作者:w7ay@知道創宇404實驗室
English version: http://www.bjnorthway.com/905/

相比于無聊的用法介紹,我更想說一下Pocsuite3為什么會有這些功能以及是如何實現的。如果你也想制造一款類似的工具,Pocsuite3的一些思想或許能夠幫助到你。本文同時也是記錄Pocsuite3開發過程中的一些思考與理解。

簡介

Pocsuite 是由知道創宇404實驗室打造的一款開源的遠程漏洞測試框架。它是知道創宇安全研究團隊發展的基石,是團隊發展至今一直維護的一個項目,保障了我們的 Web 安全研究能力的領先。

你可以直接使用 Pocsuite 進行漏洞的驗證與利用;你也可以基于 Pocsuite 進行 PoC/Exp 的開發,因為它也是一個 PoC 開發框架;同時,你還可以在你的漏洞測試工具里直接集成 Pocsuite,它也提供標準的調用類。

Pocsuite3是完全由Python3編寫,支持Windows/Linux/Mac OSX等系統,在原Pocsuite的基礎上進行了整體的重寫與升級,使整個框架更具有操作性和靈活性。

巨人的肩膀

Pocsuite3在編寫時參考了很多市面上的開源框架以及流行成熟的框架,在代碼工程結構上參考了Sqlmap,Pocsuite-console模式則參照了routersploit與metasploit,所以PoC的代碼格式和以前有些差別(但是盡量克制了大的改動)。Pocsuite3也提供了非常簡單的接口調用,可以集成到其他安全工具內部。

下載

Pip 安裝

安裝有兩種,pip和直接運行源碼。

pip install -U pocsuite3 --no-cache-dir

將使用Pocsuite3最新版。

執行

pocsuite -h

檢驗安裝效果。

源碼安裝

如果你自信能折騰的話,可以下載源碼使用,這也是我們推薦的方式,因為pip的更新可能會慢于github,

wget https://github.com/knownsec/pocsuite3/archive/master.zip
unzip master.zip

同時需要安裝兩個依賴

pip install requests requests-toolbelt

如果同時也是Windows系統,除了上面的依賴還需要安裝一個

pip install pyreadline # Windows console模式下使用,如果不使用可以不安裝

最后

python cli.py -h

檢驗安裝效果。

另外需要注意的是,兩種安裝方式只可以取其一,不可同時安裝。建議使用源碼安裝的方式。

一般使用幫助

大多數情況,-h可以幫助你了解Pocsuite支持的功能。

一個簡單的測試

python3 cli.py -r pocs/ecshop_rce.py --dork ecshop --threads 5

將使用ZoomEye搜索ecshop并使用ecshop_rce.py探測,指定線程數量為5

Pocsuite的運行模式默認是verify驗證模式,此時對目標影響最小,也有attackshell模式,對目標進行相關攻擊與shell反彈(當然需要PoC的支持,Pocsuite的PoC編寫格式預留了這三種模式的接口,并且有很多內置API幫助實現這三種接口)

Shell模式

Pocsuite3新增加了shell模式的設定,當你選擇了此函數,Pocsuite3將會監聽一個端口,并等待目標的反連。我們提供了各種語言用于反連的payload,以及用于生成在Windows/Linux平臺下可執行的shellcode。

從配置文件運行

有時候命令行命令太多,有些參數的重用性比較高,Pocsuite也提供了從配置文件中運行的方法。

我們以redis未授權訪問漏洞為例,我們修改這個文件pocsuite.ini

線程也調整一下,RUN!

python3 cli.py -c ../pocsuite.ini

由于開啟了comparsion參數,我們可以看到更多的信息

1

如果你同時還是Zoomeye VIP,搜集目標的同時也能夠識別出蜜罐信息。目前只有通過Zoomeye接口獲取的數據才能有蜜罐的標識。Shodan、Censys暫未開放相關API接口。

插件系統

Pocsuite支持了插件系統,按照加載目標(targets),加載PoC(pocs),結果處理(results)分為三種類型插件。

Targets插件

除了本身可以使用-u-f加載本地的目標之外,你可以編寫一個targets類型插件從任何你想加載的地方加載目標(eg:Zoomeye、Shodan)甚至從網頁上,redis,都可以。Pocsuite3內置了四種目標加載插件。

從上文可以看出,如果使用了搜索dork—dork—dork_zoomeye—dork_shodan—dork_censys,相關插件將自動加載,無需手動指定。

Pocs插件

原來只能通過從seebug中調用插件,現在將這種方式抽離出來作為插件,將允許從任何能夠訪問的地方調用,甚至寫一個插件在github上維護一個倉庫調用都行。

Demo:

https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/plugins/poc_from_redis.py

https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/plugins/poc_from_seebug.py

Results-plugin

Results插件允許對掃描的結果進行處理,可以參考內置的兩個插件,保存結果為html與保存結果為txt。Results插件的結果是實時的,具體可以看plugins/file_record.py的實現方式。

https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/plugins/html_report.py

https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/plugins/file_record.py

調用插件

通過--plugins在后面指定插件名稱,多個插件可以用,分割。例如--plugins html_report將會生成HTML報表格式文檔。

內置API

基于我們漏洞應急的積累,基本上Pocsuite內置的API接口可以做到PoC編寫的全覆蓋了。很多API接口我們下一章再說,這里說兩個比較有趣的案例。

Shellcode生成支持

在一些特殊的Linux和Windows環境下,想得到反彈shell條件比較困難。為此我們制作了用于在Windows/Linux x86 x64環境下的用于反彈的shellcode,并制作了接口支持,你在只需要擁有命令執行權限下便可以自動將shellcode寫入到目標機器以及執行反彈shell命令。Demo Poc:https://github.com/knownsec/pocsuite3/blob/master/pocsuite3/pocs/thinkphp_rce2.py

HTTP服務內置

如果你們還對Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE! 有印象。多么完美的漏洞,但是在編寫PoC的時候我們遇到了困難,verify模式我們可以輕松用Ceye來識別,但是attack模式與shell模式我們就必須要制作自己的Jar并將它上傳到服務器上面!

為此我們制作Jar格式打包的API以及HTTP服務API,在后面的眾多越來越難以自動化的PoC編寫中,會發現它是如此好用。

附 Jenkins Abusing Meta Programming for Unauthenticated RCE(CVE-2019-1003000) with Pocsuite3 演示視頻。

https://www.youtube.com/watch?v=5P7WWlqYt4U

自定義參數傳遞

隨著編程人員的安全意識逐漸提高,會發現以前一條鏈接就可以獲取RCE的時代已經過去了。越來越多的漏洞轉向需要一定"權限"才能觸發。為此,我們需要在Pocsuite3預留參數接口。

在盡量保持原有PoC格式的前提下,我們增加了一個_options方法,用于指定用戶傳遞的參數。DemoPoc: https://github.com/knownsec/pocsuite3/blob/master/tests/login_demo.py

我們定義了在Poc中需要傳遞usernamepassword兩個參數,為了使用的方便,可以直接在命令行模式下如下

python3 cli.py -u http://localhost -r tests/login_demo.py --username "404team" --password "password"

是的,就是這么簡單。可能你會問如果PoC中定義的參數與Pocsuite自帶的參數名沖突了如何解決?我們的解決辦法是不允許定義沖突的參數名,Pocsuite在啟動時就會檢查,如果有沖突的參數名會提示你修改PoC中的自定義參數名稱。

Console模式

在某些情況下,我們也考慮到了可交互的命令模式(黑客的儀式感)。并且它完全能兼容命令行模式下的PoC,如果你在Linux或Mac下使用它,將得到更好的體驗。

一些Tips:

  • 在此模式下多用help可以明白更多
  • 加載PoC插件時,可以直接use + 數字,更簡單方便,當然輸入完整路徑也可以,按下Tab會自動補全。
  • 有一些命令別名沒有在help中顯示,作為彩蛋等待使用者發現~image-20190424141427790

API 通用集成

我們鼓勵也支持將Pocsuite3作為安全產品中的一部分。只需要將Pocsuite3作為模塊導入到你的項目中就能輕松使用。后面我們也會詳細說明Pocsuite3是如何做到這一點的。

pocsuite3.api將Pocsuite中所有接口暴露出來,不管是寫PoC還是集成到自己的環境,只需要使用這就可以。一個簡單調用Demo。

from pocsuite3.api import init_pocsuite
from pocsuite3.api import start_pocsuite
from pocsuite3.api import get_result
from pocsuite3.api import path
import os

config = {
  'url': 'https://www.baidu.com/',
  'poc': os.path.join(paths.POCSUITE_ROOT_PATH, "../tests/login_demo.py"),
  'username': "asd",
  'password': 'asdss',
  'verbose': 0
}
# config字典的配置和cli命令行參數配置一模一樣
init_pocsuite(config)
start_pocsuite()
result = get_results().pop()
print(result)

最后

一個功能完備的框架并不只是一個可以批量處理任務的引擎,很多東西需要在實戰中積累并以最好的方式實現出來(俗稱踩坑)。在打造自己的PoC框架過程中,一定要清楚自己需要的是什么,以及用何種方式將它優雅的解決?下篇將具體談談Pocsuite3中的框架結構。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/904/