自動化滲透:DeepExploit框架深度分析
一、背景知識介紹
DeepExploit 是一種基于強化學習的自動化滲透框架,號稱能夠進行高效滲透,本文對該工具進行了分析并給出改進方向
本部分對DE(將DeepExploit簡稱為DE)利用到的核心工具做簡單介紹,分為metasploit介紹和強化學習算法介紹,均為入門介紹,熟悉的讀者可自行忽略。
1.1 metasploit簡介
Metasploit是一款非常流行的滲透測試框架,里面包含了大量知名軟件漏洞利用工具,其payload利用效率非常高效,并且還支持用戶自定義開發漏洞利用模塊。在使用metasploit時需要設置一些比較重要的參數:
漏洞利用模塊(exploit模塊),不同的漏洞需要選擇不同的模塊進行利用,而同一服務,往往存在多種漏洞,為了驗證漏洞存在,往往需要設置不同漏洞利用模塊進行測試。
target,每個exploit模塊都需要設置很多參數,其中target為比較重要的參數(metasploit會設定一個默認值),代表不同的操作系統類型,如圖1所示,target值為0代表設定目標的操作系統為 Windows 2000 SP4。

圖1、metasploit中exploit模塊下target參數含義樣例[3]
payload,該參數為exploit模塊中需要設置的另一個重要參數(也會有默認值),意為攻擊進入目標主機后需要在遠程系統中運行的惡意代碼,其中,Shellcode是payload中的精髓部分,攻擊者可以通過shellcode建立與目標系統的shell連接,方便地控制目標機。圖2為payload樣例

圖2、metasploit中exploit模塊下payload參數含義樣例[3]
以上3個參數為DE框架在運用強化學習算法進行滲透測試時所需選擇的重要參數。
1.2 強化學習算法簡介
強化學習是機器學習中的一個領域,強調如何基于環境而行動,以取得最大化的預期利益,是除了監督學習和非監督學習之外的第三種基本的機器學習方法。其基本框架如圖3所示,基本流程為:智能體(agent)通過觀察環境(Environment)的狀態(State)做出行動(action),該行動會作用于環境,改變環境的狀態,并且產生相關聯的獎勵(reward),智能體通過觀察新的狀態和獎勵來進行下一步動作,由此循環。在這個過程中,智能體會不斷得到獎勵(有好的有壞的),從而不斷進化,最終能以利益最大的目標實施行動。

圖3、強化學習基本框架[4]
強化學習有幾大要素,這些要素的定義至關重要,不同場景下,要素的定于也不盡相同,而這些要素的合理定義往往也決定強化學習算法能否生效。具體來說,想要使用強化學習來求解一個問題,首先需要定義如下3大要素:
- State(狀態空間),state通常是算法的輸入,包含agent作出action所需要的所有信息,需要滿足馬爾科夫性質,即agent可以僅根據當前做出動作,無需考慮過去的狀態。
- Action(動作空間),action一般就是算法的輸出,action是agent能夠對環境產生影響的手段,所以一個任務的action設置的最基本要求是能夠對environment產生有效影響。
- Reward(收益),reward是算法學習的指導,reward的設置往往決定了算法的最終效果是否理想,因此如何有效的設置reward也成為了強化學習應用的一個重要問題。
在對以上3大要素進行合理定義后,算法(如A3C算法)才算有使用的基礎。由于強化學習算法眾多,也不是本文的關鍵,筆者將不再展開論述。總之,強化學習任務中,3大要素的定義至關重要,定義越合理,問題的解決程度就越高。
溫馨提示:讀者可以通過對DE框架對3大要素的定義,判斷其合理性。
二、自動化滲透測試與DeepExploit框架
- 自動化滲透測試
隨著安全市場的不斷擴大,滲透測試的需求也在不斷增長,有研究預估到2025年,全球滲透測試的市場份額將會達到45億美元(2020年17億美元),相應的,滲透人才也極度短缺 [1],在這種背景下,國內外很多很多公司都有研發自動化滲透測試工具來滿足市場需求、緩解人才短缺的壓力。
自動化滲透測試,顧名思義,即自動化完成滲透測試的過程。從內容上講,一般來說人工滲透測試需要包含:信息收集、漏洞探測、漏洞利用、權限維持、后滲透、生成報告等常規步驟,一般市面上自動化滲透測試產品也都包含這些功能,從能力上講,自動化工具需要回答兩個核心問題:1. 自動化工具能發現多少風險點;2. 自動化工具對滲透測試的效率提升有多大。這兩個問題的解決程度決定了自動化工具的優劣。
在滲透測試的過程中,“漏洞探測”往往是最耗時的一步。為了發現目標系統的安全問題,滲透測試工程師一般先用漏掃工具對目標系統進行掃描測試,若未發現問題,則需要進行長期的人工滲透過程。理論上講,為了提升滲透效率,那么自動化滲透的核心價值應體現于現實中最耗時耗力的部分(漏洞探測)上,將上述長期的人工滲透過程進行自動化。但是就目前來講,大部分自動化滲透產品的做法是簡單地將漏掃的結果與相關的利用工具相結合,從而達到自動化滲透的效果,而“人工滲透的過程”并未有效實現自動化。
自動化滲透工具能多大程度解決上述問題呢?我們通過一個開源的自動化滲透框架DeepExploit來分析自動化滲透測試領域當前的前沿進展(DeepExploit應該具有代表性)。
- DeepExploit框架簡介
DeepExploit是一種基于強化學習的自動化滲透框架,由日本的一家名為MBSD的公司研發,在自動化滲透方向為大眾所熟知,在github上的star數量高達1600+,其開發人員曾在很多知名大會上介紹過該工具,如:DEFCON 2018,Black Hat 2018等,這些演講進一步拓展了該工具的知名度。
DeepExploit底層使用Metasploit進行滲透,使用強化學習技術來提升滲透效率,可以達到“給定目標IP,輸出shell”的效果,除了“權限維持”功能外,其他步驟均已實現全自動,根據github頁面介紹,特點如下:
- 高效滲透。利用機器學習,最佳情況下,只需一次利用便可成功getshell;
- 深度滲透。可以內網擴散;
- 自學習。利用強化學習進行自學習,無需準備數據;
- 學習時間快。利用A3C算法加速學習;
- 強大的情報收集能力;包含:端口掃描,服務及版本識別(包含nmap識別,機器學習識別,爬蟲識別)
針對這些特點,本文將給出詳細的分析,以向讀者展現該工具的適用性與實用性。
三、背景知識介紹DeepExploit框架深度分析
本小節中,我們首先介紹DE框架的整體運行流程,然后對照源碼,描述其核心邏輯,最后總結DE框架的優缺點,提出改進方向。
3.1 DeepExploit框架流程分析
我們先來通過官網[1]的架構圖(圖4)來了解DE的核心流程,從圖中我們可以看到DE通過RPC協議與metasploit進行通信,調用metasploit進行滲透,其核心在于強化學習算法(A3C算法)的使用,該算法整體上分為兩個步驟:訓練(testing)和測試(training),在訓練階段,會利用框架對靶標進行滲透測試,并保存訓練數據,訓練好A3C模型,在測試階段,根據訓練好的強化學習模型,對目標進行高效的滲透(以足夠少的嘗試次數完成對目標的滲透)。
圖4、DeepExploit核心架構圖
整體上該框架圖看似符合其宣稱的“利用強化學習算法進行高效滲透測試”,接下來我們通過對其源碼的分析畫出詳細的框架流程圖(圖5),其中綠色方框為框架內置的支撐數據,藍色方框代表主要流程,黃色方框為判斷邏輯。框架整體上包含滲透測試過程的:信息收集、漏洞探測、漏洞利用、后滲透、生成報告的幾個步驟。

圖5、 DeepExploit框架詳細流程圖
在信息收集過程中,主要目標是獲取目標系統上運行的服務及其版本號,為了實現這一目標,DE首先使用nmap工具進行簡單的服務識別,當遇到web服務時,會啟動爬蟲,爬取目標頁面(默認只爬到第二層頁面),通過內置的指紋庫1和機器學習模型識別出頁面背后的服務,并且為了避免爬蟲的遺漏,會通過內置的指紋庫2訪問主流服務的路徑,若路徑存在則代表服務存在,從而得到目標機器完整的服務及其版本信息。框架只支持一些特定服務的滲透,會過濾掉不支持的服務類型,最終得到要進行滲透測試的服務列表。該部分為官網所說的特點5(強大的情報收集能力)。
圖5所示的“測試模式過程”和“訓練模式過程”為DE的核心部分,也是使用強化學習算法的部分。為了使用強化學習,DE框架將強化學習的3大要素中定義如下:
- 狀態空間。DE用5個狀態表示其狀態空間,在代碼中表示為(ST_OS_TYPE,ST_SERV_NAME,ST_SERV_VER,ST_MODULE,ST_TARGET),分別代表:操作系統版本,端口上服務名稱,服務版本,要利用msf的模塊名稱編號,模塊中的target參數。
- 動作空間。DE的動作空間為metasploit模塊中所有payload集合。筆者使用的metasploit版本為v6.1.9,payload總數為593個。
- 收益。DE將收益定義為3種:R_GREAT=100,R_GOOD = 1,R_BAD = -1,R_GREAT代表可以進行后滲透測試(返回的shell類型為meterpreter,而DE利用meterpreter進行后滲透),R_GOOD代表能返回shell但是不能獲得meterpreter shell(意指無法利用該機器進行后滲透),R_BAD代表漏洞利用失敗。實際上,在DE中,后滲透模塊沒有開發完善,只要能返回shell,都會被賦予最大收益GREAT。
在訓練模式中,DE首先進行狀態空間初始化,其中ST_OS_TYPE是固定不變的,ST_SERV_NAME和ST_SERV_VER會在隨機選擇信息收集階段中識別到的設備上的服務和版本,確定ST_SERV_NAME后,在metasploit中根據語句“search name: + ST_SERV_NAMEtype:exploit app:server”返回的可利用模塊列表,隨機選擇一個模塊確定ST_MODULE,ST_TARGET在模塊可選的target列表中隨機選擇;確定狀態后,A3C算法會計算每個payload的概率,選擇一個概率最高的payload后,利用以上信息調用metasploit進行漏洞利用;當滲透失敗時,會隨機更換target,由于不用target對應的可利用payload不一樣,此時需要重新利用A3C算法計算概率最大的payload進行利用,當該步驟到一定次數還未成功,會再次進行狀態空間初始化,對其他的服務、模塊進行嘗試。整個訓練過程采用多線程并發的方式進行,線程之間沒有任何通信機制,以此方式進行算法的并行化。
測試模式為在實際環境中使用的模式,相比于訓練模式多了后滲透這一步。測試模式首先計算每種狀態空間下,payload的概率,根據該概率由大到小的順序調用metasploit進行滲透,一旦滲透成功,則進行后滲透;在后滲透的過程中,首先利用arp協議進行內網存活主機識別,然后調用metasploit框架中自帶的代理模塊“auxiliary/server/socks4a”搭建代理,對新識別的到的主機進行下一步滲透,直到沒有新的主機出現。
在訓練模式或測試模式結束后,會生成報告,內容包含滲透成功的主機上所有漏洞信息和相關metasploit的利用參數。
3.2
DeepExploit框架點評
不可否認,DeepExploit框架確實能夠進行自動化滲透,但是通過對強化學習的介紹和DE框架詳細流程的介紹,對于其號稱的“高效”滲透,仍需打個問號。
筆者認為DE框架最大問題在于使用的是偽強化學習,雖然整個框架看起來是強化學習環境+智能算法+反饋 這樣的路線,但是在問題定義上出現了根本性的問題:動作和狀態之間完全割裂。在背景知識中我們提到,強化學習中,動作需要對環境產生有效影響,從而產生環境狀態的改變,但是DE框架的狀態轉移完全是隨機的,跟動作無關。這一點不僅與強化學習的概念相左,也無法契合滲透測試的流程,滲透測試中,滲透人員會根據上一步的執行情況來決定下一步要執行的動作,而DE框架的狀態轉移是隨機的,意味著執行的動作也是隨機的。
該問題也說明了DE框架對于狀態空間和動作空間的定義是有問題的,在該定義下,強化學習算法并不能有效發揮作用。
除了該核心問題,DE框架在設計上仍然有些瑕疵,筆者將之枚舉,使用該框架的讀者朋友可以關注。
1. 服務支持問題。DE框架的“config.ini”文件中限定了DE只支持如下服務的滲透:vsftpd@ssh@telnet@postfix@bind@apache@rpc@samba@java@proftpd@mysql@postgresql@vnc@irc@jetty@tomcat@ldap@nginx@php@phpmyadmin@wordpress@joomla@drupal@sugarcrm@webmin@moodle@dav@oscommerce@tikiwiki@phpbb@mediawiki@unix@python@ubuntu@http@ms-wbt-server@upnp。一方面,metasploit所支持的服務遠遠不止這些,筆者不理解DE為什么需要限定服務,因為DE調用metasploit的接口進行滲透,對于所有metasploit支持的服務,DE理論上也可以支持;另一方面,DE沒有做不同軟件對同一服務在名稱上的映射,具體來說,DE使用nmap進行服務識別,將服務名稱在metasploit中搜索可以利用的滲透模塊,可nmap和metasploit對于同一服務往往使用不同名稱進行表示,不同版本之間也有差異,如smb服務:在metasploit搜索關鍵詞“smb”即可,而nmap對smb服務的識別結果為“microsoft-ds” ,該關鍵詞在metasploit中無效。經過筆者的手動測試,大多數流行服務在兩個軟件中都存在服務名稱不一致的問題,這也直接導致了DE框架可用性的大幅下降,甚至連傳播甚廣的“MS17-010”永恒之藍漏洞都無法利用。
2.服務識別問題。DE框架在遇到web服務時,會開啟爬蟲,默認只爬到第二層頁面,按照:匹配指紋庫1,機器學習識別,訪問指紋庫2的流程進行服務識別。整個流程特別耗時,并且機器學習算法(樸素貝葉斯)在筆者使用過程中幾乎是0貢獻,該流程與一般漏掃的服務流程基本一致, “強大的情報收集能力”能力(特點5)并未體現。
3.算法邏輯問題。除了上述算法使用不符合強化學習的邏輯外,DE還有一些邏輯問題會影響滲透效果:第一,DE會隨機選擇target嘗試進行滲透,但是根據前文介紹,target代表的是操作系統,而操作系統DE在信息收集階段已經識別了,并且作為狀態中的一個變量ST_OS_TYPE,那么還有什么必要進行所有target的嘗試呢?第二,DE將“是否返回metepreter shell”作為漏洞是否利用成功的標志從而進行后滲透,既然如此為什么要嘗試其他類型的payload呢?筆者使用metasploit中的payload共計593種,meterpreter shell 只有167種,這意味著,有426種payload實際上無需嘗試。因為這兩種邏輯問題,保守估計,DE起碼進行了至少10倍以上的無效嘗試;除卻無效嘗試,DE還存在“漏嘗試”的情況,有些payload始終未被嘗試,如圖5所示,在訓練模式下,A3C算法對每個payload計算概率,對利用成功率最大的payload進行嘗試,這種方式直接導致,在同一模型、同一狀態下,始終測試同一個payload,雖然模型在訓練的時候會動態更新,但是這種設計思路仍會存在某些payload未曾測試的情況,遺漏有可能利用成功的payload。總結來說,DE的算法邏輯增加了大量的無效嘗試,并且還有可能會漏掉能夠利用成功的嘗試。
4.程序設計問題。DE在訓練模式中使用了多線程進行加速,但是線程之間完全獨立,metasploit滲透的各個參數(服務+模塊+target)又都是隨機的,這種設計機制會導致:同一線程內出現重復的嘗試,不同線程出現重復的嘗試。在一次使用情況中,筆者至少遇到了完全相同的利用嘗試20次(默認開的20線程),這種大量的重復嘗試極大降低了滲透效率。
5.滲透目標問題。DE框架判定滲透成功的標志為“返回了meterpreter shell”,計算的是在“服務,模塊,target”確定的情況下,不同payload的成功概率,但是在一般滲透測試過程中,需要判斷的往往是“某種漏洞能否利用成功”,換句話說,即metasploit中的某個模塊能否利用成功,至于利用成功后的動作(payload)不是重點。若能改變滲透目標,計算每個模塊的成功概率,會更加符合實際需求。
上述問題會直接導致DE的可用性下降,所幸這些問題并不難解決,優化后可大幅提升漏洞利用效率。
最后,筆者對于官網所說特點2(深度滲透)和特點3(自學習)做一些補充說明:特點2中所說的深度滲透屬于后滲透,DE框架并沒有完全實現,功能尚不能順利使用;自學習并不是說真的不需要訓練數據,需要自己搭建靶場,程序運行過程中會自動產生所需數據。
3.3 DeepExploit改進方向
若需要基于DeepExploit進行自動化滲透,筆者認為可以按照如下順序進行優化,進一步提升滲透效率。
- 解決上小節中所述的“瑕疵”,如無效嘗試、重復嘗試、遺漏嘗試、服務支持問題等等,其中服務支持問題可能難度較大,不同軟件之間對同一服務的命名往往存在一定差異,可以考慮機器學習的方式進行識別。
- 重新定義強化學習的3大要素。目前的定義方式不適合使用強化學習算法,需要對狀態空間、動作空間,甚至收益做重新定義,從而使用強化學習算法。對于強化學習算法使用必要性,筆者認為強化學習算法與滲透測試的過程天然吻合,都需要根據當前狀態來判斷下一步的動作,且每一個動作是否成功、最終目標都相對明確,因此可以考慮進行周密設計。
- 使用傳統機器學習算法。按照DE框架對狀態和動作的定義(動作對狀態不起作用),可以使用傳統機器學習算法,計算每種狀態下,不同動作的成功概率。相較于強化學習算法,傳統機器學習算法更適用于DE框架。
3.4小節
本小節詳細介紹了DeepExploit框架的核心邏輯,并且分析了其優劣,給出了改進方向。總結來說DeepExploit在功能上能夠實現自動化滲透,但其宣稱的強化學習算法并沒有被有效使用,框架整體上也有一些待完善的地方。從核心功能看,DeepExploit目前僅比傳統漏掃多了漏洞利用這一步,并未將第二節所述的“長期的人工滲透過程”進行自動化,對滲透測試整體效率提升不大。
四、總結
本文介紹了自動化滲透領域廣為大眾所知的DeepExploit框架,并詳細分析了其內部原理,通過對其源碼的分析,筆者發現DeepExploit并不能實現其宣稱的高效滲透,或者說有諸多待改進之處。對于影響滲透效率的非核心問題,如:服務支持問題,各種邏輯問題等等,筆者將其列出,這些問題不難解決,對于核心的算法問題,筆者給出可能的改進方向。而滲透測試最耗時的“人工滲透”部分,DeepExploit并未將其自動化,自動化滲透領域還有很長的路要走。
參考文獻
[1]MarketsandMarkets. Penetration testingmarket by component. 2020
[2]https://github.com/13o-bbr-bbq/machine_learning_security/tree/623c97a69c47972c9b2788f6a6c19eda24b7fa74/DeepExploit
[3] https://paper.seebug.org/papers/old_sebug_paper/other/metasploit_users_guide_chinese.pdf
[4]https://zh.wikipedia.org/wiki/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0