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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
kibana-prototype-pollusion — Kibana Prototype Pollution RCE (CVE-2019-7609)のPoCと分析。 | Kitploit
ツール/GitHubGitHub/aleister1102/kibana-prototype-pollusion
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用論文と研究学習と教育
GitHubaleister1102/kibana-prototype-pollusion

kibana-prototype-pollusion

Kibana Prototype Pollution RCE (CVE-2019-7609)のPoCと分析。

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
リポジトリを見る
2年前未レビュー

CVE-2019-7609

Kibana 5.6.15未満および6.6.1未満のバージョンには、Timelionビジュアライザーにおける任意のコード実行の脆弱性が存在します。Timelionアプリケーションにアクセスできる攻撃者は、JavaScriptコードを実行しようとするリクエストを送信する可能性があります。これにより、攻撃者はホストシステム上のKibanaプロセスの権限で任意のコマンドを実行する可能性があります。

CVSS:

cvss

ブログ: https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/

ペイロード: https://github.com/mpgn/CVE-2019-7609

ターゲット

セットアップ:

  • Docker: https://www.elastic.co/guide/en/kibana/8.14/docker.html
  • Docker Compose

使用:

  • Kibana: https://www.elastic.co/guide/en/kibana/current/development-getting-started.html
  • Timelion: https://www.elastic.co/guide/en/kibana/5.4/timelion.html

分析

Timelion

シートの解析後:

代替テキスト

シートの事前処理後、queriesオブジェクトが得られます:

代替テキスト

次に、queries配列(valuesメソッドを使用して配列に変換されます)をループし、invokeにquery.functionとquery.argumentsを渡して関数を呼び出します。

invoke関数では、まず関数名(query.function)に基づいて関数定義を取得します:

代替テキスト

この関数定義には、fn、originalFn、timelionFnの3種類の関数が含まれています。次に、args(query.arguments)をループして引数を解決します:

代替テキスト

この場合、args内の引数は'literal'型のオブジェクトであるため、リテラル値をそのまま返します:

代替テキスト

実際には、値はPromiseでラップされています。

代替テキスト

インデックス付き引数は、内部にq配列を持つbyNameオブジェクトを持つ引数です:

代替テキスト

その後、invoke関数は、すべてのインデックス付き引数を使用してfunctionDef.fn(Timelionクラスの関数)を呼び出します:

代替テキスト

fn関数はoriginalFnを呼び出します。これはconfig.fn(configはtlConfig)から来ており、その関数はDatasource extends Timelionクラスのfnです:

代替テキスト

ご覧の通り、esFnという別のoriginalFnを呼び出しており、これはseriesListオブジェクトを返します:

代替テキスト

この関数は、「Elasticsearchインスタンスからデータをプルする」ために使用され、callWithRequest関数を呼び出します。

seriesListはDatasource.fnでは次のようになります:

代替テキスト

Timelion.fnでは次のようになります:

代替テキスト

シートの事前処理後、チェーンリストは次のようになります:

代替テキスト

そして、コードはresolveChainListを呼び出してチェーンリストを解決します:

代替テキスト

各チェーンは、invokeに'first'をfnNameとして、チェーン自体をargsとして渡して返されたPromiseにマッピングされます。

関数定義は再び名前で取得されます:

代替テキスト

今回は、resolveArgumentsはargsを配列として受け取り、各引数を解決するために再帰的にresolveArgumentsを呼び出します。ただし、インデックス0の引数は1つだけです。その引数はtype == chainのオブジェクトです。

そのため、switchケースでは、invokeChain関数を呼び出し、チェーンオブジェクトを渡します:

代替テキスト

invoke chainの中では、chain配列をshiftします。shift関数は削除された要素を返すため、linkはesオブジェクトになります:

代替テキスト

esのタイプは'chain'ではなく('function'です)、!resultはtruthyであるため、コードはinvoke関数を'first'をfnNameとして、esオブジェクトをargsとして呼び出します:

今回は上記と同じ手順なので、linkがpropsオブジェクトのinvokeChain呼び出しにスキップします:

代替テキスト

再び、コードはinvoke関数を'first'をfnNameとして、propsオブジェクトをargsとして呼び出します:

代替テキスト

propsのoriginalFnは、esのようにfnではなくfirstFnであり、1つの引数のみを受け入れます:

代替テキスト

そのオリジナル関数は、最終的に脆弱なunflatten関数を呼び出します。実際には、最初にTimelionのfnを呼び出し、次にfnがpropsのoriginalFnを呼び出します:

代替テキスト

propsのfirstFnは、argsのbyNameオブジェクトからinputSeriesとglobalプロパティを省略します:

代替テキスト

そのため、unflattenに渡されるdataは次のようになります:

root@kitploit:~
{
    label.__proto__.env.AAA: "a"
}

証明:

代替テキスト

Unflatten

props(label.__proto__.env.AAA="a")を使用します。dataは次のようになります:

代替テキスト

最初の反復では、prop = ''は存在しないため、cur[''] = {}を代入します。つまり、resultにも''という名前のプロパティが作成され、その値は空のオブジェクトになります。その後、curには前の代入の戻り値である{}が割り当てられます(curとcur[prop]は同じオブジェクトを指します):

代替テキスト

次に、propは'label'になります:

代替テキスト

前と同様に、resultに'label'プロパティが追加され、propは__proto__になります:

代替テキスト

3回目の反復では、__proto__はすべてのオブジェクトに常に存在するため、curはそのプロトタイプになります:

代替テキスト

その後、propはenvになります。

そして、curはObject.prototypeを指しているため、Object.prototypeにenvが空のオブジェクトとして追加され、curもObject.prototype.env内のenvを参照します。

代替テキスト

その後、ループが終了し、cur[prop] = data[p]はenv[AAA] = 'a'と等価になります。

代替テキスト

Object.prototypeがenvで汚染されました:

代替テキスト

Canvas

fork関数はspawnを呼び出すために使用できるChildProcessを返します

fork関数を呼び出す際のポートを9669(別のポート)に変更すると、メインプロセスを通常通りデバッグできます:

代替テキスト

汚染されたObject.prototypeをシミュレートし、ループの前にジャンプします:

代替テキスト

ご覧の通り、プロトタイプ汚染によりenvは{ AAA: 'a' }と等価です。具体的には、envはoptions.envに割り当てられます。そして、optionsはそのプロパティを定義していないため、プロトタイプの値を使用します。

ループ後:

代替テキスト

何らかの理由で、無効な環境変数(AAA=a、env=[Object object])がある場合、canvasは新しいソケットを作成できません:

代替テキスト

ただし、子プロセスはまだ作成できます:

代替テキスト

通常のフローでは、新しいWebSocket接続が作成されます:

代替テキスト

次にペイロードを試し、normalizeSpawnArgumentsにジャンプします:

代替テキスト

ご覧の通り、スタックトレースは同じです。

しかし、envは汚染されています:

代替テキスト

出来上がり!

ループ後のenvPairs:

代替テキスト

そして、リバースシェルを取得しました:

代替テキスト

Spawn

spawn関数内でnormalizeSpawnArgumentsを呼び出した後:

代替テキスト

ご覧の通り、envPairsにはペイロードが含まれています。また、その後spawnはinternal/child_process.js内のspawn関数を呼び出します:

代替テキスト

options変数はthis._handle.spawnに渡されます:

代替テキスト

ここでthis._handleはプロセスへのハンドルです:

代替テキスト

パッチ

root@kitploit:~
From 3377f813a5d96ff466bdf7343ce161de24830ed4 Mon Sep 17 00:00:00 2001
From: ppisljar <[email protected]>
Date: Wed, 16 Jan 2019 06:01:20 -0800
Subject: [PATCH] fixes

---
 .../core_plugins/timelion/server/series_functions/props.js      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/legacy/core_plugins/timelion/server/series_functions/props.js b/src/legacy/core_plugins/timelion/server/series_functions/props.js
index 81b74901d4db..80e9cafd6712 100644
--- a/src/legacy/core_plugins/timelion/server/series_functions/props.js
+++ b/src/legacy/core_plugins/timelion/server/series_functions/props.js
@@ -32,7 +32,7 @@ function unflatten(data) {
     let prop = '';
     let m;
     while (m = regex.exec(p)) {
-      cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));
+      cur = (cur.hasOwnProperty(prop) && cur[prop]) || (cur[prop] = (m[2] ? [] : {}));
       prop = m[2] || m[1];
     }
     cur[prop] = data[p];
ツールをダウンロード