如何自己开发漏洞扫描工具
漏洞掃描工具,核心就是掃描器,而掃描器的設(shè)計(jì)思想是:靈活,易擴(kuò)展,易修改,靈活的意思就是可單獨(dú)執(zhí)行專項(xiàng)漏洞的掃描,也可以批量執(zhí)行集成的所有漏洞探測(cè)模塊;易擴(kuò)展的意思就是,新的漏洞檢測(cè)模塊可清晰簡(jiǎn)單的集成進(jìn)掃描器;易修改,對(duì)各個(gè)漏洞掃描模塊可根據(jù)特殊情況修改探測(cè)邏輯。以下我們以網(wǎng)上一款開源的掃描工具來講解,當(dāng)然部署過程和使用中可能會(huì)處處是坑,只要一一解決就是:
掃描器的源碼
掃描器下載地址:?https://gitee.com/samllpig/SafeTool-51testing
工具的詳細(xì)安裝教程:?http://quan.51testing.com/pcQuan/lecture/117
軟件架構(gòu)圖
安裝部署
- 安裝 python 3.6 以上環(huán)境(如果怕麻煩,就安裝3.6,因?yàn)榘惭b3.8等高版本還需要調(diào)整一點(diǎn)代碼兼容性問題,但問題不多)
- 安裝 redis
- 安裝 wxPython==4.0.7
#如果安裝失敗,多執(zhí)行幾編,主要是因?yàn)榫W(wǎng)絡(luò)超時(shí)導(dǎo)致安裝失敗
#也可以直接去下載相關(guān)模塊包,如下載 wxPython-4.0.7-cp36-cp36m-win_amd64.whl,到官網(wǎng)下載,一定要下載和python版本匹配的包
#通過安裝包來安裝指定模塊
#安裝過程如果提示缺什么包,就繼續(xù)去下載什么包?
?也可以安裝更高版本的,比如wxPython==4.1.1
- 安裝openssl
一般安裝會(huì)有問題,可以直接到官網(wǎng)下載?http://slproweb.com/products/Win32OpenSSL.html
在本地安裝后,還需要將庫文件拷貝到python目錄下,這樣才能識(shí)別,如:
1、將openssl安裝目錄下的:C:\Program Files\OpenSSL-Win64\lib 拷貝到 D:\Python\libs
2、將openssl安裝目錄下的:C:\Program Files\OpenSSL-Win64\include 拷貝到?d:\Python\include
- 檢查requirements.txt
這個(gè)文件源代碼根目錄下,配置了需要安裝的模塊及版本,我們需要確認(rèn)自己的python版本是否以其匹配,比如Python3.8就要求改lxml為?lxml==4.6.3
- pip安裝模塊包
- 按以下順序啟動(dòng)服務(wù)
啟動(dòng)redis數(shù)據(jù)庫
啟動(dòng)服務(wù)端 myproxy.bat
啟動(dòng)客戶端 python consoleMain.py?
異常修改
安裝部署完后,我們可能還會(huì)遇到一些問題,這和代碼當(dāng)初的開發(fā)環(huán)境不一致有關(guān)。
1、關(guān)于Python3.8和3.6的兼容
Python3.8已經(jīng)移出了time.clock()方法,但這份源碼里還是用到了,所以如果遇到相關(guān)報(bào)錯(cuò),需要自己手動(dòng)修改,比如獲取系統(tǒng)時(shí)間,可以改為使用time.perf_counter()
2、路徑帶空格的問題
這份代碼這方面沒考慮周全,如果部署的路徑帶空格,就會(huì)報(bào)路徑錯(cuò)誤,比如“D:\Program Files”路徑,我們要么就不要部署在帶空格的路徑下,要么直接改他的代碼,比如:
setUp = "python " + path #可以將path路徑用引號(hào)全圈起來 setUp = "python '" + path + "'"?3、啟動(dòng)時(shí)報(bào)wt.exe找不到錯(cuò)誤
我也不知道wt.exe的由來,這個(gè)錯(cuò)識(shí)有時(shí)候不影響啟動(dòng),因?yàn)閱?dòng)文件consoleMain.py做了相關(guān)判斷處理,但為了徹底不調(diào)用wt.exe,我們也可把consoleMain.py當(dāng)中的相關(guān)代碼直接改了:
# wtSetUp = "wt.exe python " + path # 把以上調(diào)用改為直接調(diào)PowerShell.exe wtSetUp = "start cmd /k PowerShell.exe python '" + path + "'"這么改后,還有個(gè)好處,就是遇到代碼異常,不會(huì)立即關(guān)閉cmd窗口,這樣就能看到以下具體的報(bào)錯(cuò),對(duì)于調(diào)試和分析代碼錯(cuò)誤是有幫助的。
?4、中文報(bào)utf-8編碼錯(cuò)誤
比如在web掃描時(shí)執(zhí)行exec audit,報(bào)錯(cuò):
通過報(bào)錯(cuò),我們可以看到utf-8編碼錯(cuò)誤,而且報(bào)錯(cuò)的是request.py的resp.read().decode方法,我們把編碼改為如下(具體改成什么編碼,自己可以試試):
self.content = resp.read().decode('gbk')編碼改成功后,再通過?python consoleMain.py 入口調(diào)用就沒有這個(gè)錯(cuò)誤了。
5、報(bào)list index out of range錯(cuò)誤
這個(gè)低級(jí)錯(cuò)誤,一般是使用不當(dāng)引起,但也看出了代碼的健壯性不足,比如執(zhí)行exec attacks.xss報(bào)錯(cuò)如下:
?我們可以看到報(bào)錯(cuò)的params.py文件具體那一行,就是self.url.split("?"),問題出在這個(gè)問號(hào),因?yàn)槲议_始設(shè)置掃描路徑是:set url http://172.16.1.63,這是錯(cuò)誤的,應(yīng)該如下設(shè)置:
set url http://172.16.1.63/?u=admin一眼就看出來了,得加個(gè)?問號(hào),表示帶參數(shù),這個(gè)問題可以直接改他的代碼,加個(gè)判斷,如果不帶參數(shù),就提示重新設(shè)置,而不是報(bào)錯(cuò)。另外這塊也說明還需要進(jìn)一步擴(kuò)展開發(fā),正常應(yīng)該由掃描工具主動(dòng)去掃描和捕獲可以進(jìn)行xss跨站腳本攻擊的鏈接和地方,而不是手動(dòng)設(shè)置url來模擬攻擊。
6、執(zhí)行myproxy.bat找不到mitmdump
明明我們都裝了mitmdump,為什么還可能找不到,這是因?yàn)閜ip安裝時(shí),是局部還是全局安裝,正常mitmdump是安裝在python目錄下的Scripts中,如D:\Tools\Python\Scripts,假如你沒找到,那就需要在代碼路徑下搜索,是否裝在代碼目錄下了,比如在:SafeTool-51testing\venv\Scripts
這是因?yàn)槲覀冇肞yCharm Community Edition開發(fā)工具來安裝部署可能遇到的問題,我們要么挪一下mitmdump,要么直接改myproxy.bat,改一下調(diào)用路徑:
"D:\Program Files\Project\SafeTool-51testing\venv\Scripts\mitmdump" -q -s myproxy.py -p 80007、生成報(bào)告的問題
開源的代碼里關(guān)于這塊也是有問題的,具體下面也會(huì)提到簡(jiǎn)單的修改方式 。
簡(jiǎn)單使用
先打開我們的掃描器看下界面:
?掃描器界面:
好了,上面就是我們的掃描器,全部使用命令操作,簡(jiǎn)單易記,大家跟著敲就可以了。
- help命令使用
help: 列出集成的插件命令和描述。
我們開始掃描之前要做些基本的設(shè)置,輸入help set命令,查看我們需要設(shè)置那些參數(shù),帶*號(hào)的是必選項(xiàng).
- info 命令
info :顯示詳細(xì)的漏洞檢測(cè)模塊
info 命令的使用格式是: info [插件名稱],插件名稱就是上圖中輸入help命令得到的。
輸入info attacks:
輸入info audit命令:
可以看到audit插件下的檢測(cè)模塊太少了,后期我們需要加入tomcat、nginx、weblogic等等的掃描模塊 。
輸入info brute命令:
輸入 info disclosure:
- set命令:
在進(jìn)行掃描之前需要進(jìn)行基本的設(shè)置工作,通過help set命令查看可以設(shè)置的選項(xiàng),在通過set命令設(shè)置,在help set顯示的選項(xiàng)中帶*號(hào)的是必選項(xiàng),其他的根據(jù)需要進(jìn)行設(shè)置。
set 命令格式: set [選項(xiàng)] [參數(shù)]
舉例: set url?http://192.168.16.132/wordpress/?s=11
- check 命令:
輸入check argv 顯示set中設(shè)置的參數(shù)值
其中agent參數(shù),即版本信息默認(rèn)會(huì)隨機(jī)獲取。
- exec 命令
執(zhí)行檢測(cè)命令,命令格式:exec 插件名稱[.模塊名稱]
如果只輸入插件名稱[attacks,audit,brute,disclosure],則會(huì)執(zhí)行當(dāng)前插件下所有漏洞檢測(cè)模塊,如果輸入 插件名稱.模塊名稱,例如:attacks.xss,則僅會(huì)執(zhí)行當(dāng)前插件下指定的模塊名稱。
輸入 exec audit : 執(zhí)行檢測(cè)中間件插件下的所有模塊
輸入 exec attacks.xss :使用注入插件中的檢測(cè)xss漏洞模塊:
輸入?exec attacks.blindsqli :檢測(cè)sql盲注漏洞
- report 命令:
生成測(cè)試報(bào)告命令
命令參數(shù): report [報(bào)告名稱]
注:只有執(zhí)行過起碼一次完整的插件檢測(cè)才能生成報(bào)告,而不是專項(xiàng)漏洞檢測(cè),即 exec 插件名稱,而不是 exec 插件名稱.模塊名稱
輸入命令: report webscan
按照提示顯示的目錄,打開測(cè)試報(bào)告,報(bào)告格式是html的:
好了,以上就是使用掃描器的所有命令和完整的執(zhí)行流程(這個(gè)報(bào)告執(zhí)行了audit和attacks兩個(gè)模塊(插件),但結(jié)果都?xì)w為第一個(gè)插件模塊了,原因如下)。
注意:關(guān)于生成報(bào)告,原來的代碼應(yīng)該是有問題的,如果只執(zhí)行的是插件子模塊,如 exec attacks.xss,再執(zhí)行report webscan 生成報(bào)告是會(huì)失敗的,這是因?yàn)榇a里只有在執(zhí)行插件總模塊?exec attacks才會(huì)調(diào)用報(bào)告賦值(調(diào)用子模塊的函數(shù)是startup_spec_attacks,沒有重新賦報(bào)告值,所以導(dǎo)致exec子模塊,報(bào)告數(shù)據(jù)就會(huì)并到前面的插件總模塊),參見代碼如下:
#執(zhí)行attacks子模塊函數(shù),沒有對(duì)REPORT進(jìn)行再賦值 def startup_spec_attacks(attack:str):if attack in attacks_info.keys():plugins = spec_attacks_plugins(attack)startup_plugins(plugins)else:warn("模塊不存在!")def startup_full_attacks():global resultJsonif not REPORT['startTime']:REPORT['startTime'] = strftime("%Y/%m/%d at %H:%M:%S")execmod.append("attacks")plugins = attacks_plugins()if resultJson:resultJson = {}startup_plugins(plugins)REPORT['attacks'] = resultJson #調(diào)用總的attacks模塊,才對(duì)報(bào)告結(jié)果賦值這個(gè)問題需要引起關(guān)注,如果想簡(jiǎn)單的改,直接在startup_spec_attacks函數(shù)里加上REPORT賦值(需要有重復(fù)判斷)就行:
def startup_spec_attacks(attack:str):global resultJsonif not REPORT['startTime']:REPORT['startTime'] = strftime("%Y/%m/%d at %H:%M:%S")if resultJson and not REPORT['attacks']:resultJson = {}if attack in attacks_info.keys():execmod.append("attacks")plugins = spec_attacks_plugins(attack)startup_plugins(plugins)REPORT['attacks'] = resultJsonelse:warn("模塊不存在!")這么一改,再執(zhí)行以上的掃描步驟,報(bào)告模板顯得更準(zhǔn)確,而且就算執(zhí)行同一模塊的attacks.xss和attacks.blindsqli,后面的也不會(huì)覆蓋前面的,如下:
當(dāng)然這樣也不能保證完全沒有問題,具體以后我還會(huì)去細(xì)致考慮這方面的優(yōu)化!
插件的編寫
大家按章節(jié)一的下載地址,下載工具后,用PyCharm或vscode或你順手的工具打開,插件掃描器就在scan目錄下
我們的插件編寫,先從scan\lib\utils\settings.py 全局配置文件開始
第一步:先看基礎(chǔ)路徑配置,整個(gè)項(xiàng)目的目錄結(jié)構(gòu)就在這里
第二步,配置字典路徑,漏洞檢測(cè)模塊需要用到的字典,統(tǒng)一放在這個(gè)路徑下
第三步:配置插件路徑,新增的插件統(tǒng)一按下面的格式配置
第四步:配置插件描述信息,和第三步的插件路徑是對(duì)應(yīng)的
第五步:配置漏洞模塊描述信息,和第四步的插件描述是對(duì)應(yīng)的
第六步:配置漏洞模塊路徑信息,和第四步的插件描述是對(duì)應(yīng)的
第七步:編寫插件的加載模塊方法
統(tǒng)一命名規(guī)則 插件名成_plugins()[全部模塊執(zhí)行方法];spec_插件名稱_plugins(key:str)
第八步:編寫檢測(cè)漏洞模塊,以attacks插件下的bshi(破殼漏洞檢測(cè))檢測(cè)模塊為例,
導(dǎo)入必須的核心庫:
創(chuàng)建漏洞檢測(cè)類,繼承Request類,類名需與文件名一致
編寫的漏洞檢測(cè)方法,統(tǒng)一命名為check:
最后編寫run方法,命名不建議修改,如果實(shí)在需要修改的話,還需要在第九步中修改對(duì)應(yīng)的模塊導(dǎo)入邏輯:
第九步:在localapi.py文件下編寫本地API調(diào)用,為什么有本地API調(diào)用,因?yàn)槲掖蛩阍賹憘€(gè)遠(yuǎn)程API調(diào)用方法,結(jié)合安全工具的web服務(wù)使用(這一步不是必須的,只有在擴(kuò)展新的插件才用到,如果在原有插件的基礎(chǔ)上新增漏洞檢測(cè)模塊,則可以跳過這一步)
本地API函數(shù)的格式和基本路徑,參考下圖:
總結(jié)下擴(kuò)展邏輯就是,命名插件便于統(tǒng)一管理模塊,模塊編寫按固定格式,本地API編寫用于按指定插件運(yùn)行檢測(cè)模塊,該掃描器的檢測(cè)模塊還可以繼續(xù)更新擴(kuò)展。
由于我就學(xué)了半天Python語法和沒幾天的部署應(yīng)用,還需要繼續(xù)了解和學(xué)習(xí),語言都是相通的,會(huì)Java的學(xué)Python也快,學(xué)好Python是有助于對(duì)這款開源工具的擴(kuò)展應(yīng)用和開發(fā)。
參考:https://zhuanlan.zhihu.com/p/368859499
總結(jié)
以上是生活随笔為你收集整理的如何自己开发漏洞扫描工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xss漏洞java代码_Java处理XS
- 下一篇: 常见元器件封装