◆王璽民 朱俊瀾 黃路一 秦朝鵬 賀文博
(江蘇警官學(xué)院 江蘇 210031)
根據(jù)2020 年《網(wǎng)絡(luò)攻擊趨勢(shì):2020 年上半年報(bào)告》顯示,2020年上半年網(wǎng)絡(luò)釣魚(yú)和惡意軟件攻擊急劇增加,從2 月份的每周不足5,000 次激增至4 月下旬的每周超過(guò)20 萬(wàn)次。此外,在5 月和6 月,隨著各國(guó)開(kāi)始解除防疫封禁措施,攻擊者隨之加大了與新冠肺炎疫情相關(guān)的攻擊。與3 月和4 月相比,6 月底全球所有類(lèi)型的網(wǎng)絡(luò)攻擊增加了34%。
頻繁的網(wǎng)絡(luò)攻擊暴露出了更多的安全問(wèn)題:一方面,攻擊者的攻擊目標(biāo)正從傳統(tǒng)的系統(tǒng)漏洞轉(zhuǎn)向各種移動(dòng)感染媒介,另一方面,傳統(tǒng)DDoS 分布式拒絕服務(wù)攻擊趨緩,APT 高級(jí)持續(xù)滲透攻擊興起,攻擊者往往先通過(guò)一系列有組織,有計(jì)劃的信息搜集活動(dòng)獲得目標(biāo)可能的攻擊點(diǎn),而后進(jìn)行大規(guī)模,多手段的網(wǎng)絡(luò)攻擊,很容易突破目標(biāo)防御,直接導(dǎo)致敏感信息泄露或系統(tǒng)癱瘓。
面對(duì)日趨復(fù)雜的網(wǎng)絡(luò)環(huán)境,滲透測(cè)試作為產(chǎn)品安全檢測(cè)的一個(gè)重要環(huán)節(jié)備受關(guān)注。
當(dāng)前主流滲透測(cè)試需要大量手工工作。手動(dòng)挖掘系統(tǒng)或應(yīng)用漏洞,有利于發(fā)掘0day 漏洞,但是如果目標(biāo)開(kāi)放了多個(gè)端口,就需要對(duì)每個(gè)端口進(jìn)行多個(gè)測(cè)試,基于端口的測(cè)試工具是nmap 和metasploit 框架,在開(kāi)放多個(gè)端口的環(huán)境下,利用nmap 掃描后,就需要手動(dòng)在metasploit中進(jìn)行測(cè)試,在metasploit終端中利用search 命令根據(jù)nmap掃描到的服務(wù)名搜索exploit 測(cè)試模塊,在選定exploit 后,通過(guò)set target 命令定義測(cè)試目標(biāo)系統(tǒng),show payloads 命令產(chǎn)生針對(duì)不同協(xié)議和系統(tǒng)的payloads 測(cè)試載荷,set 命令選擇payload,再根據(jù)已選對(duì)象設(shè)置對(duì)應(yīng)的option,完成后需要從exploit,target,payload 形成的集合中遍歷數(shù)據(jù)進(jìn)行測(cè)試。但是由于目標(biāo)系統(tǒng)和端口服務(wù)版本限制,往往會(huì)產(chǎn)生很多無(wú)效測(cè)試過(guò)程,針對(duì)這種情況可以引入現(xiàn)流行的人工智能算法進(jìn)行預(yù)測(cè)。
現(xiàn)存的智能工具有GyoiThon 和Deep Exploit 兩大類(lèi)。
GyoiThon:用來(lái)實(shí)現(xiàn)對(duì)存在漏洞的Web 網(wǎng)站實(shí)現(xiàn)攻擊,機(jī)器學(xué)習(xí)體現(xiàn)在利用樸素貝葉斯算法實(shí)現(xiàn)對(duì)Web 指紋和服務(wù)器的預(yù)測(cè),在獲得信息后直接傳送給metasploit 執(zhí)行,缺少對(duì)metasploit 中exploit,target,payload 數(shù)據(jù)的學(xué)習(xí),預(yù)測(cè)只體現(xiàn)在信息搜集過(guò)程中,在執(zhí)行Metasploit 命令時(shí),還是根據(jù)if來(lái)判斷使用的exploit,target 和payload,無(wú)法滿(mǎn)足exploit->target->payloads 大量數(shù)據(jù)的學(xué)習(xí)預(yù)測(cè),效率依然低下,只不過(guò)能夠更為廣泛地搜集信息。
Deep Exploit:在2018 DEFCON 黑客大會(huì)上發(fā)布的工具,LSTM-Exploit 學(xué)習(xí)了它的執(zhí)行過(guò)程,優(yōu)化了它的以下問(wèn)題:Deep Exploit 無(wú)法針對(duì)Windows 的445 端口進(jìn)行測(cè)試,原因是靜態(tài)文件配置問(wèn)題。LSTM-Exploit 優(yōu)化了靜態(tài)config.ini 文件。Deep Exploit 利用的是A3C 強(qiáng)化學(xué)習(xí)算法,利用多線程模型提高了預(yù)測(cè)速度,但是沒(méi)有將公共訓(xùn)練模型保存下來(lái),只是保存了測(cè)試成功的數(shù)據(jù),使得每次重新測(cè)試一個(gè)IP 時(shí)都需要重新訓(xùn)練模型,并且鑒于A3C 的結(jié)果往往是局部最優(yōu)解,無(wú)法完全將payload 中指定的隧道協(xié)議和操作系統(tǒng)值影響到整個(gè)payload 預(yù)測(cè)中。所以LSTM-Exploit 利用LSTM 考慮全局預(yù)測(cè)結(jié)果,并將LSTM 訓(xùn)練好的模型保存下來(lái),方便下一次直接預(yù)測(cè),減少因?yàn)橛?xùn)練帶來(lái)的時(shí)間損耗。
滲透測(cè)試本質(zhì)上是開(kāi)發(fā)者和測(cè)試者之間的對(duì)抗,為了讓安全測(cè)試人員更加高效地進(jìn)行滲透測(cè)試,主流滲透工具開(kāi)發(fā)大多指向漏洞掃描器或惡意代碼檢測(cè)工具,缺少發(fā)現(xiàn)漏洞后精準(zhǔn)定位目標(biāo)環(huán)境執(zhí)行惡意代碼的全自動(dòng)工具,LSTM-Exploit 基于長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)LSTM,實(shí)現(xiàn)從漏洞發(fā)掘到惡意代碼執(zhí)行這一全自動(dòng)過(guò)程。
鑒于 nmap 和 metasploit 在滲透測(cè)試中的普遍搭配使用,LSTM-Exploit 選擇將兩者通過(guò)LSTM 神經(jīng)網(wǎng)絡(luò)整合,完成端口服務(wù)到漏洞,再到測(cè)試載荷執(zhí)行的滲透過(guò)程。
LSTM-Exploit 將metasploit 中內(nèi)置的漏洞利用模塊作為漏洞集,對(duì)于不同的metasploit 版本通過(guò)開(kāi)啟msfrpcd,開(kāi)放metasploit 的rpc服務(wù)的55552 或55553 端口,作為L(zhǎng)STM-Exploit 和metasploit 連接通信的api。
工具將連接的rpc 端口和地址,可攻擊的服務(wù)和系統(tǒng)等信息保存在config.ini 文件中,方便直接引用。
前期信息搜集利用nmap 端口掃描工具,方便探測(cè)目標(biāo)主機(jī)信息和開(kāi)放端口等信息,通過(guò)保存nmap 掃描結(jié)果為xml 更詳細(xì)簡(jiǎn)便的讀取掃描信息。之后讀取xml 文件信息,探測(cè)Web 端口,并對(duì)網(wǎng)站進(jìn)行指紋驗(yàn)證,得到網(wǎng)站所用模板或者中間件信息,將以上所有信息整合并和metasploit 交互選擇exploit。
LSTM 模型進(jìn)行預(yù)測(cè)需要的訓(xùn)練數(shù)據(jù)在learning 模式,同時(shí)得到exploit 映射到的 target 和 payload,利用遍歷的手段攻擊metasploitable2 和metasploitable3 兩個(gè)靶機(jī)得到。在得到成功攻擊的數(shù)據(jù)后保存為train.csv,并利用訓(xùn)練數(shù)據(jù)對(duì)LSTM 模型進(jìn)行訓(xùn)練,將訓(xùn)練完成的模型保存下來(lái),為test 模式下進(jìn)行真實(shí)滲透環(huán)境提供訓(xùn)練好的LSTM 模型。
當(dāng)工具在test 模式下,不需要和metasploit 交互得到payload,只需要利用搜集到的數(shù)據(jù)通過(guò)現(xiàn)存模型預(yù)測(cè)就可以得到payload,完成一次滲透測(cè)試后,會(huì)將測(cè)試成功的數(shù)據(jù)更新到train.csv 文件中。
LSTM 神經(jīng)網(wǎng)絡(luò)存在門(mén)限機(jī)制,能夠較好地記憶和遺忘數(shù)據(jù),對(duì)于關(guān)聯(lián)性較大的數(shù)據(jù)可以充分考慮之前數(shù)據(jù)對(duì)之后數(shù)據(jù)的影響,可以利用這種特點(diǎn)實(shí)現(xiàn)對(duì)metasploit 中不同payload 進(jìn)行記憶。
遺忘門(mén):

在遺忘門(mén)中,上一層輸出狀態(tài) payload,例 如Windows/meterpreter/reverse_http 會(huì)和本層的輸入向量進(jìn)行處理遺忘掉一些特征,比如http 協(xié)議,保留下reverse 這個(gè)建立通信隧道的方式,原理如下:
將輸入向量xt和上一層的輸入狀態(tài)ht-1合并經(jīng)過(guò)激活函數(shù)sigmoid(xt,ht-1)后得到門(mén)限向量ft,將ft和共享狀態(tài)Ct-1進(jìn)行點(diǎn)積操作,實(shí)現(xiàn)令Ct-1遺忘掉需要被舍棄的部分上一層狀態(tài)和本層輸入。
傳入門(mén):

在傳入層,本層的輸入會(huì)和上一層的輸入狀態(tài)payload 進(jìn)行處理,記憶上一層需要記憶的內(nèi)容,例如Windows/meterpreter/reverse_http就可以記住http 協(xié)議和reverse 反彈方式兩種對(duì)payload 的標(biāo)注,原理如下:
將輸入向量xt和上一層的輸入狀態(tài)ht-1合并經(jīng)過(guò)激活函數(shù)sigmoid(xt,ht-1)后得到新的門(mén)限向量it。輸入向量xt和上一層的輸入狀態(tài)ht-1合并經(jīng)過(guò)激活函數(shù)tanh(ht-1,xt)后得到新的門(mén)限向量lt,表示需要傳入的部分上一層狀態(tài)和本層輸入。再將lt和it進(jìn)行點(diǎn)積操作it*lt,并將結(jié)果和共享狀態(tài)Ct-1相加,表示需要傳入的信息被共享cell 狀態(tài)記憶,此時(shí)的Ct-1已經(jīng)完成了本層的更新,并成為Ct,等待輸出門(mén)的輸出操作。
輸出門(mén):

在輸出門(mén),確認(rèn)本次預(yù)測(cè)需要輸出的payload 信息,例如輸出經(jīng)過(guò)記憶和遺忘操作的新payload:Windows/meterpreter/ reverse_tcp,表示遺忘了上一層的http 協(xié)議,但是記住了reverse 反彈,原理如下:
將輸入向量xt和上一層的輸入狀態(tài)ht-1合并經(jīng)過(guò)激活函數(shù)sigmoid(xt,ht-1)后得到新的門(mén)限向量Ot,將更新后的Ct經(jīng)過(guò)激活函數(shù)tanh(Ct)后和Ot進(jìn)行點(diǎn)積操作tanh(Ct)*Ot,用于確認(rèn)哪些信息可以被輸出,更新ht-1為ht,傳遞ht和Ct到下一層重復(fù)三個(gè)選擇層操作。
總的來(lái)說(shuō),LSTM 門(mén)限機(jī)制會(huì)記憶住payload 中必要的信息,并且在下一預(yù)測(cè)中更加偏向于這種類(lèi)型的payload,成功率也就更高。因?yàn)闇y(cè)試的是單個(gè)目標(biāo)IP,如果該測(cè)試對(duì)象可以利用某種協(xié)議和某種方式建立單個(gè)連接,那么其他類(lèi)型的漏洞測(cè)試也可能適用于這種連接建立方式。
更新完訓(xùn)練集文件train.csv 后,即可對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。通過(guò)分割train.csv 文件不同列,得到訓(xùn)練集數(shù)據(jù),LSTM 層設(shè)置激活函數(shù)為relu,利用adam 算法反向傳播調(diào)整weight 和bias 值以降低損失值。LSTM-Exploit 利用tensorflow.keras 中封裝的LSTM 模型實(shí)現(xiàn)LSTM 長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)搭建。
利用keras 搭建單層單向LSTM 神經(jīng)網(wǎng)絡(luò):

工具架構(gòu)如圖1 所示。工具由信息搜集,獲取模塊,執(zhí)行測(cè)試三個(gè)功能組成。

圖1 工具架構(gòu)圖
(1)Learning 模式下
第一步,利用nmap 掃描目標(biāo)IP,并將結(jié)果導(dǎo)入到XML 文件中。獲取打開(kāi)的Web 端口并利用爬蟲(chóng)爬取網(wǎng)頁(yè)內(nèi)容,正則匹配得到網(wǎng)站啟用的CMS 和服務(wù)器信息。并和XML 文件內(nèi)容整合。
第二步,根據(jù)字典類(lèi)型數(shù)據(jù),向metasploit 中發(fā)送搜索exploit命令得到exploit->target->payload 信息,并根據(jù)exploit,payload的名稱(chēng)和必要參數(shù)篩選匹配的exploit 和payload 數(shù)據(jù)。
第三步,向Metasploit 發(fā)送測(cè)試指令,并將測(cè)試結(jié)果返回,本地將成功的測(cè)試結(jié)果整理成訓(xùn)練集并進(jìn)行訓(xùn)練得到LSTM 的模型。
(2)Test 模式下
前兩步和Learning 模式相同,第三步,通過(guò)Learning 模式訓(xùn)練得到的LSTM 模型訓(xùn)練搜集到的信息,直接得到payload,而不需要再和metasploit 通信得到所有payload,第四步,直接利用預(yù)測(cè)得到的exploit->payload 進(jìn)行測(cè)試,將成功結(jié)果保存到訓(xùn)練集csv 文件中,并重新訓(xùn)練并保存模型,將測(cè)試成功的exploit->target->payload 映射保存到csv 文件中方便查看。
Learning 模式用于前期的模型訓(xùn)練,Test 模式適用于真實(shí)滲透測(cè)試環(huán)境,并且能夠在每次訓(xùn)練后更新訓(xùn)練數(shù)據(jù),提高下一次模型的預(yù)測(cè)精度。
產(chǎn)品在不同環(huán)境下需要開(kāi)啟不同的端口,實(shí)現(xiàn)各種相互配合或者彼此獨(dú)立的功能。開(kāi)放的端口可以是WEB 服務(wù)器和中間件端口,也可以是數(shù)據(jù)庫(kù)端口和隧道協(xié)議端口。針對(duì)使用相同端口的不同版本服務(wù),可能存在未被補(bǔ)丁修復(fù)的已知漏洞。所以,為了發(fā)現(xiàn)現(xiàn)存漏洞,不僅需要大規(guī)模掃描端口,還需要獲取端口表示服務(wù)的banner信息,以及目標(biāo)服務(wù)運(yùn)行環(huán)境的主機(jī)信息。所以可以啟用metasploit 中內(nèi)置的nmap 功能對(duì)目標(biāo)進(jìn)行信息搜集,并對(duì)搜集到的WEB 端口獲取網(wǎng)站信息,用來(lái)實(shí)現(xiàn)可能的WEB 網(wǎng)站測(cè)試。
信息搜集代碼為:
#獲取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)
#利用爬蟲(chóng)爬取網(wǎng)站頁(yè)面
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 網(wǎng)頁(yè)信息
signature_data=Web_signature(target_port,self.target_ip,
nmap_data,self.signature_path,
self.signature_file,target_path)
#利用content 獲得Web 網(wǎng)頁(yè)信息
content_data=Web_content(Web_port,self.target_ip,nmap_data,
self.dirsearch_path,self.dirsearch_file)
根據(jù)搜集到的信息,以product 和ostype 為參數(shù),與metasploit進(jìn)行通信執(zhí)行search product 和show targets 命令,得到每個(gè)服務(wù)可以執(zhí)行的exploit 集合,以及exploit 集合中每個(gè)exploit 對(duì)應(yīng)的target 集合,并根據(jù)ostype 刪除不符合操作系統(tǒng)類(lèi)型的exploit 選項(xiàng),在Learning 模式和Test 模式下選擇不同方法獲取payload。
Learning 模式和metasploit 通信,根據(jù)選擇不同的exploit,獲取每個(gè)exploit 對(duì)應(yīng)的payload 集合代碼如下:
#得到metasploit 中所有的exploit 和payload
exploit_list=get_exploit_list(self.client)
payload_list=get_payload_list(self.client)
#根據(jù)信息搜集結(jié)果得到exploit
nmap_to_exploit=nmap_get_exploit(self.client,self.nmap_data,
exploit_list,self.allow_os_types,self.allow_services)
#根據(jù)exploit 得到target,payload
exploits_to_payloads=exploit_to_payloads(self.client,
nmap_to_exploit,exploit_list)
#合并以上信息得到完整單項(xiàng)匹配數(shù)據(jù)
execute_nmap_data,new_path_index=nmap_exploit_to_payloads(
self.nmap_data,exploits_to_payloads,payload_list,
self.path_index)
Test 模式下,利用現(xiàn)存模型預(yù)測(cè)得到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)
#預(yù)測(cè)payload
lstm_result=lstm_predict(nmap_exploit_targets,
self.model_path,self.model_name)
根據(jù)已經(jīng)探測(cè)好的exploit,target,payload 信息和metasploit通信得到測(cè)試模塊需要設(shè)置的options,將本地靜態(tài)文件中的配置寫(xiě)入對(duì)應(yīng)的options 中后和metasploit 通信測(cè)試對(duì)應(yīng)端口服務(wù),并將測(cè)試成功的結(jié)果保存到訓(xùn)練集文件中。通過(guò)導(dǎo)入訓(xùn)練集文件訓(xùn)練LSTM神經(jīng)網(wǎng)絡(luò),更新LSTM 模型,實(shí)現(xiàn)每次測(cè)試后預(yù)測(cè)精度的提高。
代碼如下:
# 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 腳本有著相同的功能,即能夠自動(dòng)化滲透,但是auto-pwn.rb 等傳統(tǒng)腳本采用的是if 判斷手段來(lái)進(jìn)行滲透測(cè)試,而LSTM-Exploit 采用的是LSTM 模型進(jìn)行測(cè)試,能夠明顯的提升效率,并且隨著測(cè)試的增多,也會(huì)使預(yù)測(cè)的準(zhǔn)確率得到提升。在面對(duì)不同的metasploit 版本時(shí),只需要添加靜態(tài)端口信息就能夠?qū)崿F(xiàn)信息加載,而不需要大量修改代碼來(lái)兼容metasploit 的漏洞集。為了和metasploit 框架通信,利用pymetasploit3 庫(kù),能夠直接訪問(wèn)metasploit內(nèi)置所有數(shù)據(jù),簡(jiǎn)化了編寫(xiě)網(wǎng)絡(luò)連接的過(guò)程。
但是LSTM-Exploit 也存在一些不足,此工具只能測(cè)試提前設(shè)定好的靜態(tài)服務(wù)端口,只能識(shí)別設(shè)置好的網(wǎng)站指紋和目錄信息,利用固定參數(shù)的漏洞載荷進(jìn)行測(cè)試。在Learning 模式下,由于對(duì)metapsploit的rpc 服務(wù)訪問(wèn)過(guò)多,不同漏洞利用模塊執(zhí)行速度不同,容易產(chǎn)生并發(fā)錯(cuò)誤導(dǎo)致服務(wù)崩潰。在實(shí)踐過(guò)程中還存在一些不便,未來(lái)還需要不斷完善。
網(wǎng)絡(luò)安全技術(shù)與應(yīng)用2021年7期