聊聊 Wafw00f 源碼及流量特征
wafw00f介紹
這不是本次的重點,相關介紹及使用方法相信大家已經了解,所以此處就直接引用其開發者對該工具的介紹。
To do its magic, WAFW00F does the following:
- Sends a normal HTTP request and analyses the response; this identifies a number of WAF solutions.通過發送正常的?HTTP?請求并且分析其返回包,判斷其是否使用 WAF ,若使用確認WAF類型
- If that is not successful, it sends a number of (potentially malicious) HTTP requests and uses simple logic to deduce which WAF it is.若是無法通過正常的?HTTP?請求結果分析出是否使用WAF以及其類型,則構造惡意的請求通過簡單的邏輯再次進行判斷
- If that is also not successful, it analyses the responses previously returned and uses another simple algorithm to guess if a WAF or security solution is actively responding to our attacks.如果這也不成功,它會分析之前返回的響應,并使用另一種簡單的算法來猜測?WAF或安全解決方案是否正在積極響應我們的攻擊
使用場景/方法
這不是本次的重點,想要具體了解其用法去其github主頁即可
??https://github.com/EnableSecurity/wafw00f??
本工具的作用上面已經很詳細的描述出來了,概括一下很簡單:探測目標是否存在WAF,也可以說wafw00f是一個Web應用防火墻(WAF)指紋識別的工具。
使用方法不難,此處不做介紹,若想進一步了解見:WEB 防火墻探測工具 -- wafw00f 使用教程 - General 的個人博客
wafw00f 源碼解析
所謂源碼解析并不會完整分析其源碼中的所有功能,比如 日志、輸出、展示 等功能不在我們分析的范圍內,而其對 WAF 的檢測邏輯、所發流量的特征、WAF 識別的指紋等將是重點要分析的地方。
流程:
- 解析源碼含義,分析特征
- 抓包觀察
源碼文件結構
為了方便大家之后去看源碼,此處簡單描述一下源碼的組成,其中沒有描述的說明其用不大,大家自己去看就知道了,其中標注important是本工具的主要功能文件,后續將重點說明。
- bin
- lib
asciiarts.py
evillib.py用于向目標建立連接發起請求( important )
- plugins?用于判斷各個WAF的指紋 ( important )
aliyundun.py阿里云盾的特征值匹配文件
huaweicloud.py****華為云的特征值匹配文件
baidu.py百度云加速的特征匹配文件
……
還有很多特征文件大家自己去看就好
- __init__.py
- main.py該工具主要的檢測、判斷功能的類與函數都在該文件中實現( important )
- manager.py?加載plugins?中的WAF?指紋判斷文件識別目標WAF類型
- wafprio.py
上述非important的文件起到的作用多是一些起到 輸出選項、連接 等功能的文件/函數,所以不做特殊介紹
基本流程
請求的流程并不復雜,和最開始介紹處的流程如出一轍:
- 發送正常HTTP?請求,并判斷是否存在WAF若存在根據指紋判斷其類型
- 若正常HTTP?檢測不出WAF?,則附加惡意的請求嘗試出發WAF并分析其類型
最后所謂的根據算法猜測,流量特征不明顯,不在此次分析的范圍內,實際用處也不大。
請求運行流程( important)
以第一次的正常HTTP請求探測為例(其余的都一致)。
由于對 Python 并不是太了解,所以作用域的表示采用了C++中的::(若是不對請及時指出會做更改)。
main.py分析
完整的源碼就不放在這占地方了,大家隨時可到其github主頁獲取,此處直接分析其重點部分
由上述流程可以看出,所有的請求均是從class WAFW00F中發起,所以該類就是我們分析的重中之重!
請求的具體實現(比如請求中攜帶了哪些內容)將在分析evillib.py文件是分析,此處主要分析何時要發出何種請求。
從main()函數出發看其邏輯:(解析參數等功能將直接略過)
沒有指定其余參數
- 對輸入的URL?做相關處理后放到target?中傳入WAFW00F進行處理
- 由于第一次做的是常規探測,若此處就匹配到了WAF的指紋則輸出結束即可,具體的輸出等邏輯不是重點,略過;
- 若無法分析出其是否存在WAF?或匹配不出WAF?則通過identwaf()函數進步拼湊惡意參數進行探測;
- 進入identwaf()?函數后,便會嘗試匹配各個WAF的特征;
這就是基本的流程。
解析來如果還沒有確定出WAF便會進入其自己提供的一個算法,但這并不是我們對流量特征分析所要關注的地方,所以就不探討了。
下面到了激動人心的時刻,WAFW00F類中到底是如何實現的呢?
class WAFW00F
一上來就中了大獎:
WAFW00F這個工具所要構造拼接的惡意代碼在一開始就全部列出了,而且在之后的使用中絕無變化,要構造惡意的請求就是從上述5個字符串中選擇1個或多個直接使用。
可以看到改用據用于判斷是否存在WAF的語句就以下五類:
- XSS類 <script>alert("XSS");</script>
- SQL注入類 UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '
- 遍歷類 ../../../../etc/passwd
- 命令執行/拼接類 /bin/cat /etc/passwd; ping 127.0.0.1; curl google.com
- XXE類 <!ENTITY xxe SYSTEM "file:///etc/shadow">]><pwn>&hack;</pwn>
那么有了這些語句,WAFW00F又該如何拼接呢?
具體邏輯并不難理解,拿出幾種幾個來說一下。
1:def xssAttack(self)
例如給一個簡單的例子:我們傳給wafw00f的URL為:http://127.0.0.1:9000則經過該參數拼接后的請求就為:
http://127.0.0.1:9000/?s=<script>alert("XSS");</script>(URL編碼前 )。
2:def centralAttack(self):
例如給一個簡單的例子:我們傳給wafw00f的URL為:http://127.0.0.1:9000則經過該參數拼接后的請求就為:
http://127.0.0.1:9000/?s=<script>alert("XSS");</script>&b=UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '&c=../../../../etc/passwd(URL編碼前 )
從前面的流程可以看出,在def identwaf(self, findall=False):中調用的拼接的語句的方法就是本方法,拼接進三個語句,
其他的邏輯相同。
evillib.py分析
上面只是在上層對要拼接哪些參數進行構造,實際上組合成完整的 HTTP 報文調用requests.get()進行請求的是在該文件中。
wafw00f中若沒有通過—headers指定頭部的話,會使用自己默認的—headers這個默認的 headers 就定義在該文件中。
默認情況下,接下來通過requests.get()請求時便會使用該頭部,
指紋的識別
拿Huawei Cloud WAF的指紋來說
CSDN使用華為云防護
其余腳本見:wafw00f/wafw00f/plugins at master · EnableSecurity/wafw00f
wafw00f 流量
本文作者:Deutsh, 轉載請注明來自FreeBuf.COM