實戰(zhàn)介紹Windows下的PC客戶端常見漏洞挖掘
0X00 為什么寫這篇文章
對于小白來說,web安全方面似乎已經(jīng)有了很完備的知識體系和漏洞發(fā)掘流程,剛剛?cè)腴T的朋友總是喜歡選擇web方向來作為自己的發(fā)展方向,因為針對web系統(tǒng)的滲透測試似乎獲得的成就感要更高,也有很多小白認(rèn)為web似乎更好學(xué),然而對于PC客戶端漏洞發(fā)掘,因為涉及到了一些計算機(jī)和操作系統(tǒng)底層的知識,很多人都不敢去碰,而實際上PC客戶端的漏洞比大家想象中要容易的多,甚至你并不需要精通匯編語言就能很容易的挖到PC客戶端漏洞,不過匯編語言是PC客戶端漏洞發(fā)掘的基礎(chǔ),還是需要學(xué)好它。
另外,挖掘PC客戶端漏洞和挖掘WEB漏洞是一樣的,都需要細(xì)心和耐心,你要學(xué)會關(guān)注每一個細(xì)節(jié),了解系統(tǒng)和軟件是如何協(xié)同工作的。本文主要講Windows下的PC客戶端漏洞發(fā)掘,為了淺顯易懂,不涉及ROP等高級內(nèi)存威脅和內(nèi)存溢出技術(shù),大佬請繞道。
0×01 工具
“工欲善其事,必先利其器” 。
PC客戶端漏洞挖掘主要是逆向工程和進(jìn)程監(jiān)控為主。
逆向工程方面我推薦兩個工具,一個是靜態(tài)分析之王:IDA pro,另一個是動態(tài)調(diào)試?yán)锩婧芎糜玫模篛llydbg(推薦大家用吾愛破解論壇版本的)這兩個逆向分析工具一查就可以查到,在這里就不多介紹了。
進(jìn)程監(jiān)控工具主要分為進(jìn)程本地行為監(jiān)控和進(jìn)程網(wǎng)絡(luò)行為監(jiān)控。
本地行為監(jiān)控工具我推薦:ProcessExplorer進(jìn)程監(jiān)控和Autoruns進(jìn)程監(jiān)控,這兩個工具知名度不高,但是很好用。
ProcessExplorer進(jìn)程監(jiān)控
Autoruns進(jìn)程監(jiān)控工具
本地監(jiān)控工具里還有一種工具是專門監(jiān)控注冊表的工具,這里推薦幾個:
Process Monitor:一個強(qiáng)大的注冊表監(jiān)視工具,可以添加過濾規(guī)則,很方便。
Regshot:一個注冊表備份和比對工具,可以通過保存快照和比對快照的方式來找出注冊表中哪些值發(fā)生了變化。
RegfromApp:也是一個進(jìn)程監(jiān)控工具,可以選擇一個進(jìn)程之后跟蹤其對注冊表的修改。
網(wǎng)絡(luò)行為監(jiān)控工具當(dāng)然首推大名鼎鼎的Wireshark啦,當(dāng)然還有一個工具很小眾但是很好用,是歲月聯(lián)盟的工具,叫WSExplorer(進(jìn)程抓包)。
Wireshark
歲月聯(lián)盟的進(jìn)程抓包工具WSExplorer,非常方便,左側(cè)是進(jìn)程,右側(cè)是抓到的數(shù)據(jù)包。
有了以上這些工具,我們便可以對程序在我們的計算機(jī)上做了些什么了如指掌,知己知彼方能百戰(zhàn)百勝,便可以開始下一步的漏洞發(fā)掘了。
0×02 缺陷
對于開發(fā)者來說,開發(fā)一款完全沒有漏洞的程序是不可能的,特別是這個程序的體量及其龐大時,則其必定存在漏洞,我們需要知道的就是哪些位置容易出現(xiàn)漏洞。
客戶端的授權(quán)認(rèn)證漏洞:
一般正版的客戶端軟件都設(shè)有授權(quán)認(rèn)證模塊,這些授權(quán)認(rèn)證方式所需要達(dá)成的目的無非就是“買了的人能用,沒買的人不能用”,一般驗證采用注冊碼的形式并與個人計算機(jī)的機(jī)器碼相互綁定,或者與某種個人認(rèn)證機(jī)制相互綁定,以達(dá)到驗證的目的。授權(quán)認(rèn)證漏洞可以導(dǎo)致軟件和功能被破解,盜版程序流通等嚴(yán)重后果。授權(quán)認(rèn)證漏洞往往是開發(fā)者在開發(fā)時沒有注重授權(quán)認(rèn)證的保密性以及安全性所導(dǎo)致的。
客戶端的網(wǎng)絡(luò)服務(wù)漏洞:
這類漏洞一般是由于客戶端在發(fā)送數(shù)據(jù)包或接收時沒有進(jìn)行嚴(yán)格的認(rèn)證造成的,可導(dǎo)致無條件調(diào)用高級權(quán)限的服務(wù)。
客戶端功能邏輯漏洞:
這類漏洞一般是由客戶端功能設(shè)計不合理導(dǎo)致的,可以導(dǎo)致無授權(quán)的訪問等嚴(yán)重后果。
客戶端溢出漏洞:
這類漏洞包含屬于逆向工程中比較高難度的一塊,主要是由于開發(fā)時對內(nèi)存的錯誤管理,或者程序本身的執(zhí)行邏輯漏洞導(dǎo)致的。
本文僅介紹前三種漏洞。
0×03 實戰(zhàn)
客戶端功能邏輯漏洞:
挖掘這類漏洞應(yīng)主要關(guān)注客戶端功能之間的邏輯,與Web邏輯漏洞類似。但是不同的是,功能邏輯漏洞也包括在反編譯之后的部分,一般情況下通過修改關(guān)鍵call函數(shù)之上的跳轉(zhuǎn)邏輯來進(jìn)行漏洞挖掘,主要成因是客戶端邏輯過于簡單,采用了較少的邏輯判斷。這種漏洞在具有完備功能的客戶端上并不常見。
客戶端的授權(quán)認(rèn)證漏洞:
1.基于本地注冊表的破解:
某些軟件雖然使用網(wǎng)絡(luò)進(jìn)行授權(quán)驗證,但是由于其試用次數(shù)設(shè)計的驗證缺陷,可以導(dǎo)致通過修改注冊表來實現(xiàn)多次數(shù)的試用,導(dǎo)致“不付費也能用”,即出現(xiàn)了授權(quán)認(rèn)證漏洞。下面這款客戶端程序即是如此,我們在剛剛打開它的時候會提示試用次數(shù)還剩29次。
現(xiàn)在我們打開Process Monitor,使用過濾功能添加白名單使Pm僅顯示該進(jìn)程的相關(guān)信息。
添加過濾白名單,僅顯示該進(jìn)程。
關(guān)鍵部位做了處理。
之后停止所有捕獲,關(guān)閉并重啟客戶端,多次重復(fù)后我們監(jiān)控到每次客戶端打開時,會自動做一次RegsetValue(注冊表值修改),如下:
經(jīng)過測試后,發(fā)現(xiàn)剩余試用次數(shù)是用整數(shù)30減去注冊表中一個名為Nowtimes的鍵下面的值。
于是我們編寫一個BAT腳本,修改該客戶端指向的那個值,并讓他在客戶端啟動時自動運(yùn)行,即可鎖定試用次數(shù)為30次,不會減少。
Reg add HKCU\Software\客戶端名字\一個位置 /v Nowtimes /t REG_DWORD /d 0 /f
這個漏洞的成因主要是因為試用次數(shù)認(rèn)的方法太簡單了,不聯(lián)網(wǎng)不加密直接寫進(jìn)注冊表中,并且鍵名還那么淺顯易懂叫做“Nowtimes”,這種存在在注冊表的漏洞發(fā)掘和利用方法還是比較簡單的,但是問題是這樣的漏洞還蠻多的,所以大家在挖掘時注意關(guān)注注冊表。另外如果注冊表禁止監(jiān)控,我們可以用REGshot來保存前后的快照進(jìn)行比對分析。
2.基于網(wǎng)絡(luò)授權(quán)驗證的hosts欺騙破解
這一部分內(nèi)容需要用到一部分逆向工程的知識。這次破解的客戶端沒有設(shè)置試用機(jī)制,我們轉(zhuǎn)而把眼光放到它的網(wǎng)絡(luò)驗證模式上來,看看到底這個客戶端的網(wǎng)絡(luò)授權(quán)驗證方式是如何工作的。
關(guān)鍵位置打碼處理
隨便輸一個注冊碼進(jìn)去
隨便輸入一個注冊碼然后確定,根據(jù)彈出的錯誤窗口來定位到客戶端的注冊檢測驗證的函數(shù)處。拖入OLLYdbg查找字串“注冊碼有誤”,并跟蹤到匯編窗口。
于是我們得到了注冊授權(quán)的服務(wù)器地址。為了進(jìn)一步驗證,我們使用wireshark來分析這個客戶端注冊時的網(wǎng)絡(luò)請求。
<>可以看出客戶端攜帶著我們的機(jī)器碼和幾個其他數(shù)據(jù)請求了服務(wù)器的/verifycheck/login.php
再回到我們的匯編窗口中,我們可以看到幾個unicode的編碼,疑似服務(wù)器的返回,記錄下來。
直接用瀏覽器訪問,可以發(fā)現(xiàn)返回值和匯編窗口的記錄值中的一條相同,所以我們猜測可以構(gòu)造一個假服務(wù)器,修改主機(jī)的hosts文件來實現(xiàn)請求重定向,讓我們的服務(wù)器返回注冊成功的信息。
修改hosts文件,將服務(wù)器域名綁定到我們自己的假服務(wù)器的ip地址
在服務(wù)器上構(gòu)造不同的payload,可以得到客戶端不同的反應(yīng),說明漏洞成功了一半。
至此我們可以排除掉其他的payload,從而確定一個格式化日期返回值是注冊成功的標(biāo)志。所以我們構(gòu)造一個格式化時間,并且重新打開客戶端輸入任意注冊碼注冊,即可看到注冊成功的窗口。
最終的payload
這一漏洞的成因為客戶端軟件在校驗注冊碼返回時的數(shù)據(jù)太過簡單,進(jìn)而非常容易構(gòu)造注冊成功的返回。并且客戶端的反編譯能力也非常差,敏感信息在反編譯后直接就能夠看到。在挖掘這一類漏洞時,我們需要一些逆向工程的基本知識,以及計算機(jī)網(wǎng)絡(luò)的一些基礎(chǔ)知識,重點關(guān)注客戶端與網(wǎng)絡(luò)服務(wù)器之間的通訊數(shù)據(jù),利用抓包工具來進(jìn)行漏洞挖掘。
客戶端的網(wǎng)絡(luò)服務(wù)漏洞:
由于想拿來做例子的漏洞廠商還沒有修復(fù),所以這里不放例子了。網(wǎng)絡(luò)服務(wù)漏洞發(fā)掘主要采用客戶端網(wǎng)絡(luò)請求分析的方式,主要的工具就是前面提到的進(jìn)程抓包工具以及Wireshark, 大部分網(wǎng)絡(luò)服務(wù)漏洞起因是由于在客戶端的網(wǎng)絡(luò)請求中沒有采取驗證方式或者采取了安全性非常低的驗證方式,從而使得任何人都可以以客戶端合法的名義來請求這個網(wǎng)絡(luò)服務(wù),實現(xiàn)沒有權(quán)限的調(diào)用私有網(wǎng)絡(luò)服務(wù)接口。常常出現(xiàn)在客戶端vip付費資源的試聽服務(wù),客戶端付費的查詢功能接口處等,不安全的客戶端請求可以被攔截并分析,進(jìn)而實現(xiàn)越權(quán)調(diào)用無權(quán)限的資源或接口。在挖掘這類漏洞時,我們需要更多的關(guān)注客戶端的網(wǎng)絡(luò)傳輸層面上的東西,盡可能的分析客戶端的每一個通過網(wǎng)路服務(wù)器實現(xiàn)的功能,來進(jìn)行漏洞挖掘。