8009 - Pentesting Apache JServ Protocol (AJP)

Reading time: 6 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

From 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'

これは、認証情報を含む WEB-INF/web.xml のようなファイルを取得できるLFI脆弱性です。これは、脆弱性を悪用するためのエクスプロイトであり、AJPが公開しているポートはこれに対して脆弱である可能性があります。

パッチが適用されたバージョンは、9.0.31、8.5.51、および7.0.100以上です。

列挙

自動

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

ブルートフォース

AJPプロキシ

Nginxリバースプロキシ + AJP

(Docker化されたバージョンをチェック)

オープンなAJPプロキシポート(8009 TCP)と通信することが可能で、Nginxのajp_module Apacheモジュールを使用してこのポートからTomcatマネージャーにアクセスでき、最終的には脆弱なサーバーでのRCEにつながる可能性があります。

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.confhttpブロックに以下を追加します。
json
upstream tomcats {
server <TARGET_SERVER>:8009;
keepalive 10;
}
server {
listen 80;
location / {
ajp_keep_conn on;
ajp_pass tomcats;
}
}
  • 最後に、nginxを起動します(sudo nginx)そして、http://127.0.0.1にアクセスして動作を確認します。

NginxのDocker化バージョン

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

nginx.confTARGET-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 プロキシ を使用することも可能です。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする