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