AJP Connector:监听8009端口,负责和其他的HTTP服务器建立连接,通过AJP协议和另一个Web容器进行交互。 Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互。 而Tomcat服务器8009端口上的AJP协议存在漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件,如:webapp配置文件或源代码等 影响版本 Apache Tomcat Ghostcat $ python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py <靶场IP> -p 8009 -f WEB-INF/web.xml ? YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi ----
由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件。 EXP收集 https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi https://github.com/0nise/CVE-2020-1938
0x01 漏洞简介 Tomcat 服务器作一个免费的开放源代码的Web 应用服务器,其安装后会默认开启ajp连接器,方便与其他web服务器通过ajp协议进行交互。 CVE-2020-1938漏洞是由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件,例如可以读取 webapp 配置文件或源代码。 vulhub/tomcat/CVE-2020-1938 sudo docker-compose up -d 环境启动后,访问http://your-ip:8080即可查看tomcat默认页面,此时通过AJP 0x03 漏洞利用 目前,在网上已经公布了该漏洞的POC: https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi 将POC下载到本地,使用如下命令读取 WEB-INF/web.xml文件: python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.126.130 -p 8009 -f WEB-INF/web.xml
American journal of psychiatry, 2017:appi. ajp. 2017.17040469
0x00:前言 Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。 www.cnvd.org.cn/flaw/show/CNVD-2020-10487 2、referer: https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
Java 是目前 Web 开发中最主流的编程语言,而 Tomcat 是当前最流行的 Java 中间件服务器之一,从初版发布到现在已经有二十多年历史,在世界范围内广泛使用。 Ghostcat(幽灵猫) 是由长亭科技安全研究员发现的存在于 Tomcat 中的安全漏洞,由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 GzqLkwlIQi_i3AVIXn59FQ 漏洞环境 执行如下命令启动一个Tomcat 9.0.30: docker-compose up -d 环境启动后,访问http://your-ip:8080即可查看tomcat默认页面,此时通过AJP 利用如下工具均可测试漏洞: https://github.com/chaitin/xray https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
本篇文章主要针对于Apache Tomcat Ajp(CVE-2020-1938)漏洞进行源码分析和漏洞利用,顺便通过这个漏洞来学习JAVA代码审计。 AJP13协议介绍 AJP的全程是Apache JServ Protocol,支持AJP协议的Web容器包括Apache Tomcat,JBoss AS / WildFly和GlassFish。 AJP协议。 </sourceDirectory> <resources> <resource> <directory>java</directory> </resource> </resources 在这里我们下断点给java.org.apache.catalina.servlets.DefaultServlet.java文件中的doGet方法,因为协议走的Get请求。
0x00 前言 Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web 应用的开源MVC框架,主要提供两个版本框架产品
07-Jan-2020 22:34:30.342 SEVERE [ajp-nio-8009-exec-2] org.apache.coyote.ajp.AjpMessage.processHeader -2020 22:34:30.390 SEVERE [ajp-nio-8009-exec-4] org.apache.coyote.ajp.AjpMessage.processHeader Invalid (ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java at java.lang.Thread.run(Thread.java:748) 07-Jan-2020 22:34:30.414 SEVERE [ajp-nio-8009-exec-6] org.apache.coyote.ajp.AjpMessage.processHeader -2020 22:34:30.418 SEVERE [ajp-nio-8009-exec-8] org.apache.coyote.ajp.AjpMessage.processHeader Invalid
Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。 如果想看漏洞具体详情,传送门:【WEB安全】Tomcat-Ajp协议漏洞分析 漏洞修复建议 1:临时禁用AJP协议端口,在conf/server.xml配置文件中注释掉 <Connector port ="8009" protocol="<em>AJP</em>/1.3"redirectPort="8443" /> 2:配置ajp配置中的secretRequired跟secret属性来限制认证 3:官方下载最新版下载地址 tomcat.apache.org/download-90.cgi Github下载:https://github.com/apache/tomcat/releases 参考文章:【WEB安全】Tomcat-Ajp
AJP 协议 根据 apache 官网 AJP 协议相关介绍: The original document was written by Dan Milstein, danmil@shore.net on 说完了 AJP13 的来龙去脉,接着,进入主题。 SpringBoot 为什么这么火? SpringBoot 对 AJP 协议的支持 通过阅读 tomcat-embed-core 组件,说明嵌入式 tomcat 是支持 AJP 协议的,相关代码在 org.apache.coyote.ajp 但是奇怪的是,在 SpringBoot 的 yml 文件配置中,并没有找到 ajp 协议相关的 server 参数配置。 ? 笔者猜测,虽然 Tomcat 集成了 ajp 协议,但是不推荐使用吧。 所以在 tomcat 服务器接收 ajp 请求时, 由 AjpProcessor 来处理 ajp 真实的 request 请求消息。 ?
/ javax.servlet.include.path_info: code.txt javax.servlet.include.servlet_path: / code.txt内容如下 <% java.util.List <String> commands = new java.util.ArrayList<String>(); commands.add("/bin/bash"); commands.add("-c" ); commands.add("/Applications/Calculator.app/Contents/MacOS/Calculator"); java.lang.ProcessBuilder pb = new java.lang.ProcessBuilder(commands); pb.start(); %> 发送AJP请求,请求的是/docs/test.jsp这个jsp,但是由于那三个 AJP在Apache HTTP服务器中是以模块的形式实现的,表示为mod_jk或mod_proxy_ajp。AJP本身并不会暴露到外部,这也是下一部分要讨论的RCE场景的先决条件之一。 ?
还有一个连接器叫做AJP,AJP主要是用来和web服务器进行通信用的,因为AJP协议的速度要比HTTP的快,所以AJP除了用来和其他webserver进行通信之外,还可以通过AJP来构建tomcat集群 :使用AJP协议的连接器,实现与web server(如Apache httpd)之间的通信 org.apache.coyote.ajp.AjpNioProtocol:SJP协议+ New IO org.apache.coyote.ajp.AjpNio2Protocol :SJP协议+ New IO2 org.apache.coyote.ajp.AjpAprProtocol:AJP + APR 讲下他们的区别,BIO就是block IO是最最基础的IO方式, 我们通过这样来配置 New IO是基于java.nio包及其子包的一种IO方式。能提供非阻塞IO方式,比传统的BIO拥有与更加高效的运行效率。 /configure --with-apr=/usr/bin/apr-1-config \ --with-java-home=/home/jfclere/JAVA/jdk1.7.0
主页说明安装和整合成功 JkMount /*.Ubuntu jsp平台 ajp13_worker JkMount /*/servlet/ ajp13_worker 中的两个 “ajp13 _worker worker.ajp13_worker.port=8009 worker.ajp13_worker.host=localhost worker.ajp13_worker.type= ajp13 worker.ajp13_worker.lbfactor=1 worker.loadbalancer.balanced_workers=ajp13_worker 在修改/etc/apache2 -5.0.6.tar.gz) tar zxvf mysql-connector-java-5.0.6.tar.gz 3.配置连接文件 将刚刚展开的mysql-connector-java-5.0.6 中的 mysql-connector-java-5.0.6-bin.jar文件拷贝到上面安装的jdk 和 tomcat下的lib文件夹中 cd mysql-connector-java-5.0.6 cp
整合Apache和Tomcat,使得Java工程和PHP工程都能共用80端口,访问网站时,无需在地址栏中加端口号,具体实现如下,感兴趣的朋友可以参考下哈 目的: 整合Apache和Tomcat,使得Java JkMount /servlet/* ajp13 #Send all files under MyProject for to worker named ajp13 JKMount /MyProject ajp13 3、在/apache/conf目录下新建文件workers.properties worker.list=ajp13 worker.ajp13.port=8009 worker.ajp13 .host=localhost worker.ajp13.type=ajp13 worker.ajp13.lbfactor=1 4、修改/conf/httpd.conf Listen 80改为Listen 端口号(8009不可修改,若这一句被注释掉了,取消注释) <Connector port="8009" protocol="<em>AJP</em>/1.3" redirectPort="8443" /> III.检查<
http://archive.apache.org/dist/tomcat/ https://github.com/apache/tomcat/releases 下载完成之后,放置在任意目录下,并安装好Java AJP连接器可以通过AJP协议和另一个web容器进行交互。它监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。 AJP连接器可以通过AJP协议和一个web容器进行交互。 默认情况下,tomcat配置完成后,在conf/server.xml文件中AJP connector服务在8009端口监听 ? 如未使用Tomcat AJP协议: 如未使用 Tomcat AJP 协议,可以直接将 Tomcat 升级到 9.0.31、8.5.51或 7.0.100 版本进行漏洞修复。 如果使用了Tomcat AJP协议: 建议将Tomcat立即升级到9.0.31、8.5.51或7.0.100版本进行修复,同时为AJP Connector配置secret来设置AJP协议的认证凭证。
#此处的ajp13是workers.properties文件中的worker.list配置的值,一定要写的一样,否则会报错 JkMount /*.jsp ajp13 JkMount /*.do ajp13 内容如下: worker.ajp13.port= 8009 worker.ajp13.host= 127.0.0.1 worker.ajp13.type= ajp13 worker.ajp13.lbfactor " import="java.util.*"%> ::this is tomcat's jsp page Now,the time&date is : <%out.println(new Date()) #在apache服务器下创建jsp文件 vi /usr/local/apache2/htdocs/test/showtime.jsp #输入如下内容 <%@page language="<em>java</em> " import="<em>java</em>.util.*"%> ::this is apache's jsp page Now,the time&date is : <%out.println(new Date())
因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。 由长亭科技安全研究员发现的存在于 Tomcat中的安全漏洞,由于 Tomcat AJP协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector可以读取或包含 Tomcat上所有 webapp 漏洞原理 Tomcat 配置了两个Connecto,它们分别是 HTTP 和 AJP :HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJP比http tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的 ,会根据RFC 3875来从Url参数中生成命令行参数,并把参数传递至Java的 Runtime 执行。
-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener Documentation at : <em>Java</em> HTTP Connector: /docs/config/http.html (blocking & non-blocking) <em>Java</em> <em>AJP</em> Connector: /docs/config/<em>ajp</em>.html APR (HTTP/<em>AJP</em>) Connector: /docs/apr.html -- Define an <em>AJP</em> 1.3 Connector on port 8009 --> <Connector port="8009" protocol="<em>AJP</em>/1.3" redirectPort -- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost
最近公司又在搞安全监控,针对tomcat关于AJP端口存在的漏洞要求升级指定版本或关闭该端口重启服务,小编所在的部门关于tomcat外置服务器AJP端口早已关闭,得益于前技术总监的优化建议。 以下是关于前技术总监关于tomcat优化的建议,拿小本本记下的内容: 1.关闭AJP端口8009 在tomcat前再使用web服务器时,即便tomcat提供的都是静态资源文件,情况都要比直接使用http 连接差的多,如果确实有需要集成前置服务器,走AJP协议要比http协议性能更好。 通常前置服务器有nginx做静态伺服器和反向代理足矣,无需使用AJP,不用的资源直接关掉即可。 set "JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -Xss512k -Xloggc:/star_gc.log -XX:+PrintGCDetails
包含指标、链路、日志的一站式应用性能监控服务,开源协议平滑接入,有效加速故障排查,定位架构瓶颈
扫码关注腾讯云开发者
领取腾讯云代金券