让我们聊聊AJP
2022年11月15日 - 作者:Mohamed Ouad
引言
AJP(Apache JServ Protocol)是一种二进制协议,于1997年开发,旨在提高传统HTTP/1.1协议的性能,特别是在代理Web服务器和J2EE容器之间的HTTP流量时。它最初是为了在从服务器A转发请求到服务器B时有效管理网络吞吐量而创建的。
该协议的典型用例如下所示:
在Doyensec最近的一个研究周中,我研究并分析了该协议的工作原理及其在一些流行Web服务器和Java容器中的实现。该研究还旨在复现由长亭科技研究人员在Tomcat中发现的臭名昭著的Ghostcat(CVE-2020-1938)漏洞,并可能发现其他类似的错误。
Ghostcat
该漏洞影响了Apache Tomcat Java servlet容器的AJP连接器组件,允许恶意攻击者从应用程序根目录执行本地文件包含。在某些情况下,此问题可能允许攻击者执行任意命令执行。有关Ghostcat的更多详细信息,请参阅以下博客文章:https://hackmag.com/security/apache-tomcat-rce/
通过AJP通信
早在2017年,我们自己的Luca Carettoni开发并发布了首批(如果不是第一个)实现Apache JServ Protocol版本1.3(ajp13)的开源库之一。在此基础上,他还开发了AJPFuzzer。本质上,这是一个基本的模糊测试工具,可以轻松发送手工制作的AJP消息、运行消息变异、测试目录遍历以及模糊测试数据包中的任意元素。
通过微调,AJPFuzzer也可用于快速复现GhostCat漏洞。事实上,我们通过发送一个精心构造的forwardrequest请求,包括javax.servlet.include.servlet_path和javax.servlet.include.path_info Java属性,成功复现了攻击,如下所示:
|
|
连接到目标主机后,发送恶意的ForwardRequest数据包消息并验证test.xml文件的泄露:
|
|
服务器AJP连接器将接收具有以下结构的AJP消息:
libajp13、AJPFuzzer和Wireshark AJP13解析器的组合使得理解协议并与之交互变得更加容易。例如,AJPFuzzer中另一个值得注意的测试用例名为genericfuzz。使用此命令,可以对AJP请求中的任意元素执行模糊测试,例如请求属性名称/值、密钥、cookie名称/值、请求URI路径等:
|
|
要点
Web二进制协议很有趣,值得学习和逆向工程。
对于防御者:
- 不要在敌对网络中暴露您的AJP接口。相反,考虑切换到HTTP/2
- 通过启用共享密钥来保护AJP接口。在这种情况下,工作器还必须包含匹配的密钥值
其他相关文章
- Windows Installer, Exploiting Custom Actions - 2024年7月18日
- Windows Installer EOP (CVE-2023-21800) - 2023年3月21日
- SSRF Cross Protocol Redirect Bypass - 2023年3月16日
- Diving Into Electron Web API Permissions - 2022年9月27日
- Apache Pinot SQLi and RCE Cheat Sheet - 2022年6月9日
- Regexploit: DoS-able Regular Expressions - 2021年3月11日
- Researching Polymorphic Images for XSS on Google Scholar - 2020年4月30日
- One Bug To Rule Them All: Modern Android Password Managers and FLAG_SECURE Misuse - 2019年8月22日
- Jackson gadgets - Anatomy of a vulnerability - 2019年7月22日