打造自己的滲透測試框架 — 溯光
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 指紋示例
相關文章
- Web應用滲透測試框架Arachni2017-07-06Web框架
- 滲透測試會用到哪些工具?滲透測試教程2021-08-05
- 網路安全滲透測試的型別!滲透測試入門教程2021-08-02型別
- Linux滲透測試2018-05-31Linux
- Metasploit滲透測試指南2012-02-13
- 滲透測試-資訊收集2024-04-22
- 滲透測試報告2024-03-22測試報告
- 【滲透測試】Vulnhub DarkHole2024-08-19
- 安全測試和滲透測試的區別2022-07-29
- 滲透測試什麼?滲透測試具體操作流程是什麼2022-03-31
- Android滲透測試Android滲透測試入門教程大學霸2015-02-04Android
- metasploit滲透測試筆記(內網滲透篇)2020-08-19筆記內網
- 什麼是滲透測試?網站有必要進行滲透測試嗎?2023-09-19網站
- 滲透測試技巧總結2019-03-30
- 物理滲透測試基礎2019-03-26
- beescms網站滲透測試2020-12-27網站
- GraphQL滲透測試詳解2023-04-24
- FLUXION參考滲透測試2020-12-23UX
- 網路安全滲透測試2018-06-01
- kali滲透測試工具方法2017-10-29
- [原創]滲透測試工具2015-08-28
- Web 端滲透測試初探2024-06-26Web
- 【滲透測試】Vulnhub Hackable II2024-08-19
- [雪峰磁針石部落格]滲透測試簡介1滲透測試簡介2018-11-12
- 搭建滲透測試環境選自KaliLinux無線網路滲透測試教程2015-01-05Linux
- 內網滲透測試基礎2021-02-07內網
- 滲透測試入門實戰2018-11-28
- 滲透測試學習記錄2020-12-08
- 滲透測試(PenTest)基礎指南2022-07-14
- [滲透測試] Hydra暴力破解2015-07-14
- 軟體滲透測試基礎知識分享,可做滲透測試的軟體檢測公司有哪些?2023-04-14
- 網站安全測試之APP滲透測試漏洞2020-12-04網站APP
- 什麼是網路滲透測試?網路滲透測試分為幾種型別?2022-08-25型別
- 滲透測試的WINDOWS NTFS技巧集合(一)2018-09-06Windows
- 滲透測試的WINDOWS NTFS技巧集合(二)2018-09-07Windows
- 後滲透測試神器Empire的詳解2018-06-04
- 網站滲透測試安全檢測漏洞2019-11-24網站
- 網站滲透測試安全檢測方案2019-10-17網站