从F5 BIG-IP RCE漏洞(CVE-2023-46747)来看请求走私的利用价值

0x01 前言

F5 BIG-IP广域流量管理器是一种网络流量管理设备,用于提升链路性能与可用性。F5在金融行业具有特别广泛的使用量,做过各大银行攻防演练的小伙伴对这个系统应该不会陌生。

最近爆出的CVE-2023-46747漏洞能达到远程RCE的效果,属于严重级别的安全漏洞。有意思的是这个漏洞和“AJP请求走私”有关。相信很多小伙伴是第一次听说这种漏洞类型,本文将对请求走私漏洞和CVE-2023-46747做一个详细介绍和分析。

0x02 AJP请求走私介绍

较早出现的AJP请求走私漏洞是CVE-2022-26377,关于该漏洞的详细信息已经有作者进行过分析,感兴趣的读者可以查看原文https://www.ctfiot.com/44809.html,这里我们关注的是AJP请求走私漏洞的危害。

AJP请求走私漏洞影响Apache Httpd < 2.4.54,注意这里直接受影响的并不是tomcat,所以并不是所有的java网站都受请求走私漏洞的影响,而是只有启用了httpd服务的网站才受此漏洞影响,类似于现在前后端分离中nginx服务的作用。在F5 BIG-IP中启动的WEB服务的架构如图2.1所示,并且在F5-BIG-IP中的httpd版本2.2.15,受CVE-2022-26377漏洞影响。

图片

图2.1 F5 BIG-IP中的WEB服务架构

图片

图2.2 F5 BIG-IP中的httpd版本

AJP请求走私漏洞并不是一个高危漏洞,在各个CVSS评分在6.5-7.5之间,所以一直没有受到我的关注,只是觉得这是一个仅供研究没有实际意义的理论漏洞。在这次F5 BIG-IP的RCE漏洞爆出之后,我才重新对这个漏洞进行研究。关于此漏洞的详细理论可以参考上面的文章,这里主要总结下面的几个关键点:

1) 浏览器并不能直接发送AJP协议的数据包,需要依赖于Apache的 proxy_ajp 模块进行反向代理,暴露成 HTTP 协议给客户端访问。

2) AJP协议对于POST类型的HTTP请求会分成 header 和 body 两个数据包发送,由于处理body数据时,其中前面四位固定格式与Forward Request 数据包完全一样,导致本来应该是一个数据包body部分的数据,可能在进行AJP转发时被识别为另一个数据包。这也是AJP请求走私的本质原理和危害,如图2.3所示。

3) AJP请求走私时需要使用Transfer-Encoding: a, chunked 进行分块传输。

图片

图2.3 AJP请求走私流程

从图2.3可以看出,整个AJP请求走私的流程是可以把一个HTTP请求经过AJP代理转化之后转化为两个AJP请求,这也是请求走私名字的来源。

0x03 CVE-2023-46747漏洞分析

经过0x02的分析已经对AJP请求走私有了初步的了解,但是实际上还是很难看出这样的漏洞能导致RCE效果。

从官方对这个漏洞的描述中可以看出,此漏洞仅影响开放了TNUI接口的系统(F5 BIG-IP默认启用),这是因为在/config/httpd/conf.d/proxy_ajp.conf文件中定义了AJP代理的配置,其中只会对tmui相关接口进行代理,如图3.1所示。

图片

图3.1 TMUI接口中的AJP代理配置

如图2.1所示,httpd服务监听的IP是0.0.0.0,所以是可以被外网用户直接访问到的,httpd提供反向代理的功能,把请求转发到tomcat java监听的80端口。最初看到这个漏洞的时候,我一直在java代码中寻找鉴权的逻辑,以图找到通过AJP请求走私绕过鉴权的方式,但是找了很久都没有找到,甚至我在F5的JAVA代码中没有找到任何的Filter。后来在翻阅F5的历史漏洞分析文章中才看到原来F5的鉴权并不在JAVA代码中,而是在httpd模块中。

F5实现了自己的pam进行认证,模块路径为/usr/lib/httpd/modules/,其中,涉及到login.jsp授权的是mod_f5_auth_cookie.so文件。反汇编之后,大概是这样的。我们能够请求/tmui/login.jsp而不需要进行身份验证。

图片

图3.2 访问/tmui/login.jsp不需要授权

如果直接访问其他jsp文件,在没有通过身份验证的情况下,会被重定向到/tmui/login.jsp

图片

图3.3访问其它页面需要授权

这也就说明在CVE-2023-46747漏洞的POC利用脚本中通过访问/tmui/login.jsp(这个页面是不需要授权,又可以进行AJP请求转化的页面),在body中添加AJP请求走私的内容,就可以达到绕过鉴权的效果。

poc地址:

https://www.ddpoc.com/poc/DVB-2023-5391.html

在使用的时候注意,部分BurpSuite会去掉Transfer-Encoding头,自动从分块传输转化为普通传输导致检测失败,所以在使用的过程中尽量不要使用Burp代理,如果非要抓包可以使用Charles,如图3.4所示。

图片

图3.4 使用Burp代码导致检测失败

去掉Burp代理之后,在Charles中可以看到正常的Chunked请求体和请求头,并且运行成功之后可以执行命令,如图3.5所示。

图片

图3.5 通过POC可以正常绕过权限添加用户并执行命令

关于绕过权限之后F5 BIG-IP执行命令的逻辑在F5历史漏洞CVE-2022-1388中已经使用过,其实F5 BIG-IP本身就提供了接口/mgmt/tm/util/bash为后台用户执行系统命令的,有兴趣的读者也可以看https://mp.weixin.qq.com/s/wUoBy7ZiqJL2CUOMC-8Wdg了解详细的创建用户和后台命令执行的逻辑。

0x4 结论

CVE-2023-46747算是请求走私漏洞的典型应用场景,把一个中低危的漏洞放在特定的场景中放大危害造成RCE效果,整个利用过程就像是为AJP请求走私量身定制一样。

首先,F5 BIG-IP使用httpd来转发前端用户请求,并且对特定接口/tmui/*开启AJP请求转发功能。

其次,F5 BIG-IP的用户鉴权逻辑在httpd的so文件中实现,而不是在java代码中是实现。甚至在后端的java代码中没有任何鉴权逻辑,导致只要请求转发到后端java代码则可以访问到。通过AJP请求走私可以把一个隐私的添加用户的请求隐藏在未授权接口/tmui/login.jsp请求中,导致绕过了F5鉴权的逻辑把添加用户的请求转发到后端java代码。

最后,添加的用户在后台可以直接命令执行导致RCE效果。

参考:

https://mp.weixin.qq.com/s/wUoBy7ZiqJL2CUOMC-8Wdg

https://github.com/W01fh4cker/CVE-2023-46747-RCE

https://www.ctfiot.com/44809.html

https://blog.csdn.net/weixin_39541693/article/details/111112257

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

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

相关文章

9.spark自适应查询-AQE之动态调整Join策略

目录 概述动态调整Join策略原理实战 动态优化倾斜的 Join原理实战 概述 broadcast hash join 类似于 Spark 共享变量中的广播变量&#xff0c;Spark join 如果能采取这种策略&#xff0c;那join 的性能是最好的 自适应查询AQE(Adaptive Query Execution) 动态调整Join策略 原…

pytorch 初始化

初始化 import matplotlib.pyplot as plt import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader import torch.optim as optim import numpy as np random_seed=1000 # np.random.seed(random_seed) torch.manual_seed(random_seed)#自定义损…

linux(ubuntu)安装并使用scrcpy

scrcpy 是一款开源的在计算机上显示和控制 Android 设备的工具。要在 Ubuntu 上使用 scrcpy&#xff0c;你可以按照以下步骤进行安装&#xff1a; 通过命令行安装 scrcpy&#xff1a; 安装 scrcpy&#xff1a; 打开终端&#xff08;Terminal&#xff09;并执行以下命令来安装…

uniapp小程序v-for提示“不支持循环数据”

问题描述: 在uniapp小程序项目中使用多层for循环时&#xff0c;小程序端提示&#xff1a;uniapp v-for 暂不支持循环数据&#xff0c;以至于获取不到循环的数据。 <view v-for"(item,index) in list" :key"item.id"> <view v-for"child i…

.net core添加SQL日志输出

GreDbContext : Microsoft.EntityFrameworkCore.DbContext 下添加 public static readonly ILoggerFactory MyLoggerFactory LoggerFactory.Create(builder > { builder.AddConsole(); }); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder…

代码随想录算法训练营第四十六天丨 动态规划part09

198.打家劫舍 思路 如果刚接触这样的题目&#xff0c;会有点困惑&#xff0c;当前的状态我是偷还是不偷呢&#xff1f; 仔细一想&#xff0c;当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 所以这里就更感觉到&#xff0c;当前状态和前面状态会有一种依赖关系…

go-carbon v2.2.13 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

Mysql5.7二级等保配置项示例

一、Mysql5.7的配置文件my.ini配置示例 [mysql] #设置mysql客户端默认字符集 default-character-setutf8 [mysqld] #设置mysql端口号&#xff0c;调整为非默认端口3306 port 3807 #设置为mysql的程序安装目录 basedir"C:\Program Files\MySQL\MySQL Server 5.7\" #…

Jupyter Notebook 内核似乎挂掉了,它很快将自动重启

报错原因&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade perfo…

uniapp刻度尺的实现(swiper)滑动打分器

实现图&#xff08;百分制&#xff09;&#xff1a;滑动swiper进行打分&#xff0c;分数加减 <view class"scoring"><view class"toggle"><view class"score"><text>{{0}}</text><view class"scoreId&quo…

Apipost-Helper:IDEA中的类postman工具

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

STM32F103C8T6第三天:pwm、sg90、超声波、距离感应按键开盖震动开盖蜂鸣器

1. 定时器介绍1&#xff08;317.21&#xff09; 软件定时&#xff08;之前的定时方法&#xff09;&#xff08;软件延时&#xff09;缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (-…

微服务-网关设计

文章目录 引言I 网关部署java启动jar包II 其他服务部署细节2.1 服务端api 版本号III 网关常规设置3.1 外部请求系统服务都需要通过网关访问3.2 第三方平台回调校验文件的配置IV 微服务日志跟踪4.1 打印线程ID4.2 封装线程池任务执行器4.3 将自身MDC中的数据复制给子线程4.4 微服…

龙迅LT8911EXB功能概述 MIPICSI/DSI TO EDP

LT8911EXB 描述&#xff1a; Lontium LT8911EXB是MIPIDSI/CSI到eDP转换器&#xff0c;单端口MIPI接收器有1个时钟通道和4个数据通道&#xff0c;每个数据通道最大运行2.0Gbps&#xff0c;最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24bp…

PageHelper多表关联查询数量问题

PageHelper多表关联查询数量问题 通常我们会使用PageHelper进行分页查询&#xff0c;但是当分页查询被用到多个表的关联查询中时&#xff0c;就有可能导致查询出来的数据总数比我们想要的多得多。 首先在数据库中创建三个demo表&#xff1a;role、path、role_path role角色表…

使用Selenium发邮件附件

发邮件可以使用SMTP协议实现程序去发送&#xff0c;但附件的不能太大&#xff0c;一般不超过20M。 以下使用Selenium模拟发送邮件&#xff0c;跳过这个限制&#xff0c;网上找了很多资料&#xff0c;都没有完整实现的&#xff0c;那么自己实现一个&#xff0c;以下代码用Python…

WM 报错不含领货点存储类型的存储类型需要部分搁板管理

试图为SAP新建堆放策略维B标准存储类型系统报错如下&#xff1a; 不含领货点存储类型的存储类型需要部分搁板管理 加个P类型的&#xff0c;先保存&#xff0c;然后再改 解决方案&#xff1a; 进入如下配置路径&#xff0c; 新增一个配置条目&#xff0c;如上图示&#xff0c;…

ci-cd的流程

1、项目在gitlab上&#xff0c;从gitlab上使用git插件获取源码&#xff0c;构建成war包&#xff0c;所以使用tomcat作为运行环境 发布 &#xff1a;使用maven插件发布&#xff0c;使用ssh连接。

小米6安装Ubuntu Touch系统也不是很难嘛

序言 这个文章是用来解说,小米6如何安装Ubuntu Touch系统 正文 安装这个系统需要注意的几点 1.手机必须已经解BL锁 2.没了 安装步骤 先双击打开压缩包查看,按照第一步第二步来进行执行,下面是解压图片 第一步 1.打开第一个文件夹 复制刷入rec的命令.txt里面的内容,然后打开红…

HTTP-HTTPS区别详解

一、HTTP协议 1. GET和POST的请求的区别 Post 和 Get 是 HTTP 请求的两种方法&#xff0c;其区别如下&#xff1a; 应用场景&#xff1a; GET 请求是一个幂等的请求&#xff0c;一般 Get 请求用于对服务器资源不会产生影响的场景&#xff0c;比如说请求一个网页的资源。而 Po…