记一次CNVD通用漏洞审计
本文轉(zhuǎn)載于:https://www.freebuf.com/articles/web/290697.html
0x01 前言
寫這篇文章的緣由其實(shí)還挺魔幻的,起因是在一次實(shí)戰(zhàn)滲透時(shí)通過(guò)弱口令拿下一個(gè)低權(quán)限用戶成功進(jìn)入后臺(tái),在后臺(tái)尋找功能點(diǎn)通過(guò)抓包分析,定位到目標(biāo)系統(tǒng)后臺(tái)存在SQL注入,通過(guò)os shell拿下內(nèi)網(wǎng)之后閑著無(wú)聊就谷歌了下,發(fā)現(xiàn)這個(gè)系統(tǒng)的開(kāi)發(fā)商是某某公司,同時(shí)cnvd也沒(méi)有收錄該產(chǎn)品,于是想著能不能撿漏搞個(gè)cnvd證書。
礙于信息檢索能力太差,只收集到屈指可數(shù)的幾個(gè)url,而且這幾個(gè)系統(tǒng)都沒(méi)有弱口令可以進(jìn)入后臺(tái),因?yàn)檫M(jìn)不了后臺(tái),就猜測(cè)后臺(tái)的功能也都無(wú)法使用,漏洞無(wú)法復(fù)現(xiàn),于是在知道肯定過(guò)不了的情況下還是硬著頭皮只交了幾個(gè)url上去(沒(méi)記錯(cuò)通用漏洞需要至少3個(gè)以上驗(yàn)證成功漏洞案例),結(jié)果果不其然,三審的時(shí)候給我駁回了。
不甘心,案例找不出來(lái),我把代碼審計(jì)一遍還不行嗎?于是就通過(guò)webshell打包了一份代碼(因?yàn)槭?net的站,就只打包了bin包下來(lái)),于是便有了這篇文章。
0x02 漏洞利用
還是先簡(jiǎn)單聊聊sql注入如何拿下內(nèi)網(wǎng)的吧。(以前的一次實(shí)戰(zhàn),沒(méi)有截圖,腦補(bǔ)一下,見(jiàn)諒)
漏洞點(diǎn)抓包
嘗試直接sqlmap拿下--os-shell,苦于沒(méi)有絕對(duì)路徑,就嘗試百度看看還有沒(méi)有其他漏洞,然而網(wǎng)上資料幾乎沒(méi)有,就在要放棄的時(shí)候從百度文庫(kù)中找到一線希望,找到了該系統(tǒng)的使用說(shuō)明,從說(shuō)明書中得知系統(tǒng)的mysql數(shù)據(jù)庫(kù)安裝路徑和web路徑在同一目錄下,于是通過(guò)--sql-shell使用
select @@datadir獲取到mysql的安裝目錄,同時(shí)也就獲得了web目錄,最后就可以直接--os-shell了。
拿到os-shell之后先tasklist,沒(méi)有殺軟,不需要免殺;ping了下發(fā)現(xiàn)服務(wù)器出網(wǎng),基礎(chǔ)操作certutil下載msf馬上線,先用msf上傳一個(gè)web shell到網(wǎng)站目錄(感覺(jué)拿到web shell后要放心點(diǎn))。看了下權(quán)限,system,不用提權(quán)了;看了下systeminfo,08的機(jī)器,load kiwi模塊,讀取明文密碼;netstat看下3389端口,沒(méi)開(kāi)啟,用注冊(cè)表開(kāi)啟。msf起socks代理,mstsc遠(yuǎn)程連接之。net view看了下沒(méi)有域,上傳fscan進(jìn)行內(nèi)網(wǎng)資產(chǎn)掃描,同時(shí)在桌面看到WinScp軟件,而且其中還保存著好幾臺(tái)內(nèi)網(wǎng)服務(wù)器,都是root權(quán)限,試了試都能連接上。這里我下了個(gè)星號(hào)密碼查看器傳上去,想獲取它們的明文密碼,結(jié)果失敗了。谷歌了下,發(fā)現(xiàn)WinScp配置默認(rèn)加密保存在注冊(cè)表中,可以修改保存方式為ini文件并用工具破解其密碼,于是修改之后dump到本地通過(guò)工具get到密碼。
另一邊f(xié)scan掃到了兩臺(tái)服務(wù)器的弱密碼,還有幾臺(tái)有redis未授權(quán)漏洞,都可以寫私鑰登錄。
此外,從sql備份文件中又找到另外平臺(tái)的賬號(hào)密碼。
0x03 代碼審計(jì)
從webshell的文件管理處定位到漏洞文件Default.ashx,可以看到調(diào)用了UserInfo.Default這個(gè)類。
在bin包中找到對(duì)應(yīng)dll文件,使用dnSpy反編譯得到源碼,開(kāi)始審計(jì)。
結(jié)構(gòu)如下:
首先全局搜索一下session關(guān)鍵字,沒(méi)有發(fā)現(xiàn)。再在所有外部引用中搜索session關(guān)鍵字,還是沒(méi)有發(fā)現(xiàn),是個(gè)好兆頭,說(shuō)明系統(tǒng)可能沒(méi)有對(duì)session進(jìn)行驗(yàn)證。
代碼第20行,定義ProcessRequest方法并將http請(qǐng)求體作為該方法的參數(shù)傳入,并在第22行定義httpCookie變量存儲(chǔ)當(dāng)前cookie中鍵名為"WCMS.User"的數(shù)據(jù),可以看到在代碼第23行,程序只進(jìn)行了三種判斷,cookie不為空,cookie中UserID不為空且RoleID也不為空
只要滿足上述三個(gè)條件,程序就會(huì)繼續(xù)處理請(qǐng)求,否則才返回204代碼報(bào)錯(cuò)。
這里由于身份校驗(yàn)不嚴(yán),導(dǎo)致攻擊者可以在沒(méi)有后臺(tái)管理員權(quán)限的情況下也能執(zhí)行相應(yīng)操作。審計(jì)到這里我興奮起來(lái)了,因?yàn)橹皳?dān)心系統(tǒng)會(huì)對(duì)session進(jìn)行判斷就沒(méi)有對(duì)另外幾個(gè)站點(diǎn)進(jìn)行復(fù)現(xiàn),導(dǎo)致cnvd提交被駁回,然而現(xiàn)在完全不需要擔(dān)心了,因?yàn)橄到y(tǒng)根本就沒(méi)有對(duì)session進(jìn)行驗(yàn)證,只需要修改http請(qǐng)求中的host參數(shù)就可以實(shí)現(xiàn)漏洞的批量利用。
但是審計(jì)到這里還沒(méi)有結(jié)束,我們繼續(xù)對(duì)sql注入漏洞的成因進(jìn)行分析。
在代碼第32行,對(duì)action參數(shù)進(jìn)行判斷,我們根據(jù)payload中的Read值,跟進(jìn)到GetData()函數(shù)
從代碼第190行,不難看出該函數(shù)并未對(duì)參數(shù)進(jìn)行過(guò)濾,只進(jìn)行了是否為空的判斷
在代碼第197行程序還進(jìn)行了RoleInfoID的校驗(yàn),擔(dān)心這里可能會(huì)要求提供服務(wù)器中存在的id導(dǎo)致身份鑒權(quán)失敗,我們著重分析下這里
定義一個(gè)text變量接收結(jié)果,如果在http form表單中不存在RoleInfoID,就調(diào)用Lib.CommonFunction類中的GetRoleID()方法進(jìn)行獲取,我們跟進(jìn)后發(fā)現(xiàn)程序仍然只判斷了cookie是否存在,只有當(dāng)cookie不存在時(shí)才會(huì)返回為空,導(dǎo)致代碼第198行判斷為假進(jìn)而導(dǎo)致api返回為空
如果cookie存在,會(huì)調(diào)用DESDec()函數(shù)將cookie中RoleID的值進(jìn)行DES解密,并將結(jié)果保存以待后用。
這里我根據(jù)源碼用c#重寫了下解密過(guò)程,并將payload中的RoleID用于解密,結(jié)果最后是亂碼(可能是我代碼沒(méi)寫對(duì)的鍋...)
然后我用在線的DES工具解密出來(lái)又是正確的...(蚌埠住了,我寫的代碼就是屎?jiǎn)鑶鑶?#xff09;
然后我們?cè)倩氐紾etData()函數(shù),代碼第186行通過(guò)Lib.Factory類中的CreateUserInfo()函數(shù)創(chuàng)建了DBHelper對(duì)象,并在第205行調(diào)用了GetItems()函數(shù)
通過(guò)分析發(fā)現(xiàn)IDBHelper接口由Mysql.DBHelper類實(shí)現(xiàn),跟進(jìn)到DBHelper類的GetItems()函數(shù)進(jìn)行分析
代碼第302行,使用for循環(huán)遍歷之前text變量中的值,構(gòu)造sql語(yǔ)句,使用where in語(yǔ)法對(duì)查詢結(jié)果進(jìn)行限定。同時(shí),我們注意到,搜索關(guān)鍵字keyWords到目前為止仍未進(jìn)行任何的過(guò)濾,而且后續(xù)通過(guò)分析,發(fā)現(xiàn)開(kāi)發(fā)者也未在全局使用預(yù)處理和參數(shù)化,導(dǎo)致keyWords參數(shù)易于受到攻擊。
綜上,雖然RoleID會(huì)用于獲取子賬號(hào)ID,然而如果數(shù)據(jù)庫(kù)中不存在該RoleID的用戶也沒(méi)有關(guān)系,因?yàn)槲覀兊墓舴绞绞腔跁r(shí)間的盲注,即使數(shù)據(jù)庫(kù)查詢返回為空,也不妨礙我們通過(guò)時(shí)間比較進(jìn)行攻擊。因此可以下定結(jié)論,該漏洞在未經(jīng)授權(quán)就可被利用。
整個(gè)流程如下圖所示:
0x04 后話
細(xì)心細(xì)心細(xì)心!
總結(jié)
以上是生活随笔為你收集整理的记一次CNVD通用漏洞审计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 记一次应急响应到溯源入侵者
- 下一篇: Fofa搜索技巧