什么是DNS Rebinding?
假設(shè)你是一臺公網(wǎng)服務(wù)器,無數(shù)人會給你發(fā)來URL,要求你進(jìn)行內(nèi)容加載。那么在這海量請求中,會有不懷好意的人發(fā)送內(nèi)網(wǎng)URL,要求你進(jìn)行加載,這其中的風(fēng)險難以言喻。
因此,一些聰明的開發(fā)人員為了防止這種情況,就發(fā)明了各種各樣的代碼。
- ip_banlist,你指定的惡意IP列表
- domain,你指定的域
- getHostname,這其實(shí)是一個函數(shù),它會把一個URL解析為實(shí)際的IP地址
以上就是DNS重綁定所要解決的問題!
先讓我們逐行分析代碼。
- 假設(shè)這個函數(shù)的參數(shù)設(shè)置為domain='http://wtf.geleta.eu'以及ip_banlist = ['169.254.169.254', '127.0.0.1']
- 在這種情況下,它將對wtf.geleta.eu進(jìn)行DNS查詢,并得到12.34.56.78這個結(jié)果,它不存在ip_banlist上,讓我們繼續(xù)!!
- 此時再神奇的將http://wtf.geleta.eu的DNS記錄改為127.0.0.1
- 最后服務(wù)器會向http://wtf.geleta.eu發(fā)出請求。此時已沒有什么能阻攔我向127.0.0.1發(fā)出請求了!
以上就是最原始的整體流程。
我們需要做什么
- 由于我們無法在程序運(yùn)行時以毫秒為單位手動更改dns記錄,因此需要配置一個自定義DNS服務(wù)器,并設(shè)定好某些域名的解析IP,再將TTL設(shè)置為0,這樣后端就不會有緩存
- 一些用來配置域的“接口”——它應(yīng)該解析什么,解析多少次之類的
- 足夠的運(yùn)氣
而在我使用https://lock.cmpxchg8b.com/rebinder.html時,發(fā)現(xiàn)它的功能并不能滿足我的需求。它只能在2個IP之間隨機(jī)變化,我往往需要發(fā)送多個請求才能得到我想要的結(jié)果。為此我特意制造了屬于自己的工具。
實(shí)際漏洞
在某次測試時,我偶然發(fā)現(xiàn)了一個服務(wù),可以主動發(fā)送JSON請求(可以自定義報頭等字段)。
當(dāng)我將url設(shè)置為某些內(nèi)網(wǎng)ip時(比如127.0.0.1),它就會返回如下結(jié)果:The request was blocked。
我試了幾個普通繞過方法后,發(fā)現(xiàn)并沒有效果。于是我便想起我和我的朋友Jan Masarik所參與的一次CTF競賽中遇到的一道和DNS重綁定有關(guān)的題目。詳細(xì)信息如下:https://ctftime.org/writeup/13005。
這個CTF題是由ELB創(chuàng)作的,我非常感謝他帶給我的靈感!
我使用了writeup中的技巧,將谷歌網(wǎng)站的IP解析為127.0.0.1。在利用burp發(fā)送了100個請求后,我終于看到了想要的結(jié)果!
此時,雖然我成功找到了一個SSRF漏洞,但并不知道接下去該做什么……我以前都只是面對CTF——你拿到flag,一切就結(jié)束了。但實(shí)際情況并非如此。
在現(xiàn)實(shí)生活中效果不是很好
在幾個小時毫無頭緒后,我向Jan Masarik發(fā)出了求助。我告訴他,目標(biāo)貌似和亞馬遜服務(wù)有關(guān),于是他發(fā)送給我一些ip地址——169.254.169.254。他告訴我這是AWS元數(shù)據(jù)的ip地址,如果我能獲取其中的數(shù)據(jù),基本上就控制了整個AWS。于是我立刻開始了行動,并很快得到了AWS的key。
回到現(xiàn)實(shí)
不幸的是,那些都是沒用的key,我?guī)缀醪荒苡盟鼈冏鋈魏问?hellip;…。
實(shí)際上,我只能讀寫一些存儲桶,但這沒有任何用處,而那些托管在前端的存儲桶都是不可寫的。在接下來的幾個小時里我試著提升權(quán)限以及嘗試一些其他操作,但其實(shí)能做的并不多。
于是我決定把這個漏洞上報,并持續(xù)觀察測試,看是否能得到一個RCE。
一周后
我沒有收到公司的任何回復(fù),也許我應(yīng)該把這個漏洞說的更嚴(yán)重一點(diǎn)……,不過這樣我有了更多的時間進(jìn)行測試。
其他利用點(diǎn)
當(dāng)我向127.0.0.1:22發(fā)出請求時,服務(wù)器返回bad response: SSH-2.0-OpenSSH_someversion :D,我試圖通過暴力破解得到ssh的root登錄密碼,但很可惜失敗了。
接下來我開始遍歷這臺機(jī)器上的其他端口。
很快我又發(fā)現(xiàn)了一個Monit管理界面,由于它存在一個緩沖區(qū)漏洞,所以我可以讀取到一些內(nèi)存信息甚至直接關(guān)閉整個實(shí)例!
最后我把這個新發(fā)現(xiàn)也上報了!
一個月后
在等待了一個月后,他們終于修好了漏洞,并給了我一筆賞金,生活還在繼續(xù)。
后續(xù)
回顧整個流程,我覺得在利用DNS這方面缺少一個強(qiáng)悍的界面和日志,于是開始使用Flask api,通過SQL和redis連接到特殊配置的DNS服務(wù)器。
你可以點(diǎn)擊這里查看代碼,以及一個現(xiàn)成的可使用的網(wǎng)站——你可以注冊,創(chuàng)建新綁定規(guī)則,用它來破解某些東西,查看日志等等。是的,這個網(wǎng)站只使用了http協(xié)議,我恨自己,我太懶了,不想去安裝https。
具體來說,它的作用是:
- 我告訴它一個子域,每解析三次到1.2.3.4,就解析一次到127.0.0.1
- 它會將數(shù)據(jù)放入數(shù)據(jù)庫,并給出類似y1982ehiuwqh82319j2139821.gel0.space這樣的子域名
- 當(dāng)我針對這個子域進(jìn)行解析查詢時,DNS服務(wù)器會查找數(shù)據(jù)庫中的數(shù)據(jù),并加載到redis中,根據(jù)給定的規(guī)則以更快的速度回復(fù)未來的請求。
如果你有一些空閑時間,歡迎看看我的https://github.com/makuga01/dnsFookup。如果有人能添加一些功能或前端,我會很感激的。
若你想和我聯(lián)系,可以直接在推特上找到我。
本文由白帽匯整理并翻譯,不代表白帽匯任何觀點(diǎn)和立場
來源:https://nosec.org/home/detail/3185.html
原文:https://geleta.eu/2019/my-first-ssrf-using-dns-rebinfing/
白帽匯從事信息安全,專注于安全大數(shù)據(jù)、企業(yè)威脅情報。
公司產(chǎn)品:FOFA-網(wǎng)絡(luò)空間安全搜索引擎、FOEYE-網(wǎng)絡(luò)空間檢索系統(tǒng)、NOSEC-安全訊息平臺。
為您提供:網(wǎng)絡(luò)空間測繪、企業(yè)資產(chǎn)收集、企業(yè)威脅情報、應(yīng)急響應(yīng)服務(wù)