如何“組合拳”滲透開發(fā)者的本地數(shù)據(jù)庫

責任編輯:editor005

作者:dawner

2016-09-01 15:07:14

摘自:黑客與極客

如果你是一名開發(fā)人員,平時可能在本地會運行一些數(shù)據(jù)庫服務,比如Redis,、Memcached、Elasticsearch之流。你可能不知道,這些本地運行的服務能跟你在外網(wǎng)訪問的網(wǎng)站進行通信,黑客也許能借此從你本地服務中竊取數(shù)據(jù)。

如果你是一名開發(fā)人員,平時可能在本地會運行一些數(shù)據(jù)庫服務,比如Redis,、Memcached、Elasticsearch之流。相信很多產(chǎn)品都會依賴這一類的服務。

但是你可能不知道,這些本地運行的服務能跟你在外網(wǎng)訪問的網(wǎng)站進行通信,黑客也許能借此從你本地服務中竊取數(shù)據(jù)。

攻擊如何生效的

雖然筆者下面要講的并不是新的東西,但攻擊利用方法其實還是比較新穎的,因為以前很少有人把這些攻擊組合在一起。在這里,我將結合兩種不同技術進行測試,即“跨協(xié)議腳本”+“DNS重新綁定”。

跨協(xié)議腳本(cross protocol scripting)

第一種技術我們稱之為“跨協(xié)議腳本”,有人在2001年曾經(jīng)放出過這種攻擊的細節(jié)。簡單解釋下攻擊原理,那就是Redis、Memcached都存在一個簡單的命令行協(xié)議,它會忽略無效的命令內(nèi)容。這意味著,你的瀏覽器如果發(fā)送下面的HTTP請求到你本地的redis(localhost:6379),redis就會執(zhí)行相應的SET命令。

POST / HTTP/1.1

Host: localhost:6379

SET abc 123

QUIT

惡意站點可以通過下面的form表單,借助你的手給你本地的redis發(fā)送惡意請求:

 

 

而Elasticsearch協(xié)議則完全是基于HTTP,所以在通信時沒有什么特別的技巧和需要注意的地方。

但是我們在執(zhí)行上面的測試命令時,實際上是不能直接收到結果的。這是因為瀏覽器的同源策略,會在你發(fā)送請求給另一個域時,能進行限制讓你無法取得返回的數(shù)據(jù)。那么,現(xiàn)在我們就需要用到上面講的另外一門技術了。

DNS重綁定(DNS Rebinding)

簡單解釋下,DNS重綁定的攻擊原理就是字面的意思,我們采用某種手段重新更新一下DNS A記錄,綁定為別的地址。

為了繞過同源策略的保護,我們可以使用DNS重綁定技術,這種攻擊需要一臺跟你相對TTL值很低的服務器作為域名站點。一旦你瀏覽器訪問了惡意網(wǎng)站,站點上的惡意代碼會在特定的時刻,突然將站點DNS記錄更改到另外一個的IP地址,比如你私有的IP地址(127.0.0.1),該惡意站點就能借此竊取你本地服務里面的數(shù)據(jù)。當然,這前提是在它訪問你本地的服務時,能夠通過相應的認證授權。

POC代碼

我在extractdata.club網(wǎng)站上插入了攻擊的POC代碼,它會主動嘗試連接你本地默認端口的Redis, Memcached和Elasticsearch服務。

大約一分鐘后,這個網(wǎng)站會返回類似于下面的頁面。

這里的POC只會接收服務的版本信息,并不會去漫游你整個數(shù)據(jù)庫,咱們的POC代碼在這里。

修復方案

很遺憾其實沒有特別好的辦法來解決這個問題,但是我們可以試著為本地運行的服務設置密碼。筆者還想出了一個辦法,那就是對于Redis和Memcached這兩種服務,只要檢測到連接是通過HTTP請求發(fā)送來的,就可以立即阻止并退出。

對于瀏覽器方面來講,廠商可以在瀏覽器里面實現(xiàn)“DNS阻塞(DNS pinning)”。簡單來說就是,一旦某個網(wǎng)站被加載完成,瀏覽器就需要忽略其DNS的變化。

瀏覽器廠商也可以把Redis和Memcached端口加入它們阻塞的端口列表中,現(xiàn)在已經(jīng)在列表中的常見協(xié)議有SMTP和IRC。當然,這辦法是治標不治本,如果出現(xiàn)了新的服務還是會出現(xiàn)漏洞的。

后記

Chromium開發(fā)人員正在致力于移除對HTTP/0.9的支持,這樣瀏覽器就不能從Redisand和Memcached讀取數(shù)據(jù)了。然而,即使這樣是這樣做,黑客仍然可以進行遠程命令執(zhí)行。

對某些開發(fā)者來講,本地使用的測試數(shù)據(jù)庫里可能不會有太多有價值的東西。但黑客一旦擁有了讀寫權限,可能會對開發(fā)者的電腦進行遠程代碼執(zhí)行操作。比如,黑客可以用惡意的payload覆蓋疑似Ruby marshalled或者Python pickled數(shù)據(jù),這樣開發(fā)者的電腦就可能會淪陷。

結論

這個POC證明了計算機安全是很難得到絕對的保證的。有的時候,軟件單獨工作的時候看起來會很安全,但它們在交互時就可能就會產(chǎn)生一定的漏洞。

相關閱讀

跨協(xié)議腳本

DNS重綁定

在Rails使用DNS重綁定

鏈接已復制,快去分享吧

企業(yè)網(wǎng)版權所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號