前言
晚上,朋友圈有人发了篇tomcat-ajp漏洞的通告和一个简要分析的文章,也是当时唯一的参考文章,本着“好好学习、天天向上”的态度,作为小白,就想试着分析下,看看能不能写出poc。所以本文主要讲述一个小白(当然也不能太白,java至少要会吧,网站要知道是啥吧)如何一步步调试分析,编写poc的过程。
一、漏洞介绍
简单来说就是apache tomcat服务器的8009端口上的ajp协议存在漏洞,导致未授权用户可以读网站目录下的任意文件。
漏洞编号:
CNVD-2020-10487/CVE-2020-1938
受影响版本:
ApacheTomcat 9.x < 9.0.31
ApacheTomcat 8.x < 8.5.51
ApacheTomcat 7.x < 7.0.100
ApacheTomcat 6.x
二、调试环境搭建
为了观察数据流向、编写poc,我们需要搭建调试环境。
tomcat是开源项目,所以我首先想的是下载源码,在源码基础上调试,这里我下载的版本是9.0.2的代码。调试器选择的是Idea。
我先在网上搜索了下idea 调试 tomcat源码的文章。最后参考了
https://blog.csdn.net/weixin_30631587/article/details/96528373
这篇文章,将pom.xml中tomcat的版本由9.0.14修改成9.0.2。,不过这里我觉得不改也不会影响结果。成功运行tomcat服务。
三、ajp协议学习
到目前为止,我还不知道什么是ajp协议,这个协议是干啥的,但是既然知道此次tomcat漏洞是ajp协议造成的。我们肯定要去了解下这个协议是什么。
Apache官方有说明文档
http://tomcat.apache.org/connectors-doc-archive/jk2/common/AJPv13.html
当然这个文档一眼看上去,是不太容易理解的,于是百度一番
我理解的是,我们要访问tomcat网站有两种方式,一种是通过浏览器直接输入url地址。
另外一种就是通过ajp协议访问。
AJP协议是定向包(面向包)协议,采用二进制形式代替文本形式,以提高性能。
所以我们需要写个ajp的客户端程序用来与tomcat服务器的8009端口进行数据交互。当然我们可以自己从头写一个ajp客户端,前提是我们需要很详细了解ajp协议及其各个字段含义。我并不打算如此,毕竟自己从头写起来还是很费劲的。我先到github上用关键词ajp和ajp client搜了一下,看来白的人运气不会太差,发现已经有别人的ajp-client项目。
我把三个ajp-client都下了下来,经过测试和对比(边调试边测试),最后使用了
这个项目,最后poc也是在这个项目上完成的。
这里我们需要说下ajp协议中比较重要的字段。
Forward Request包就是我们要发送给tomcat 8009端口的内容,用来触发漏洞的。该字段中比较重要的字段是attributes,后面调试跟踪的时候,也会发现的,后面再说。
四、调试跟踪
通过参考我们知道,tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性。
我们现在AjpProcessor中定位到prepareRequest()函数,并在函数开始出下上断点,在request.setAttribute(n, v )也下上断点。
编写测试代码如下(test_servlet是我自己编写的servlet代码,放在了webapps目录下):
运行程序,程序成功断在了prepareRequest(),继续向下单步执行,期间可以观察一些字段的变化。但是程序并没有进入while循环,自然也不会执行request.setAttribute(n, v )函数。(此时我对attributes还不懂,不知道这个字段的意义),再次跟踪时发现while循环的判断条件中在获取attitudes的值时,返回值为-1。然后又回头重新看了下前一节所说的Forward Request结构,看到了其中的attitudes字段,心想这个字段也许和代码中while循环判断的attitudecode有关。
然后看了看ajp-client中代码对attitudes字段的处理,发现该项目没有处理attitudes字段。就按照自己的理解在AjpClient.java中添加了attitudes处理相关代码。
public List<Pair<String,String>> headers = new LinkedList<Pair<String,String>>();
public List<Pair<String,String>> attributes = new LinkedList<Pair<String, String>>();
添加函数setHeaders()此函数并不重要,添加函数addAttributes()。
在query函数中添加,处理atrribute代码
修改测试代码如下
(test_servlet/xx是一个不存在的地址或映射,只有设置成不存在的地址,代码流程才会进入DefaultServlet)
运行程序,程序成功进入while循环
至于addAttributes参数为什么这样写,我已开始自然也是不知道的,多跟踪调试几次就知道了。
程序执行了request.setAttribute(n, v )函数,接下来就是DefaultServlet的serveResource函数。
跟踪到getRelativePath函数中,
这里就会获取我们设置的attributes值。然后通过resources.getResource(path);判断设置的路径文件是否存在,如果存在则返回文件内容,不存在则报错。
已经成功读到文件。
关于org.apache.jasper.servlet.JspServlet类实现文件包含,这里就不分析了,有兴趣的如法炮制即可。
五、编写poc
如何编写poc就不在讲了,上面的测试代码稍微修改,就是poc了。
六、总结
总的来说,该漏洞的利用并不是很难,即使你不懂ajp协议,有些参考,稍微花点时间,还是能够独立写出poc的,当然我实际调试的时候也没有文章中那么顺的,要有耐心,多调试几次就好。修复的话,如果不需要ajp的,可以把配置文件中的8009配置关闭,或者更新到最新版本。
参考:
https://blog.csdn.net/u012206617/article/details/104416626/
https://blog.csdn.net/kalman2008/article/details/24487703
https://blog.csdn.net/jeikerxiao/article/details/82745516
http://tomcat.apache.org/connectors-doc-archive/jk2/common/AJPv13.html
- 上一篇:从防护角度看Thinkphp历史漏洞
- 下一篇:挖洞经验 | 登录注册表单渗透
猜你还喜欢
- 07-08八年专业安全团队承接渗透入侵维护服务
- 08-06SQLMAP的注入命令以及使用方法
- 08-03白帽故事汇:网络安全战士从来不是「男生」的专利
- 07-27编辑器漏洞手册
- 07-12web安全之如何全面发现系统后台
- 02-22常见Web源码泄露总结
- 07-25网站后台登陆万能密码
- 07-23破解emlog收费模板“Begin”
- 01-12批量检测SQL注入
- 01-22Apache Solr远程代码执行漏洞(CVE-2017-12629)从利用到入侵检测
- 随机文章
-
- 内网渗透:利用WMI代替psexec(WMIEXEC.vbs)
- 域科普文:使用powershell管理域用户
- 详解Filezilla提权
- 适用于PHP初学者的学习线路和建议
- PHP开发规范
- 如何绕过安全狗waf这类的防护软件--PHP过狗一句话实例两枚+过狗详细分析讲解
- 漏洞挖掘经验分享
- 是什么让黑帽黑客成了白帽英雄
- phpcms_v9.6.0_sql注入与exp
- PHPcms9.6.0 最新版任意文件上传漏洞(直接getshell)
- 我为什么会热爱黑客技术
- AppStore充值漏洞,王者荣耀等热门游戏可免费充值
- 【漏洞预警】WordPress <4.7.1 远程代码执行漏洞(更新漏洞环境)
- 强推HTTPS:Chrome 62将所有需输入数据的HTTP页面标为“不安全”
- bug bounty – 绕过限制劫持Skpe账号
- 禁止sethc.exe运行 防止3389的sethc后门
- PHP基础阶段内容
- 图片后门捆绑利用工具 – FakeImageExploiter
- 如何编写高质量的Windows Shellcode
- Windows渗透测试工具:RedSnarf
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 渗透测试培训(第五期)
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
文章存档
- 2021年3月(4)
- 2020年12月(4)
- 2020年11月(5)
- 2020年10月(8)
- 2020年9月(8)
- 2020年8月(20)
- 2020年7月(47)
- 2020年6月(70)
- 2020年5月(41)
- 2020年4月(21)
- 2020年3月(120)
- 2020年2月(26)
- 2019年12月(12)
- 2019年11月(13)
- 2019年10月(17)
- 2019年9月(15)
- 2019年8月(13)
- 2019年7月(15)
- 2019年6月(15)
- 2019年5月(19)
- 2019年4月(23)
- 2019年3月(19)
- 2019年2月(11)
- 2019年1月(29)
- 2018年12月(24)
- 2018年11月(56)
- 2018年10月(79)
- 2018年9月(20)
- 2018年8月(17)
- 2018年7月(16)
- 2018年6月(7)
- 2018年5月(10)
- 2018年3月(6)
- 2018年2月(2)
- 2018年1月(11)
- 2017年11月(18)
- 2017年10月(6)
- 2017年9月(8)
- 2017年8月(7)
- 2017年7月(7)
- 2017年6月(15)
- 2017年5月(30)
- 2017年4月(7)
- 2017年3月(1)
- 2017年2月(4)
- 2017年1月(1)
- 2016年12月(3)
- 2016年11月(7)
- 2016年10月(6)
- 2016年9月(6)
- 2016年8月(102)
- 2016年7月(24)
- 2013年7月(1)
- 文章标签
-