如何“組合拳”滲透開發(fā)者的本地?cái)?shù)據(jù)庫
如果你是一名開發(fā)人員,平時(shí)可能在本地會(huì)運(yùn)行一些數(shù)據(jù)庫服務(wù),比如Redis,、Memcached、Elasticsearch之流。相信很多產(chǎn)品都會(huì)依賴這一類的服務(wù)。
但是你可能不知道,這些本地運(yùn)行的服務(wù)能跟你在外網(wǎng)訪問的網(wǎng)站進(jìn)行通信,黑客也許能借此從你本地服務(wù)中竊取數(shù)據(jù)。
攻擊如何生效的
雖然筆者下面要講的并不是新的東西,但攻擊利用方法其實(shí)還是比較新穎的,因?yàn)橐郧昂苌儆腥税堰@些攻擊組合在一起。在這里,我將結(jié)合兩種不同技術(shù)進(jìn)行測試,即“跨協(xié)議腳本”+“DNS重新綁定”。
跨協(xié)議腳本(cross protocol scripting)
第一種技術(shù)我們稱之為“跨協(xié)議腳本”,有人在2001年曾經(jīng)放出過這種攻擊的細(xì)節(jié)。簡單解釋下攻擊原理,那就是Redis、Memcached都存在一個(gè)簡單的命令行協(xié)議,它會(huì)忽略無效的命令內(nèi)容。這意味著,你的瀏覽器如果發(fā)送下面的HTTP請求到你本地的redis(localhost:6379),redis就會(huì)執(zhí)行相應(yīng)的SET命令。
- POST / HTTP/1.1
- Host: localhost:6379
- SET abc 123
- QUIT
惡意站點(diǎn)可以通過下面的form表單,借助你的手給你本地的redis發(fā)送惡意請求:
- <form enctype="text/plain"method="POST" action="http://localhost:6379">
- <textarea name="abc">
- SET abc 123
- QUIT
- </textarea>
- <input type="submit"value="Submit" />
- </form>
而Elasticsearch協(xié)議則完全是基于HTTP,所以在通信時(shí)沒有什么特別的技巧和需要注意的地方。
但是我們在執(zhí)行上面的測試命令時(shí),實(shí)際上是不能直接收到結(jié)果的。這是因?yàn)闉g覽器的同源策略,會(huì)在你發(fā)送請求給另一個(gè)域時(shí),能進(jìn)行限制讓你無法取得返回的數(shù)據(jù)。那么,現(xiàn)在我們就需要用到上面講的另外一門技術(shù)了。
DNS重綁定(DNS Rebinding)
簡單解釋下,DNS重綁定的攻擊原理就是字面的意思,我們采用某種手段重新更新一下DNS A記錄,綁定為別的地址。
為了繞過同源策略的保護(hù),我們可以使用DNS重綁定技術(shù),這種攻擊需要一臺(tái)跟你相對TTL值很低的服務(wù)器作為域名站點(diǎn)。一旦你瀏覽器訪問了惡意網(wǎng)站,站點(diǎn)上的惡意代碼會(huì)在特定的時(shí)刻,突然將站點(diǎn)DNS記錄更改到另外一個(gè)的IP地址,比如你私有的IP地址(127.0.0.1),該惡意站點(diǎn)就能借此竊取你本地服務(wù)里面的數(shù)據(jù)。當(dāng)然,這前提是在它訪問你本地的服務(wù)時(shí),能夠通過相應(yīng)的認(rèn)證授權(quán)。
POC代碼
我在extractdata.club網(wǎng)站上插入了攻擊的POC代碼,它會(huì)主動(dòng)嘗試連接你本地默認(rèn)端口的Redis, Memcached和Elasticsearch服務(wù)。
大約一分鐘后,這個(gè)網(wǎng)站會(huì)返回類似于下面的頁面。
這里的POC只會(huì)接收服務(wù)的版本信息,并不會(huì)去漫游你整個(gè)數(shù)據(jù)庫,咱們的POC代碼在這里。
修復(fù)方案
很遺憾其實(shí)沒有特別好的辦法來解決這個(gè)問題,但是我們可以試著為本地運(yùn)行的服務(wù)設(shè)置密碼。筆者還想出了一個(gè)辦法,那就是對于Redis和Memcached這兩種服務(wù),只要檢測到連接是通過HTTP請求發(fā)送來的,就可以立即阻止并退出。
對于瀏覽器方面來講,廠商可以在瀏覽器里面實(shí)現(xiàn)“DNS阻塞(DNS pinning)”。簡單來說就是,一旦某個(gè)網(wǎng)站被加載完成,瀏覽器就需要忽略其DNS的變化。
瀏覽器廠商也可以把Redis和Memcached端口加入它們阻塞的端口列表中,現(xiàn)在已經(jīng)在列表中的常見協(xié)議有SMTP和IRC。當(dāng)然,這辦法是治標(biāo)不治本,如果出現(xiàn)了新的服務(wù)還是會(huì)出現(xiàn)漏洞的。
后記
Chromium開發(fā)人員正在致力于移除對HTTP/0.9的支持,這樣瀏覽器就不能從Redisand和Memcached讀取數(shù)據(jù)了。然而,即使這樣是這樣做,黑客仍然可以進(jìn)行遠(yuǎn)程命令執(zhí)行。
對某些開發(fā)者來講,本地使用的測試數(shù)據(jù)庫里可能不會(huì)有太多有價(jià)值的東西。但黑客一旦擁有了讀寫權(quán)限,可能會(huì)對開發(fā)者的電腦進(jìn)行遠(yuǎn)程代碼執(zhí)行操作。比如,黑客可以用惡意的payload覆蓋疑似Ruby marshalled或者Python pickled數(shù)據(jù),這樣開發(fā)者的電腦就可能會(huì)淪陷。
結(jié)論
這個(gè)POC證明了計(jì)算機(jī)安全是很難得到絕對的保證的。有的時(shí)候,軟件單獨(dú)工作的時(shí)候看起來會(huì)很安全,但它們在交互時(shí)就可能就會(huì)產(chǎn)生一定的漏洞。