CVE-2023-46747和AJP走私漏洞

本文主要介绍了AJP走私漏洞在实际项目中的应用,以及CVE-2023-46747的分析。

什么是AJP走私?

AJP是一种用于连接web服务器与应用服务器的二进制协议,通常用于Apache HTTP ServerNginxApache TomcatJava应用服务器之间的通信。
AJP走私漏洞利用的是AJP协议HTTP协议之间的差异,以及中间件(如代理服务器或负载均衡器)和应用服务器对HTTP请求的不同解析方式。这种漏洞允许攻击者通过特殊构造的请求,操纵AJP协议下的数据流,实现请求走私。
关于AJP协议的详细内容可以参考https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html

AJP走私的实际意义

说到AJP走私其实相关的漏洞很少,这也导致了很多时候并没有考虑到这方面的问题。但是实际上AJP走私相当于发送一个额外的请求,通过这个额外的请求我们可以访问到原来无法访问的地址,绕过一些针对外部的访问配置问题,当然这只是利用方式的一种。
AJP走私最早的利用应该是在长亭的ghostcat漏洞中,通过这个漏洞,攻击者可以读取目标机器webapp目录下的任意文件,这也是在公开项目中危害比较大的一个漏洞了,网上有很多相关资料可以查阅。

CVE-2023-46747

环境搭建

直接下载镜像用vmware启动即可。
默认账号密码为:admin/default

漏洞分析

因为BIG-IP的Apache是基于Apache 2.4.6的定制版,所以也会受AJP走私的影响,结合其它信息就能得知:

  1. 在BIG-IP的历史漏洞CVE-2022-1388中得知,我们可以从/mgmt/tm/util/bash来执行命令,但是当时是基于X-F5-Auth-Token权限的绕过,那么既然权限绕过已经修复了,我们就需要一个可以通过认证的X-F5-Auth-Token,那么也就是需要创建一个管理员用户。
  2. 那么创建账户这个问题就来到了tmui上,我们通过AJP走私到/tmui/Control/form调用/tmui/system/user/create.jsp来创建一个新的用户。
  3. 参考官方文档的方式,创建完新的用户之后就可以通过/mgmt/shared/authn/login然后返回第一步来执行命令。

image.png
流程概括下来就是:通过/tmui/Control/form来调用user/create.jsp然后从/mgmt/shared/authn/login获取新的token,最后在/mgmt/tm/util/bash执行命令。

这其中有一个需要注意的点:

tmsh中进行了csrf检测,所以在第一步调用的时候需要构造好三个参数_timenow Tmui-Dubbuf_bufvalue,满足_bufvalue的值等于Tmui-Dubbuf+Tmui-Dubbuf

image.png
通过构造Tmui-Dubbuf=BBBBBBBBBBB、_timenow=a、_bufvalue=eIL4RUnSwXYoPUIOGcOFx2o00Xc=,即可绕过csrf的检测,这也是这个漏洞中比较关键的一环。

使用这三个键值对进行构造,那么最后得到的poc如下:

image.png

使用Transfer-Encoding: chunked时,会使用分块传输编码,第一个204就是trunk size的大小,用十进制转换为十六进制后对应516,也就是我们走私请求的长度,最后的0表示结尾,如果不是用https看到的明文如下:

image.png

这个步骤需要多试几次,不一定第一次就成功,发现返回的不是登录界面后就可以进行下一步了:

通过账号密码获取到token的值。

image.png

然后执行命令:

image.png
自此漏洞利用就结束了。

总结

根据这个CVE发现其实在通过请求走私是可以将一些老漏洞重新利用的,那么在进行代码审计的过程中或者渗透测试的过程中,是否有别的可能存在的思路?因为现如今很多的企业,尤其是一些老企业所使用的组件仍然是较低版本,在做的时候可以顺带看一眼,如果存在可利用的AJP走私就可以绕过一些权限验证从而进一步操作。

  • 发表于 2024-05-24 10:06:12
  • 阅读 ( 16920 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
SpringKill
SpringKill

4 篇文章

站长统计