เริ่มด้วยการ nmap เพื่อสแกนดู port ที่เปิดอยู่ทั้งหมด
┌──(kali㉿kali)-[~/Downloads/HTB/Soulmate]
└─$ nmap -sC -sV -T5 10.10.11.86
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-15 09:17 +07
Nmap scan report for 10.10.11.86
Host is up (0.038s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://soulmate.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.54 seconds
ให้ไปเพิ่ม host ที่ /etc/hosts
10.10.11.86 soulmate.htb
จากนั้นเข้าไปดูที่หน้าเว็บผ่าน url http://soulmate.htb/
ใช้ dirsearch สำหรับการ enum เพื่อดู path ต่างๆของ web
┌──(kali㉿kali)-[~/Downloads/HTB/Soulmate]
└─$ dirsearch -u http://soulmate.htb/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /home/kali/Downloads/HTB/Soulmate/reports/http_soulmate.htb/__25-09-15_09-29-43.txt
Target: http://soulmate.htb/
[09:29:43] Starting:
[09:30:01] 301 - 178B - /assets -> http://soulmate.htb/assets/
[09:30:01] 403 - 564B - /assets/
[09:30:05] 302 - 0B - /dashboard.php -> /login
[09:30:11] 200 - 8KB - /login.php
[09:30:11] 302 - 0B - /logout.php -> login.php
[09:30:20] 302 - 0B - /profile.php -> /login
[09:30:21] 200 - 11KB - /register.php
Task Completed
จากนั้นเข้าไปทำการ register
หลังจาก register เสร็จก็ทำการ login เข้าไป
หลังจากเข้ามาในเว็บจะมีแค่ฟังก์ชันสำหรับ update profile ซึ่งผมลองทำอะไรหลายๆอย่างกับหน้านี้แล้วแต่ก็ใช้ไม่ได้ทั้ง XSS, Upload webshell, SQL Injection
ผมเลยจะลอง enum ต่อโดยการใช้ ffuf เพื่อหา subdomain อื่นๆของ web นี้
┌──(kali㉿kali)-[~/Downloads/HTB/Soulmate]
└─$ ffuf -u http://soulmate.htb/ -H "Host: FUZZ.soulmate.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -fs 154
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://soulmate.htb/
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
:: Header : Host: FUZZ.soulmate.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response size: 154
________________________________________________
ftp [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 139ms]
:: Progress: [114442/114442] :: Job [1/1] :: 1265 req/sec :: Duration: [0:01:48] :: Errors: 0 ::
เพิ่ม ftp.soulmate.htb เข้าไปที่ /etc/hosts
10.10.11.86 soulmate.htb ftp.soulmate.htb
จากนั้นเข้าไปดูที่หน้าเว็บ http://ftp.soulmate.htb/
ซึ่งสำหรับหน้านี้ผมก็ลอง SQL Injection ดูแล้วก็ไม่ได้ ผมเลยลองหาช่องโหว่ที่เกี่ยว bypass login ของ crushFTP ดูเผื่อเจอ
แล้วก็ไปเจออันนึงที่ดูน่าจะใช่ซึ่งก็คือ CVE-2025-31161 มันก็คือช่องโหว่ที่สามารถทำให้ผู้โจมตีใช้สิทธิ์ของ crushadmin (เป็น default user admin ของ crushFTP) ในการทำอะไรต่างๆได้ด้วยสิทธิ์ระดับสูง ซึ่งผมก็ได้นำ CVE นี้ไปหา exploit ก็ไปเจอมาอันนึง CVE-2025-31161 ซึ่ง exploit นี้มันจะทำการใช้สิทธิ์ของ crushadmin ในการไปสร้าง user ใหม่ที่มีสิทธิ์เป็น admin ในระบบได้
จากนั้นก็ทำการ login เข้าไปด้วย username กับ password ที่เราพึ่งสร้างมา และทำการเข้าไปที่หน้า admin > User management
จะเห็นว่า user ben มี folder webProd อยู่เลยลองกดเข้าไปดูไฟล์ข้างใน
จากรูปนี้ทำให้เรารู้ว่า user ben เป็นคนจัดการเกี่ยวกับ web ที่เราเข้าไปดูตอนแรกซึ่งหากเราเข้าไปที่ user ben และทำการ upload webshell ขึ้นไปได้เราก็น่าจะเข้าไปในเครื่องได้ ดังนั้นผมเลยทำการเปลี่ยน password ของ user ben เป็น 1234 และกด save
ทำการออกจากระบบและ login เข้าไปใหม่ด้วย user ben และ password 1234 จากนั้นกดเข้าไปที่ folder webProd
กด Add file และทำการ upload webshell ลงไป
ในเครื่องเราให้ทำการเปิด listening ไว้ที่ port 9001
┌──(kali㉿kali)-[~/Downloads/HTB/Soulmate]
└─$ nc -lvnp 9001
listening on [any] 9001 ...
กลับไปที่ web http://soulmate.htb และเข้าไปที่ path http://soulmate.htb/php-reverse-shell.php เพื่อ trigger ตัว reverse shell
จากนั้นกลัมาดูที่เครื่องเราที่ได้ทำการเปิด listening ไว้
ทำการ deploy linpeas.sh มาที่เครื่องเหยื่อไปไว้ที่ path /tmp และทำการ run จะเจอสิ่งที่น่าสงสัยอยู่ 2 จุด อย่างแรกคือ password ของ admin ของ web soulmate.htb แต่ก็ไม่ได้มีอะไร
อีกอันคือ port ที่เครื่องนี้ทำการเปิดอยู่ซึ่งมันเยอะกว่าปกติแสดงว่ามันต้องมีการใช้ service บางอย่าง
และในเครื่องนี้มี user แค่ ben และ root ดังนั้นเราต้องหา password ของ ben ให้ได้ก่อน

ผมเลยใช้คำสั่ง grep -rE '\bben\b' . เพื่อหาไฟล์ที่มีคำว่า ben จาก path ที่อยู่ปัจจุบันและ subfolder ทั้งหมด (ซึ่งมันเยอะมากครับบอกเลยว่าหาตาแตก 😅)
แต่ก็เจอจริงๆ
ได้ user flag แล้วววว

จากนั้นผมลองใช้ sudo -l ดูก็ปรากฎว่า user ben ไม่สามารถรัน sudo ในเครื่องนี้ได้เลย ซึ่งจากผลลัพธ์ของ linpeas.sh ก่อนหน้านี้ที่เราเห็น port เปิดเยอะๆมันมี port ที่ผมไม่คุ้นและน่าสงสัยอยู่ก็คือ port 4369 และ 2222 แต่ผมลอง ssh tunneling ไปที่ port 4369 ด้วยคำสั่ง ssh -L 4369:localhost:4369 ben@10.10.11.86 และเข้าไปที่ url http://127.0.0.1:4369/ แล้วแต่ก็ไม่เจออะไร ต่อมาทำแบบเดียวกันกับ port 2222
ปรากฎว่าเจอ version และชื่อของ service ผมเลยลองนำไป search หาช่องโหว่ดู
แล้วก็เจอจริงๆด้วย ซึ่งช่องโหว่ของตัวนี้ก็คือ CVE-2025-32433 มันเป็นช่องโหว่ของ SSH server ที่มาจาก library SSH ของ Erlang/OTP ทำให้ผู้โจมตีที่ยังไม่ผ่านการยืนยันตัวตนสามารถทำ RCE ได้นั่นเอง แต่เรายังไม่รู้ว่า Erlang/OTP SSH รันด้วยสิทธิ์ของใครถ้าหากรันด้วยสิทธิ์ของ root ข้อนี้ก็จบแต่หากรันด้วยสิทธิ์ของ ben ก็ต้องทำต่อ อยากรู้ก็ต้องลองครับ ผมเลยทำการโหลดหา exploit มา CVE-2025-32433-Erlang-OTP-SSH-RCE-PoC จากนั้นทำการ deploy มาที่เครื่องเหยื่อ และใช้คำสั่ง (ให้ทำการเปิด listening ไว้ที่เครื่องเราก่อนด้วย)

อย่าลืมใส่ port เป็น 2222 ด้วยนะ
กลับไปที่เครื่องเราที่ทำการเปิด listening ไว้
ปรากฎว่ามันรันด้วยสิทธิ์ root จึงทำให้เราได้ shell มาด้วยสิทธิ์ของ root ด้วย ก็เลยทำให้ได้ root flag แล้ววววว 🥳
ก็จบไปอีกหนึ่ง easy machine นะครับข้อนี้ผมว่าเน้นการ enum เป็นหลักถ้าติดนานๆก็ตรงที่หา password ของ ben นี่แหละก็ไว้เจอกันใหม่ blog หน้าครับ
