Skip to content
KitploitKITPLOIT
ツールブログ
Log in
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cve-2026-43512-poc — CVE-2026-43512 (Apache Tomcat Digest Authentication Bypass) のエクスプロイトPoC | Kitploit
ツール/GitHubGitHub/covepseng/cve-2026-43512-poc
脆弱性分析エクスプロイトウェブセキュリティペネトレーションテスト認証論文と研究学習と教育
GitHubcovepseng/cve-2026-43512-poc

cve-2026-43512-poc

CVE-2026-43512 (Apache Tomcat Digest Authentication Bypass) のエクスプロイトPoC

リポジトリを見る
2173ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-43512 — Apache Tomcat DIGEST認証バイパス

エクスプロイト可能性分析結果: 根本原因は確認されました。標準のUserDatabaseRealmデプロイメントに対するエンドツーエンドのエクスプロイトは再現できません。詳細は分析を参照。


目次

  • 概要
  • 影響を受けるバージョン
  • 根本原因
  • 分析
  • リポジトリ構成
  • 要件
  • 使用方法
  • 期待される出力
  • 参考
  • 免責事項

概要

CVE-2026-43512は、Apache TomcatのHTTP DIGEST認証メカニズムにおける脆弱性です。メソッドRealmBase.getDigest()は、A1ハッシュ入力を構築する前にgetPassword(username)の戻り値を検証しません。設定されたRealmにユーザー名が存在しない場合、getPassword()はnullを返し、Javaの文字列連結演算子はそれを4文字のリテラル"null"に暗黙的に変換します。

そのためサーバーは次のように計算します:

A1 = MD5("<username>:<realm>:null")

パスワードとしてリテラル文字列"null"を使用して計算されたDIGEST応答を送信するクライアントは、同一のハッシュを生成します。アドバイザリによれば、これは認証バイパスを構成します。

このリポジトリには、実際のTomcatインスタンスに対してその主張を検証するための最小限の再現環境とGoベースの概念実証が含まれています。


影響を受けるバージョン

影響範囲修正バージョン
7.0.0 – 7.0.1097.0.110
8.5.0 – 8.5.1008.5.101
9.0.0.M1 – 9.0.1179.0.118
10.1.0.M1 – 10.1.5410.1.55
11.0.0.M1 – 11.0.2111.0.22

根本原因

脆弱なコードパスはRealmBase.java内(すべての影響を受けるブランチ):

// RealmBase.java — vulnerable
protected String getDigest(String username, String realmName, String algorithm) {
    if (hasMessageDigest(algorithm)) {
        return getPassword(username);  // returns null for unknown users
    }

    // null is concatenated as the literal "null" by Java
    String a1 = username + ":" + realmName + ":" + getPassword(username);
    return HexUtils.toHexString(
        ConcurrentMessageDigest.digest(algorithm, a1.getBytes(...))
    );
}

修正(コミット6565a6c)では明示的なnullガードが追加されています:

// RealmBase.java — patched
protected String getDigest(String username, String realmName, String algorithm) {
    String password = getPassword(username);
    if (password == null) {
        return null; 
    }
    ...
}

分析

Tomcat 11.0.0-M1に対してFINEレベルログを有効にしてPoCを実行すると、次のことが明らかになります:

Digest:        2388e2c78407def640f37f092a8d3a84   ← client
Server digest: 2388e2c78407def640f37f092a8d3a84   ← server
Failed to authenticate user [ghost]

ダイジェストハッシュは一致します。 getDigest()のバグは実際に存在し、確認されました。ただし、RealmBase.authenticate()には2つ目の独立したチェックがあるため、認証は依然として失敗します:

// RealmBase.authenticate()
if (serverDigest.equals(clientDigest)) {
    return getPrincipal(username);  // returns null for non-existent users
}
return null;

tomcat-users.xmlでバックアップされた標準のUserDatabaseRealmでは、getPrincipal()はインメモリのユーザーデータベースに対してルックアップを実行します。そのデータベースに存在しないユーザー名の場合、nullを返します。呼び出し元はnullのPrincipalを認証失敗とみなし、401を発行します。


リポジトリ構成

cve-2026-43512-poc/
├── Dockerfile                          # Tomcat 11.0.0-M1 (affected version)
├── tomcat-users.xml                    # Minimal Realm config — no user "ghost"
├── web.xml
├── exploit/
│   ├── exploit.go                      # PoC — Go, stdlib only
│   └── go.mod
└── README.md

要件

ツールバージョン備考
Podman≥ 4.0Dockerでも動作します
Go≥ 1.22エクスプロイトをローカルで実行する場合のみ

使用方法

1. コンテナのビルドと起動

podman build -t tomcat-cve-2026-43512 .
podman run -d --name tomcat-vuln -p 8080:8080 tomcat-cve-2026-43512

Tomcatの起動が完了するまで数秒待ち、起動していることを確認します:

curl -si http://localhost:8080/protected/secret.html | head -1
# Expected: HTTP/1.1 401

2. エクスプロイトの実行

cd exploit
go run exploit.go \
  -target   http://localhost:8080 \
  -path     /protected/secret.html \
  -username ghost

利用可能なフラグ:

フラグデフォルト説明
-targethttp://localhost:8080TomcatのベースURL
-path/protected/保護されたリソースのパス
-usernameghost使用するユーザー名 — tomcat-users.xmlに存在してはなりません

3. Tomcatの詳細ログを有効にする(オプション)

内部の認証状態を観察するには、logging.propertiesファイルを作成し、マウントします:

org.apache.catalina.authenticator.level = FINE
org.apache.catalina.realm.level = FINE
podman run -d --name tomcat-vuln -p 8080:8080 \
  -v ./logging.properties:/usr/local/tomcat/conf/logging.properties:ro \
  tomcat-cve-2026-43512

ログにはダイジェスト比較の結果が直接表示され、ハッシュが一致するかどうかが確認できます。

4. クリーンアップ

podman stop tomcat-vuln && podman rm tomcat-vuln

期待される出力

============================================================
 CVE-2026-43512 — Tomcat DIGEST Auth Bypass PoC
============================================================
 Target   : http://localhost:8080/protected/secret.html
 Username : "ghost"  (must NOT exist in tomcat-users.xml)
 Password : "null"   (literal string)
------------------------------------------------------------
[1] Sending unauthenticated request to obtain DIGEST challenge...
[+] HTTP 401 received — DIGEST challenge:
    Digest realm="UserDatabase", qop="auth", nonce="...", opaque="..."

[*] realm="UserDatabase"  nonce="..."  qop="auth"  algorithm="MD5"

[2] Computing DIGEST response with password="null"...
    Digest username="ghost", realm="UserDatabase", ...

[3] Sending request with crafted DIGEST credentials...
------------------------------------------------------------
[✗] HTTP 401 — exploit failed.
    The UserDatabaseRealm provides a second line of defence:
    getPrincipal("ghost") returned null after the digest matched.
============================================================

参考

リソースリンク
Apache Tomcatセキュリティアドバイザリhttps://tomcat.apache.org/security-9.html
修正コミットhttps://github.com/apache/tomcat/commit/6565a6cb6499e56fe2f34457cec99f9d1c4f39e9
RealmBase.java(メイン)https://github.com/apache/tomcat/blob/main/java/org/apache/catalina/realm/RealmBase.java
RFC 2617 — HTTP Digest認証https://datatracker.ietf.org/doc/html/rfc2617
完全な分析 — ブログ記事https://return-zero.dev/posts/cve-2026-43512

免責事項

このリポジトリは教育目的およびローカルでのエクスプロイト可能性分析のみを目的としています。すべてのテストは自己ホスト型コンテナ環境に対して実施されました。所有していない、または明示的な書面によるテスト許可を得ていないシステムに対してこのPoCを実行しないでください。

ツールをダウンロード