13 KiB
8009 - Apache JServ Protocol (AJP)의 Pentesting
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- The PEASS Family를 발견하세요. 독점적인 NFTs 컬렉션입니다.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm를 팔로우하세요.
- Hacking Tricks를 공유하려면 PR을 HackTricks 및 HackTricks Cloud github 저장소에 제출하세요.
경험있는 해커와 버그 바운티 헌터와 소통하기 위해 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 이상의 패치된 버전은 이 문제를 해결했습니다.
열거
자동화된 방법
nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 <IP>
무차별 대입 공격
AJP 프록시
Nginx 역 프록시 & AJP
AJP 프록시 포트(8009 TCP)가 열려 있는 경우, 우리는 ajp_module
을 사용하여 "숨겨진" Tomcat Manager에 접근하기 위해 Nginx를 사용할 수 있습니다. 이를 위해 다음과 같이 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
/etc/nginx/conf/nginx.conf
파일의 http
블록 내에 다음 라인을 추가하고, server
블록 전체를 주석 처리하세요.
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 도커화 버전
Nginx is a popular web server that is often used as a reverse proxy. It is known for its high performance and scalability. In this section, we will discuss how to run Nginx in a Docker container.
Nginx는 자주 사용되는 웹 서버로, 역 프록시로 사용되는 경우가 많습니다. 높은 성능과 확장성으로 알려져 있습니다. 이 섹션에서는 Nginx를 Docker 컨테이너에서 실행하는 방법에 대해 설명하겠습니다.
Dockerizing Nginx
To run Nginx in a Docker container, you need to create a Dockerfile. Here is an example of a basic Dockerfile for Nginx:
Nginx를 Docker 컨테이너에서 실행하려면 Dockerfile을 생성해야 합니다. 다음은 Nginx를 위한 기본 Dockerfile의 예입니다:
FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
In this Dockerfile, we start with the latest Nginx image from the Docker Hub. We then copy our custom nginx.conf
file to the appropriate location in the container. The EXPOSE
instruction exposes port 80, which is the default port for HTTP traffic. Finally, the CMD
instruction starts the Nginx server with the daemon off;
option, which keeps the process running in the foreground.
이 Dockerfile에서는 Docker Hub에서 최신 Nginx 이미지로 시작합니다. 그런 다음 사용자 정의 nginx.conf
파일을 컨테이너의 적절한 위치로 복사합니다. EXPOSE
지시문은 HTTP 트래픽의 기본 포트인 80번 포트를 노출합니다. 마지막으로 CMD
지시문은 daemon off;
옵션으로 Nginx 서버를 시작하며, 이는 프로세스를 전면에서 실행 상태로 유지합니다.
To build the Docker image, navigate to the directory containing the Dockerfile and run the following command:
Docker 이미지를 빌드하려면 Dockerfile이 있는 디렉토리로 이동한 다음 다음 명령을 실행하세요:
docker build -t my-nginx .
This command builds the Docker image with the tag my-nginx
. The .
at the end of the command specifies the build context, which is the current directory.
이 명령은 태그가 my-nginx
인 Docker 이미지를 빌드합니다. 명령의 끝에 있는 .
은 빌드 컨텍스트를 나타내며, 현재 디렉토리를 의미합니다.
Once the image is built, you can run a container from it using the following command:
이미지가 빌드되면 다음 명령을 사용하여 컨테이너를 실행할 수 있습니다:
docker run -d -p 80:80 my-nginx
This command runs a container from the my-nginx
image in detached mode (-d
), mapping port 80 of the host to port 80 of the container (-p 80:80
).
이 명령은 호스트의 80번 포트를 컨테이너의 80번 포트에 매핑하여 my-nginx
이미지에서 컨테이너를 분리된 모드(-d
)로 실행합니다(-p 80:80
).
You can now access the Nginx server by navigating to http://localhost
in your web browser.
이제 웹 브라우저에서 http://localhost
로 이동하여 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 프록시
다른 접근 가능한 웹 포트 없이 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
참고 자료
- https://github.com/yaoweibin/nginx_ajp_module
- https://academy.hackthebox.com/module/145/section/1295
경험 많은 해커와 버그 바운티 헌터와 소통하기 위해 HackenProof Discord 서버에 가입하세요!
해킹 통찰력
해킹의 스릴과 도전에 대해 자세히 알아보는 콘텐츠에 참여하세요.
실시간 해킹 뉴스
실시간 뉴스와 통찰력을 통해 빠르게 변화하는 해킹 세계를 따라가세요.
최신 공지사항
새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 최신 정보를 받아보세요.
**Discord**에 가입하여 최고의 해커들과 협업을 시작하세요!
**htARTE (HackTricks AWS Red Team Expert)**로 AWS 해킹을 처음부터 전문가까지 배워보세요!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- 독점적인 NFTs인 The PEASS Family를 발견하세요.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm를 팔로우하세요.
- HackTricks와 HackTricks Cloud github 저장소에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.