HTB Sherlock - Nubilum-1 Writeup

HTB Sherlock - Nubilum-1 Writeup

Scenariusz Zadania

Nasza grupa administracji chmurowej niedawno otrzymała ostrzeżenie od Amazon, że instancja EC2 wdrożona w naszym środowisku chmurowym jest wykorzystywana do celów złośliwych. Nasz zespół administratorów systemu nie przypomina sobie wdrażania tej instancji EC2, jednak pamiętają, że po zalogowaniu się do konsoli AWS znaleźli ponad 6 uruchomionych instancji EC2, których wdrożenia nie pamiętają. Dostarczono ci wywiad z naszym administratorem chmury w ramach triage.

(ang. Our cloud administration team recently received a warning from Amazon that an EC2 instance deployed in our cloud environment is being utilised for malicious purposes. Our sysadmin team have no recollection of deploying this EC2, however do recall logging onto the AWS console and finding in excess of 6 EC2s running, which he did not recall deploying. You have been provided with the interview with our Cloud sysadmin within the triage.)

Artefakty

Po rozpakowaniu pobranego pliku ZIP, w celu rozwiązania zadania, otrzymujemy następujące pliki i katalogi (Rys. 1):

  • CloudTrail - katalog zawierający logi z AWS,
  • catscale_ip-172-31-24-20-20230130-1628.tar.gz - artefakty zebrane z zainfekowanej maszyny za pomocą narzędzia Catscale,
  • forela-storage - kopia plików z bucketu s3,
  • interview.txt - transkrypcja przeprowadzonego wywiadu z administratorem,
  • unusual-directory.zip - katalog znaleziony na skompromitowanej maszynie.
    Rys. 1. Zawartość pobranego pliku zip po rozpakowaniu.
    Rys. 1. Zawartość pobranego pliku zip po rozpakowaniu.

Rozwiązanie

Zadanie 1

Które konto AWS IAM zostało skompromitowane przez atakującego?

(ang. Which AWS IAM account was compromised by the TA?)

Najpierw, za pomocą polecenia find . -type f -name "*.json" -exec cat {} \; > all.json, scaliłem wszystkie pliki z logami w jeden plik. Następnie przez dłuższy czas szukałem prawidłowej odpowiedzi, ale bez powodzenia. Standardowo rozpocząłem od wyodrębnienia agentów użytkownika i znalazłem wartość “kali” w jednym z nich, a następnie poszukałem powiązanego z nim adresu IP. Potem wpadł mi do głowy pomysł, aby podejść do zadania w inny, bardziej charakterystyczny dla CTF sposób. Skoro oczekiwany format flagi to ******-***-*********n (Rys. 2), postanowiłem wykorzystać regex do znalezienia odpowiedzi. Użyłem polecenia cat all.json| jq| grep -E "[a-zA-Z0-9]{6}-[a-zA-Z0-9]{3}-[a-zA-Z0-9]{9}n" | grep userName|uniq, co zajęło trochę czasu, ale ostatecznie znalazłem tylko jedną wartość AWS IAM account, która pasowała do tego schematu (Rys. 3).

Rys. 2. Oczekiwany format flagi do zadania 1.
Rys. 2. Oczekiwany format flagi do zadania 1.
Rys. 3. Skompromitowany AWS IAM przez atakującego.
Rys. 3. Skompromitowany AWS IAM przez atakującego

Odpowiedź: forela-ec2-automation

Zadanie 2

Gdzie atakujący znalazł zakodowane na stałe dane uwierzytelniające IAM?

(ang. Where did the attacker locate the hard coded IAM credentials?)

Na początku przejrzałem zawartość katalogu forela-storage. Moja uwagę przykuł plik ec2.py (Rys. 4).

Rys. 4. Zawartość katalogu <code>forela-storage</code>.
Rys. 4. Zawartość katalogu forela-storage.
Po sprawdzeniu jego zawartości okazało się, że zawiera on zahardkodowane dane do logowania (Rys. 5).
Rys. 5. Zawartość pliku <code>cat forela-storage/backups/ec2.py</code>.
Rys. 5. Zawartość pliku cat forela-storage/backups/ec2.py.
Musiałem tylko upewnić się, że atakujący faktycznie pobrał ten plik. Za pomocą polecenia jq '.Records | .[] | select(.userIdentity.accountId== "anonymous") | select(.eventName=="GetObject") | select(.errorCode!="AccessDenied") | select(.errorCode!="NoSuchKey")' all.json wylistowałem wszystkie udane pobrania plików przez użytkownika anonymous. Następnie sprawdziłem, czy w logach znajduje się wcześniej znaleziony plik ec2.py. Wśród wylistowanych zdarzeń plik ec2.py pojawił się tylko raz. Dzięki temu nie tylko znalazłem dokładną ścieżkę, ale również ustaliłem czas pobrania pliku, co pozwoliło mi zawęzić dalsze poszukiwania.
Rys. 6. Zdarzenie wskazujące na pobranie pliku przez atakującego.
Rys. 6. Zdarzenie wskazujące na pobranie pliku przez atakującego.

Odpowiedź: /backups/ec2.py

Zadanie 3

Ile instancji EC2 zostało łącznie wdrożonych przez atakującego?

(ang. In total how many EC2 hosts were deployed by the TA?)

Kolejnym krokiem było wyodrębnienie wszystkich akcji wykonanych przez skompromitowane konto po czasie, gdy atakujący uzyskał do niego dostęp. Jako punkt graniczny wybrałem moment pobrania pliku ec2.py. Za pomocą polecenia jq '.Records[] | select(.userIdentity.userName == "forela-ec2-automation" and .eventTime >= "2023-01-24T22:37:59Z")' all.json > compromised.json wyodrębniłem wszystkie zdarzenia. Następnie skoncentrowałem się na zdarzeniach związanych z tworzeniem instancji. Było ich 8, które odpowiadały za utworzenie 13 instancji EC2 (Rys. 7).

Rys. 7. Lista instancji utworzonych przez atakującego.
Rys. 7. Lista instancji utworzonych przez atakującego.

Odpowiedź: 13

Zadanie 4

Jakie są nazwy par kluczy wygenerowanych przez atakującego?

(ang. What is the name of the key pair/s generated by the attacker?)

Za pomocą polecenia jq 'select(.eventName=="CreateKeyPair")' compromised.json wylistowałem zdarzenia związane z tworzeniem kluczy w AWS (Rys. 8).

Rys. 8. Nazwa par kluczy utworzonych przez atakującego.
Rys. 8. Nazwa par kluczy utworzonych przez atakującego.

Odpowiedź: 1337.key, 13337

Zadanie 5

O której godzinie atakujący wygenerował pary kluczy?

(ang. What time were the key pair/s generated by the attacker?)

Z poprzedniego zadania (Rys 9).

Rys. 9. Czas utworzenia kluczy przez atakującego.
Rys. 9. Czas utworzenia kluczy przez atakującego

Odpowiedź: 2023-01-24T22:48:34Z,2023-01-25T12:01:38Z

Zadanie 6

Jakie są identyfikatory par kluczy wygenerowanych przez atakującego?

(ang. What are the key pair ID/s of the key/s generated by the attacker?)

Z zadania nr 4 (Rys 10).

Rys. 10. Identyfikator utworzonego klucza.
Rys. 10. Identyfikator utworzonego klucza.

Odpowiedź: key-0450dc836eaf2aa37

Zadanie 7

Jaki jest opis grupy zabezpieczeń utworzonej przez atakującego?

(ang. What is the description of the security group created by the attacker?)

Za pomocą polecenia jq 'select(.eventName=="CreateSecurityGroup")' compromised.json otrzymałem jedno zdarzenie dotyczące utworzenia grupy. W polu groupDescription znajdowała się odpowiedź (Rys. 11).

Rys. 11. Utworzona grupa przez atakującego.
Rys. 11. Utworzona grupa przez atakującego.

Odpowiedź: still here

Zadanie 8

O której godzinie administrator systemu zakończył pierwszą grupę uruchomionych instancji EC2?

(ang. At what time did the Sys Admin terminate the first set of EC2s deployed?)

Aby uzyskać odpowiedź na to pytanie, musiałem wrócić do pierwotnie utworzonego pliku all.json. Mając na uwadze czas, kiedy atakujący uzyskał poświadczenia do logowania, użyłem polecenia jq '.Records[] | select(.eventName=="TerminateInstances" and .eventTime >= "2023-01-24T22:37:59Z") | {time: .eventTime}' all.json i otrzymałem dwa wyniki (Rys. 12).

Rys. 12. Czas zakończenia działania instancji przez administratora.
Rys. 12. Czas zakończenia działania instancji przez administratora.

Odpowiedź: 2023-01-24 23:25

Zadanie 9

Czy możemy potwierdzić adresy IP używane przez atakującego do nadużywania wyciekłych danych uwierzytelniających? (Rosnąca kolejność)

(ang. Can we confirm the IP addresses used by the TA to abuse the leaked credentials? (Ascending Order))

Mając już wyodrębniony plik ze zdarzeniami wykonanymi z wykorzystaniem skompromitowanego konta IAM, za pomocą polecenia cat compromised.json | grep sourceIPAddress | sort | uniq wyodrębniłem unikalne adresy IP używane przez atakującego (Rys. 13).

Rys. 13. Lista adresów IP używanych przez atakującego.
Rys. 13. Lista adresów IP używanych przez atakującego.

Odpowiedź: 95.181.232.4, 95.181.232.8, 95.181.232.9, 95.181.232.28

Zadanie 10

Oprócz danych CloudTrail i dostępu do S3 dostarczyliśmy artefakty z punktu końcowego zgłoszonego przez AWS. Jaka jest nazwa złośliwej aplikacji zainstalowanej na instancji EC2?

(ang. In addition to the CloudTrail data and S3 access we have provided artefacts from the endpoint reported by AWS. What is the name of the malicious application installed on the EC2 instance?)

Po rozpakowaniu archiwum unusual-directory.zip otrzymałem nowy katalog poshc2. Poshc2 to C2 (Rys. 14).

Rys. 14. Otrzymana nazwa katalogu po rozpakowaniu archiwum <code>unusual-directory.zip</code>.
Rys. 14. Otrzymana nazwa katalogu po rozpakowaniu archiwum unusual-directory.zip.

Odpowiedź: PoshC2

Zadanie 11

Czy możesz podać nazwę hosta i szczegóły dotyczące użytkownika ofiar serwera C2?

(ang. Please can you provide the hostname and username details of any victims of the C2 server?)

W katalogu poshc2/money/ znalazłem plik poshc2_server.log, który zawierał informacje z uruchomionej instancji PoshC2. Przeglądając go, znalazłem nazwę hosta oraz nazwę użytkownika (Rys. 15).

Rys. 15. Nazwa hosta i użytkownika wykorzystywana przez serwer C2.
Rys. 15. Nazwa hosta i użytkownika wykorzystywana przez serwer C2

Odpowiedź: DESKTOP-R4KM0GJ\Marcus Athony