今天来学习一下早就听说过的幽灵猫ghostCat漏洞,已经是四年前提出的漏洞了。但看起来还是很难完全理解它的机制的。
这个漏洞是一个存在于Tomcat的文件包含漏洞
主要是tomcat中配置了两个连接器,一个http,一个ajp
AJP和HTTP协议都是网络通信协议,都基于tcp协议。其中AJP协议使用二进制格式传输数据,主要用于web server和Servlet容器之间
而且它可以复用连接,不用http那样是无状态,无连接的协议。一次请求建立一次tcp连接。
所以AJP协议比http在处理集群,反向代理的时候更高效一点
形成漏洞的原因是tomcat过于信任来自ajp协议的数据了, 接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性
因此可以通过此种特性从而可以控制request对象的下面三个Attribute属性
javax.servlet.include.request_uri:
javax.servlet.include.path_info
javax.servlet.include.servlet_path
我们这里使用Docker 创建一个tomcat环境,存在这个幽灵猫漏洞
启动nmap查看本机端口,也确实开启http和ajp服务
先尝试读取文件ROOT下的web.xml文件
接着尝试文件包含配合文件上传RCE
正常文件上传应该是找一个接口的,这里简化就直接在docker上添加文件了
利用脚本访问并且执行
这次的靶机训练确实是比较难的了,因为很多东西我的理解还不够,做这个之前都不知道ajp是个啥,还有对java web了解太少了,而且这个漏洞最后的exp是利用脚本。可以说又当了一次脚本小子。现在确实看不懂他那个脚本咋写的,但我感觉可能和php的文件包含漏洞类似。只不过是用ajp协议传输的数据,然后指定包含了上传的文件。read的时候,就当作文本打印。eval的时候,就当作jsp脚本去执行
还有再次感受到编程的重要性,虽然这次测试看上去很少。但我搞了很久,原因是脚本刚下下来的时候,怎么都不响应。全是返回500。我以为是脚本那有问题,还是docker环境坏了,最后才发现居然是我写的一句编程错了。
我原本写的是 <% out.print('tomcat test'); %>,本以为没有问题
但是后来发现居然被解析这样
但是读取的时候可以
不知道为何好好的单引号被解析成了html实例'
切换成双引号反而可以了
我觉得可能是在写入文件的时候出现了问题
我是使用echo 打印再重定向的方式写入文件的
echo " <% out.print('tomcat test'); %> " > test.png的时候就经常出现报错,写进去的时候可能就破坏了什么东西
但是还没看出来为啥会这样,因为读取都是可以的啊。应该就是解析的问题了!!!!
以后再回来看看吧!