导语:本文将对请求走私漏洞和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
如若转载,请注明原文地址