AppArmor
Reading time: 9 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація
AppArmor - це покращення ядра, призначене для обмеження ресурсів, доступних програмам через профілі для кожної програми, ефективно реалізуючи Обов'язковий Контроль Доступу (MAC), прив'язуючи атрибути контролю доступу безпосередньо до програм, а не до користувачів. Ця система працює шляхом завантаження профілів у ядро, зазвичай під час завантаження, і ці профілі визначають, до яких ресурсів програма може отримати доступ, таких як мережеві з'єднання, доступ до сирих сокетів і дозволи на файли.
Існує два робочих режими для профілів AppArmor:
- Режим виконання: Цей режим активно забезпечує виконання політик, визначених у профілі, блокуючи дії, які порушують ці політики, і реєструючи будь-які спроби їх порушення через системи, такі як syslog або auditd.
- Режим скарги: На відміну від режиму виконання, режим скарги не блокує дії, які суперечать політикам профілю. Натомість він реєструє ці спроби як порушення політики без накладення обмежень.
Компоненти AppArmor
- Модуль ядра: Відповідає за забезпечення політик.
- Політики: Визначають правила та обмеження для поведінки програми та доступу до ресурсів.
- Парсер: Завантажує політики в ядро для забезпечення виконання або звітування.
- Утиліти: Це програми в режимі користувача, які надають інтерфейс для взаємодії та управління AppArmor.
Шлях до профілів
Профілі AppArmor зазвичай зберігаються в /etc/apparmor.d/
За допомогою sudo aa-status
ви зможете перерахувати двійкові файли, які обмежені якимось профілем. Якщо ви можете змінити символ "/" на крапку в шляху кожного перерахованого двійкового файлу, ви отримаєте назву профілю apparmor у згаданій папці.
Наприклад, профіль apparmor для /usr/bin/man буде розташований у /etc/apparmor.d/usr.bin.man
Команди
aa-status #check the current status
aa-enforce #set profile to enforce mode (from disable or complain)
aa-complain #set profile to complain mode (from diable or enforcement)
apparmor_parser #to load/reload an altered policy
aa-genprof #generate a new profile
aa-logprof #used to change the policy when the binary/program is changed
aa-mergeprof #used to merge the policies
Створення профілю
- Щоб вказати на уражений виконуваний файл, дозволені абсолютні шляхи та шаблони для вказування файлів.
- Щоб вказати доступ, який бінарний файл матиме до файлів, можна використовувати такі контролі доступу:
- r (читання)
- w (запис)
- m (відображення пам'яті як виконуваного)
- k (блокування файлів)
- l (створення жорстких посилань)
- ix (виконати іншу програму з новою політикою успадкування)
- Px (виконати під іншим профілем, після очищення середовища)
- Cx (виконати під дочірнім профілем, після очищення середовища)
- Ux (виконати без обмежень, після очищення середовища)
- Змінні можуть бути визначені в профілях і можуть бути змінені ззовні профілю. Наприклад: @{PROC} та @{HOME} (додайте #include <tunables/global> до файлу профілю)
- Правила заборони підтримуються для переважання правил дозволу.
aa-genprof
Щоб легко почати створення профілю, apparmor може вам допомогти. Можливо, apparmor перевіряє дії, виконувані бінарним файлом, а потім дозволяє вам вирішити, які дії ви хочете дозволити або заборонити.
Вам просто потрібно виконати:
sudo aa-genprof /path/to/binary
Потім, у іншій консолі виконайте всі дії, які зазвичай виконує двійковий файл:
/path/to/binary -a dosomething
Тоді в першій консолі натисніть "s", а потім у записаних діях вкажіть, чи хочете ви ігнорувати, дозволити або щось інше. Коли ви закінчите, натисніть "f", і новий профіль буде створено в /etc/apparmor.d/path.to.binary
note
Використовуючи клавіші зі стрілками, ви можете вибрати, що хочете дозволити/заборонити/щось інше
aa-easyprof
Ви також можете створити шаблон профілю apparmor для бінарного файлу за допомогою:
sudo aa-easyprof /path/to/binary
# vim:syntax=apparmor
# AppArmor policy for binary
# ###AUTHOR###
# ###COPYRIGHT###
# ###COMMENT###
#include <tunables/global>
# No template variables specified
"/path/to/binary" {
#include <abstractions/base>
# No abstractions specified
# No policy groups specified
# No read paths specified
# No write paths specified
}
note
Зверніть увагу, що за замовчуванням у створеному профілі нічого не дозволено, тому все заборонено. Вам потрібно буде додати рядки, такі як /etc/passwd r,
, щоб дозволити бінарному файлу читати /etc/passwd
, наприклад.
Ви можете потім застосувати новий профіль з
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
Модифікація профілю з журналів
Наступний інструмент буде читати журнали та запитувати в користувача, чи хоче він дозволити деякі з виявлених заборонених дій:
sudo aa-logprof
note
Використовуючи клавіші зі стрілками, ви можете вибрати, що ви хочете дозволити/заборонити/що завгодно
Керування профілем
#Main profile management commands
apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode
apparmor_parser -C /etc/apparmor.d/profile.name #Load a new profile in complain mode
apparmor_parser -r /etc/apparmor.d/profile.name #Replace existing profile
apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile
Logs
Приклад AUDIT та DENIED журналів з /var/log/audit/audit.log виконуваного service_bin
:
type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
Ви також можете отримати цю інформацію, використовуючи:
sudo aa-notify -s 1 -v
Profile: /bin/service_bin
Operation: open
Name: /etc/passwd
Denied: r
Logfile: /var/log/audit/audit.log
Profile: /bin/service_bin
Operation: open
Name: /etc/hosts
Denied: r
Logfile: /var/log/audit/audit.log
AppArmor denials: 2 (since Wed Jan 6 23:51:08 2021)
For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor
Apparmor в Docker
Зверніть увагу, як профіль docker-profile Docker завантажується за замовчуванням:
sudo aa-status
apparmor module is loaded.
50 profiles are loaded.
13 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/chromium-browser/chromium-browser//browser_java
/usr/lib/chromium-browser/chromium-browser//browser_openjdk
/usr/lib/chromium-browser/chromium-browser//sanitized_helper
/usr/lib/connman/scripts/dhclient-script
docker-default
За замовчуванням профіль docker-default Apparmor генерується з https://github.com/moby/moby/tree/master/profiles/apparmor
Резюме профілю docker-default:
- Доступ до всіх мереж
- Жодна можливість не визначена (Однак деякі можливості будуть отримані з включення базових правил, тобто #include <abstractions/base>)
- Запис у будь-який файл /proc не дозволено
- Інші підкаталоги/файли /proc та /sys не мають доступу на читання/запис/блокування/посилання/виконання
- Монтування не дозволено
- Ptrace може бути виконано лише на процесі, який обмежений тим же профілем apparmor
Якщо ви запустите контейнер docker, ви повинні побачити наступний вивід:
1 processes are in enforce mode.
docker-default (825)
Зверніть увагу, що apparmor навіть заблокує привілеї можливостей, надані контейнеру за замовчуванням. Наприклад, він зможе заблокувати дозвіл на запис у /proc, навіть якщо можливість SYS_ADMIN надана, оскільки за замовчуванням профіль apparmor для docker забороняє цей доступ:
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
echo "" > /proc/stat
sh: 1: cannot create /proc/stat: Permission denied
Вам потрібно вимкнути apparmor, щоб обійти його обмеження:
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
Зверніть увагу, що за замовчуванням AppArmor також заборонить контейнеру монтувати папки зсередини, навіть з можливістю SYS_ADMIN.
Зверніть увагу, що ви можете додати/видалити можливості до контейнера docker (це все ще буде обмежено методами захисту, такими як AppArmor та Seccomp):
--cap-add=SYS_ADMIN
надає можливістьSYS_ADMIN
--cap-add=ALL
надає всі можливості--cap-drop=ALL --cap-add=SYS_PTRACE
скидає всі можливості і надає лишеSYS_PTRACE
note
Зазвичай, коли ви виявляєте, що у вас є привілейована можливість доступна всередині контейнера docker, але деяка частина експлуатації не працює, це буде тому, що apparmor docker заважатиме цьому.
Приклад
(Приклад з тут)
Щоб проілюструвати функціональність AppArmor, я створив новий профіль Docker “mydocker” з наступним рядком:
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
Щоб активувати профіль, нам потрібно зробити наступне:
sudo apparmor_parser -r -W mydocker
Щоб перерахувати профілі, ми можемо виконати наступну команду. Команда нижче перераховує мій новий профіль AppArmor.
$ sudo apparmor_status | grep mydocker
mydocker
Як показано нижче, ми отримуємо помилку, коли намагаємося змінити “/etc/”, оскільки профіль AppArmor заважає запису в “/etc”.
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
chmod: /etc/hostname: Permission denied
AppArmor Docker Bypass1
Ви можете дізнатися, який профіль apparmor запущений у контейнері, використовуючи:
docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"
Тоді ви можете виконати наступний рядок, щоб знайти точний профіль, що використовується:
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
У дивному випадку ви можете змінити профіль apparmor docker і перезавантажити його. Ви могли б видалити обмеження і "обійти" їх.
AppArmor Docker Bypass2
AppArmor базується на шляху, це означає, що навіть якщо він може захищати файли всередині каталогу, як /proc
, якщо ви можете налаштувати, як контейнер буде запущений, ви могли б монтувати каталог proc хоста всередині /host/proc
і він більше не буде захищений AppArmor.
AppArmor Shebang Bypass
У цьому багу ви можете побачити приклад того, як навіть якщо ви заважаєте perl виконуватися з певними ресурсами, якщо ви просто створите оболонковий скрипт вказуючи в першому рядку #!/usr/bin/perl
і ви виконаєте файл безпосередньо, ви зможете виконати що завгодно. Наприклад:
echo '#!/usr/bin/perl
use POSIX qw(strftime);
use POSIX qw(setuid);
POSIX::setuid(0);
exec "/bin/sh"' > /tmp/test.pl
chmod +x /tmp/test.pl
/tmp/test.pl
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.