W przypadku złożonych skryptów kodowanie ich nie zawsze jest najlepszym rozwiązaniem. Jedną z innych opcji jest umieszczenie ich na stronie internetowej, załadowanie skryptów, a następnie bootstrapowanie ich w naszym kodzie. Dwie funkcje w programie PowerShell pomagają nam to zrobić:
Invoke-Expression i Invoke-WebRequest.
Funkcja Invoke-WebRequest wyjdzie i pobierze stronę internetową, a następnie zwróci jej zawartość. Pozwala nam to umieścić stronę w Internecie z naszym kodem, a następnie pobrać ją z poziomu programu PowerShell. Ta funkcja domyślnie używa silnika IE, którego nasz komputer z systemem Windows 2019 mógł nie zainicjować, więc będziemy musieli użyć obejścia, aby upewnić się, że może pobrać nasze strony internetowe. Możemy użyć opcji -UseBasicParsing, aby powiedzieć funkcji, aby nie próbowała analizować wyników, ale zamiast tego po prostu je nam zwróciła. Funkcja Invoke-Expression ocenia przekazany jej kod. Możemy załadować kod z pliku, a następnie przekazać go przez stdin lub inną opcję. Jedną z najczęstszych metod, z których korzystają atakujący, jest jednak przekazanie Invoke-Expression wyniku z żądania internetowego, aby mogli uruchomić większe programy bez obaw o blokowanie skryptów. Na początek utwórzmy plik, który chcemy obsługiwać, a następnie możemy uruchomić podstawowy serwer Pythona w tle. Na polu Kali w laboratorium wpisz następujące polecenie:
Nasz plik nazywa się t.ps1, ponieważ chcemy wpisać jak najmniej. Dzięki naszemu serwerowi WWW działającemu na Kali (w tym przykładzie 10.0.0.40) i naszemu kodowi w t.ps1 możemy wykonać kod za pomocą wiersza poleceń programu PowerShell z naszego docelowego systemu Windows bez konieczności martwienia się o użycie opcji encodedcommand. Użyj powłoki poleceń, używając kontekstu użytkownika „target”:
Tutaj połączyliśmy nasze dwa polecenia, aby pobrać plik z naszego pudełka Kali i wykonać go. Daje nam to taki sam wynik, jak przy uruchamianiu lokalnym, i nie otrzymaliśmy żadnych komunikatów o błędach, które widzieliśmy wcześniej, gdy próbowaliśmy wykonać skrypty. Możemy zrobić to samo ze ścieżkami Universal Naming Convention (UNC). W tej części laboratorium użyjemy smbserver Impacket, aby udostępnić nasz katalog. Chcemy nazwać nasz udział ghh i chcemy, aby był mapowany na nasz katalog lokalny. Uruchomimy go również w tle. Będziemy mogli zobaczyć wynik z serwera na naszym ekranie, ale nadal będziemy mogli wpisywać polecenia.
Na koniec możemy przetestować naszą usługę Samba. Gdy smbclient poprosi o hasło, po prostu naciśnij ENTER.
Po uruchomieniu usługi tworzymy listę udziałów za pomocą smbclient, aby zweryfikować, czy nasz udział został pomyślnie dodany. Po skonfigurowaniu udziałów możemy teraz odwołać się do tego samego skryptu za pomocą ścieżki UNC. Zamiast używać wiersza poleceń, uruchommy plik wykonywalny programu PowerShell bez żadnych opcji wiersza poleceń i wypróbujmy to:
Tutaj zastosowaliśmy to samo podstawowe podejście ze ścieżką UNC zamiast adresu URL. Daje nam to kilka różnych sposobów wykonywania kodu na komputerach bez konieczności zmiany zasad programu PowerShell.