打造自己的滲透測試框架 — 溯光

凌天labs發表於2019-05-24

TrackRay簡介

溯光,英文名“TrackRay”,意為逆光而行,追溯光源。同時致敬安全圈前輩開發的“溯雪”,“流光”。

 

溯光是一個開源的外掛化滲透測試框架,框架自身實現了漏洞掃描功能,整合了知名安全工具:Metasploit、Nmap、Sqlmap、AWVS等。

 

溯光使用 Java 編寫,SpringBoot 作為基礎框架,JPA + HSQLDB嵌入式資料庫做持久化,Maven 管理依賴,Jython 實現 Python 外掛呼叫,quartz 做任務排程,freemarker + thymeleaf 做檢視層,Websocket 實現命令列式外掛互動。

 

框架可擴充套件性高,支援 Java、Python、JSON 等方式編寫外掛,有“漏洞掃描外掛”、“爬蟲外掛”、“MVC外掛”、“內部外掛”、“無互動外掛”和“可互動外掛” 等外掛型別。

功能展示

>>>>主頁

>>>>登入

>>>>任務建立

>>>>任務列表

>>>>任務詳情

>>>>無互動介面外掛呼叫

>>>>MVC外掛示例

>>>>互動式外掛控制檯

>>>>MSF 控制檯

依賴環境

JDK 1.8
Python 2.7
Maven
Git
Metasploit
Nmap(建議安裝)
SQLMAP(建議安裝)
AWVS

 

**加粗為必須環境,沒有安裝程式則無法正常編譯執行

 

不論是 Windows 還是 linux 一定需要先安裝 JDK1.8 和 Maven。安裝過程這裡不做演示。保證 JDK 和 Maven 都在系統環境變數,能執行java -version 和 mvn --version即可。

安裝過程

>>>>第一步

手動啟動 AWVS 服務

 

 

登入後臺,生成一個API密匙。

 

 

複製密匙和 AWVS 的地址。

 

找到web/src/main/resources/application.properties配置檔案。

 

修改如下部分

 

>>>>第二步

找到你 python 的第三方庫目錄。

 

Windows 的一般在 python 安裝目錄下的/Lib/site-packages

 

Linux 下可以通過輸出 sys.path 來找第三方包路徑

 

 

我的是 D:/Python2/Lib/site-packages

 

同樣找到web/src/main/resources/application.properties配置檔案。

 

修改python.package.path引數

 

>>>>第三步

安裝 Maven 後找到倉庫位置。

 

如果沒有在 settings.xml 裡配置指定倉庫目錄,預設會在當前使用者目錄中生成一個 .m2的目錄

Linux /root/.m2/repository
Windows C:/Users/blue/.m2/repository

 

找到倉庫目錄後修改 application.properties 的 maven.repository.path引數

 

>>>>第四步

這個是 DNSLOG 回顯檢測漏洞時需要的。

 

去 ceye.io 註冊一個賬號,拿到給你分配的域名和 TOKEN。

 

 

修改配置檔案

 

>>>>第五步

啟動 msf 和 sqlmapapi。

 

如果你是 kali 作業系統,可以直接執行startdep.sh。

 

如果是其他系統,則要找到 metasploit 和 sqlmap 的目錄分別執行

 

 

 

啟動成功後修改配置檔案

 

 

>>>>第六步

編譯打包程式

Windows 下執行package.bat
Linux 下執行 package.sh

 

等待依賴下載完成和編譯完成,如果以上操作都沒有出現問題則會提示 BUILD SUCCESS

 

 

編譯成功後會在當前目錄打包一個trackray.jar就是溯光的主程式。

 

然後直接執行startup.bat或startup.sh溯光就會啟動服務。

 

 

沒有丟擲異常或ERROR日誌,訪問 8080 埠正常。

 

##服務啟動正常後,登入 iZone 社群賬號。

 

開發外掛建議使用 Intellij IDEA IDE,需要安裝 lombok 外掛。

目錄結構

外掛

AbstractPlugin
這是互動式外掛和非互動式外掛的父類。

 

BASE常量

 

其中的靜態常量 BASE 是 /resources/include/ 的所在目錄。

 

如果你的外掛需要額外的靜態資源,那麼你可以在 /resources/include 目錄裡建立一個和外掛 KEY 相同的資料夾,便於識別,如果沒有在 @Plugin 註解中設定 value 則預設的外掛 KEY 就是當前類名首字母小寫。

 

如 Typecho001 = typecho001

 

check(Map<String,Object> param)

 

 

這是用於檢驗是否合規的方法,需要被強制重寫,當返回 true 時才會呼叫 start() 方法

 

param 引數是從前臺傳過來的引數鍵值對。

 

常被用於檢驗引數格式是否正確或漏洞是否存在。

 

after()

 

在 start() 方法之前呼叫

 

before()

 

在 start() 方法之後呼叫

 

start()

 

 

這是一個抽象方法,所有繼承了該類的子類都需要重寫這個方法。

 

在 check 方法通過後會呼叫 start() 方法

 

start() 方法返回值最終會會當做外掛結果,響應給前臺。

 

shell()

 

呼叫當前系統 shell 來輔助完成外掛功能。

 

executor()

 

外掛執行的主方法

 

crawlerPage

 

http請求物件(不推薦使用)

 

fetcher

 

執行 http 請求物件(不推薦使用)

 

errorMsg

 

當校驗不通過時,返回給前臺的資訊。

 

param

 

前臺傳過來的引數鍵值對

 

requests

 

HTTP 發包工具(推薦使用)

 

hackKit

 

hack 常用工具包

無互動外掛

無互動外掛需要你填寫好所有要填寫的引數,直接請求介面來執行外掛。

 

預設需要去繼承 CommonPlugin類。

 


這是一個抽象類,繼承了 AbstractPlugin

 

主要多出來兩個屬性:request 和 response。

 

繼承了 CommonPlugin 的類可以通過呼叫這兩個屬性來控制請求和響應內容。

 

Type 和 Charset 列舉類,用於在外掛註解裡宣告當前介面返回的資料格式和編碼型別。

 

無互動外掛同時也需要使用 @Rule 和 @Plugin 外掛,這兩個註解後面會講到。

 

在 http://127.0.0.1:8080/api,找到相應的外掛填寫好引數提交即可完成呼叫。

 

或直接呼叫介面。

http://127.0.0.1:8080/plugin/use?key=外掛KEY&引數=引數值

互動式外掛

互動式外掛一般在命令列控制檯中呼叫,可以允許你通過命令列互動來完成外掛的呼叫。

 

互動式外掛由 Websocket 實現,想要寫一個互動式外掛,首先要繼承 WebSocketPlugin 類。

 

同時設定 @Rule 註解的 websocket 引數為 true ,如果需要非同步互動需要將 sync 也設定為 true。

 

 

內部外掛

所屬包:con.trackray.module.inner

 

內部外掛是不可以通過外部去呼叫的,需要繼承 InnerPlugin 並使用 @Plugin 註解,通常在漏洞掃描時時會呼叫。

 

例如 “網頁爬蟲”,“指紋識別”,“埠掃描” 等,都是通過呼叫內部外掛實現的。

 

還有用於檢測 SSRF 等漏洞用的 FuckCeye 外掛也屬於內部外掛。

 

通過 spring 的自動注入,來注入內部外掛到當前物件。

例子可參考 WebLogicWLSRCE.java

爬蟲外掛

所屬包:con.trackray.module.crawler

 

爬蟲外掛會在掃描任務被勾選“網頁爬蟲”時呼叫,每爬取一條請求就會呼叫一次爬蟲外掛。

 

爬蟲外掛需要繼承 CrawlerPlugin,繼承該類必須重寫 check 和 process 方法。

 

check 方法用於檢驗請求是否符合外掛規則,以免產生多餘請求。

 

check 方法返回為 true 時會呼叫 process 方法。

 

process 方法裡寫外掛主要檢測程式碼。

 

addVulnerable()

 

當外掛檢測出漏洞時,可以通過呼叫 addVulnerable() 方法來向資料庫插入一條漏洞。

 

requests

 

requests 屬性為請求工具包,處理 https 和 http 都很方便。

 

response

 

response 屬性為當前爬蟲得到的 HTTP 響應。

 

task

 

task 屬性為當前任務物件,如果你的爬蟲外掛不是檢測漏洞而希望是檢測一些敏感資訊的話可以修改 task.getResult() 裡的屬性。

 

參考 FingerProbe.java 或 InfoProbe.java。

 

target

 

爬蟲爬取到的 URL 物件。

 

fetcher & crawlerPage

 

http 請求物件(不建議使用)。

漏洞掃描外掛

漏洞掃描外掛會在,掃描任務中勾選“漏洞攻擊模組”時呼叫。

 

漏洞掃描外掛分為三種

1.獨立外掛

com.trackray.module.exploit

 

獨立的漏洞掃描外掛需要繼承 AbstractExploit 並使用 @Plugin 或 @Exploit

 

AbstractExploit 中有以下需要了解的方法和屬性。

 

requests

 

http / https 發包工具

 

target 當前掃描任務的地址。

 

task

 

當前掃描任務物件。

 

check()

 

check 是一個抽象方法,需要被子類強制重寫。

 

該方法一般用於檢驗是否符合當前漏洞掃描外掛的規則,以免產生多與請求。

 

attack()

 

attack 也是一個抽象方法,需要被子類強制重寫。

 

該方法是檢測漏洞的主方法。

 

before()

 

在 attack 方法前執行

 

after()

 

在 attack 方法後執行

 

addVulnerable()

 

當外掛檢測出漏洞時,可以通過呼叫 addVulnerable() 方法來向資料庫插入一條漏洞。

 

fetcher & crawlerPage

 

http 請求物件(不建議使用)。

2.漏洞規則

位於

com.trackray.module.inner.SimpleVulRule

 

實際上這是一個“內部外掛”,會在勾選漏洞模組攻擊時呼叫。

 

有一些漏洞檢測方法很簡單,只通過簡單的判斷響應體就能識別出來,也就沒有必要再去寫一個獨立的外掛而佔用空間了。

 

在 doSwitch() 方法中會先去根據當前任務的指紋識別結果走一遍 switch 流程。

 

swtich 的每一個 case 都是 WEB 指紋的列舉物件。
當 switch 找到當前任務 WEB 指紋對應的 case 後,case 內的程式碼會通過構建一個漏洞規則新增到 loaders 集合裡。
如果規則是通用的,可以寫在 switch 的外面。

例:phpcms 的 authkey 洩漏漏洞規則

 

3.kunpeng JSON外掛

kunpeng 是一個 go 語言編寫的 poc 測試框架,這裡我對 kunpeng 的 JSON 外掛做了一個支援。

 

只需要按照 kunpeng json 外掛的格式規範建立一個 json 檔案到 /resources/json 目錄。

 

在掃描任務勾選“漏洞攻擊模組”時會被呼叫,或通過 MVC 外掛呼叫 http://127.0.0.1:8080/apps/json。

MVC 外掛

位於

com.trackray.module.mvc

 

MVC 外掛的特點在於,他可以像是在寫一個功能一樣,而非簡單的介面式呼叫。

 

MVC 外掛需要繼承 MVCPlugin 類,並使用 @Rule,@Plugin 註解。

 

MVCPlugin 內建了一個 ModelAndView 物件, 是 SpringMVC 提供的。

 

可以通過 setViewName() 來指定檢視層的網頁模板。

 

通過 addObject(key,value) 向檢視層網頁模板注入引數。

 

這裡的檢視層是使用 thymeleaf 實現的,需要懂 thymeleaf 的語法。

 

例子可以參考:com.trackray.module.inner.JSONPlugin

 

繼承 MVCPlugin 必須要重寫一個 index 方法,這是外掛的入口。

 

如果需要寫其他的功能,就得再建立一個 public 返回值為 void 的無參方法。

 

並且要在該方法上使用 @Function 註解,該註解的 value 引數如果不填寫的話則預設的 requestMapping 地址為方法名。

 

例如

http://127.0.0.1:8080/plugin/mvc/pentest/index 對應 index()

 

http://127.0.0.1:8080/plugin/mvc/pentest/foo 對應 fooTest()

 

最後還需要在 /module/src/main/resources/templates 建立一個目錄名為外掛 KEY 的目錄。

 

裡面存放副檔名為 .html 的模板檔案。

 

Python 外掛

python 外掛有兩種實現方式。

1.通過命令列實現

這種方式最為簡單,通過在 include 裡寫一個 python 指令碼。

 

然後在外掛裡呼叫 shell() 方法來執行系統命令。

 

案例可參考 com.trackray.module.plugin.windows.smb.MS17010

 

但這樣還需要再寫 java 的程式碼,對於沒有學過 java 的人來說很不友好。

2.通過jython實現

jython 是一個 Python 語言在 Java 中的完全實現。

 

我將它的呼叫過程寫成了一個互動式外掛。

 

你可以通過在 /resources/python/ 目錄下安裝如下規範去建立一個 python 檔案。

 

在這個 python 檔案中需要寫兩個方法。

 

params(): 返回字典物件,key 為 引數,value 為引數的說明。

 

verify(args): args 是一個字典型別,是從前臺傳過來的引數。

 

 

關於註解

com.trackray.base.annotation

@Rule

一般用在“可互動外掛”和“無互動外掛”類上。

 

 

params() 最為常用,它用來宣告這個外掛需要哪幾個引數。

 

![](/upload/attach/20190524/843603_C3PSAFQ2T7A3XZ3.png

 

例子:Thinkphp51and52RCE.java

 

@Plugin

它是所有外掛必須要使用的註解,只有宣告瞭這個註解才可以使用。

 

WEB指紋

這裡順便再說一下如何新增指紋庫。

com.trackray.base.enums.FingerPrint

 

指紋庫位於 base 模組,是一個列舉類。

 

可以在首部或尾部新增一條新的列舉,儘量使用 $ 開頭。

 

第一個引數是 指紋的名稱,如果第二個引數是 String 型別則是該指紋的說明。

 

FingerBean 類是指紋匹配物件。

 

dedecms 指紋示例

 

相關文章