◆王璽民 朱俊瀾 黃路一 秦朝鵬 賀文博
(江蘇警官學院 江蘇 210031)
根據2020 年《網絡攻擊趨勢:2020 年上半年報告》顯示,2020年上半年網絡釣魚和惡意軟件攻擊急劇增加,從2 月份的每周不足5,000 次激增至4 月下旬的每周超過20 萬次。此外,在5 月和6 月,隨著各國開始解除防疫封禁措施,攻擊者隨之加大了與新冠肺炎疫情相關的攻擊。與3 月和4 月相比,6 月底全球所有類型的網絡攻擊增加了34%。
頻繁的網絡攻擊暴露出了更多的安全問題:一方面,攻擊者的攻擊目標正從傳統(tǒng)的系統(tǒng)漏洞轉向各種移動感染媒介,另一方面,傳統(tǒng)DDoS 分布式拒絕服務攻擊趨緩,APT 高級持續(xù)滲透攻擊興起,攻擊者往往先通過一系列有組織,有計劃的信息搜集活動獲得目標可能的攻擊點,而后進行大規(guī)模,多手段的網絡攻擊,很容易突破目標防御,直接導致敏感信息泄露或系統(tǒng)癱瘓。
面對日趨復雜的網絡環(huán)境,滲透測試作為產品安全檢測的一個重要環(huán)節(jié)備受關注。
當前主流滲透測試需要大量手工工作。手動挖掘系統(tǒng)或應用漏洞,有利于發(fā)掘0day 漏洞,但是如果目標開放了多個端口,就需要對每個端口進行多個測試,基于端口的測試工具是nmap 和metasploit 框架,在開放多個端口的環(huán)境下,利用nmap 掃描后,就需要手動在metasploit中進行測試,在metasploit終端中利用search 命令根據nmap掃描到的服務名搜索exploit 測試模塊,在選定exploit 后,通過set target 命令定義測試目標系統(tǒng),show payloads 命令產生針對不同協(xié)議和系統(tǒng)的payloads 測試載荷,set 命令選擇payload,再根據已選對象設置對應的option,完成后需要從exploit,target,payload 形成的集合中遍歷數據進行測試。但是由于目標系統(tǒng)和端口服務版本限制,往往會產生很多無效測試過程,針對這種情況可以引入現(xiàn)流行的人工智能算法進行預測。
現(xiàn)存的智能工具有GyoiThon 和Deep Exploit 兩大類。
GyoiThon:用來實現(xiàn)對存在漏洞的Web 網站實現(xiàn)攻擊,機器學習體現(xiàn)在利用樸素貝葉斯算法實現(xiàn)對Web 指紋和服務器的預測,在獲得信息后直接傳送給metasploit 執(zhí)行,缺少對metasploit 中exploit,target,payload 數據的學習,預測只體現(xiàn)在信息搜集過程中,在執(zhí)行Metasploit 命令時,還是根據if來判斷使用的exploit,target 和payload,無法滿足exploit->target->payloads 大量數據的學習預測,效率依然低下,只不過能夠更為廣泛地搜集信息。
Deep Exploit:在2018 DEFCON 黑客大會上發(fā)布的工具,LSTM-Exploit 學習了它的執(zhí)行過程,優(yōu)化了它的以下問題:Deep Exploit 無法針對Windows 的445 端口進行測試,原因是靜態(tài)文件配置問題。LSTM-Exploit 優(yōu)化了靜態(tài)config.ini 文件。Deep Exploit 利用的是A3C 強化學習算法,利用多線程模型提高了預測速度,但是沒有將公共訓練模型保存下來,只是保存了測試成功的數據,使得每次重新測試一個IP 時都需要重新訓練模型,并且鑒于A3C 的結果往往是局部最優(yōu)解,無法完全將payload 中指定的隧道協(xié)議和操作系統(tǒng)值影響到整個payload 預測中。所以LSTM-Exploit 利用LSTM 考慮全局預測結果,并將LSTM 訓練好的模型保存下來,方便下一次直接預測,減少因為訓練帶來的時間損耗。
滲透測試本質上是開發(fā)者和測試者之間的對抗,為了讓安全測試人員更加高效地進行滲透測試,主流滲透工具開發(fā)大多指向漏洞掃描器或惡意代碼檢測工具,缺少發(fā)現(xiàn)漏洞后精準定位目標環(huán)境執(zhí)行惡意代碼的全自動工具,LSTM-Exploit 基于長短期記憶神經網絡LSTM,實現(xiàn)從漏洞發(fā)掘到惡意代碼執(zhí)行這一全自動過程。
鑒于 nmap 和 metasploit 在滲透測試中的普遍搭配使用,LSTM-Exploit 選擇將兩者通過LSTM 神經網絡整合,完成端口服務到漏洞,再到測試載荷執(zhí)行的滲透過程。
LSTM-Exploit 將metasploit 中內置的漏洞利用模塊作為漏洞集,對于不同的metasploit 版本通過開啟msfrpcd,開放metasploit 的rpc服務的55552 或55553 端口,作為LSTM-Exploit 和metasploit 連接通信的api。
工具將連接的rpc 端口和地址,可攻擊的服務和系統(tǒng)等信息保存在config.ini 文件中,方便直接引用。
前期信息搜集利用nmap 端口掃描工具,方便探測目標主機信息和開放端口等信息,通過保存nmap 掃描結果為xml 更詳細簡便的讀取掃描信息。之后讀取xml 文件信息,探測Web 端口,并對網站進行指紋驗證,得到網站所用模板或者中間件信息,將以上所有信息整合并和metasploit 交互選擇exploit。
LSTM 模型進行預測需要的訓練數據在learning 模式,同時得到exploit 映射到的 target 和 payload,利用遍歷的手段攻擊metasploitable2 和metasploitable3 兩個靶機得到。在得到成功攻擊的數據后保存為train.csv,并利用訓練數據對LSTM 模型進行訓練,將訓練完成的模型保存下來,為test 模式下進行真實滲透環(huán)境提供訓練好的LSTM 模型。
當工具在test 模式下,不需要和metasploit 交互得到payload,只需要利用搜集到的數據通過現(xiàn)存模型預測就可以得到payload,完成一次滲透測試后,會將測試成功的數據更新到train.csv 文件中。
LSTM 神經網絡存在門限機制,能夠較好地記憶和遺忘數據,對于關聯(lián)性較大的數據可以充分考慮之前數據對之后數據的影響,可以利用這種特點實現(xiàn)對metasploit 中不同payload 進行記憶。
遺忘門:
在遺忘門中,上一層輸出狀態(tài) payload,例 如Windows/meterpreter/reverse_http 會和本層的輸入向量進行處理遺忘掉一些特征,比如http 協(xié)議,保留下reverse 這個建立通信隧道的方式,原理如下:
將輸入向量xt和上一層的輸入狀態(tài)ht-1合并經過激活函數sigmoid(xt,ht-1)后得到門限向量ft,將ft和共享狀態(tài)Ct-1進行點積操作,實現(xiàn)令Ct-1遺忘掉需要被舍棄的部分上一層狀態(tài)和本層輸入。
傳入門:
在傳入層,本層的輸入會和上一層的輸入狀態(tài)payload 進行處理,記憶上一層需要記憶的內容,例如Windows/meterpreter/reverse_http就可以記住http 協(xié)議和reverse 反彈方式兩種對payload 的標注,原理如下:
將輸入向量xt和上一層的輸入狀態(tài)ht-1合并經過激活函數sigmoid(xt,ht-1)后得到新的門限向量it。輸入向量xt和上一層的輸入狀態(tài)ht-1合并經過激活函數tanh(ht-1,xt)后得到新的門限向量lt,表示需要傳入的部分上一層狀態(tài)和本層輸入。再將lt和it進行點積操作it*lt,并將結果和共享狀態(tài)Ct-1相加,表示需要傳入的信息被共享cell 狀態(tài)記憶,此時的Ct-1已經完成了本層的更新,并成為Ct,等待輸出門的輸出操作。
輸出門:
在輸出門,確認本次預測需要輸出的payload 信息,例如輸出經過記憶和遺忘操作的新payload:Windows/meterpreter/ reverse_tcp,表示遺忘了上一層的http 協(xié)議,但是記住了reverse 反彈,原理如下:
將輸入向量xt和上一層的輸入狀態(tài)ht-1合并經過激活函數sigmoid(xt,ht-1)后得到新的門限向量Ot,將更新后的Ct經過激活函數tanh(Ct)后和Ot進行點積操作tanh(Ct)*Ot,用于確認哪些信息可以被輸出,更新ht-1為ht,傳遞ht和Ct到下一層重復三個選擇層操作。
總的來說,LSTM 門限機制會記憶住payload 中必要的信息,并且在下一預測中更加偏向于這種類型的payload,成功率也就更高。因為測試的是單個目標IP,如果該測試對象可以利用某種協(xié)議和某種方式建立單個連接,那么其他類型的漏洞測試也可能適用于這種連接建立方式。
更新完訓練集文件train.csv 后,即可對神經網絡進行訓練。通過分割train.csv 文件不同列,得到訓練集數據,LSTM 層設置激活函數為relu,利用adam 算法反向傳播調整weight 和bias 值以降低損失值。LSTM-Exploit 利用tensorflow.keras 中封裝的LSTM 模型實現(xiàn)LSTM 長短期記憶神經網絡搭建。
利用keras 搭建單層單向LSTM 神經網絡:
工具架構如圖1 所示。工具由信息搜集,獲取模塊,執(zhí)行測試三個功能組成。
圖1 工具架構圖
(1)Learning 模式下
第一步,利用nmap 掃描目標IP,并將結果導入到XML 文件中。獲取打開的Web 端口并利用爬蟲爬取網頁內容,正則匹配得到網站啟用的CMS 和服務器信息。并和XML 文件內容整合。
第二步,根據字典類型數據,向metasploit 中發(fā)送搜索exploit命令得到exploit->target->payload 信息,并根據exploit,payload的名稱和必要參數篩選匹配的exploit 和payload 數據。
第三步,向Metasploit 發(fā)送測試指令,并將測試結果返回,本地將成功的測試結果整理成訓練集并進行訓練得到LSTM 的模型。
(2)Test 模式下
前兩步和Learning 模式相同,第三步,通過Learning 模式訓練得到的LSTM 模型訓練搜集到的信息,直接得到payload,而不需要再和metasploit 通信得到所有payload,第四步,直接利用預測得到的exploit->payload 進行測試,將成功結果保存到訓練集csv 文件中,并重新訓練并保存模型,將測試成功的exploit->target->payload 映射保存到csv 文件中方便查看。
Learning 模式用于前期的模型訓練,Test 模式適用于真實滲透測試環(huán)境,并且能夠在每次訓練后更新訓練數據,提高下一次模型的預測精度。
產品在不同環(huán)境下需要開啟不同的端口,實現(xiàn)各種相互配合或者彼此獨立的功能。開放的端口可以是WEB 服務器和中間件端口,也可以是數據庫端口和隧道協(xié)議端口。針對使用相同端口的不同版本服務,可能存在未被補丁修復的已知漏洞。所以,為了發(fā)現(xiàn)現(xiàn)存漏洞,不僅需要大規(guī)模掃描端口,還需要獲取端口表示服務的banner信息,以及目標服務運行環(huán)境的主機信息。所以可以啟用metasploit 中內置的nmap 功能對目標進行信息搜集,并對搜集到的WEB 端口獲取網站信息,用來實現(xiàn)可能的WEB 網站測試。
信息搜集代碼為:
#獲取nmap_data
filename=nmap_front_scan(self.client,self.command,
self.timeout,self.target_ip,self.front_filename)
nmap_data=nmap_data_process(filename)
#得到nmap 中的Web 端口
Web_ports=get_Web_ports(self.target_ip,nmap_data)
#利用爬蟲爬取網站頁面
Web_target_info=run_spider(self.target_ip,Web_ports,
self.spider_concurrent_reqs,self.spider_depth_limit,
self.spider_delay_time,self.spider_item_count,
self.spider_time_out,self.spider_page_count,
self.spider_error_count,self.spider_path,
self.output_base_path,self.output_filename)
#利用指紋獲取Web 網頁信息
signature_data=Web_signature(target_port,self.target_ip,
nmap_data,self.signature_path,
self.signature_file,target_path)
#利用content 獲得Web 網頁信息
content_data=Web_content(Web_port,self.target_ip,nmap_data,
self.dirsearch_path,self.dirsearch_file)
根據搜集到的信息,以product 和ostype 為參數,與metasploit進行通信執(zhí)行search product 和show targets 命令,得到每個服務可以執(zhí)行的exploit 集合,以及exploit 集合中每個exploit 對應的target 集合,并根據ostype 刪除不符合操作系統(tǒng)類型的exploit 選項,在Learning 模式和Test 模式下選擇不同方法獲取payload。
Learning 模式和metasploit 通信,根據選擇不同的exploit,獲取每個exploit 對應的payload 集合代碼如下:
#得到metasploit 中所有的exploit 和payload
exploit_list=get_exploit_list(self.client)
payload_list=get_payload_list(self.client)
#根據信息搜集結果得到exploit
nmap_to_exploit=nmap_get_exploit(self.client,self.nmap_data,
exploit_list,self.allow_os_types,self.allow_services)
#根據exploit 得到target,payload
exploits_to_payloads=exploit_to_payloads(self.client,
nmap_to_exploit,exploit_list)
#合并以上信息得到完整單項匹配數據
execute_nmap_data,new_path_index=nmap_exploit_to_payloads(
self.nmap_data,exploits_to_payloads,payload_list,
self.path_index)
Test 模式下,利用現(xiàn)存模型預測得到payload,代碼如下:
#信息搜集和模塊獲取
exploit_list=get_exploit_list(self.client)
payload_list=get_payload_list(self.client)
nmap_to_exploit=nmap_get_exploit(client,self.nmap_data,
exploit_list,self.allow_os_types,
self.allow_services)
exploit_to_targets=get_exploit_to_targets(self.client,
nmap_to_exploit,exploit_list)
nmap_exploit_targets,tmp_path_index=get_nmap_exploit_targets(
nmap_to_exploit,exploit_to_targets,
self.tunnel,self.path_index)
#預測payload
lstm_result=lstm_predict(nmap_exploit_targets,
self.model_path,self.model_name)
根據已經探測好的exploit,target,payload 信息和metasploit通信得到測試模塊需要設置的options,將本地靜態(tài)文件中的配置寫入對應的options 中后和metasploit 通信測試對應端口服務,并將測試成功的結果保存到訓練集文件中。通過導入訓練集文件訓練LSTM神經網絡,更新LSTM 模型,實現(xiàn)每次測試后預測精度的提高。
代碼如下:
# Get the options that need to be set for each exploit and payload
exploit_options=get_options_from_etp(self.client,
self.execute_nmap_data,self.exploit_list,
self.allow_options)
# Set the obtained option to the dictionary obtained by collecting information
tmp_execute_nmap_data,tmp_path_index=set_option_to_data(self.client,self.execute_nmap_data,exploit_options,
self.path_index,self.allow_payloads,
self.payload_list)
# Perform the test and save the successful result to a csv file
success_data=start_attack(client,target_ip,
tmp_execute_nmap_data,self.path_index,
self.exploit_list,self.payload_list,self.local_ip)
success_data=success_to_train(success_data,exploit_list,
payload_list)
train_csv=save_to_csv(success_data,self.train_csv_path,
self.train_csv_filename,payload_list)
# Train module
model_file=train_new_model(train_csv,self.epochs,
self.model_path,self.model_name)
metasploit 企業(yè)版中存在一鍵滲透腳本 auto-pwn.rb,LSTM-Exploit 和auto-pwn.rb 腳本有著相同的功能,即能夠自動化滲透,但是auto-pwn.rb 等傳統(tǒng)腳本采用的是if 判斷手段來進行滲透測試,而LSTM-Exploit 采用的是LSTM 模型進行測試,能夠明顯的提升效率,并且隨著測試的增多,也會使預測的準確率得到提升。在面對不同的metasploit 版本時,只需要添加靜態(tài)端口信息就能夠實現(xiàn)信息加載,而不需要大量修改代碼來兼容metasploit 的漏洞集。為了和metasploit 框架通信,利用pymetasploit3 庫,能夠直接訪問metasploit內置所有數據,簡化了編寫網絡連接的過程。
但是LSTM-Exploit 也存在一些不足,此工具只能測試提前設定好的靜態(tài)服務端口,只能識別設置好的網站指紋和目錄信息,利用固定參數的漏洞載荷進行測試。在Learning 模式下,由于對metapsploit的rpc 服務訪問過多,不同漏洞利用模塊執(zhí)行速度不同,容易產生并發(fā)錯誤導致服務崩潰。在實踐過程中還存在一些不便,未來還需要不斷完善。