awvs 13使用_如何解密AWVS?15行代码就够了!
項目介紹
AWVS一直以來在圈子中都比較火,以速度快和高準確性深受大家喜愛。很多人想研究其運作機制卻因閉源而不得其解。
今天這里通過一個極其簡單的方式,只用幾行代碼就能讓你一見其核心代碼。這是最新解碼方法,除python3外無須安裝任何依賴(沒辦法,python寫的),支持11.x,12.x,13.x,以及后續(xù)版本^_^
對于有IAST、DAST掃描器需求的同學,很有幫助。安全從業(yè)人員亦可以學習到業(yè)界頂尖的掃描技術;對于動手能力強的同學,還可以通過學習這幾行代碼,自動動手給AWVS添加插件哦。
項目地址
https://github.com/gatlindada/awvs-decode/
解密原理
awvs的版本迭代歷史
1. 6.5版本之前,awvs的掃描規(guī)則是明文可見
2. 6.5 - 10.x,awvs的規(guī)則變?yōu)?script結尾的javascript腳本,執(zhí)行程序也使用了TMD加殼,分析較難,但也可以使用解密腳本從文件夾提取,因過于古老,腳本就沒必要放出來了
3. 11.x - 13.x(當前最新),awvs把腳本放到了“wvsc_blob.bin”文件中,起初誤以為加密了,沒承想,經(jīng)過靜態(tài)分析后發(fā)現(xiàn)程序沒加殼,wvsc_blob.bin也沒有加密,只是google protobuf協(xié)議壓縮存儲了。簡單理解:類似把文件使用ZIP工具壓縮一下。所以新版本中,使用解密這個詞有些不準確了,準確地講是解碼(decode)而非解密(decrypt)。
使用方法
wvsc_blob.bin文件一般在“C:\Program Files (x86)\Acunetix XXX\core\wvsc_blob.bin”
將wvscblob.bin文件放到和腳本同一目錄,執(zhí)行腳本即可,輸出在以‘a(chǎn)wvs_script_blob_decode’開頭的目錄下。
$ python3 awvs-decode.py目錄解讀
awvs使用Google V8引擎執(zhí)行javascript的掃描腳本,腳本在/Scripts/目錄下的”.script”后綴文件,”.script”文件中“#include”包含的是/Scripts/Includes目錄下的文件,使用宏替換的方式加載,而非require。
/Scripts/PerFile/: 針對文件路徑中文件名相關的漏洞,常用于檢測備份文件、BashRCE、PHP CGI、URI XSS等
/Scripts/PerFolder/: 針對URI路徑中文件夾的漏洞探測,如備份文件夾、探測后臺路徑等
/Scripts/PerScheme/: 針對變量輸入點的掃描,包括GET、POST參數(shù)、Http請求頭、Cookie參數(shù)等
/Scripts/PerServer/: 針對不同域名或主機的檢測,每個“站點”只執(zhí)行一次
/Scripts/PostCrawl/: 針對POST請求的掃描,在爬蟲期間即可執(zhí)行
/Scripts/PostScan/: 只針對POST請求的掃描,常用于存儲型漏洞掃描,執(zhí)行期間不會上報漏洞,通常借助于DNSLog技術異步觸發(fā),一旦觸發(fā)即漏洞存在。
/Scripts/WebApps/: 只針對檢測到的相關WebApps類型進行檢測。awvs會識別服務類型,新版指紋特征在/httpdata/12-WebAppDetection.js中,11.x版本之前在.xml的配置文件中。
/Crawler下包含一些爬蟲相關的處理腳本
/httpdata、/lib包含一些基礎腳本
/lib/legacy/legacy.js是一個非常核心的文件,是所有腳本的先導,它解釋了掃描引擎(C++)如何與V8進行數(shù)據(jù)交互,如果你想運行這些代碼,你最好得模擬一個掃描引擎,代碼量不小,不建議嘗試。
其他的目錄留給大家探索。
還有一個大家關注的,獲取AWVS的漏洞描述文件:很簡單,使用數(shù)據(jù)庫連接工具連接pgsql后dump即可,用戶名和密碼在應用配置目錄下找,一般在/AppData/隱藏目錄下
核心代碼
只有簡簡單單15行代碼就搞定。確要精簡的話5行代碼也行。
#!/usr/bin/env python3import struct, zlib, os, datetimemask, pos = 2 ** 32 - 16, 32base_path = os.path.abspath("awvs_script_blob_decode_" + datetime.date.today().isoformat())with open('wvsc_blob.bin', 'rb') as fp: s = fp.read() while pos < len(s): file_len = struct.unpack(' d = zlib.decompress(s[pos + 4: pos + 4 + file_len]) path_len = ord(struct.unpack(' path = os.path.join(base_path, bytes.decode(d[2 + 1: 2 + path_len])) os.makedirs(os.path.dirname(path), exist_ok=True) open(path, 'wb').write(d[2 + path_len + 1 + 2 + (1 if (len(d) - path_len - 3) > 2 ** 14 else 0) + (1 if (len(d) - path_len - 3) > 2 ** 21 else 0):]) pos += ((file_len + 4) & mask) + 16免責聲明
該腳本僅用于個人私下研究技術交流用,一切后果就使用者承擔
*本文作者:gatlindada,轉(zhuǎn)載請注明來自FreeBuf.COM
精彩推薦
總結
以上是生活随笔為你收集整理的awvs 13使用_如何解密AWVS?15行代码就够了!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle字段求和_oracle大纲
- 下一篇: virtual DOM和真实DOM的区别