Hack-The-Box – Jarvis

บทความโดย
Vanitas
Cyber Security Researcher

Box Name : Jarvis
Difficulty : Medium
Point : 30

Vulnerability :
– Blinded-SQL Injection from page : room.php.
– Bypass Command Injection from sudo python script.
– Privilege Escalation from SUID : systemctl binary. 

Enumeration & Exploit :

  1. Nmap scan แบบ all port (TCP + UDP) จะพบว่า TCP : 22,80 และ 64999 เปิดอยู่
  2. เราจะพบว่า TCP : 80 เป็น Apachet HTTPD ก็ไม่ต้องรอช้า ลอง browse เข้าไปดูกันเลย จะพบ Stark Hotel เดาว่าคงเอาไปอิงกับ Tony Stark ตามรูป logo ของ box
  3. เลื่อนลงมาอีกนิด จะมี button ให้กดเข้าไปดูรายละเอียดห้องพัก
  4. กดเข้าไปเพื่อ Booking ดู ทีนี้ลองสังเกตที่ url จะพบจุดที่น่าสนใจว่ามันโชว์ id ของห้องด้วย ผ่าน parameter : cod
  5. ซึ่งตรงจุดนี้ หลายๆคนน่าจะเริ่มสังเกตแล้วว่ามา pattern นี้ น่าจะลอง SQL-Injection ดูครับ เราก็เอา payload มาใส่ intercept ผ่าน Burp ดูเลย
  6. อย่ารอช้า เอา request ไปใส่ใน text เพื่อพร้อมจะลองนำไปยิงผ่าน SQLMap
  7. ใช้ SQLMap แปะ request แล้วยิงไป จะเจอว่า parameter : cod นี้มัน “Injectable” หรือพูดง่ายๆ ก็คือมันไปทำ SQL-Injection ได้นั่นแหละ ทีนี้ก็จะง่ายละครับ (หมายเหตุ : ใครสนใจลองไป manual ต่อดูกันก็ได้นะครับ
  8. คราวนี้ลอง SQLMap อีกรอบ แต่เพิ่ม option : –os-shell เข้าไปด้วย เพื่อให้เราได้ shell บนเครื่องเป้าหมาย โดยที่เราไม่ต้อง infect payload ไปสร้าง webshell เอง ซึ่งหลังจากลองใช้ command : id ดู จะพบว่าได้ shell จาก user : www-data ซึ่งเป็น normal user ที่ใช้รัน Apache จริงๆแล้ว
  9. ทำ reverse shell กลับมาอีกที แล้วเตะให้ไปเป็น full interactive TTY shell เพื่อสะดวกกับการใช้งาน
  10. ไปกันต่อเลย โดยปกติแล้วเวลาได้ Low Privileged Shell แล้วก็มักจะไปที่ home folder ของ local user (username : peppper) ก่อน เพื่อเอา flag : user.txt ไป submit เอา point แต่….. เหมือนจะยังไม่ได้
  11. คาดว่า box นี้น่าจะมีดักอะไรสักอย่างอีกสัก chain เพื่อให้ไปเป็น user : pepper เพื่อ get flag ได้
  12. ลอง sudo -l ดู จะพบอะไรแปลกๆ คือ user : www-data ที่ได้ shell อยู่ในปัจจุบัน ดันมี sudo privilege ซะงั้น (ซึ่งปกติแล้วในชีวิตจริง ไม่ค่อยมีใครไปให้ sudo privilege กับ user : www-data เท่าไร) 
  13. โดยลองใช้ sudo -u pepper เข้าไปรัน python script นี้ดู จะเจอ option หลายอันเลย ซึ่งหลังจากลองเล่น พบว่า option -p เพื่อใช้ ping ip นั้นมีอะไรค่อนข้างน่าสนใจ 
  14. ซึ่งโดยทั่วไปแล้ว hacker ก็มักจะคิดถึงการทำ Command Injection หลังการ ping ยกตัวอย่างเช่น ping 127.0.0.1;id แบบนี้ก็จะสามารถเรียก os command หลังจาก ping เสร็จได้
  15. ทีนี้ลองไปใช้ท่าที่ว่ากันดู จะพบว่า simpler.py นี่มันมีการดักการทำ Command Injection ไว้ด้วย เลย return msg : Got you มาแทนที่จะขึ้น result output
  16. ถึงเวลาแห่งการ source code review ลองเข้าอ่าน simpler.py ดู
  17. จะพบว่าตอนที่เรียก option : -p นี่ มีการดักด้วยการ filter input บางส่วนออกไป ตามรูป
  18. จะเห็นว่าใน function : exec_ping() ไม่ได้ดัก “ “ (space) ,$ และ { } ไว้
  19. ทีนี้ลองใช้ $(bash) เพื่อ execute bash shell ดู ปรากฏว่าได้ สามารถสวมรอยเป็น user : pepper ได้เรียบร้อย
  20. เนื่องจาก session ที่ได้มาของ user : pepper ยังไม่เป็น full interactive shell จึงทำ reverse shell กลับไปอีกรอบ แล้วทำให้เป็น TTY shell ซะ เพื่อความสะดวก
  21. เข้าไปที่ /home/pepper ก็จะได้ flag : user.txt มาเรียบร้อย
  22. ถึงขั้นตอนที่จะทำ Privilege Escalation กันแล้ว ซึ่งก็ลองเริ่มต้นโดยการหา SUID ดู ด้วย command : find / -perm -u=s -type f 2>/dev/nullจะเห็นว่า /bin/systemctl นั้นดูแปลกๆ ซึ่งปกติแล้วลองกับ os ทั่วๆไป มักจะมีการ hardening ไม่ให้ใช้ systemctl ได้ผ่าน SUID หมายเหตุ : ตรงจุดนี้ ถ้าใช้ LinEnum.sh มารันเพื่อหา แล้วลองสังเกตุดูก็จะเจอเช่นกัน
  23. ลองไป research เกี่ยวกับ systemctl suid exploit ดู จะพบ blog ที่น่าสนใจตัวนึง และดูท่าว่าน่าจะใช้ได้ด้วย (Ref : https://carvesystems.com/news/contest-exploiting-misconfigured-sudo/, https://gtfobins.github.io/gtfobins/systemctl/ )
  24. ลอง exploit ตามวิธีนี้ดู จะพบว่าขั้นตอนที่จะทำ symbolic-link ไปให้ systemctl เห็น service มันยังใช้ไม่ได้ เนื่องจากติด permission ในการสร้าง service ดังรูป
  25. ลอง research เพิ่มเติม เจอจาก StackExchange ว่าควรจะต้องไปดูว่า home ของการใช้งาน systemctl จะไปสร้าง service file ไว้ที่ไหนบ้าง (Ref : https://security.stackexchange.com/questions/212427/why-doesnt-my-systemctl-command-work ) ซึ่งใน guide ก็ได้ลองให้เข้าไปดูใน /etc/system/system ดู
  26. ลองเข้าไป enumerate ภายใน folder นี้ทั่วๆ จะพบว่าใน folder : multi-user.target.wants นี้ มีการทำ symlink ไปหา /home/pepper/mal.service ซึ่งอยู่บน home folder ของ user : pepper พอดี
  27. มาถึงจุดนี้ น่าจะพอเดากันได้แล้วเราจะไปยังไงต่อ ซึ่ง idea ที่เราต้องการคือ เราจะสร้าง systemctl service file ไปวางไว้ที่ /home/pepper/mal.service เพื่อทำ reverse shell กลับมาหา attacker ด้วย root privileged shell
  28. ไปสร้างไฟล์ตาม content ในรูป ลงบน /home/pepper/mal.service
  29. ลอง create symlink ดูอีกที จะพบว่ารอบนี้ได้แล้ว
  30. ไป start netcat listener รอได้เลย แล้วใช้ systemctl start mal.service ดู
  31. จะพบว่าคราวนี้เราจะได้ reverse shell กลับมาด้วย root privilege แล้ว แล้วก็จะได้ flag : root.txt บน /root