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.
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).
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).Po sprawdzeniu jego zawartości okazało się, że zawiera on zahardkodowane dane do logowania (Rys. 5).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.
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).
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).
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).
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).
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).
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).
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).
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).
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).
Odpowiedź: DESKTOP-R4KM0GJ\Marcus Athony