ChatGPT 寫 PoC,拿下漏洞!
0×01前言
ChatGPT(Chat Generative Pre-trained Transformer)是當今備受矚目的智能AI聊天機器人之一。它不僅能夠實現基本的語言交流,還具備許多強大的功能,例如文章撰寫、代碼腳本編寫、翻譯等等。那么我們是否可以利用 ChatGpt 去輔助我們完成一些工作呢?比如當一個產品存在安全風險需要漏洞檢測時,我們就需要編寫對應的POC來實現。目前進行多次驗證,我們初步證實了這個實驗的可行性,可以訓練 ChatGPT 去編寫簡單的 PoC,但是它對細節的把控并不夠完善,例如對輸出內容進行匹配的正則表達式的編寫和一些復雜邏輯的處理等存在一定的誤差,還需要人工干預修改處理。另外我們利用比對的方式驗證了 ChatGPT 的一些安全猜想和訓練模型的準確性。如下是將其與 Goby 實戰化網絡攻防工具所結合進行利用檢測的實現效果。

0×02訓練過程
我們利用 ChatGPT 與 Goby 結合編寫 PoC 與 EXP 有兩種方法:半自動編寫和全自動編寫(過程中使用 ChatGPT-Plus 賬號)。
半自動編寫利用 ChatGPT 進行語言格式轉換,轉換后生成的代碼可能存在細節問題,需要進一步排錯完善,最后修改對應的語句和函數內容完成 PoC 與 EXP 的編寫。
全自動編寫通過將使用到的代碼模板、漏洞詳細信息給到 ChatGPT,讓它自動生成對應模板的 PoC,在給出詳細信息時需要注意信息的完整與準確。目前可以實現自動編寫簡單的 PoC,對于EXP來說還需要進一步訓練 ChatGPT 對 Goby 內置函數的使用等。
0×03CVE-2010-2861
Adobe ColdFusion 是一款高效的網絡應用服務器開發環境。Adobe ColdFusion 9.0.1 及之前版本的管理控制臺中存在多個目錄遍歷漏洞。遠程攻擊者可借助向 /CFIDE/administrator/enter.cfm 和 /CFIDE/administrator/archives/index.cfm 等發送的 locale 參數讀取任意文件。
3.1 半自動編寫
首先嘗試讓 ChatGPT 將 CVE-2010-2861 目錄遍歷漏洞的 Python 格式 EXP 轉換為 Go 語言格式的代碼,這樣可以利用 ChatGPT 代替人工完成代碼解釋及代碼轉換的過程。
我們在漏洞公開平臺中選取該漏洞的 EXP 代碼:

在使用 ChatGPT 將相應漏洞的 EXP 代碼轉換之前,先演示一下原始 Python 代碼的執行效果,具體如下:

開始轉化格式:

此外,他還提供了該程序的使用方法。然而,每次 ChatGPT 的回答都可能不完全相同。此前的回答中并沒有詳細說明函數的具體用法,但在另一個回答中給出了以下解釋:(如果需要,可在問題中增加“并介紹函數的具體用法”)

最后進行代碼調試后,發現無法立即使用,未能成功讀取所需的文件內容:

那么就需要開始排錯,以下是排錯過程:
檢查正則匹配后字符串是否為空:


檢查返回包內容是否正常,有無所需內容,如下返回數據包顯示正常:

判斷正則表達式有問題,無法匹配到對應內容:
通過排查發現正則表達式中沒有正確匹配,因此無法將文件的內容正確取出,做出以下修改,修改后內容具體如下:

修改前:

最終執行結果,完成 Python—Go 的轉化:

前面我們已經成功將 Python 格式的EXP轉換為了 Go 語言格式,現在嘗試將其轉換為 Goby 格式的 PoC 和 EXP。
由于 Goby 使用的是基于 Go 語言開發的自研漏洞框架,為方便用戶使用,其中已有很多內置函數可供用戶使用,所以只需要利用上述部分代碼即可完成 PoC 和 EXP,以下是 EXP 修改的大致說明與詳細內容:


修改 import 內容:

由于生成的 EXP 在命令行使用時需要手動輸入參數:

那么在 PoC 轉化時,需要重新定義常量,并利用 Goby 中的 httpclient.FixUrl.IP 與 httpclient.FixUrl.Port 獲取測試的 IP 和端口號,確定測試的文件路徑 path:

接著在 PoC 中添加條件判斷語句,判斷漏洞存在的特征,并返回 true(有漏洞):

最后刪除多余的輸出打印代碼即可完成 PoC 轉化,如:

EXP 轉化時,需重新定義變量,利用 Goby 中的 expResult.HostInfo.IP 與 expResult.HostInfo.Port 獲取測試的IP和端口號,利用 ss.Params["filePath"]. (string) 獲取用戶輸入的 EXP 參數——測試文件路徑 filePath:

接著在 EXP 代碼中添加條件判斷語句,判斷 EXP 是否執行成功,并輸出 EXP 執行結果,完成 EXP 轉化:

3.2 全自動編寫
在使用 ChatGPT 與人工相結合編寫后,我們進一步嘗試使用它來撰寫 Goby 格式的 PoC。
首先將 Goby 格式的模板給出:

接著將漏洞的編號、產品、類型、Url、漏洞文件、參數和判斷成功條件給出,說明相關的字段格式,我們最終得到了下面的代碼,它已經可以通過 Goby 前端的編譯,并可以成功地生成簡單的 PoC:

模型訓練初步完成,繼續使用第二個案例驗證模型完善程度:

發現 Name 字段還是存在格式錯誤,再次訓練修改(若驗證中 Name 字段等輸出正確,那么即可跳過此糾錯步驟):

最后使用第三個案例進行驗證最終的訓練結果,訓練成功:

將代碼放入 Goby 中,并填入缺少的漏洞描述信息(后續還可繼續深入訓練),運行效果如下:

0×04 自我學習
當我們在利用 ChatGPT 去幫助編寫一個新鮮出爐的 0day 漏洞或者其他機密漏洞的檢測 PoC 這個過程當中,是否會導致程序注入或信息泄露等問題呢?也就是說當模型訓練完成后,其他用戶提問相關的內容,ChatGPT 是否會直接將訓練好的模型或數據直接輸出呢?
為了驗證 ChatGPT 自我學習的猜想是否存在,分別通過“不同會話”與“不同賬戶”來進行訓練。經過以下實踐,得到的結論是 ChatGPT 并不會進行跨會話與跨賬號的自我學習,訓練好的模型與數據是掌握在 OpenAI 手中的,其他用戶并不會得到相關的模型,所以目前還不存在相關信息數據泄露的安全風險,但日后的情況還需要根據 OpenAI 采取的決策做判斷。
4.1 不同會話比對
將使用的模板(此處省略示意圖)和漏洞信息給出,可以看到 PoC 中的 Name 和 Desc ription 字段并沒有按照上一個會話中的訓練模式來進行填充,因此在不同會話當中 ChatGPT 并不會自我學習,每個會話間的訓練模型獨立:

4.2 不同賬號比對
同樣將模板(此處省略示意圖)和漏洞信息給出,也可以看到 PoC 中的相關字段并沒有按照之前的訓練模型來進行填充,由此可得知 ChatGPT 并不會跨賬號自我學習:

0×05 ChatGPT3與4
ChatGPT4 已經更新上線,那么去使用 ChatGPT4 進行同樣的全自動編寫訓練和 ChatGPT3 訓練出來的模型有什么區別呢?答案是 ChatGPT4 要比 3 更“聰明靈動”一些,模型的生成更為準確。
我們將所需要的各種信息給出,經過一次訓練后(此處省略部分示意圖),達到了下圖中正確的效果:

另外我們進行了 10 輪的訓練,針對模型中的Name字段進行比對,來判斷 ChatGPT3 與 4 的 PoC 編寫準確率,發現均會出現概率性的出錯情況,其中 3 的模型輸出準確率要比 4 低一些,在一定情況下仍需進行糾錯訓練,如下表格所示:

0×06 總結
總的來說,ChatGPT 確實能夠幫助完成一部分的工作,對于日常的工作例如編寫漏洞 PoC,可以利用它的代碼轉換能力加速編寫;也可以將漏洞的詳細信息給出,利用 ChatGPT 訓練合適的模型,直接輸出一份簡單的漏洞驗證 PoC 代碼,更加便捷快速。但它所提供的回答內容并不一定能直接復制使用,還需要進行一些人工的修正來完善。另外目前我們也可以相對放心去使用 ChatGPT,它并不會將單個用戶的訓練模型數據輸出給其他用戶來使用(不混淆會話可能是擔心用戶數據互相污染),但日后還需要針對 OpenAI 總部所作出的決策來進一步判斷。因此 ChatGPT 的合理使用,可以輔助提高一定的工作效率,若日后可以再延續進一步的訓練開發,比如是否可以利用其編寫信息描述規范且較為復雜的 PoC 甚至是 EXP,或者將其工程化批量完成內容去探索更多的應用場景和潛力。
參考
[1] https://gobysec.net/exp
[2] https://www.exploit-db.com/exploits/14641
[3] https://zhuanlan.zhihu.com/p/608738482?utm_source=wechat_session&utm_medium=social&utm_oi=1024775085344735232
[4] 用ChatGPT來生成編碼器與配套Webshell
- 文章來自Goby社區成員:LPuff@白帽匯安全研究院,轉載請注明出處。
- 獲取版本:https://gobysec.net
本文作者:GobySec, 轉載請注明來自FreeBuf.COM





























