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

2023-11-08 12:04

本文主要是介绍从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

这篇关于从F5 BIG-IP RCE漏洞(CVE-2023-46747)来看请求走私的利用价值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369735

相关文章

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配