Scalpel:解構API復雜參數Fuzz的「手術刀」
Scalpel 簡介
Scalpel是一款自動化Web/API漏洞Fuzz引擎,該工具采用被動掃描的方式,通過流量中解析Web/API參數結構,對參數編碼進行自動識別與解碼,并基于樹結構靈活控制注入位點,讓漏洞Fuzz向量能夠應對復雜的編碼與數據結構,實現深度漏洞挖掘。
- 詳細技術原理可參考KCon 2022議題:《自動化API漏洞Fuzz實戰》
- 目前我們的Fuzz引擎端已打包為一個小工具,內置100+漏洞POC,供大家試用:
- https://github.com/StarCrossPortal/scalpel
深度參數注入原理
隨著Web應用復雜度的提升與API接口的廣泛使用,在HTTP應用漏洞Fuzz過程中,傳統的「Form表單明文傳參的模式」已經逐漸變為「復雜、嵌套編碼的參數傳遞」。在此情況下,直接對參數內容進行注入或替換,無法深入底層的漏洞觸發點。
漏洞Fuzz過程中需要對這些「結構體、編碼」進行抽離,找到真正的注入點位,方可進行自動化漏洞測試。

Scalpel擁有一個強大的數據解析和變異算法,它可以將常見的數據格式(json, xml, form等)解析為樹結構,然后根據poc中的規則,對樹進行變異,包括對葉子節點和樹結構的變異。變異完成之后,將樹結構還原為原始的數據格式。
Scalpel主體結構分為被動代理、Fuzz向量生成與驗證、結果輸出三個階段:

漏洞檢測部分,采用解析算法,深度解析流量請求中的參數,通過POC中設定的注入點和變異方式生成測試請求,發送請求之后,再通過POC中的驗證規則進行成功性判斷,最終輸出Fuzz結果。
以下面這個JSON請求包為例,解析算法會將其轉換為右邊所示的樹結構,無論其嵌套的層次有多深,解析算法會將其中的所有鍵值對都解析為一個樹結構。然后可以對樹中的葉子節點進行變異,也可以對樹的整體結構上進行變異。在樹上進行變異之后,將樹按照原始的數據格式再還原回去,填充到請求報文中,形成變異的請求報文之后再發送出去。

在原始參數結構解析之后,我們可以基于樹結構來設定我們的測試向量注入方式:
對節點的變異方式有:
1. 按數據類型注入payload
2. 注入通用型payload
3. 畸形數據替換
4. 類型轉換

對樹結構的變異方式有:
1. 替換object類型結構
2. 插入節點
3. 刪除節點

Scapel 功能介紹
Scalpel掃描器支持以下漏洞檢測或者挖掘場景:
1、檢測目標已知安全的漏洞,包括CVE漏洞,熱門框架、組件、中間件安全漏洞。
2、通用安全漏洞,包括但不限于SQL注入、XSS漏洞、文件上傳、命令執行、文件讀取等。
3、未知0day漏洞或者安全問題
同時支持多個參數位置的變異,包括:path、query、header、body等部分,具體可以參考Scalpel
漏洞POC編寫指南(https://github.com/StarCrossPortal/scalpel/wiki/POC%E7%BC%96%E5%86%99%E6%8C%87%E5%8D%97)

案例1:CVE-2022-1388F5 BIG-IP APIUnauthenticated RCE漏洞的檢測
簡單了解下漏洞,具體可以參考之前分析文章(【技術干貨】F5 BIG-IP API Unauthenticated RCE(CVE-2022-1388)分析),我們要實現RCE,需要構造如下特殊的請求:
1、訪問路徑為/mgmt/tm/util/bash
2、Host為localhost或者127.0.0.1時,繞過驗證賦予用戶身份
3、Connection頭加上X-F5-Auth-Token
4、body部分添加json形式的執行命令

為了檢測到CVE-2022-1388漏洞是否存在,我們需要在發送構造的特殊請求后,識別響應中是否進行了命令執行。了解到整個檢測的步驟后,開始編寫漏洞POC
一一對應,在URL部分變異,變異方式為替換,變異值為/mgmt/tm/util/bash


在Host部分變異,變異方式為替換,變異值為localhost


對Heder部分的變異,變異方式為替換,變異值為Keep-Alive,X-F5-Auth-Token


對body部分的變異,變異方式為替換,變異值為我們需要執行的命令,這里執行id命令。


最后對響應的匹配,使用正則識別id命令之后的結果。

在編輯好漏洞POC之后,運行掃描器進行檢查。

在被動掃描的過程,實際獲取到的數據包如下:

如果存在漏洞,將會以html文件的形式記錄存在漏洞的信息,查看此次掃描結果。
成功掃描出CVE-2022-1388F5 BIG-IP API Unauthenticated RCE漏洞,漏洞的請求也變異無誤,最后的響應中也是執行了id命令。

案例二:利用Scalpel工具挖掘多個0day漏洞
Scalpel工具使用較為靈活,通過對檢測目標變異響應的check,可以發現檢測目標中未知的安全問題。
例如為發現某些API接口是否存在賬號密碼的泄露,可以在check部分利用正則表達式匹配具體的泄露數據。

為發現目標是否存在文件讀取漏洞,可以在多個變異位置插入或者替換payload


為發現SQL注入漏洞,可以在query、Heder、body中的參數插入' and 1=1類似的payload


星闌實驗室成員利用如上的類似通用檢測規則,挖掘多個0day漏洞,已提交給CNVD國家信息安全共享平臺并被收錄。


同時發現某Apache開源項目的CVE漏洞,報告被該團隊接受并正在修復,尚未披露。

工具地址
GitHub地址下載地址:https://github.com/StarCrossPortal/scalpel
目前已支持100+常見漏洞Fuzz向量與POC,持續維護中。

Scalpel支持多個平臺,請根據您的平臺或者需求下載相應的版本。
