Linux Capabilities
RootedCON є найважливішою подією в галузі кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою просування технічних знань, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в усіх дисциплінах.\
Linux Capabilities
Linux capabilities ділять привілеї root на менші, окремі одиниці, дозволяючи процесам мати підмножину привілеїв. Це мінімізує ризики, не надаючи повні привілеї root без потреби.
Проблема:
Звичайні користувачі мають обмежені дозволи, що впливає на завдання, такі як відкриття мережевого сокета, яке вимагає доступу root.
Набори можливостей:
Inherited (CapInh):
Мета: Визначає можливості, які передаються від батьківського процесу.
Функціональність: Коли створюється новий процес, він успадковує можливості від свого батька в цьому наборі. Корисно для підтримки певних привілеїв під час створення процесів.
Обмеження: Процес не може отримати можливості, яких не мав його батько.
Effective (CapEff):
Мета: Представляє фактичні можливості, які процес використовує в будь-який момент.
Функціональність: Це набір можливостей, які перевіряються ядром для надання дозволу на різні операції. Для файлів цей набір може бути прапором, що вказує, чи слід враховувати дозволені можливості файлу як ефективні.
Значення: Ефективний набір є критично важливим для негайних перевірок привілеїв, діючи як активний набір можливостей, які може використовувати процес.
Permitted (CapPrm):
Мета: Визначає максимальний набір можливостей, які може мати процес.
Функціональність: Процес може підвищити можливість з дозволеного набору до свого ефективного набору, надаючи йому можливість використовувати цю можливість. Він також може скинути можливості зі свого дозволеного набору.
Межа: Він діє як верхня межа для можливостей, які може мати процес, забезпечуючи, щоб процес не перевищував свій попередньо визначений обсяг привілеїв.
Bounding (CapBnd):
Мета: Встановлює межу для можливостей, які процес може коли-небудь отримати під час свого життєвого циклу.
Функціональність: Навіть якщо процес має певну можливість у своєму успадкованому або дозволеному наборі, він не може отримати цю можливість, якщо вона також не в межах набору.
Використання: Цей набір особливо корисний для обмеження потенціалу підвищення привілеїв процесу, додаючи додатковий рівень безпеки.
Ambient (CapAmb):
Мета: Дозволяє зберігати певні можливості під час системного виклику
execve
, який зазвичай призводить до повного скидання можливостей процесу.Функціональність: Забезпечує, щоб програми без SUID, які не мають асоційованих файлових можливостей, могли зберігати певні привілеї.
Обмеження: Можливості в цьому наборі підлягають обмеженням успадкованих і дозволених наборів, забезпечуючи, щоб вони не перевищували дозволені привілеї процесу.
Для отримання додаткової інформації перегляньте:
Процеси та Бінарні Можливості
Можливості Процесів
Щоб побачити можливості для конкретного процесу, використовуйте файл status у каталозі /proc. Оскільки він надає більше деталей, обмежимося лише інформацією, що стосується можливостей Linux. Зверніть увагу, що для всіх запущених процесів інформація про можливості зберігається для кожного потоку, для бінарних файлів у файловій системі вона зберігається в розширених атрибутах.
Ви можете знайти можливості, визначені в /usr/include/linux/capability.h
Ви можете знайти можливості поточного процесу в cat /proc/self/status
або виконавши capsh --print
, а також можливості інших користувачів у /proc/<pid>/status
Ця команда повинна повернути 5 рядків на більшості систем.
CapInh = Спадковані можливості
CapPrm = Дозволені можливості
CapEff = Ефективні можливості
CapBnd = Обмежувальний набір
CapAmb = Набір навколишніх можливостей
Ці шістнадцяткові числа не мають сенсу. Використовуючи утиліту capsh, ми можемо декодувати їх у назви можливостей.
Давайте перевіримо тепер capabilities, які використовуються ping
:
Хоча це працює, є інший і простіший спосіб. Щоб побачити можливості запущеного процесу, просто використовуйте інструмент getpcaps, за яким слідує його ідентифікатор процесу (PID). Ви також можете надати список ідентифікаторів процесів.
Давайте перевіримо можливості tcpdump
після надання бінарному файлу достатніх можливостей (cap_net_admin
та cap_net_raw
) для перехоплення мережі (tcpdump працює в процесі 9562):
Як ви можете бачити, надані можливості відповідають результатам двох способів отримання можливостей бінарного файлу. Інструмент getpcaps використовує системний виклик capget() для запиту доступних можливостей для певного потоку. Цей системний виклик потребує лише PID для отримання додаткової інформації.
Можливості бінарних файлів
Бінарні файли можуть мати можливості, які можна використовувати під час виконання. Наприклад, дуже поширено знаходити бінарний файл ping
з можливістю cap_net_raw
:
Ви можете шукати двійкові файли з можливостями за допомогою:
Скидання можливостей з capsh
Якщо ми скинемо можливості CAP_NET_RAW для ping, тоді утиліта ping більше не повинна працювати.
Крім виходу самого capsh, команда tcpdump також повинна викликати помилку.
/bin/bash: /usr/sbin/tcpdump: Операція не дозволена
Помилка чітко показує, що команді ping не дозволено відкривати сокет ICMP. Тепер ми точно знаємо, що це працює як очікувалося.
Видалити можливості
Ви можете видалити можливості бінарного файлу з
User Capabilities
Очевидно, можливо призначити можливості також користувачам. Це, ймовірно, означає, що кожен процес, виконуваний користувачем, зможе використовувати можливості користувача.
Виходячи з цього, цього та цього, потрібно налаштувати кілька файлів, щоб надати користувачу певні можливості, але той, що призначає можливості кожному користувачу, буде /etc/security/capability.conf
.
Приклад файлу:
Системні можливості
Компіліруючи наступну програму, можливо запустити оболонку bash в середовищі, яке надає можливості.
Всередині bash, виконуваного скомпільованим амбієнтним бінарником, можна спостерігати нові можливості (звичайний користувач не матиме жодної можливості в розділі "поточний").
Ви можете додавати лише ті можливості, які присутні як у дозволених, так і в успадкованих наборах.
Бінарні файли з усвідомленням можливостей/Бінарні файли без усвідомлення можливостей
Бінарні файли з усвідомленням можливостей не використовуватимуть нові можливості, надані середовищем, однак бінарні файли без усвідомлення можливостей використовуватимуть їх, оскільки не відхилять їх. Це робить бінарні файли без усвідомлення можливостей вразливими в спеціальному середовищі, яке надає можливості бінарним файлам.
Можливості сервісу
За замовчуванням сервіс, що працює від імені root, матиме призначені всі можливості, і в деяких випадках це може бути небезпечно. Тому файл конфігурації сервісу дозволяє вказати можливості, які ви хочете, щоб він мав, і користувача, який повинен виконувати сервіс, щоб уникнути запуску сервісу з непотрібними привілеями:
Capabilities in Docker Containers
За замовчуванням Docker призначає кілька можливостей контейнерам. Дуже легко перевірити, які це можливості, запустивши:
RootedCON є найактуальнішою подією в галузі кібербезпеки в Іспанії та однією з найважливіших в Європі. З метою просування технічних знань, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в усіх дисциплінах.
Privesc/Container Escape
Можливості корисні, коли ви хочете обмежити свої власні процеси після виконання привілейованих операцій (наприклад, після налаштування chroot і прив'язки до сокета). Однак їх можна експлуатувати, передаючи їм шкідливі команди або аргументи, які потім виконуються від імені root.
Ви можете примусово застосувати можливості до програм, використовуючи setcap
, і запитувати їх, використовуючи getcap
:
+ep
означає, що ви додаєте можливість (“-” видалить її) як Ефективну та Дозволену.
Щоб ідентифікувати програми в системі або папці з можливостями:
Приклад експлуатації
У наступному прикладі двійковий файл /usr/bin/python2.6
виявляється вразливим до підвищення привілеїв:
Можливості, необхідні для tcpdump
, щоб дозволити будь-якому користувачу перехоплювати пакети:
Спеціальний випадок "порожніх" можливостей
З документації: Зверніть увагу, що можна призначити порожні набори можливостей програмному файлу, і таким чином можливо створити програму з set-user-ID-root, яка змінює ефективний та збережений set-user-ID процесу, що виконує програму, на 0, але не надає жодних можливостей цьому процесу. Або, простіше кажучи, якщо у вас є двійковий файл, який:
не належить root
не має встановлених бітів
SUID
/SGID
має порожні набори можливостей (наприклад:
getcap myelf
повертаєmyelf =ep
)
тоді цей двійковий файл буде виконуватись як root.
CAP_SYS_ADMIN
CAP_SYS_ADMIN
є надзвичайно потужною можливістю Linux, часто прирівнюється до рівня близького до root через свої широкі адміністративні привілеї, такі як монтування пристроїв або маніпулювання функціями ядра. Хоча вона є незамінною для контейнерів, що імітують цілі системи, CAP_SYS_ADMIN
створює значні проблеми безпеки, особливо в контейнеризованих середовищах, через свій потенціал для ескалації привілеїв та компрометації системи. Тому її використання вимагає суворих оцінок безпеки та обережного управління, з сильною перевагою для скидання цієї можливості в контейнерах, специфічних для застосунків, щоб дотримуватись принципу найменших привілеїв та мінімізувати поверхню атаки.
Приклад з двійковим файлом
Використовуючи python, ви можете змонтувати модифікований passwd файл поверх реального passwd файлу:
І нарешті монтуйте змінений passwd
файл на /etc/passwd
:
І ви зможете su
як root використовуючи пароль "password".
Приклад з середовищем (вихід з Docker)
Ви можете перевірити увімкнені можливості всередині контейнера docker за допомогою:
Всередині попереднього виходу ви можете побачити, що можливість SYS_ADMIN увімкнена.
Mount
Це дозволяє контейнеру docker монтувати диск хоста та вільно до нього отримувати доступ:
Повний доступ
У попередньому методі ми змогли отримати доступ до диска хоста docker. Якщо ви виявите, що хост працює на сервері ssh, ви можете створити користувача всередині диска хоста docker і отримати доступ до нього через SSH:
CAP_SYS_PTRACE
Це означає, що ви можете втекти з контейнера, інжектуючи shellcode в деякий процес, що виконується всередині хоста. Щоб отримати доступ до процесів, що виконуються всередині хоста, контейнер потрібно запускати принаймні з --pid=host
.
CAP_SYS_PTRACE
надає можливість використовувати функціональність налагодження та трасування системних викликів, що надається ptrace(2)
, а також виклики крос-пам'яті, такі як process_vm_readv(2)
і process_vm_writev(2)
. Хоча це потужний інструмент для діагностики та моніторингу, якщо CAP_SYS_PTRACE
увімкнено без обмежувальних заходів, таких як фільтр seccomp на ptrace(2)
, це може суттєво підірвати безпеку системи. Зокрема, це може бути використано для обходу інших обмежень безпеки, зокрема тих, що накладаються seccomp, як показано в доказах концепції (PoC), таких як цей.
Приклад з бінарним файлом (python)