Zakodowane polecenia

https://chacker.pl/

Kiedy mamy bardziej złożone zadanie, miło jest nie martwić się o formatowanie. PowerShell ma przydatny tryb, który pozwala nam przekazać zakodowany ciąg Base64 jako skrypt do uruchomienia — pod warunkiem, że skrypt nie jest zbyt długi. Całkowita długość polecenia wiersza poleceń systemu Windows wynosi około 8000 znaków, więc to jest twój limit. Musimy wprowadzić kilka zmian, aby utworzyć zakodowane polecenie. Przede wszystkim opcja encodedcommand programu PowerShell przyjmuje zakodowany ciąg Unicode Base64, więc najpierw musimy przekonwertować nasz tekst na Unicode, a następnie zakodować go jako Base64. Aby to zrobić, potrzebujemy łatwego sposobu na konwersję do kodowania Base64. Chociaż moglibyśmy użyć narzędzi już dostępnych w Kali, aby to zrobić, użyjemy jednego z moich ulubionych zestawów narzędzi, Ruby BlackBag autorstwa Erica Montiego. Ten klejnot Ruby zawiera wiele narzędzi do kodowania i dekodowania, które pomagają zarówno w analizie złośliwego oprogramowania, jak i hakowaniu. SSH do instancji Kali w laboratorium. Najpierw musimy ją zainstalować, zanim będziemy mogli jej używać:

Po zainstalowaniu tego zestawu narzędzi nie tylko dodaje on funkcjonalność Ruby, ale także tworzy kilka skryptów pomocniczych — jeden z nich nazywa się b64, narzędzie do konwersji Base64. Następnie weźmiemy to samo polecenie, którego użyliśmy w poprzednim laboratorium, i przekonwertujemy je na ciąg Base64 zgodny z PowerShell:

Tutaj używamy echo z opcją -n, aby wydrukować nasze polecenie PowerShell bez włączania nowej linii. Następnie przekazujemy to do iconv, konwertera zestawów znaków, który przekonwertuje nasz tekst ASCII na UTF-16LE, format Windows Unicode. Na koniec przekazujemy to wszystko do b64, jak pokazano poniżej. Ciąg, który on wyprowadza, to ciąg, którego będziemy używać z PowerShell na naszym docelowym systemie Windows w laboratorium.

Powinien pojawić się następujący wynik:

Tutaj widać, że gdy przekazujemy nasz ciąg z opcją -enc, otrzymujemy oczekiwany wynik. Teraz możemy budować bardziej złożone skrypty i przekazywać cały skrypt w wierszu poleceń, dzięki czemu nie musimy się martwić o zapobieganie wykonywaniu skryptów. Oprócz użycia sztuczki b64, możemy to również zrobić bezpośrednio z PowerShell w Kali. Ta instancja ma zainstalowany Microsoft PowerShell i jest wykonywalna za pomocą polecenia pwsh. Możemy używać większości poleceń PowerShell tak samo, jak moglibyśmy to robić w systemie Windows.

Aby wyjść z powłoki PowerShell, wpisz polecenie exit, aby powrócić do zwykłych monitów powłoki.

Przekazywanie poleceń w wierszu poleceń

https://chacker.pl/

Wcześniej wykonaliśmy szereg poleceń programu PowerShell z wiersza poleceń.Tu przyjrzymy się, jak wykonywać bardziej złożone polecenia. W poprzednich przykładach widziałeś, że opcja -command może być używana do przekazywania poleceń w wierszu poleceń; jednak wiele opcji programu PowerShell można skrócić. W tym laboratorium zaloguj się ponownie do komputera docelowego w laboratorium, używając protokołu RDP jako użytkownika docelowego. Uruchom powłokę poleceń, używając uprawnień użytkownika „docelowego”. W tym przypadku możemy po prostu użyć opcji -com, jak pokazano tutaj, i zaoszczędzić sobie pisania:

Tutaj mogliśmy wydać proste zapytanie Windows Management Instrumentation (WMI) za pomocą programu PowerShell i bez żadnych dodatkowych cudzysłowów wokół zapytania. W przypadku podstawowych zapytań będzie to działać dobrze; jednak w przypadku bardziej złożonych zapytań możemy napotkać problem. Zobaczmy, co się stanie, gdy spróbujemy uzyskać dodatkowe informacje o nazwie hosta:

Tutaj widać, że nie mogliśmy użyć znaku potoku do przekazywania danych z jednej metody do drugiej, ponieważ jest on interpretowany przez system operacyjny. Najłatwiejszym sposobem obejścia tego jest użycie cudzysłowów, tak jak tutaj:

Zwróć uwagę, że nazwa hosta może być inna. Tym razem znak potoku nie został zinterpretowany przez system operacyjny, więc mogliśmy uzyskać tylko informacje o nazwie hosta z wyjścia zapytania WMI. W przypadku prostych poleceń działa to dobrze, a jeśli wykonujemy tylko kilka z tych poleceń, dość łatwo jest dodać je do skryptu wsadowego i uruchomić je stamtąd.

Warunek awarii

https://chacker.pl/

Zanim przyjrzymy się, jak obejść zabezpieczenia, powinniśmy przyjrzeć się, jak zabezpieczenia działają w działaniu. Aby to zrobić, zbudujemy bardzo prosty skrypt na naszym komputerze z systemem Windows , a następnie spróbujemy wykonać ten skrypt. W przypadku naszego skryptu po prostu utworzymy listę katalogów katalogu głównego C:\. Najpierw musimy połączyć się z systemem docelowym, używając szczegółów połączenia z wyników kompilacji naszego laboratorium i poświadczeń wymienionych w repozytorium dla rozdziału 15. Po zalogowaniu się do systemu przy użyciu protokołu pulpitu zdalnego (RDP) otwieramy wiersz poleceń jako administrator, a następnie uruchamiamy następujący kod:

Tutaj widać, że wykonanie naszego skryptu test.ps1 zostało zablokowane, ponieważ uruchamianie skryptów w systemie zostało wyłączone. Przyjrzyjmy się bieżącej polityce wykonywania:

Pokazuje to, że bieżąca polityka wykonywania jest „Restricted”. Tabela  przedstawia podział tego, co robi każda z możliwych polityk wykonywania.

Spróbujmy zmienić politykę wykonywania na Unrestricted, a następnie ponownie uruchomić nasz skrypt test.ps1:

Jak widać, po zmianie polityki na Unrestricted nasz skrypt działa bez zarzutu. Na podstawie Tabeli  wygląda na to, że RemoteSigned również powinno działać. Spróbujmy:

Zasada RemoteSigned również działa. Teoretycznie moglibyśmy po prostu zresetować zasadę wykonywania do jednej z tych dwóch wartości. Niestety, w wielu środowiskach wartość ta jest wymuszana przez zasady grupy. W takiej sytuacji nie jest tak łatwo zmienić zasadę. Dlatego ustawmy wartość z powrotem na Restricted, jak pokazano tutaj, i przejdziemy do reszty rozdziału z włączonymi najsurowszymi kontrolami:

Zamknij teraz wiersz poleceń, ponieważ pozostałe ćwiczenia laboratoryjne należy wykonać jako normalny użytkownik „docelowy”.

Ładowanie skryptów PowerShell

https://chacker.pl/

Zanim będziemy mogli przeprowadzić jakąkolwiek eksploatację za pomocą PowerShell, musisz wiedzieć, jak wykonywać skrypty. W większości środowisk niepodpisane skrypty PowerShell nie są domyślnie dozwolone. Przyjrzymy się temu zachowaniu, abyś mógł je zidentyfikować, a następnie przyjrzymy się, jak je ominąć, aby móc uruchomić dowolny kod, który chcesz uruchomić.

Przenośność programu PowerShell

https://chacker.pl/

Jednym z miłych aspektów programu PowerShell jest to, że moduły są bardzo przenośne i można je ładować na wiele różnych sposobów. Daje nam to możliwość ładowania zarówno modułów zainstalowanych w systemie, jak i modułów w innych lokalizacjach. Możemy również ładować moduły z udziałów Server Message Block (SMB), a także z sieci Web. Dlaczego możliwość ładowania z tych zdalnych lokalizacji jest tak cenna? Chcemy pozostawić jak najmniej śladów i chcemy powielać jak najmniej pracy. Oznacza to, że możemy pozostawić elementy, których będziemy często używać, w udziale SMB lub nawet w witrynie, a następnie odwoływać się do nich z tego miejsca. Ponieważ skrypt jest tylko tekstem, nie musimy martwić się o bloki dla plików binarnych lub podobnych typów plików. Możemy również zaciemniać kod, a następnie dekodować go w locie, co potencjalnie ułatwia omijanie kontroli bezpieczeństwa. Ponieważ skrypt jest tylko tekstem, możemy go uwzględnić niemal wszędzie. Często witryny z kodem, takie jak GitHub, są przydatne do tego typu działań, ponieważ takie witryny mają wiele celów związanych z biznesem. Możemy uwzględnić nasze skrypty w repozytorium lub jako podstawowe polecenia gist, które ładujemy z naszego środowiska PowerShell, aby uruchomić inne działania. PowerShell może nawet używać ustawień proxy użytkownika, więc jest to świetny sposób na ustanowienie trwałości w środowisku.

Rejestrowanie bloków skryptów

https://chacker.pl/

Rejestrowanie bloków skryptów służy do rejestrowania, kiedy wykonywane są bloki skryptów, co zapewnia większą głębię w tym, co jest wykonywane. Począwszy od programu PowerShell v5.0, rejestrowanie bloków skryptów dostarcza wielu danych o potencjalnie podejrzanych zdarzeniach, aby dać ludziom zajmującym się analizą kryminalistyczną coś do zrobienia. Rejestrowane elementy obejmują skrypty uruchomione za pomocą opcji encodedcommand, a także wszelkie podstawowe zaciemnianie. Dlatego po włączeniu rejestrowania bloków skryptów obrońcy prawdopodobnie będą mieli dodatkowe informacje na temat tego, co robiłeś. Jest to lepsze rozwiązanie dla obrońców niż rejestrowanie modułów, ponieważ wyróżnia rzeczy, które prawdopodobnie byłyby dla Ciebie ważne z punktu widzenia analizy kryminalistycznej, a jednocześnie nie powoduje tak dużego obciążenia analizą dziennika.

 

Rejestrowanie modułów

https://chacker.pl/

Rejestrowanie modułów umożliwia szereg funkcji dotyczących sposobu ładowania skryptów i podstawowych informacji o tym, co zostało wykonane. Obejmuje to, jakie moduły i zmienne zostały załadowane, a nawet niektóre informacje o skrypcie. Rejestrowanie to znacznie zwiększa szczegółowość podczas uruchamiania skryptów programu PowerShell i może być przytłaczające dla administratora. Rejestrowanie modułów jest dostępne od wersji PowerShell v3.0 i nie jest domyślnie włączone, więc aby uzyskać to rejestrowanie, należy włączyć obiekt zasad grupy (GPO) w systemach. Chociaż ten typ rejestrowania zwiększa widoczność tego, co zostało uruchomione, w większości przypadków nie zapewnia faktycznego kodu, który został uruchomiony. Dlatego też w przypadku dochodzenia kryminalistycznego ten poziom rejestrowania jest nadal niewystarczający. Będzie jednak naprowadzał śledczych na typy rzeczy, które robiłeś, chociaż szczegóły prawdopodobnie nie zostaną zarejestrowane.

Rejestrowanie w programie PowerShell

https://chacker.pl/

We wcześniejszych wersjach programu PowerShell (przed v4.0) dostępnych było tylko kilka opcji rejestrowania. Pozwalało nam to działać bez tworzenia wielu alertów dziennika podczas ładowania programu PowerShell, a także bardzo utrudniało osobom zajmującym się analizą kryminalistyczną ustalenie, co robiliśmy. Rejestrowanie rejestrowało tylko fakt załadowania programu PowerShell. W nowszych wersjach programu PowerShell dostępne są dodatkowe opcje zwiększające rejestrowanie w programie PowerShell. Z tego powodu ukierunkowanie na najnowszą wersję systemu Windows może zdradzić więcej informacji o tym, co robisz, niż w starszych wersjach.

UWAGA: Omawiamy tylko kilka aspektów rejestrowania w programie PowerShell, które mogą mieć wpływ na wykrywanie włamań. Aby uzyskać więcej informacji, dodaliśmy odniesienie z FireEye, które bardziej szczegółowo opisuje różne opcje i wyjaśnia, jak je włączyć.

Życie z ziemi

https://chacker.pl/

Kiedy mówimy o „życiu z ziemi”, mamy na myśli korzystanie z narzędzi już obecnych w systemach w celu dalszego wykorzystania luk. Jest to cenne, ponieważ zawsze, gdy dodajemy coś do systemu, zwiększamy prawdopodobieństwo wykrycia. Co więcej, gdy zostawiamy narzędzia, pomaga to ujawnić nasze taktyki, techniki i procedury (TTP), dzięki czemu łatwiej jest znaleźć naszą aktywność w innych systemach. Gdy żyjemy z ziemi, możemy zostawić mniej artefaktów i ograniczyć narzędzia, które musimy przenosić z systemu do systemu. PowerShell jest przydatny jako już istniejące narzędzie w systemie, ponieważ daje nam możliwość łatwego pisania skryptów, a także obejmuje integrację z .NET, więc prawie wszystko, co możemy napisać w .NET, możemy napisać w PowerShell. Oznacza to, że możemy wyjść poza podstawowe skrypty i wchodzić w interakcje z funkcjami jądra i nie tylko. Daje nam to dodatkową elastyczność, która normalnie wymagałaby użycia oddzielnych programów. Jedną z głównych zalet PowerShell jest to, że może on korzystać z opcji przeglądarki Internet Explorer, więc takie rzeczy jak obsługa proxy są wbudowane w PowerShell. W rezultacie możemy używać wbudowanych bibliotek internetowych do zdalnego ładowania kodu, co oznacza, że ​​nie musimy ręcznie pobierać żadnego kodu do systemu docelowego. Dlatego gdy ktoś spojrzy na oś czasu systemu plików, te pobrania ze stron internetowych nie będą widoczne, co pozwoli nam być jeszcze bardziej dyskretnym.

Dlaczego PowerShell

https://chacker.pl/

Chociaż język PowerShell był błogosławieństwem dla automatyzacji systemów Windows, daje hakerom przewagę. PowerShell zapewnia nam dostęp do niemal wszystkich funkcji systemu Windows w sposób programowy. Jest rozszerzalny i może być używany do administrowania usługą Active Directory, systemami poczty e-mail, programem SharePoint, stacjami roboczymi i nie tylko. PowerShell zapewnia nam dostęp do bibliotek .NET z poziomu interfejsu skryptowego, co czyni go jednym z najbardziej elastycznych narzędzi, których można używać w środowisku Windows.