什么是DNS Rebinding?
假設你是一臺公網服務器,無數人會給你發來URL,要求你進行內容加載。那么在這海量請求中,會有不懷好意的人發送內網URL,要求你進行加載,這其中的風險難以言喻。
因此,一些聰明的開發人員為了防止這種情況,就發明了各種各樣的代碼。
- ip_banlist,你指定的惡意IP列表
- domain,你指定的域
- getHostname,這其實是一個函數,它會把一個URL解析為實際的IP地址

以上就是DNS重綁定所要解決的問題!
先讓我們逐行分析代碼。
- 假設這個函數的參數設置為domain='http://wtf.geleta.eu'以及ip_banlist = ['169.254.169.254', '127.0.0.1']
- 在這種情況下,它將對wtf.geleta.eu進行DNS查詢,并得到12.34.56.78這個結果,它不存在ip_banlist上,讓我們繼續!!
- 此時再神奇的將http://wtf.geleta.eu的DNS記錄改為127.0.0.1
- 最后服務器會向http://wtf.geleta.eu發出請求。此時已沒有什么能阻攔我向127.0.0.1發出請求了!
以上就是最原始的整體流程。
我們需要做什么
- 由于我們無法在程序運行時以毫秒為單位手動更改dns記錄,因此需要配置一個自定義DNS服務器,并設定好某些域名的解析IP,再將TTL設置為0,這樣后端就不會有緩存
- 一些用來配置域的“接口”——它應該解析什么,解析多少次之類的
- 足夠的運氣
而在我使用https://lock.cmpxchg8b.com/rebinder.html時,發現它的功能并不能滿足我的需求。它只能在2個IP之間隨機變化,我往往需要發送多個請求才能得到我想要的結果。為此我特意制造了屬于自己的工具。
實際漏洞
在某次測試時,我偶然發現了一個服務,可以主動發送JSON請求(可以自定義報頭等字段)。
當我將url設置為某些內網ip時(比如127.0.0.1),它就會返回如下結果:The request was blocked。
我試了幾個普通繞過方法后,發現并沒有效果。于是我便想起我和我的朋友Jan Masarik所參與的一次CTF競賽中遇到的一道和DNS重綁定有關的題目。詳細信息如下:https://ctftime.org/writeup/13005。
這個CTF題是由ELB創作的,我非常感謝他帶給我的靈感!
我使用了writeup中的技巧,將谷歌網站的IP解析為127.0.0.1。在利用burp發送了100個請求后,我終于看到了想要的結果!

此時,雖然我成功找到了一個SSRF漏洞,但并不知道接下去該做什么……我以前都只是面對CTF——你拿到flag,一切就結束了。但實際情況并非如此。
在現實生活中效果不是很好
在幾個小時毫無頭緒后,我向Jan Masarik發出了求助。我告訴他,目標貌似和亞馬遜服務有關,于是他發送給我一些ip地址——169.254.169.254。他告訴我這是AWS元數據的ip地址,如果我能獲取其中的數據,基本上就控制了整個AWS。于是我立刻開始了行動,并很快得到了AWS的key。

回到現實
不幸的是,那些都是沒用的key,我幾乎不能用它們做任何事……。
實際上,我只能讀寫一些存儲桶,但這沒有任何用處,而那些托管在前端的存儲桶都是不可寫的。在接下來的幾個小時里我試著提升權限以及嘗試一些其他操作,但其實能做的并不多。

于是我決定把這個漏洞上報,并持續觀察測試,看是否能得到一個RCE。
一周后
我沒有收到公司的任何回復,也許我應該把這個漏洞說的更嚴重一點……,不過這樣我有了更多的時間進行測試。
其他利用點
當我向127.0.0.1:22發出請求時,服務器返回bad response: SSH-2.0-OpenSSH_someversion :D,我試圖通過暴力破解得到ssh的root登錄密碼,但很可惜失敗了。
接下來我開始遍歷這臺機器上的其他端口。
很快我又發現了一個Monit管理界面,由于它存在一個緩沖區漏洞,所以我可以讀取到一些內存信息甚至直接關閉整個實例!
最后我把這個新發現也上報了!
一個月后
在等待了一個月后,他們終于修好了漏洞,并給了我一筆賞金,生活還在繼續。
后續
回顧整個流程,我覺得在利用DNS這方面缺少一個強悍的界面和日志,于是開始使用Flask api,通過SQL和redis連接到特殊配置的DNS服務器。
你可以點擊這里查看代碼,以及一個現成的可使用的網站——你可以注冊,創建新綁定規則,用它來破解某些東西,查看日志等等。是的,這個網站只使用了http協議,我恨自己,我太懶了,不想去安裝https。
具體來說,它的作用是:
- 我告訴它一個子域,每解析三次到1.2.3.4,就解析一次到127.0.0.1
- 它會將數據放入數據庫,并給出類似y1982ehiuwqh82319j2139821.gel0.space這樣的子域名
- 當我針對這個子域進行解析查詢時,DNS服務器會查找數據庫中的數據,并加載到redis中,根據給定的規則以更快的速度回復未來的請求。
如果你有一些空閑時間,歡迎看看我的https://github.com/makuga01/dnsFookup。如果有人能添加一些功能或前端,我會很感激的。
若你想和我聯系,可以直接在推特上找到我。
本文由白帽匯整理并翻譯,不代表白帽匯任何觀點和立場
來源:https://nosec.org/home/detail/3185.html
原文:https://geleta.eu/2019/my-first-ssrf-using-dns-rebinfing/
白帽匯從事信息安全,專注于安全大數據、企業威脅情報。
公司產品:FOFA-網絡空間安全搜索引擎、FOEYE-網絡空間檢索系統、NOSEC-安全訊息平臺。
為您提供:網絡空間測繪、企業資產收集、企業威脅情報、應急響應服務