https://chacker.pl/
Po utworzeniu środowiska otrzymujemy adres IP hosta AWS; dzieje się to jako wynik uruchomionego skryptu. Możesz użyć Kali Linux, którego posiadasz, lub Kali hostowanego w chmurze. Niektóre przykłady w tym laboratorium są zaprojektowane do pracy z wewnętrzną przestrzenią IP, która będzie dostępna tylko za pośrednictwem hostowanej wersji Kali. W tym laboratorium będziemy używać adresu IP, który może być inny niż ten, który będziesz mieć w swoich laboratoriach. Pokażemy Ci, jak klucze AWS można łatwo zobaczyć za pośrednictwem usługi Identity Metadata.
WSKAZÓWKA: Znajdowanie identyfikatorów kont AWS i kluczy AWS może być w pewnym sensie sztuką. Identyfikatory kont nie powinny być publiczne, a klucze AWS powinny być tajne. Mamy jednak dowody i wiedzę na temat przechowywania obu elementów w niezabezpieczonych obszarach, takich jak systemy zarządzania kodem źródłowym, takie jak GitHub, kod źródłowy w JavaScript wysyłany do przeglądarki i zakodowany na stałe w aplikacjach mobilnych. Znaleźliśmy je nawet przeszukujące sieć i odkryliśmy wyniki wyszukiwania w miejscach, w których pracują programiści, takich jak Trello. Biorąc pod uwagę, jak powszechny jest ten problem, istnieje armia botów, zarówno dobrych, jak i złych, które stale monitorują Internet w poszukiwaniu tych kluczy. Używając cURL, przeszukamy teraz usługę Identity Metadata Service w AWS.

W tym scenariuszu wyświetlany adres 3.234.217.218 jest adresem serwera dostępnego w Internecie. Maszyna jest ofiarą, którą atakujemy. Aplikacja, o której mowa, ma lukę w zabezpieczeniach SSRF (server-side request forgery) (1). SSRF umożliwiają wykonanie aplikacji w celu pobrania ruchu internetowego z dowolnej innej lokalizacji, do której serwer może się dostać, w tym aplikacji wewnętrznych.
UWAGA: SSRF-y takie jak ten można łatwo znaleźć jako 169.254.169.254, co jest dobrze znanym ciągiem. Możesz spróbować wykonać dodatkową pracę, aby ukryć wyniki systemu, na przykład konwertując 169.254.169.254 na inny format, taki jak ósemkowy, dziesiętny, a nawet notację IPv6 na IPv4. Użyjemy kilku z nich w całym laboratorium.
Jako atakujący kontrolujemy wykonywanie adresu URL, jak widać w kodzie, kierując go do wewnętrznego interfejsu API odpowiedzialnego za zarządzanie urządzeniem. Adres 169.254.169.254 jest podobny do 127.0.0.1 (pętla zwrotna) w naturze. Przestrzeń 169.254 jest nieroutowalnym, ale lokalnie znaczącym adresem. Adres 169.254.169.254, który widzisz tutaj, jest adresem metadanych instancji AWS. Jest to bardzo dobrze zdefiniowana i znana usługa, którą obsługuje AWS i prawie wszyscy dostawcy usług w chmurze. Metadane instancji mogą dostarczyć nam informacji o systemie, w którym się znajdujemy. Wynik tego zapytania pokazuje nam dwa konkretne katalogi, które chcielibyśmy zbadać. Pokazuje dwa katalogi o nazwie meta-data (2) i user-data (3). Zbadamy każdy z nich. Najpierw powinniśmy sprawdzić, z jakim typem hosta lub usługi próbujemy pracować. Czy to jest moduł równoważenia obciążenia? Czy to instancja Lambda? Jednym ze sposobów, w jaki możemy to sprawdzić, jest odwrotne wyszukiwanie DNS. To urządzenie może być instancją EC2; możemy to stwierdzić, używając odwrotnego wyszukiwania DNS, aby sprawdzić ten wynik, jak pokazano tutaj:

Rekord PTR ma tutaj określony format: ec2-3-234-217-218. To oznacza, że usługa to EC2 i ma adres IP 3.234.217.128. Ponadto compute-1 jest identyfikatorem centrum danych us-east-1. Teraz wiemy, że jesteśmy w EC2. Przyjrzyjmy się pierwszej części tej usługi metadanych instancji:

Adres URL, którego używamy, odnosi się bezpośrednio do części usługi metadanych związanej z informacjami IAM. Ta instancja EC2 ma przypisaną rolę IAM (4). Sama usługa zwróci tylko dane systemu, który ją wywołuje. Każdy serwer będzie miał inny zestaw zwracanych wartości, ponieważ wartości są lokalnie istotne. Musimy przeszukać ten adres URL usługi, zanim będziemy mogli przeszukać następną część tej usługi, aby dodać naszą rolę:

Teraz mamy klucz API, który nam przekazano; klucz składa się z trzech części:
- AccessKeyId (5). Klucz dostępu, który jest tutaj wyświetlany, ma prefiks zaczynający się od ASIA; jest to tymczasowy klucz AWS z 6-godzinnym terminem ważności.
- SecretAccessKey (4). Jest to tajny klucz dostępu, którego zazwyczaj potrzebujemy z dowolnymi kluczami API od Amazon.
- Token (7). Jest to wartość tokena sesji — dodatkowy element uwierzytelniający do naszego użytku.
UWAGA: W tym przykładzie używamy usługi Identity Metadata Service (IMDS) v1; w domyślnym szablonie uruchamiania EC2 wdrożono zarówno IMDSv1, jak i IMDSv2. IMDSv2 chroni klientów przed tym wektorem ataku, wymagając dodatkowego wywołania HTTP w celu uzyskania tokena. Dodatkowe wywołanie HTTP to żądanie metody PUT, po którym następuje to samo GET. Użycie metody PUT do początkowego żądania tokena przerwałoby wektor ataku SSRF, ponieważ żądanie musiałoby używać żądań GET.
Są dwie krytyczne rzeczy, o których należy pamiętać, które naprawdę warto rozważyć, zmieniając w praktyce. Po pierwsze, wysłanie tego typu żądania lub otrzymanie tego wyniku może wywołać zaporę aplikacji internetowych (WAF). Po drugie, i być może ważniejsze, użycie tego klucza poza AWS wywoła usługę taką jak AWS GuardDuty. Jedną z jej standardowych reguł jest to, że GuardDuty szuka kluczy EC2 IAM używanych poza chmurą AWS.7 Chcielibyśmy użyć tych kluczy w chmurze AWS i na szczęście możemy uruchomić nasze własne maszyny, aby to zrobić. Musimy edytować dwa pliki na naszym komputerze: .aws/credentials i .aws/config. Te pliki znajdują się w katalogu głównym Twojego folderu domowego; dla użytkowników Kali będzie to /home/kali/.aws/credentials i /home/kali/.aws/config. Edytuj plik poświadczeń AWS, który znajduje się w katalogu /home/kali/.aws, aby mógł on lepiej odzwierciedlać wartości znajdujące się w poniższym bloku kodu. Plik poświadczeń musi zawierać ten blok kodu; upewnij się, że zwracasz uwagę na nazwy wartości i to, co kopiujesz i wklejasz. W szczególności musisz dodać sekcję aws_session_token, której nie zobaczysz w żadnym istniejącym pliku. Instrukcje dotyczące tego, co należy skopiować, podano poniżej.

Aws_access_key_id będzie wartością z naszego zamknięcia na górze o nazwie AccessKeyId. Aws_secret_access_key zostanie skopiowany z SecretAccessKey. Aws_session_token będzie pochodził z wartości Token. Plik /home/kali/.aws/config również będzie musiał zostać zmodyfikowany, aby uwzględnić sekcję [profile default]. Ważne jest, aby pamiętać, że region powinien być ustawiony. Wszelkie dodatkowe elementy, takie jak output, nie są krytyczne. Pominięcie output spowoduje, że output zostanie wydrukowany w formacie JSON.

Po poprawnym skonfigurowaniu pliku konfiguracyjnego AWS możemy przejść do zapytania do interfejsu API AWS w celu znalezienia informacji o koncie dla naszego klucza interfejsu API AWS:

Jeśli bloki kodu zostały umieszczone poprawnie, powinniśmy teraz otrzymać zapytanie zwrotne, które pokazuje, że działamy w przyjętej roli i przyjmujemy rolę naszej instancji EC2. Jest to równoważne z możliwością komunikowania się z domeną Active Directory, tak jakbyśmy próbowali użyć poświadczeń konta maszyny. Ale co możemy zrobić z tymi kluczami? Będziemy musieli to zbadać dalej.