Používanie prostredia PowerShell na zhromažďovanie informácií o incidente

PowerShell je pomerne bežný automatizačný nástroj, ktorý často používajú vývojári malvéru aj špecialisti na informačnú bezpečnosť.
Tento článok bude diskutovať o možnosti použitia PowerShell na vzdialené zhromažďovanie údajov z koncových zariadení pri reakcii na incidenty zabezpečenia informácií. K tomu budete musieť napísať skript, ktorý sa spustí na koncovom zariadení a následne bude podrobný popis tohto skriptu.

function CSIRT{
param($path)
if ($psversiontable.psversion.major -ge 5)
	{
	$date = Get-Date -Format dd.MM.yyyy_hh_mm
	$Computer = $env:COMPUTERNAME
	New-Item -Path $path$computer$date -ItemType 'Directory' -Force | Out-Null
	$path = "$path$computer$date"

	$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname,
	processid, commandline, parentprocessid

	$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state
	
	$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state

	$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname|
	where author -notlike '*Майкрософт*' | where author -ne $null |
	where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*'

	$job = Get-ScheduledJob

	$ADS =  get-item * -stream * | where stream -ne ':$Data'

	$user = quser

	$runUser = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"

	$runMachine =  Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

	$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
	$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
	"ScheduledJob", "AlternativeDataStream"


	for ($w = 0; $w -lt $array.count; $w++){
		$name = $arrayName[$w]
		$array[$w] >> $path$name.txt
		}

	}

}

Ak chcete začať, vytvorte funkciu rozšírenie CSIRT, ktorý prevezme argument - cestu na uloženie prijatých dát. Vzhľadom na to, že väčšina cmdletov funguje v Powershell v5, bola skontrolovaná správna funkčnosť verzie PowerShell.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

Pre uľahčenie navigácie vo vytvorených súboroch sú inicializované dve premenné: $date a $Computer, ktorým bude priradený názov počítača a aktuálny dátum.

$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date –ItemType 'Directory' -Force | Out-Null 
$path = "$path$computer$date"

Zoznam spustených procesov v mene aktuálneho používateľa získame takto: vytvorte premennú $process, priraďte jej cmdlet get-ciminstance s triedou win32_process. Pomocou cmdlet Select-Object môžete pridať ďalšie výstupné parametre, v našom prípade to budú parentprocessid (ID nadradeného procesu PPID), dátum vytvorenia (dátum vytvorenia procesu), spracované (ID procesu PID), názov procesu (názov procesu), príkazový riadok ( príkaz spustiť).

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

Ak chcete získať zoznam všetkých pripojení TCP a UDP, vytvorte premenné $netTCP a $netUDP tak, že im priradíte rutiny cmdlet Get-NetTCPConnection a Get-NetTCPConnection.

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

Dôležité bude zistiť si zoznam plánovaných úloh a zadaní. Na tento účel používame cmdlety get-ScheduledTask a Get-ScheduledJob. Priraďme im premenné $úloha a $job, pretože Spočiatku je v systéme veľa naplánovaných úloh, potom sa na identifikáciu škodlivej činnosti oplatí odfiltrovať legitímne naplánované úlohy. Pomôže nám v tom cmdlet Select-Object.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

V súborovom systéme NTFS existuje niečo ako alternatívne dátové toky (ADS). To znamená, že súbor v systéme NTFS môže byť voliteľne spojený s viacerými dátovými tokmi ľubovoľnej veľkosti. Pomocou ADS môžete skryť údaje, ktoré by štandardnými systémovými kontrolami neboli viditeľné. To umožňuje vložiť škodlivý kód a/alebo skryť údaje.

Na zobrazenie alternatívnych dátových tokov v PowerShell použijeme cmdlet get-item a vstavaný streamovací nástroj Windows so symbolom * na zobrazenie všetkých možných tokov, na tento účel vytvoríme premennú $ADS.

$ADS = get-item * -stream * | where stream –ne ':$Data' 

Užitočné bude zistiť si zoznam užívateľov prihlásených do systému, na to vytvoríme premennú $user a priradíme ju vykonávaniu programu quser.

$user = quser

Útočníci môžu vykonať zmeny v automatickom spustení, aby získali oporu v systéme. Na zobrazenie spúšťacích objektov môžete použiť cmdlet Get-ItemProperty.
Vytvorme dve premenné: $runUser - na zobrazenie spustenia v mene používateľa a $runMachine - na zobrazenie spustenia v mene počítača.

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

Aby sa všetky informácie zapísali do rôznych súborov, vytvoríme pole s premennými a pole s názvami súborov.


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect" "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

A pomocou cyklu for sa prijaté údaje zapíšu do súborov.

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

Po vykonaní skriptu sa vytvorí 9 textových súborov obsahujúcich potrebné informácie.

Profesionáli v oblasti kybernetickej bezpečnosti dnes môžu použiť PowerShell na obohatenie informácií, ktoré potrebujú na riešenie rôznych úloh pri svojej práci. Pridaním skriptu do spustenia môžete získať niektoré informácie bez odstraňovania výpisov, obrázkov atď.

Zdroj: hab.com

Pridať komentár