Linux Capabilities
RootedCON є найбільш важливою подією з кібербезпеки в Іспанії та однією з найважливіших в Європі. З місією просування технічних знань цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у будь-якій галузі.\
Linux Capabilities
Linux capabilities розбивають привілеї root на менші, відокремлені одиниці, що дозволяє процесам мати підмножину привілеїв. Це мінімізує ризики, не надаючи повних привілеїв root непотрібно.
Проблема:
Звичайні користувачі мають обмежені дозволи, що впливає на завдання, такі як відкриття мережевого сокета, яке вимагає доступу root.
Набори привілеїв:
Успадковані (CapInh):
Мета: Визначає привілеї, успадковані від батьківського процесу.
Функціональність: Коли створюється новий процес, він успадковує привілеї від свого батька в цьому наборі. Корисно для збереження певних привілеїв під час створення процесів.
Обмеження: Процес не може отримати привілеї, які не мав його батьківський процес.
Ефективні (CapEff):
Мета: Представляє фактичні привілеї, якими процес користується у будь-який момент.
Функціональність: Це набір привілеїв, які перевіряються ядром для надання дозволу на різні операції. Для файлів цей набір може бути прапорцем, що вказує, чи слід вважати дійсними привілеї, дозволені для файлу.
Значення: Ефективний набір є важливим для миттєвих перевірок привілеїв, діючи як активний набір привілеїв, якими може користуватися процес.
Дозволені (CapPrm):
Мета: Визначає максимальний набір привілеїв, якими може користуватися процес.
Функціональність: Процес може підвищити привілегію з дозволеного набору до ефективного, надаючи можливість використовувати цю привілегію. Він також може скинути привілеї зі свого дозволеного набору.
Межа: Він діє як верхній ліміт для привілеїв, якими може користуватися процес, забезпечуючи, що процес не перевищує своєї заздалегідь визначеної області привілеїв.
Обмеження (CapBnd):
Мета: Встановлює максимальні привілеї, які процес може отримати протягом свого життєвого циклу.
Функціональність: Навіть якщо у процесу є певна привілегія в його успадкованому або дозволеному наборі, він не може отримати цю привілегію, якщо вона також не є в обмежувальному наборі.
Сценарій використання: Цей набір особливо корисний для обмеження потенціалу підвищення привілеїв процесу, додаючи додатковий рівень безпеки.
Амбієнтні (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, ми можемо розкодувати їх у назву можливостей.
Перевіримо зараз можливості, які використовує ping
:
Хоча це працює, існує ще один і простіший спосіб. Щоб переглянути можливості запущеного процесу, просто скористайтеся інструментом getpcaps, за яким слідує ідентифікатор процесу (PID). Ви також можете надати список ідентифікаторів процесів.
Перевіримо тут можливості tcpdump
після надання достатньо можливостей виконуваному файлу (cap_net_admin та cap_net_raw) для перехоплення мережі (tcpdump працює у процесі 9562):
Як ви можете побачити, надані можливості відповідають результатам 2 способів отримання можливостей бінарного файлу. Інструмент getpcaps використовує системний виклик capget() для запиту доступних можливостей для певного потоку. Цей системний виклик потрібно лише надати PID, щоб отримати більше інформації.
Можливості бінарних файлів
Бінарні файли можуть мати можливості, які можна використовувати під час виконання. Наприклад, дуже поширеною є можливість cap_net_raw
у бінарного файлу ping
:
Ви можете шукати бінарні файли з можливостями за допомогою:
Зниження можливостей за допомогою capsh
Якщо ми знищимо можливості CAP_NET_RAW для ping, то утиліта ping більше не повинна працювати.
Крім виводу capsh самого себе, команда tcpdump також повинна викликати помилку.
/bin/bash: /usr/sbin/tcpdump: Операція не дозволена
Помилка чітко показує, що команді ping не дозволено відкривати сокет ICMP. Тепер ми впевнені, що це працює як очікувалося.
Видалення можливостей
Ви можете видалити можливості бінарного файлу за допомогою
Права користувача
Здається, можливо також призначати можливості користувачам. Це, ймовірно, означає, що кожен процес, запущений користувачем, зможе використовувати можливості користувача.
Основано на цьому, цьому та цьому кілька файлів потрібно налаштувати, щоб надати користувачеві певні можливості, але той, хто призначає можливості кожному користувачеві, буде /etc/security/capability.conf
.
Приклад файлу:
Середовищні можливості
Компілюючи наступну програму, можна створити оболонку bash всередині середовища, яке надає можливості.
У bash, виконаному компільованим амбієнтним бінарним файлом, можна спостерігати нові можливості (звичайний користувач не матиме жодних можливостей у розділі "поточний").
Ви можете додавати лише можливості, які присутні як у наборі дозволених, так і у спадковому наборі.
Бінарні файли, що розуміють можливості / бінарні файли, що не розуміють можливості
Бінарні файли, що розуміють можливості не використовуватимуть нові можливості, надані середовищем, однак бінарні файли, що не розуміють можливості, використовуватимуть їх, оскільки вони не відхилять їх. Це робить бінарні файли, що не розуміють можливості, вразливими всередині спеціального середовища, яке надає можливості для бінарних файлів.
Можливості служби
За замовчуванням служба, яка працює в якості root, матиме призначені всі можливості, і у деяких випадках це може бути небезпечно. Отже, файл конфігурації служби дозволяє вказати можливості, які ви хочете, щоб вони мали, і користувача, який повинен виконувати службу, щоб уникнути запуску служби з непотрібними привілеями:
Можливості в контейнерах Docker
За замовчуванням Docker надає деякі можливості контейнерам. Дуже легко перевірити, які саме можливості надані, виконавши:
RootedCON - це найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є важливою точкою зустрічі для професіоналів технологій та кібербезпеки у будь-якій галузі.
Підвищення привілеїв/Втеча з контейнера
Можливості корисні, коли ви хочете обмежити власні процеси після виконання привілейованих операцій (наприклад, після налаштування chroot та прив'язки до сокету). Однак їх можна використовувати для виконання зловмисних команд або аргументів, які потім виконуються в якості root.
Ви можете накладати можливості на програми за допомогою setcap
та запитувати їх за допомогою getcap
:
+ep
означає, що ви додаєте можливість ("-" видалить її) як Ефективну та Дозволену.
Щоб ідентифікувати програми в системі або папці з можливостями:
Приклад експлуатації
У наступному прикладі виявлено, що бінарний файл /usr/bin/python2.6
має вразливість для підвищення привілеїв:
Можливості, необхідні для tcpdump
, щоб дозволити будь-якому користувачеві перехоплювати пакети:
Спеціальний випадок "порожніх" можливостей
З документації: Зверніть увагу, що можна призначити порожні набори можливостей для файлу програми, тому можна створити програму з встановленим бітами встановлення ідентифікатора користувача власника на root, яка змінює ефективний та збережений ідентифікатор користувача власника процесу, який виконує програму на 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
Це означає, що ви можете вийти з контейнера, впровадивши шелл-код всередині деякого процесу, що працює всередині хоста. Для доступу до процесів, що працюють всередині хоста, контейнер повинен бути запущений принаймні з параметром --pid=host
.
CAP_SYS_PTRACE
надає можливість використовувати функціональність налагодження та відстеження системних викликів, надану ptrace(2)
та викликами прикріплення пам'яті, такими як process_vm_readv(2)
та process_vm_writev(2)
. Хоча це потужно для діагностики та моніторингу, якщо CAP_SYS_PTRACE
увімкнено без обмежувальних заходів, таких як фільтр seccomp на ptrace(2)
, це може значно підірвати безпеку системи. Зокрема, його можна використовувати для обхідних дій щодо інших обмежень безпеки, зокрема тих, які накладаються seccomp, як показано у доказах концепції (PoC) таких як цей.
Приклад з бінарним файлом (python)
Приклад з бінарним файлом (gdb)
gdb
з можливістю ptrace
:
Створіть shellcode за допомогою msfvenom для впровадження в пам'ять через gdb
Налагодити процес root за допомогою gdb та скопіювати раніше згенеровані рядки gdb:
Приклад з середовищем (втеча з Docker) - Ще одне зловживання gdb
Якщо GDB встановлено (або ви можете встановити його за допомогою apk add gdb
або apt install gdb
, наприклад), ви можете налагоджувати процес з хоста та змусити його викликати функцію system
. (Ця техніка також потребує можливості SYS_ADMIN
).
Ви не зможете побачити вивід виконаної команди, але вона буде виконана цим процесом (так отримайте обернене з'єднання).
Якщо ви отримуєте помилку "No symbol "system" in current context.", перевірте попередній приклад завантаження шелл-коду в програму через gdb.
Приклад з оточенням (втеча з Docker) - Впровадження шелл-коду
Ви можете перевірити увімкнені можливості всередині контейнера Docker за допомогою:
Перелік процесів, що працюють на хості ps -eaf
Отримати архітектуру
uname -m
Знайти shellcode для архітектури (https://www.exploit-db.com/exploits/41128)
Знайти програму для ін'єкції shellcode в пам'ять процесу (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Змінити shellcode всередині програми та скомпілювати її
gcc inject.c -o inject
Ін'єкція та отримання вашого shell:
./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
CAP_SYS_MODULE
дозволяє процесу завантажувати та видаляти модулі ядра (системні виклики init_module(2)
, finit_module(2)
та delete_module(2)
), надаючи прямий доступ до основних операцій ядра. Ця можливість представляє критичні ризики безпеки, оскільки вона дозволяє підвищення привілеїв та повне компрометування системи, дозволяючи внесення змін до ядра, тим самим обхід усіх механізмів безпеки Linux, включаючи модулі безпеки Linux та ізоляцію контейнерів. Це означає, що ви можете вставляти/видаляти модулі ядра в/з ядра хост-машини.
Приклад з бінарним файлом
У наступному прикладі бінарний файл python
має цю можливість.
За замовчуванням команда modprobe
перевіряє список залежностей та файли карт в каталозі /lib/modules/$(uname -r)
.
Для того щоб скористатися цим, створимо фальшиву папку lib/modules:
Потім скомпілюйте модуль ядра, ви можете знайти 2 приклади нижче і скопіюйте його в цю папку:
Нарешті, виконайте необхідний код Python для завантаження цього модуля ядра:
Приклад 2 з бінарним файлом
У наступному прикладі бінарний файл kmod
має цю можливість.
Це означає, що можна використовувати команду insmod
для вставки ядерного модуля. Слідуйте прикладу нижче, щоб отримати зворотню оболонку, зловживаючи цим привілеєм.
Приклад з середовищем (втеча з Docker)
Ви можете перевірити увімкнені можливості всередині контейнера Docker, використовуючи:
У попередньому виводі ви можете побачити, що можливість SYS_MODULE увімкнена.
Створіть ядро модуля, яке буде виконувати зворотню оболонку, та Makefile для його компіляції:
Пробіл перед кожним словом make в файлі Makefile повинен бути табуляцією, а не пробілами!
Виконайте make
, щоб скомпілювати це.
Нарешті, запустіть nc
всередині оболонки та завантажте модуль з іншої оболонки, і ви захопите оболонку в процесі nc:
Код цієї техніки був скопійований з лабораторії "Зловживання можливістю SYS_MODULE" з https://www.pentesteracademy.com/
Інший приклад цієї техніки можна знайти за посиланням https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host
CAP_DAC_READ_SEARCH
CAP_DAC_READ_SEARCH дозволяє процесу обійти дозволи для читання файлів та для читання та виконання каталогів. Його основне використання полягає в пошуку файлів або читанні. Однак він також дозволяє процесу використовувати функцію open_by_handle_at(2)
, яка може отримати доступ до будь-якого файлу, включаючи ті, що знаходяться поза простором імен точки монтування процесу. Ідентифікатор, використаний в open_by_handle_at(2)
, повинен бути непрозоримим ідентифікатором, отриманим за допомогою name_to_handle_at(2)
, але він може містити чутливу інформацію, таку як номери inode, які піддаються втручанню. Потенціал для експлуатації цієї можливості, особливо в контексті контейнерів Docker, був продемонстрований Себастьяном Крамером за допомогою експлойту shocker, як аналізується тут. Це означає, що ви можете обійти перевірки дозволів на читання файлів та перевірки дозволів на читання/виконання каталогів.
Приклад з бінарним файлом
Бінарний файл зможе читати будь-який файл. Таким чином, якщо файл, наприклад, tar, має цю можливість, він зможе прочитати файл тіні:
Приклад з binary2
У цьому випадку давайте припустимо, що бінарний файл python
має цю можливість. Щоб переглянути файли кореневого каталогу, ви можете виконати:
І для того, щоб прочитати файл, ви можете виконати:
Приклад у середовищі (втеча з Docker)
Ви можете перевірити увімкнені можливості всередині контейнера Docker за допомогою:
У попередньому виводі можна побачити, що можливість DAC_READ_SEARCH увімкнена. В результаті контейнер може налагоджувати процеси.
Ви можете дізнатися, як працює наступне використання в https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3, але в описі CAP_DAC_READ_SEARCH не тільки дозволяє нам пересуватися по файловій системі без перевірок дозволів, але також явно вилучає будь-які перевірки на open_by_handle_at(2) і може дозволити нашому процесу доступ до чутливих файлів, відкритих іншими процесами.
Оригінальний експлойт, який використовує ці дозволи для читання файлів з хоста, можна знайти тут: http://stealth.openwall.net/xSports/shocker.c, наведений нижче модифікована версія, яка дозволяє вказати файл, який ви хочете прочитати як перший аргумент і вивести його в файл.
Експлойт повинен знайти вказівник на щось, що змонтовано на хості. Оригінальний експлойт використовував файл /.dockerinit, а ця модифікована версія використовує /etc/hostname. Якщо експлойт не працює, можливо, вам потрібно встановити інший файл. Щоб знайти файл, який змонтований на хості, просто виконайте команду mount:
Код цієї техніки був скопійований з лабораторії "Зловживання можливістю DAC_READ_SEARCH" з https://www.pentesteracademy.com/
RootedCON - найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є важливою точкою зустрічі для професіоналів технологій та кібербезпеки у будь-якій галузі.
CAP_DAC_OVERRIDE
Це означає, що ви можете обійти перевірку дозволів на запис будь-якого файлу, тому ви можете записувати будь-який файл.
Є багато файлів, які ви можете перезаписати для підвищення привілеїв, ви можете отримати ідеї тут.
Приклад з бінарним файлом
У цьому прикладі vim має цю можливість, тому ви можете змінювати будь-який файл, наприклад passwd, sudoers або shadow:
Приклад з бінарним файлом 2
У цьому прикладі бінарний файл python
матиме цю можливість. Ви можете використовувати Python для перезапису будь-якого файлу:
Приклад з середовищем + CAP_DAC_READ_SEARCH (Втеча з Docker)
Ви можете перевірити увімкнені можливості всередині контейнера Docker за допомогою:
Спочатку прочитайте попередній розділ, який використовує можливість DAC_READ_SEARCH для читання довільних файлів хоста та скомпілюйте експлойт. Потім скомпілюйте наступну версію експлойту shocker, яка дозволить вам записувати довільні файли в файлову систему хоста:
Для виходу з контейнера Docker ви можете завантажити файли /etc/shadow
та /etc/passwd
з хоста, додати до них нового користувача та використати shocker_write
, щоб їх перезаписати. Потім зайти через ssh.
Код цієї техніки був скопійований з лабораторії "Зловживання можливістю DAC_OVERRIDE" з https://www.pentesteracademy.com
CAP_CHOWN
Це означає, що можна змінювати власника будь-якого файлу.
Приклад з бінарним файлом
Допустимо, що у бінарного файлу python
є ця можливість, ви можете змінити власника файлу shadow, змінити пароль root та підняти привілеї:
Або з ruby
бінарним файлом, який має цю можливість:
CAP_FOWNER
Це означає, що можна змінити дозвіл на будь-який файл.
Приклад з бінарним файлом
Якщо у Python є ця можливість, ви можете змінити дозвіл на файл тіні, змінити пароль root та підвищити привілеї:
CAP_SETUID
Це означає, що можливо встановити ефективний ідентифікатор користувача створеного процесу.
Приклад з бінарним файлом
Якщо у python є ця здатність, ви можете дуже легко зловживати нею для підвищення привілеїв до root:
Ще один спосіб:
CAP_SETGID
Це означає, що можливо встановити ефективний ідентифікатор групи створеного процесу.
Є багато файлів, які ви можете перезаписати для підвищення привілеїв, ви можете отримати ідеї тут.
Приклад з бінарним файлом
У цьому випадку вам слід шукати цікаві файли, які група може прочитати, оскільки ви можете уособлювати будь-яку групу:
Після того, як ви знайшли файл, який можна використовувати (через читання або запис), щоб підвищити привілеї, ви можете отримати оболонку, підміняючи цікаву групу за допомогою:
У цьому випадку група shadow була підроблена, тому ви можете прочитати файл /etc/shadow
:
Якщо встановлено docker, ви можете імітувати групу docker та використовувати її для спілкування з сокетом docker та підвищення привілеїв.
CAP_SETFCAP
Це означає, що можна встановлювати можливості для файлів та процесів
Приклад з бінарним файлом
Якщо у Python є ця можливість, ви можете дуже легко використовувати її для підвищення привілеїв до root:
Зверніть увагу, що якщо ви встановите нову можливість для бінарного файлу за допомогою CAP_SETFCAP, ви втратите цю можливість.
Якщо у вас є можливість SETUID, ви можете перейти до її розділу, щоб побачити, як підвищити привілеї.
Приклад з середовищем (втеча з Docker)
За замовчуванням можливість CAP_SETFCAP надається процесу всередині контейнера в Docker. Ви можете перевірити це, зробивши щось на зразок:
Ця можливість дозволяє надавати будь-яку іншу можливість для бінарних файлів, тому ми можемо подумати про втечу з контейнера, зловживовуючи будь-якими іншими втечами можливостей, згаданими на цій сторінці. Однак, якщо ви спробуєте, наприклад, надати можливості CAP_SYS_ADMIN та CAP_SYS_PTRACE для бінарного файлу gdb, ви побачите, що ви можете їх надати, але бінарний файл не зможе виконатися після цього:
З документації: Дозволені: Це обмежуючий надмножинний набір для ефективних можливостей, які може припустити потік. Це також обмежуючий надмножинний набір для можливостей, які можуть бути додані до успадкованого набору потоком, який не має можливості CAP_SETPCAP у своєму ефективному наборі. Здається, що дозволені можливості обмежують ті, які можна використовувати. Однак Docker також надає CAP_SETPCAP за замовчуванням, тому ви, можливо, зможете встановлювати нові можливості всередині успадкованих. Проте, у документації цього cap: CAP_SETPCAP : […] додавати будь-яку можливість з обмеженого набору потоку, що викликається, до його успадкованого набору. Здається, що ми можемо додавати до успадкованого набору лише можливості з обмеженого набору. Це означає, що ми не можемо додавати нові можливості, такі як CAP_SYS_ADMIN або CAP_SYS_PTRACE в успадкований набір для підвищення привілеїв.
CAP_SYS_RAWIO
CAP_SYS_RAWIO надає доступ до числа чутливих операцій, включаючи доступ до /dev/mem
, /dev/kmem
або /proc/kcore
, зміну mmap_min_addr
, доступ до системних викликів ioperm(2)
та iopl(2)
, а також різні дискові команди. Ця можливість також дозволяє використовувати FIBMAP ioctl(2)
, що викликало проблеми у минулому. Згідно зі сторінкою довідки, це також дозволяє власнику описово виконувати ряд операцій, специфічних для пристрою, на інших пристроях
.
Це може бути корисно для підвищення привілеїв та виходу з Docker.
CAP_KILL
Це означає, що можливо вбити будь-який процес.
Приклад з бінарним файлом
Давайте припустимо, що бінарний файл python
має цю можливість. Якщо ви також зможете змінити деяку службу або конфігурацію сокету (або будь-який файл конфігурації, пов'язаний із службою), ви зможете вставити задній хід, а потім вбити процес, пов'язаний із цією службою, і зачекати, поки новий файл конфігурації буде виконаний з вашим заднім ходом.
Підвищення привілеїв за допомогою kill
Якщо у вас є можливості kill і запущена програма node в якості root (або в якості іншого користувача), ви, ймовірно, можете надіслати їй сигнал SIGUSR1 і змусити її відкрити відладчик node, до якого ви зможете підключитися.
RootedCON - найбільш важлива подія з кібербезпеки в Іспанії та одна з найважливіших в Європі. З місією просування технічних знань, цей конгрес є важливою точкою зустрічі для професіоналів у галузі технологій та кібербезпеки у будь-якій дисципліні.
CAP_NET_BIND_SERVICE
Це означає, що можливо слухати будь-який порт (навіть привілейовані). Ви не можете безпосередньо підвищити привілеї з цією можливістю.
Приклад з бінарним файлом
Якщо у python
є ця можливість, він зможе слухати будь-який порт та навіть підключатися з нього до будь-якого іншого порту (деякі служби вимагають підключень з конкретних привілейованих портів)
CAP_NET_RAW
CAP_NET_RAW можливість дозволяє процесам створювати RAW та PACKET сокети, що дозволяє їм генерувати та відправляти довільні мережеві пакети. Це може призвести до ризиків безпеки в контейнеризованих середовищах, таких як підробка пакетів, впровадження трафіку та обхід мережевих контролів доступу. Зловмисники можуть використовувати це для втручання в маршрутизацію контейнерів або компрометації безпеки мережі хоста, особливо без належного захисту брандмауером. Крім того, CAP_NET_RAW є важливим для привілейованих контейнерів для підтримки операцій, таких як ping через RAW ICMP запити.
Це означає, що можливо перехоплювати трафік. Ви не можете безпосередньо підвищити привілеї за допомогою цієї можливості.
Приклад з використанням бінарного файлу
Якщо у бінарного файлу tcpdump
є ця можливість, ви зможете використовувати його для захоплення мережевої інформації.
Зверніть увагу, що якщо середовище надає цю можливість, ви також можете використовувати tcpdump
для перехоплення трафіку.
Приклад з бінарним 2
Наступний приклад - це код на python2
, який може бути корисним для перехоплення трафіку інтерфейсу "lo" (localhost). Код походить з лабораторії "The Basics: CAP-NET_BIND + NET_RAW" з https://attackdefense.pentesteracademy.com/
CAP_NET_ADMIN + CAP_NET_RAW
CAP_NET_ADMIN можливість надає власнику можливість змінювати мережеві конфігурації, включаючи налаштування брандмауера, таблиці маршрутизації, дозволи сокетів та налаштування мережевих інтерфейсів у відкритих просторах імен мережі. Вона також дозволяє включати режим прослуховування на мережевих інтерфейсах, що дозволяє перехоплювати пакети в різних просторах імен.
Приклад з використанням бінарного файлу
Давайте припустимо, що у бінарного файлу python є ці можливості.
CAP_LINUX_IMMUTABLE
Це означає, що можна змінювати атрибути inode. Ви не можете підвищити привілеї безпосередньо за допомогою цієї можливості.
Приклад з бінарним файлом
Якщо ви виявите, що файл є незмінним, а у python є ця можливість, ви можете видалити незмінний атрибут і зробити файл змінюваним:
Зверніть увагу, що зазвичай цей незмінний атрибут встановлюється та видаляється за допомогою:
CAP_SYS_CHROOT
CAP_SYS_CHROOT дозволяє виконувати системний виклик chroot(2)
, що потенційно може дозволити вибратися з оточень chroot(2)
через відомі уразливості:
CAP_SYS_BOOT
CAP_SYS_BOOT не тільки дозволяє виконувати системний виклик reboot(2)
для перезавантаження системи, включаючи конкретні команди, такі як LINUX_REBOOT_CMD_RESTART2
, призначені для певних апаратних платформ, але також дозволяє використовувати kexec_load(2)
і, починаючи з Linux 3.17, kexec_file_load(2)
для завантаження нових або підписаних ядер аварійного відновлення відповідно.
CAP_SYSLOG
CAP_SYSLOG був відокремлений від більш широкого CAP_SYS_ADMIN в Linux 2.6.37, спеціально надаючи можливість використовувати виклик syslog(2)
. Ця здатність дозволяє переглядати адреси ядра через /proc
та подібні інтерфейси, коли параметр kptr_restrict
встановлено на 1, що контролює викриття адрес ядра. Починаючи з Linux 2.6.39, значення за замовчуванням для kptr_restrict
- 0, що означає, що адреси ядра викриті, хоча багато дистрибутивів встановлюють це на 1 (приховувати адреси, крім uid 0) або 2 (завжди приховувати адреси) з міркувань безпеки.
Крім того, CAP_SYSLOG дозволяє отримувати доступ до виводу dmesg
, коли dmesg_restrict
встановлено на 1. Незважаючи на ці зміни, CAP_SYS_ADMIN залишає можливість виконувати операції syslog
через історичні прецеденти.
CAP_MKNOD
CAP_MKNOD розширює функціональність системного виклику mknod
поза створенням звичайних файлів, FIFO (іменованих каналів) або UNIX-доменних сокетів. Він спеціально дозволяє створювати спеціальні файли, до яких входять:
S_IFCHR: Спеціальні файли символьних пристроїв, які є пристроями, наприклад, терміналами.
S_IFBLK: Спеціальні файли блочних пристроїв, які є пристроями, наприклад, дисками.
Ця здатність є обов'язковою для процесів, які потребують можливості створення файлів пристроїв, що сприяє прямому взаємодії з апаратурою через символьні або блочні пристрої.
Це здатність за замовчуванням для Docker (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Ця здатність дозволяє реалізувати підвищення привілеїв (через повне читання диска) на хості за таких умов:
Мати початковий доступ до хоста (непривілейований).
Мати початковий доступ до контейнера (привілейований (EUID 0) та ефективний
CAP_MKNOD
).Хост та контейнер повинні мати спільне простір імен користувача.
Кроки для створення та доступу до блочного пристрою в контейнері:
На хості як стандартний користувач:
Визначте свій поточний ідентифікатор користувача за допомогою
id
, наприклад,uid=1000(standarduser)
.Визначте цільовий пристрій, наприклад,
/dev/sdb
.
Усередині контейнера як
root
:
Назад на хості:
CAP_SETPCAP
CAP_SETPCAP дозволяє процесу змінювати набори можливостей іншого процесу, дозволяючи додавати або видаляти можливості з ефективних, успадкованих та дозволених наборів. Однак процес може модифікувати лише можливості, які він має у своєму власному дозволеному наборі, забезпечуючи тим самим неможливість підвищення привілеїв іншого процесу понад свої власні. Останні оновлення ядра затвердили ці правила, обмежуючи CAP_SETPCAP
лише для зменшення можливостей у власних або нащадкових дозволених наборах, спрямованих на зменшення ризиків безпеки. Для використання потрібно мати CAP_SETPCAP
у ефективному наборі та цільові можливості у дозволеному наборі, використовуючи capset()
для модифікацій. Це узагальнює основну функцію та обмеження CAP_SETPCAP
, підкреслюючи його роль у керуванні привілеями та підвищенні безпеки.
CAP_SETPCAP
- це можливість Linux, яка дозволяє процесу змінювати набори можливостей іншого процесу. Вона надає можливість додавати або видаляти можливості з ефективних, успадкованих та дозволених наборів можливостей інших процесів. Однак існують певні обмеження щодо того, як цю можливість можна використовувати.
Процес з CAP_SETPCAP
може лише надавати або видаляти можливості, які є у його власному дозволеному наборі можливостей. Іншими словами, процес не може надавати можливість іншому процесу, якщо він сам не має цієї можливості. Це обмеження запобігає підвищенню привілеїв іншого процесу понад його власний рівень привілеїв.
Більше того, у новіших версіях ядра можливість CAP_SETPCAP
була додатково обмежена. Тепер вона більше не дозволяє процесу довільно модифікувати набори можливостей інших процесів. Замість цього вона дозволяє лише процесу знижувати можливості у власному дозволеному наборі або дозволеному наборі його нащадків. Ця зміна була внесена для зменшення потенційних ризиків безпеки, пов'язаних з можливістю.
Для ефективного використання CAP_SETPCAP
вам потрібно мати цю можливість у своєму ефективному наборі можливостей та цільові можливості у своєму дозволеному наборі можливостей. Після цього ви можете використовувати виклик системи capset()
для модифікації наборів можливостей інших процесів.
Отже, CAP_SETPCAP
дозволяє процесу змінювати набори можливостей інших процесів, але він не може надавати можливості, яких у нього немає. Крім того, через питання безпеки, його функціональність була обмежена в останніх версіях ядра, щоб дозволити лише зниження можливостей у власному дозволеному наборі або дозволених наборах його нащадків.
Last updated