Nebula เลเวล 08: มาลองแฮกทำ network forensics

Pichaya Morimoto
3 min readJun 7, 2016

--

ข้อนี้บอกตามตรงว่าทำผมเงิบอยู่ หลายนาทีหลังจาก spawn shell ได้แล้ว ว่าผมทำอะไรลงไปเนี่ย ก่อนจะ อ๋อ… จริง ๆ ก็ไม่ได้น่าเงิบแค่ผม บังเอินใช้ท่าที่ทำสำเร็จได้โดยไม่ต้องคิดมากเอง มาดูกันว่าเกิดอะไรขึ้นกับข้อนี้ครับ

โจทย์บอกว่า เลเวล 08 เกิดปัญหาจาก ไฟล์ที่ตั้งสิทธิ์อย่างไม่ปลอดภัย ยอมให้ใครก็ได้อ่านไฟล์ที่ไม่ควรอ่านได้ อีกแล้ว ถ้ายังจำได้เราเคย exploit เรื่องนี้ไปแล้วในเลเวล 05 ลองแฮกจาก SSH private key นะครับ จากนั้นก็เหมือนเดิมครับ ssh เข้าไปด้วย level08:level08 ไปสำรวจ ณ /home/flag08/

$ ls -l /home/flag08
total 9
-rw-r--r-- 1 root root 8302 Nov 20 2011 capture.pcap

พบว่าข้างในมีไฟล์ capture.pcap อยู่ ซึ่งไฟล์นี้ถูกตั้งค่าสิทธิ์ให้ใครก็ได้อ่านได้ (world readable จาก r:read ตัวที่สามที่บอกถึง user อื่นนอกเหนือจากเจ้าของไฟล์หรือ user ที่อยู่ในกลุ่มของไฟล์ ใครก็ได้อ่านได้) เจ้าไฟล์ pcap นี้เกิดจากการดักจับ network packet ในช่วงระยะเวลาใด เวลานึงไว้ครับ กรณีดักจับ*บนเครื่องเรา*ก็ได้ จากโปรแกรม network analyzer ทั้งหลาย เช่น wireshark, tshark, tcpdump พวกนี้หรือโปรแกรมอะไรก็ตามที่เรียก api ต่อกับ libpcap และมีสิทธิ์ NET_ADMIN หรือทำงานเป็นสิทธิ์ user root ก็สามารถทำได้เช่นกันครับ

คราวนี้มาลองแงะดูกันดีกว่าว่ามีอะไรอยู่ในนี้กันแน่?? step ผมครั้งแรกจะลองใช้คำสั่ง strings เปิดดูก่อน การเปิดด้วย strings ต่างจาก cat ตรงนี้จะออกมาแต่ตัวอักษรที่เป็น ASCII นะครับ ถ้าใช้ cat แล้วอาจจะมี non-printable characters/binary โผล่ปนออกมาทำให้อ่านยากครับ

$ strings /home/flag08/capture.pcap
[...]
38400,38400
SodaCan:0
DISPLAY
SodaCan:0
xterm
[...]
Linux 2.6.38–8-generic-pae (::ffff:10.1.1.2) (pts/10)
wwwbugs login:
@f&NV.
[...]
Password: Nf&Nat
[...]
Login incorrect
wwwbugs login:
df&N
R}jf&N
R}jf&N
jf&N

จากจุดนี้สิ่งที่ผมสังเกตเห็นชัด ๆ คือ น่าจะมีการ login เกิดขึ้นครับ เพราะมีขึ้นว่า login แล้วมีถาม password อีกแน่ะ แต่ปัญหาคือค่าของ username กับ password ที่ใช้อยู่ตรงไหนละ? ใน […] ที่ผมละไว้นี้คือเป็น ASCII มั่ว ๆ ไม่มีความหมายอะไรนะครับ จากนั้น ผมก็ลองเปิดด้วย tcpdump ดูต่อเพื่อวิเคราะห์ภาพรวมของการ เชื่อมต่อ ครับ

$ tcpdump -A -r /home/flag08/capture.pcap
reading from file /home/flag08/capture.pcap, link-type EN10MB (Ethernet)
[...]
22:23:12.339391 IP 59.233.235.223.12121 > 59.233.235.218.39247: Flags [P.], seq 127:202, ack 179, win 453, options [nop,nop,TS val 46280435 ecr 18592808], length 75
E…..@.@..A;…;…/Y.O…….t….K……
…….(
Linux 2.6.38–8-generic-pae (::ffff:10.1.1.2) (pts/10)
..wwwbugs login:
22:23:12.339542 IP 59.233.235.218.39247 > 59.233.235.223.12121: Flags [.], ack 202, win 115, options [nop,nop,TS val 18592808 ecr 46280435], length 0
E..4..@.@.J<;…;….O/Y…t…….s…….
…(….
[...]
Password:
22:23:26.095329 IP 59.233.235.218.39247 > 59.233.235.223.12121: Flags [.], ack 228, win 115, options [nop,nop,TS val 18594183 ecr 46283874], length 0
E..4..@.@.J-;…;….O/Y…{…%…s…….
……<b
[...]
Login incorrect
wwwbugs login:
22:23:48.730579 IP 59.233.235.218.39247 > 59.233.235.223.12121: Flags [.], ack 267, win 115, options [nop,nop,TS val 18596446 ecr 46289533], length 0
E..4..@.@.J.;…;….O/Y…….L…s…….
…^..R}
[...]

จะเห็นว่ามีการคุยกันระหว่างสองไอพีคือ 59.233.235.218 กับ 59.233.235.223 โดยฝั่ง server คือ .223 ที่ มี service อยู่ใน TCP port 12121 และ client ต่อเข้าไปด้วย source port 39247 นะครับ ตัว protocol มองดูแล้วคล้าย ๆ telnet คือเหมือนจะไม่มีการเข้ารหัสใด ๆ เป็น clear text แต่เอ๋.. username/password อยู่ไหนละ??

step ถัดมาถ้าใครเซียนหน่อยก็อาจลอง filter ใส่ tcpdump เพิ่มวิเคราะห์ต่อได้เลย จริง ๆ มันอยู่ในนั้นแหละ แค่มองย๊ากกก ยากเท่านั้นเอง ส่วนผมจะใช้ scp ย้ายไฟล์ออกมาแล้วเปิดต่อด้วย wireshark ครับ วิธีสำหรับคนแอบขี้เกียจ แฮ่ ๆ

$ scp level08@192.168.99.100:/home/flag08/capture.pcap capture.pcap
$ wireshark capture.pcap

จากนั้นก็เลือก data packet อันไหนก็ได้ (เพราะมันเป็น connection เดียวกัน) แล้วคลิกขวาเลือก Follow แล้วไปที่ TCP Stream จะได้ หน้าต่างแบบนี้ครับ

พบว่า เฮ้ย.. มีรหัสนี่หว่า เป็น ASCII คือ backdoor…00Rm8.ate จากนั้นผมก็ลองนำรหัสนี้ไป login ด้วย user flag08

$ su flag08
Password:
su: Authentication failure

ปราฏว่ายังไม่ได้นะครับ ผมเลยลอง.. แทนที่จะพิมพ์เอง เลยเอาเมาส์ลากแล้วก๊อปไปแปะในหน้า terminal ที่ต้องใส่รหัสของ user flag08 ดูปรากฏว่าเข้าได้เฉยเลย แต่พิมพ์เองไม่ได้ ทำไมกันนะ!? และผมก็เกิดความสงสัยว่า ทำไมใน Follow TCP Stream ขึ้นรหัสแบบนี้ทั้ง ๆ ที่ตอนที่เราสั่ง strings / tcpdump ดูไม่มีคำว่า backdoor เลย???

เลยย้อนกลับไปดูผล tcpdump อีกรอบเพื่อไขข้อสงสัย…

ปรากฏว่าจริง ๆ มันส่งครับ เป็น plaintext นี้แหละ แต่มันไม่ได้ส่งเป็น word แต่มันส่งทีละตัว ๆ ไปเรื่อย ๆ เลยมองยากนิดนึง ทีนี้ผมก็สงสัยอีกว่า backdoor…00Rm8.ate เนี่ย ตรง จุด ๆ ๆ มันคือ ค่าอะไรกันแน่ เพราะมันอาจจะไม่ใช่จุดจริง ๆ แต่เป็น non-printable character/binary เพราะเราเปิดด้วย ASCII mode มันเลยโชว์เป็นจุดครับ ผมเลยลองเปลี่ยนเป็น wireshark เป็น hex mode ทันทีผลคือ…

เกร็ดเล็กน้อยจริง ๆ เราใช้ออฟชั่น -X ใน tcpdump ก็ทำ hexdump เทียบกับ ASCII ได้สำหรับสายแข็งนะครับ ส่วนตัวผมขอเปิดบน wireshark ละกัน ทีนี้เรามากางตาราง ASCII เต็ม ๆ ดูกันว่าค่า hex 7f ที่มันโชว์เป็นจุดตรงนี้นั้นคืออะไร กันแน่??

ปรากฏว่า ความจริงแล้ว ค่า hex 7f จริง ๆ แล้วเป็น DEL หรือเป็น ค่าแทนการกดปุ่ม delete ลบซะงั้น เลยกลับมาลองแทนที่การลบดูครับ

จากค่า “backdoor…00Rm8.ate” พอเปลี่ยน จากจุดเป็นการลบแทนก็จะได้คำว่า “backd00Rmate” แบบนี้นี่เอง~

จากนั้นลองล็อคอินด้วยรหัสใหม่ที่เราได้มานี้ครับ

$ id
uid=1009(level08) gid=1009(level08) groups=1009(level08)
$ su flag08
Password:
sh-4.2$ id
uid=991(flag08) gid=991(flag08) groups=991(flag08)
sh-4.2$ getflag
You have successfully executed getflag on a target account

ภารกิจนี้ค่อนข้างสนุกดีว่าต้องคิดเยอะขึ้น ต้องใช้ tool มากขึ้นละครับ ยังดีว่า protocol นี้ไม่ใช่ binary เต็ม ๆ ยังไม่ถึงขนาดต้องทำ protocol reverse engineering แบบท่ายาก ๆ กัน ขอบคุณที่ติดตามอ่านกันจนจบนะครับ อยากจะเขียนแนวทางมุมมองการคิด ตั้งแต่เจอโจทย์จนถึงแก้ปัญหาได้ ไม่ใช่จะเฉลยเลยอย่างเดียว หวังว่าจะสนุกกันนะครับ :)

ที่มา: https://exploit-exercises.com/nebula/level08/

--

--