hacktricks/network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md

10 KiB

8009 - Pentesting Apache JServ Protocol (AJP)

htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 제로부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

HackenProof Discord 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터와 소통하세요!

해킹 통찰력
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 관련

실시간 해킹 뉴스
빠르게 변화하는 해킹 세계의 최신 뉴스와 통찰력을 유지하세요

최신 공지
출시되는 최신 버그 바운티 및 중요한 플랫폼 업데이트에 대해 정보를 유지하세요

**Discord**에 참여하여 최고의 해커들과 협업을 시작하세요!

기본 정보

출처: https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/

AJP는 와이어 프로토콜입니다. 이는 Apache와 같은 독립형 웹 서버가 Tomcat과 통신할 수 있도록 HTTP 프로토콜의 최적화된 버전입니다. 역사적으로 Apache는 정적 콘텐츠를 제공하는 데 Tomcat보다 훨씬 빨랐습니다. 아이디어는 가능한 경우 Apache가 정적 콘텐츠를 제공하도록 하되, Tomcat 관련 콘텐츠에 대한 요청을 Tomcat으로 프록시하는 것입니다.

또한 흥미로운 내용:

ajp13 프로토콜은 패킷 지향적입니다. 성능상의 이유로 이해하기 쉬운 일반 텍스트 대신 이진 형식이 선택되었습니다. 웹 서버는 서블릿 컨테이너와 TCP 연결을 통해 통신합니다. 소켓 생성의 비용을 줄이기 위해 웹 서버는 서블릿 컨테이너에 대한 지속적인 TCP 연결을 유지하려고 시도하며, 여러 요청/응답 주기에 대해 연결을 재사용할 것입니다.

기본 포트: 8009

PORT     STATE SERVICE
8009/tcp open  ajp13

CVE-2020-1938 'Ghostcat'

AJP 포트가 노출되어 있으면 Tomcat은 Ghostcat 취약점에 취약할 수 있습니다. 이 문제와 작동하는 exploit이 있습니다.

Ghostcat은 특정 경로에서만 파일을 끌어올 수 있는 LFI 취약점입니다. 그럼에도 불구하고 이는 WEB-INF/web.xml과 같은 파일을 포함할 수 있으며, 이는 서버 설정에 따라 Tomcat 인터페이스의 자격 증명과 같은 중요한 정보를 노출시킬 수 있습니다.

9.0.31 이상, 8.5.51 및 7.0.100 이상의 패치된 버전은 이 문제를 해결했습니다.

Enumeration

Automatic

nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 <IP>

브루트 포스

AJP 프록시

Nginx 리버스 프록시 & AJP

Docker화된 버전 확인

8009 TCP로 열린 AJP 프록시 포트를 만나면 Nginx와 ajp_module을 사용하여 "숨겨진" Tomcat Manager에 액세스할 수 있습니다. 이를 위해 다음과 같이 Nginx 소스 코드를 컴파일하고 필요한 모듈을 추가해야 합니다:

  • Nginx 소스 코드 다운로드
  • 필요한 모듈 다운로드
  • ajp_module을 사용하여 Nginx 소스 코드 컴파일
  • AJP 포트를 가리키는 구성 파일 생성
# Download Nginx code
wget https://nginx.org/download/nginx-1.21.3.tar.gz
tar -xzvf nginx-1.21.3.tar.gz

# Compile Nginx source code with the ajp module
git clone https://github.com/dvershinin/nginx_ajp_module.git
cd nginx-1.21.3
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 {
-#     listen 80;
-#     server_name example.com;
-#     location / {
-#         root /var/www/html;
-#         index index.html;
-#     }
-# }
+    location /secret {
+        root /var/www/secret;
+        index index.html;
+    }
upstream tomcats {
server <TARGET_SERVER>:8009;
keepalive 10;
}
server {
listen 80;
location / {
ajp_keep_conn on;
ajp_pass tomcats;
}
}

로컬 호스트에 cURL 요청을 보내어 Nginx를 시작하고 모든 것이 올바르게 작동하는지 확인합니다.

sudo nginx
curl http://127.0.0.1:80

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/X.X.XX</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</headas
<body>
<div id="wrapper">
<div id="navigation" class="curved container">
<span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
<span id="nav-hosts"><a href="/docs/">Documentation</a></span>
<span id="nav-config"><a href="/docs/config/">Configuration</a></span>
<span id="nav-examples"><a href="/examples/">Examples</a></span>
<span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
<span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
<span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
<br class="separator" />
</div>
<div id="asf-box">
<h1>Apache Tomcat/X.X.XX</h1>
</div>
<div id="upper" class="curved container">
<div id="congrats" class="curved container">
<h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
<SNIP>

Nginx 도커화된 버전

git clone https://github.com/ScribblerCoder/nginx-ajp-docker
cd nginx-ajp-docker

nginx.conf 파일에서 TARGET-IP를 AJP IP로 변경한 후 빌드하고 실행하세요.

docker build . -t nginx-ajp-proxy
docker run -it --rm -p 80:80 nginx-ajp-proxy

Apache AJP Proxy

포트 8009가 열려 있지만 다른 접근 가능한 웹 포트가 없는 경우는 드물지만, Metasploit을 사용하여 이를 악용할 수 있습니다. Apache를 프록시로 활용하여 요청을 포트 8009의 Tomcat으로 리다이렉트할 수 있습니다.

sudo apt-get install libapache2-mod-jk
sudo vim /etc/apache2/apache2.conf # append the following line to the config
Include ajp.conf
sudo vim /etc/apache2/ajp.conf     # create the following file, change HOST to the target address
ProxyRequests Off
<Proxy *>
Order deny,allow
Deny from all
Allow from localhost
</Proxy>
ProxyPass       / ajp://HOST:8009/
ProxyPassReverse    / ajp://HOST:8009/
sudo a2enmod proxy_http
sudo a2enmod proxy_ajp
sudo systemctl restart apache2

이 설정은 AJP 프로토콜의 이진 형식 때문에 침입 탐지 및 방지 시스템 (IDS/IPS)를 우회할 수 있는 잠재력을 제공하지만, 이 기능이 확인되지는 않았습니다. 정상적인 Metasploit Tomcat exploit을 127.0.0.1:80으로 전송하여 대상 시스템을 효과적으로 제어할 수 있습니다.

msf  exploit(tomcat_mgr_deploy) > show options

참고 자료

HackenProof Discord 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터들과 소통하세요!

해킹 통찰
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요

실시간 해킹 뉴스
실시간 뉴스와 통찰을 통해 빠른 속도의 해킹 세계를 최신 상태로 유지하세요

최신 공지
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요

**Discord에서 최고의 해커들과 협업을 시작하세요!

**htARTE (HackTricks AWS Red Team Expert)**로부터 AWS 해킹을 제로부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법: