每天分享更多黑客技能,工具及体系化视频教程
0x01. 序言时隔该当快一年了吧,详细ghost这个漏洞出来我也忘却了,由于我最近无聊,然后想起我利用的tomcat有没有漏洞,于是我就来试了试,顺便剖析一下这段已经时隔许久的漏洞,依稀记得上次的文章是大略的复现~~ 反正是闲的无聊
0x02. 环境支配
idea2020.2 + tomcat7.0.99+jdk1.8
详细参考这篇文章,idea导入Tomcat源码:环境与exp打包好,在附件中~,收1金币该当问题不大,我想社区币去抽华子https://blog.csdn.net/u013268035/article/details/81349341
https://www.cnblogs.com/r00tuser/p/12343153.html
0x03.漏洞的根本Tomcat支配的时候会有两个主要的文件
而Tomcat在 server.xml中配置了两种连接器。个中包含的是AJP Connector和HTTP Connector
AJP Connector解释启用了8080和8009端口,这时候我们可以看一下
而相对付,8080我们是可以访问的
也便是说,8080是卖力Http协议,8009卖力吸收ajp协议;
提问1:AJP协议和HTTP协议有什么差异吗?
HTTP协议:卖力吸收建立HTTP数据包,成为一个web做事器,处理HTTP协议的同时还额外可处理Servlet和jsp
AJP协议: 卖力和其他的HTTP做事器建立连接, 通过AJP协议和另一个web容器进行交互
Web用户访问Tomcat做事器的两种办法
而一个Tomcat便是一个server,个中包含多个service;而每个service由Connector、Container、Jsp引擎、日志等组件构成,造成漏洞的关键地方是Connector、Container
Connector上面已经说过分别是AJP Connector和HTTP Connector ,是用来接管客户真个要求,要求中的数据包在被Connector解析后就会由Container处理。这个过程大致如下图:
一次要求的处理可以划分为Connector及Container进行处理,经历的过程大致如下:
一个TCP/IP数据包发送到目标做事器,被监听此端口的Tomcat获取到。处理这个Socket网络连接,利用Processor解析及包装成request和response工具,并通报给下一步处理。Engine来处理接下来的动作,匹配虚拟主机Host、高下文Context、Mapping Table中的servlet。Servlet调用相应的方法(service/doGet/doPost…)进行处理,并将结果逐级返回。小结对付利用HTTP协议或AJP协议进行访问的要求来讲,在解析包装成为request和response工具之后的流程都是一样的,紧张的差异便是对 socket流量的处理以及利用Processor进行解析的过程的不同
也便是第二步的地方涌现问题
0x04.源码剖析通过第三步中,我们知道是Processor的解析过程不同,而供应这部分功能的接口,在 org.apache.coyote.Processor,紧张卖力要求的预处理。
而此处AjpProcessor则是处理ajp协议的要求,并通过它将要求转发给Adapter,针对不用的协议则具有不同的实现类。
我们从上面wirshark抓包可以看出
可以看出这边是设置了三个莫名其妙的东西
通过exp源码可以看到这边是设置了三个域工具的值
可以看出,我们这边是实行成功了,由于wirshark抓包没有去截图,又关闭了,以是就不截图了
这边可以假设:要求参数时是写去世,也便是xxx.jsp文件,而jsp后缀等等缘故原由,然后成功进行了文件包含
那么我们的test.txt是怎么识别的?
我们连续往下看,来办理各类迷惑
知道是这个prepareRequest()问题,我们f7跟进去看看
进入了该方法的内部,我们连续跟进查看,这边进行判断,获取到了要求参数为GET
首先是一些解析数据包读取字节的操作
while循环获取,switch判断
当attributeCode=10时,则进入第一条分支,连续f8进去
是不是有了有种眼熟的觉得~~~ 实在便是往域工具中存值
由于if都不知足,直接进入了末了这个比进的else分支
最后进入第二个步骤的末了一小步,f8连续下一步走,在预处理完了request headers之后,在adapter里面处理request,然后调用Adapter将要求交给Container处理
进入service方法,然后f8一贯跟进
直到跟进此处,要求会发送到对应的servlet,我们要求的是一个jsp文件,根据tomcat的默认web.xml文件
通过上面假设,tomcat默认将jsp/jspx结尾的要求交给org.apache.jasper.servlet.JspServlet处理,它的service()方法如下:
而jspUri即是null,知足条件,则进入该if条件分支
由于javax.servlet.include.servlet_path可掌握,通过getAttribute去域工具中获取属性名为javax.servlet.include.servlet_path的值,得到值为 test.txt
此时,jspUri的值为/test.txt
pathInfo的值此时为空
末了一贯到下面,传入serviceJspFile方法中
连续跟进,会先判断文件是否存在,如果存在,随后才会初始化wrapper,末了调用JspServletWrapper的service方法来解析,从而导致本地文件包含
参考
https://gitee.com/wdragondragon/javasec/blob/master/tomcat%20ajp%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.md
https://www.cnblogs.com/r00tuser/p/12343153.html
https://xz.aliyun.com/t/7325#toc-6
https://zhishihezi.net/b/5d644b6f81cbc9e40460fe7eea3c7925#