# 8009 - Pentesting Apache JServ Protocol (AJP) {{#include ../banners/hacktricks-training.md}} ## 기본 정보 From [https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/](https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/) > AJP는 와이어 프로토콜입니다. 이는 독립형 웹 서버인 [Apache](http://httpd.apache.org/)가 Tomcat과 통신할 수 있도록 HTTP 프로토콜의 최적화된 버전입니다. 역사적으로 Apache는 정적 콘텐츠를 제공하는 데 Tomcat보다 훨씬 빠릅니다. 아이디어는 가능한 경우 Apache가 정적 콘텐츠를 제공하고, Tomcat 관련 콘텐츠에 대해서는 요청을 Tomcat으로 프록시하는 것입니다. 또한 흥미로운 점: > ajp13 프로토콜은 패킷 지향적입니다. 성능상의 이유로 더 읽기 쉬운 일반 텍스트보다 이진 형식이 선택된 것으로 보입니다. 웹 서버는 TCP 연결을 통해 서블릿 컨테이너와 통신합니다. 소켓 생성의 비용이 많이 드는 과정을 줄이기 위해, 웹 서버는 서블릿 컨테이너에 대한 지속적인 TCP 연결을 유지하고, 여러 요청/응답 주기를 위해 연결을 재사용하려고 시도합니다. **기본 포트:** 8009 ``` PORT STATE SERVICE 8009/tcp open ajp13 ``` ## CVE-2020-1938 ['Ghostcat'](https://www.chaitin.cn/en/ghostcat) 이것은 자격 증명이 포함된 `WEB-INF/web.xml`과 같은 파일을 가져올 수 있는 LFI 취약점입니다. 이 취약점을 악용하기 위한 [익스플로잇](https://www.exploit-db.com/exploits/48143)이며 AJP 노출 포트가 이에 취약할 수 있습니다. 패치된 버전은 9.0.31, 8.5.51 및 7.0.100 이상입니다. ## Enumeration ### Automatic ```bash nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 ``` ### [**브루트 포스**](../generic-hacking/brute-force.md#ajp) ## AJP 프록시 ### Nginx 리버스 프록시 + AJP ([Dockerized 버전 확인하기](8009-pentesting-apache-jserv-protocol-ajp.md#Dockerized-version)) Nginx `ajp_module` 아파치 모듈을 사용하여 열린 AJP 프록시 포트(8009 TCP)와 통신하고 이 포트에서 Tomat Manager에 접근할 수 있으며, 이는 궁극적으로 취약한 서버에서 RCE로 이어질 수 있습니다. - [https://nginx.org/en/download.html](https://nginx.org/en/download.html)에서 Nginx를 다운로드한 후 ajp 모듈로 컴파일합니다: ```bash # Compile Nginx with the ajp module git clone https://github.com/dvershinin/nginx_ajp_module.git cd nginx-version sudo apt install libpcre3-dev ./configure --add-module=`pwd`/../nginx_ajp_module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules make sudo make install nginx -V ``` - 그런 다음, `server` 블록을 주석 처리하고 `/etc/nginx/conf/nginx.conf`의 `http` 블록에 다음을 추가합니다. ```json upstream tomcats { server :8009; keepalive 10; } server { listen 80; location / { ajp_keep_conn on; ajp_pass tomcats; } } ``` - 마지막으로, nginx를 시작합니다 (`sudo nginx`) 그리고 `http://127.0.0.1`에 접속하여 작동하는지 확인합니다. ### Nginx Dockerized-version ```bash git clone https://github.com/ScribblerCoder/nginx-ajp-docker cd nginx-ajp-docker ``` `nginx.conf`에서 `TARGET-IP`를 AJP IP로 교체한 후 빌드하고 실행합니다. ```bash docker build . -t nginx-ajp-proxy docker run -it --rm -p 80:80 nginx-ajp-proxy ``` ### Apache AJP 프록시 **Nginx** 대신 해당 포트에 접근하기 위해 **Apache AJP 프록시**를 사용할 수도 있습니다. ## References - [https://github.com/yaoweibin/nginx_ajp_module](https://github.com/yaoweibin/nginx_ajp_module) {{#include ../banners/hacktricks-training.md}}