ChatGPT 寫 PoC,拿下漏洞!
0×01前言
ChatGPT(Chat Generative Pre-trained Transformer)是當(dāng)今備受矚目的智能AI聊天機(jī)器人之一。它不僅能夠?qū)崿F(xiàn)基本的語(yǔ)言交流,還具備許多強(qiáng)大的功能,例如文章撰寫、代碼腳本編寫、翻譯等等。那么我們是否可以利用 ChatGpt 去輔助我們完成一些工作呢?比如當(dāng)一個(gè)產(chǎn)品存在安全風(fēng)險(xiǎn)需要漏洞檢測(cè)時(shí),我們就需要編寫對(duì)應(yīng)的POC來(lái)實(shí)現(xiàn)。目前進(jìn)行多次驗(yàn)證,我們初步證實(shí)了這個(gè)實(shí)驗(yàn)的可行性,可以訓(xùn)練 ChatGPT 去編寫簡(jiǎn)單的 PoC,但是它對(duì)細(xì)節(jié)的把控并不夠完善,例如對(duì)輸出內(nèi)容進(jìn)行匹配的正則表達(dá)式的編寫和一些復(fù)雜邏輯的處理等存在一定的誤差,還需要人工干預(yù)修改處理。另外我們利用比對(duì)的方式驗(yàn)證了 ChatGPT 的一些安全猜想和訓(xùn)練模型的準(zhǔn)確性。如下是將其與 Goby 實(shí)戰(zhàn)化網(wǎng)絡(luò)攻防工具所結(jié)合進(jìn)行利用檢測(cè)的實(shí)現(xiàn)效果。
0×02訓(xùn)練過(guò)程
我們利用 ChatGPT 與 Goby 結(jié)合編寫 PoC 與 EXP 有兩種方法:半自動(dòng)編寫和全自動(dòng)編寫(過(guò)程中使用 ChatGPT-Plus 賬號(hào))。
半自動(dòng)編寫利用 ChatGPT 進(jìn)行語(yǔ)言格式轉(zhuǎn)換,轉(zhuǎn)換后生成的代碼可能存在細(xì)節(jié)問(wèn)題,需要進(jìn)一步排錯(cuò)完善,最后修改對(duì)應(yīng)的語(yǔ)句和函數(shù)內(nèi)容完成 PoC 與 EXP 的編寫。
全自動(dòng)編寫通過(guò)將使用到的代碼模板、漏洞詳細(xì)信息給到 ChatGPT,讓它自動(dòng)生成對(duì)應(yīng)模板的 PoC,在給出詳細(xì)信息時(shí)需要注意信息的完整與準(zhǔn)確。目前可以實(shí)現(xiàn)自動(dòng)編寫簡(jiǎn)單的 PoC,對(duì)于EXP來(lái)說(shuō)還需要進(jìn)一步訓(xùn)練 ChatGPT 對(duì) Goby 內(nèi)置函數(shù)的使用等。
0×03CVE-2010-2861
Adobe ColdFusion 是一款高效的網(wǎng)絡(luò)應(yīng)用服務(wù)器開(kāi)發(fā)環(huán)境。Adobe ColdFusion 9.0.1 及之前版本的管理控制臺(tái)中存在多個(gè)目錄遍歷漏洞。遠(yuǎn)程攻擊者可借助向 /CFIDE/administrator/enter.cfm 和 /CFIDE/administrator/archives/index.cfm 等發(fā)送的 locale 參數(shù)讀取任意文件。
3.1 半自動(dòng)編寫
首先嘗試讓 ChatGPT 將 CVE-2010-2861 目錄遍歷漏洞的 Python 格式 EXP 轉(zhuǎn)換為 Go 語(yǔ)言格式的代碼,這樣可以利用 ChatGPT 代替人工完成代碼解釋及代碼轉(zhuǎn)換的過(guò)程。
我們?cè)诼┒垂_(kāi)平臺(tái)中選取該漏洞的 EXP 代碼:
在使用 ChatGPT 將相應(yīng)漏洞的 EXP 代碼轉(zhuǎn)換之前,先演示一下原始 Python 代碼的執(zhí)行效果,具體如下:
開(kāi)始轉(zhuǎn)化格式:
此外,他還提供了該程序的使用方法。然而,每次 ChatGPT 的回答都可能不完全相同。此前的回答中并沒(méi)有詳細(xì)說(shuō)明函數(shù)的具體用法,但在另一個(gè)回答中給出了以下解釋:(如果需要,可在問(wèn)題中增加“并介紹函數(shù)的具體用法”)
最后進(jìn)行代碼調(diào)試后,發(fā)現(xiàn)無(wú)法立即使用,未能成功讀取所需的文件內(nèi)容:
那么就需要開(kāi)始排錯(cuò),以下是排錯(cuò)過(guò)程:
檢查正則匹配后字符串是否為空:
檢查返回包內(nèi)容是否正常,有無(wú)所需內(nèi)容,如下返回?cái)?shù)據(jù)包顯示正常:
判斷正則表達(dá)式有問(wèn)題,無(wú)法匹配到對(duì)應(yīng)內(nèi)容:
通過(guò)排查發(fā)現(xiàn)正則表達(dá)式中沒(méi)有正確匹配,因此無(wú)法將文件的內(nèi)容正確取出,做出以下修改,修改后內(nèi)容具體如下:
修改前:
最終執(zhí)行結(jié)果,完成 Python—Go 的轉(zhuǎn)化:
前面我們已經(jīng)成功將 Python 格式的EXP轉(zhuǎn)換為了 Go 語(yǔ)言格式,現(xiàn)在嘗試將其轉(zhuǎn)換為 Goby 格式的 PoC 和 EXP。
由于 Goby 使用的是基于 Go 語(yǔ)言開(kāi)發(fā)的自研漏洞框架,為方便用戶使用,其中已有很多內(nèi)置函數(shù)可供用戶使用,所以只需要利用上述部分代碼即可完成 PoC 和 EXP,以下是 EXP 修改的大致說(shuō)明與詳細(xì)內(nèi)容:
修改 import 內(nèi)容:
由于生成的 EXP 在命令行使用時(shí)需要手動(dòng)輸入?yún)?shù):
那么在 PoC 轉(zhuǎn)化時(shí),需要重新定義常量,并利用 Goby 中的 httpclient.FixUrl.IP 與 httpclient.FixUrl.Port 獲取測(cè)試的 IP 和端口號(hào),確定測(cè)試的文件路徑 path:
接著在 PoC 中添加條件判斷語(yǔ)句,判斷漏洞存在的特征,并返回 true(有漏洞):
最后刪除多余的輸出打印代碼即可完成 PoC 轉(zhuǎn)化,如:
EXP 轉(zhuǎn)化時(shí),需重新定義變量,利用 Goby 中的 expResult.HostInfo.IP 與 expResult.HostInfo.Port 獲取測(cè)試的IP和端口號(hào),利用 ss.Params["filePath"]. (string) 獲取用戶輸入的 EXP 參數(shù)——測(cè)試文件路徑 filePath:
接著在 EXP 代碼中添加條件判斷語(yǔ)句,判斷 EXP 是否執(zhí)行成功,并輸出 EXP 執(zhí)行結(jié)果,完成 EXP 轉(zhuǎn)化:
3.2 全自動(dòng)編寫
在使用 ChatGPT 與人工相結(jié)合編寫后,我們進(jìn)一步嘗試使用它來(lái)撰寫 Goby 格式的 PoC。
首先將 Goby 格式的模板給出:
接著將漏洞的編號(hào)、產(chǎn)品、類型、Url、漏洞文件、參數(shù)和判斷成功條件給出,說(shuō)明相關(guān)的字段格式,我們最終得到了下面的代碼,它已經(jīng)可以通過(guò) Goby 前端的編譯,并可以成功地生成簡(jiǎn)單的 PoC:
模型訓(xùn)練初步完成,繼續(xù)使用第二個(gè)案例驗(yàn)證模型完善程度:
發(fā)現(xiàn) Name 字段還是存在格式錯(cuò)誤,再次訓(xùn)練修改(若驗(yàn)證中 Name 字段等輸出正確,那么即可跳過(guò)此糾錯(cuò)步驟):
最后使用第三個(gè)案例進(jìn)行驗(yàn)證最終的訓(xùn)練結(jié)果,訓(xùn)練成功:
將代碼放入 Goby 中,并填入缺少的漏洞描述信息(后續(xù)還可繼續(xù)深入訓(xùn)練),運(yùn)行效果如下:
0×04 自我學(xué)習(xí)
當(dāng)我們?cè)诶?ChatGPT 去幫助編寫一個(gè)新鮮出爐的 0day 漏洞或者其他機(jī)密漏洞的檢測(cè) PoC 這個(gè)過(guò)程當(dāng)中,是否會(huì)導(dǎo)致程序注入或信息泄露等問(wèn)題呢?也就是說(shuō)當(dāng)模型訓(xùn)練完成后,其他用戶提問(wèn)相關(guān)的內(nèi)容,ChatGPT 是否會(huì)直接將訓(xùn)練好的模型或數(shù)據(jù)直接輸出呢?
為了驗(yàn)證 ChatGPT 自我學(xué)習(xí)的猜想是否存在,分別通過(guò)“不同會(huì)話”與“不同賬戶”來(lái)進(jìn)行訓(xùn)練。經(jīng)過(guò)以下實(shí)踐,得到的結(jié)論是 ChatGPT 并不會(huì)進(jìn)行跨會(huì)話與跨賬號(hào)的自我學(xué)習(xí),訓(xùn)練好的模型與數(shù)據(jù)是掌握在 OpenAI 手中的,其他用戶并不會(huì)得到相關(guān)的模型,所以目前還不存在相關(guān)信息數(shù)據(jù)泄露的安全風(fēng)險(xiǎn),但日后的情況還需要根據(jù) OpenAI 采取的決策做判斷。
4.1 不同會(huì)話比對(duì)
將使用的模板(此處省略示意圖)和漏洞信息給出,可以看到 PoC 中的 Name 和 Desc ription 字段并沒(méi)有按照上一個(gè)會(huì)話中的訓(xùn)練模式來(lái)進(jìn)行填充,因此在不同會(huì)話當(dāng)中 ChatGPT 并不會(huì)自我學(xué)習(xí),每個(gè)會(huì)話間的訓(xùn)練模型獨(dú)立:
4.2 不同賬號(hào)比對(duì)
同樣將模板(此處省略示意圖)和漏洞信息給出,也可以看到 PoC 中的相關(guān)字段并沒(méi)有按照之前的訓(xùn)練模型來(lái)進(jìn)行填充,由此可得知 ChatGPT 并不會(huì)跨賬號(hào)自我學(xué)習(xí):
0×05 ChatGPT3與4
ChatGPT4 已經(jīng)更新上線,那么去使用 ChatGPT4 進(jìn)行同樣的全自動(dòng)編寫訓(xùn)練和 ChatGPT3 訓(xùn)練出來(lái)的模型有什么區(qū)別呢?答案是 ChatGPT4 要比 3 更“聰明靈動(dòng)”一些,模型的生成更為準(zhǔn)確。
我們將所需要的各種信息給出,經(jīng)過(guò)一次訓(xùn)練后(此處省略部分示意圖),達(dá)到了下圖中正確的效果:
另外我們進(jìn)行了 10 輪的訓(xùn)練,針對(duì)模型中的Name字段進(jìn)行比對(duì),來(lái)判斷 ChatGPT3 與 4 的 PoC 編寫準(zhǔn)確率,發(fā)現(xiàn)均會(huì)出現(xiàn)概率性的出錯(cuò)情況,其中 3 的模型輸出準(zhǔn)確率要比 4 低一些,在一定情況下仍需進(jìn)行糾錯(cuò)訓(xùn)練,如下表格所示:
0×06 總結(jié)
總的來(lái)說(shuō),ChatGPT 確實(shí)能夠幫助完成一部分的工作,對(duì)于日常的工作例如編寫漏洞 PoC,可以利用它的代碼轉(zhuǎn)換能力加速編寫;也可以將漏洞的詳細(xì)信息給出,利用 ChatGPT 訓(xùn)練合適的模型,直接輸出一份簡(jiǎn)單的漏洞驗(yàn)證 PoC 代碼,更加便捷快速。但它所提供的回答內(nèi)容并不一定能直接復(fù)制使用,還需要進(jìn)行一些人工的修正來(lái)完善。另外目前我們也可以相對(duì)放心去使用 ChatGPT,它并不會(huì)將單個(gè)用戶的訓(xùn)練模型數(shù)據(jù)輸出給其他用戶來(lái)使用(不混淆會(huì)話可能是擔(dān)心用戶數(shù)據(jù)互相污染),但日后還需要針對(duì) OpenAI 總部所作出的決策來(lái)進(jìn)一步判斷。因此 ChatGPT 的合理使用,可以輔助提高一定的工作效率,若日后可以再延續(xù)進(jìn)一步的訓(xùn)練開(kāi)發(fā),比如是否可以利用其編寫信息描述規(guī)范且較為復(fù)雜的 PoC 甚至是 EXP,或者將其工程化批量完成內(nèi)容去探索更多的應(yīng)用場(chǎng)景和潛力。
參考
[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來(lái)生成編碼器與配套Webshell
- 文章來(lái)自Goby社區(qū)成員:LPuff@白帽匯安全研究院,轉(zhuǎn)載請(qǐng)注明出處。
- 獲取版本:https://gobysec.net
本文作者:GobySec, 轉(zhuǎn)載請(qǐng)注明來(lái)自FreeBuf.COM