Utilizarea PowerShell pentru colectarea informațiilor despre incidente.

PowerShell este un instrument de automatizare destul de răspândit, utilizat adesea atât de dezvoltatori de malware, cât și de specialiști în securitatea informației.
În acest articol va fi examinat un mod de a folosi PowerShell pentru colectarea de date de la dispozitive finale în cadrul reacției la incidente de securitate cibernetică. Pentru aceasta, va fi necesară scrierea unui script care va fi rulat pe dispozitivul final și urmează o descriere detaliată a acestui script.

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 '*Microsoft*' | 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
		}

	}

}

Pentru a începe lucrul, se crează o funcție CSIRT, care va accepta un argument - calea pentru a salva datele obținute. Deoarece majoritatea cmdlet-urilor funcționează în PowerShell v5, a fost efectuată o verificare a versiunii PowerShell pentru a asigura funcționarea corectă.

function CSIRT{
		
param($path) # la rularea scriptului trebuie sa fie specificată o directory pentru salvare
if ($psversiontable.psversion.major -ge 5)

Pentru a facilita navigarea printre fișierele create, au fost inițializate două variabile: $date și $Computer, cărora le vor fi atribuite numele computerului și data curentă.

$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"

Lista proceselor în execuție din contul utilizatorului curent poate fi obținută astfel: vom crea variabila $process, atribuindo-i comanda get-ciminstance cu clasa win32_process. Folosind comanda Select-Object, putem adăuga parametrii suplimentari pentru ieșire, în cazul nostru aceștia vor fi parentprocessid (identificatorul procesului părinte PPID), creationdate (data creării procesului), processed (identificatorul procesului PID), processname (numele procesului), commandline (comanda de executare).

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

Pentru a obține lista tuturor conexiunilor TCP și UDP, vom crea variabilele $netTCP și $netUDP, atribuindu-le comenzile Get-NetTCPConnection și Get-NetUDPEndpoint, respectiv.

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

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

De asemenea, este important să știm lista sarcinilor programate și a lucrărilor. Pentru aceasta, vom folosi comenzile get-ScheduledTask și Get-ScheduledJob. Le vom atribui variabilele $task și $job, deoarece în sistem există o mulțime de sarcini programate, iar pentru a identifica activitatea malițioasă, este bine să filtrăm sarcinile programate legitime. Comanda Select-Object ne va ajuta în acest sens.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname | where author -notlike '*Microsoft*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task exclude autorii care conțin „Microsoft”, „*@%systemroot%*” și autorii „goi”
$job = Get-ScheduledJob

În sistemul de fișiere NTFS există noțiunea de fluxuri de date alternative (Alternate Data Streams, ADS). Aceasta înseamnă că un fișier din NTFS poate fi legat suplimentar de mai multe fluxuri de date de dimensiuni arbitrare. Prin intermediul ADS se pot ascunde date care nu vor fi vizibile în verificările standard ale sistemului. Datorită acestui lucru, se poate introduce cod malițios și/sau ascunde date.

Pentru a vizualiza fluxurile de date alternative în PowerShell, vom folosi comanda get-item și instrumentul încorporat Windows stream cu simbolul * pentru a vizualiza toate fluxurile posibile, pentru aceasta vom crea variabila $ADS.

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

Va fi util să aflăm și lista utilizatorilor conectați la sistem, pentru aceasta vom crea variabila $user și îi vom atribui execuția programului quser.

$user = quser

Atacatorii, pentru a se stabili în sistem, pot face modificări în autostart. Pentru a vizualiza obiectele din autostart, se poate folosi cmdlet-ul Get-ItemProperty.
Vom crea două variabile: $runUser – pentru a vizualiza autostartul în numele utilizatorului și $runMachine – pentru a vizualiza autostartul în numele computerului.

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

Pentru a înregistra toate informațiile în fișiere diferite, creăm un array cu variabile și un array cu numele fișierelor.


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

Și, folosind un ciclu for, datele obținute vor fi salvată în fișiere.

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

După execuția scriptului, vor fi create 9 fișiere text, conținând informațiile necesare.

În prezent, specialiștii în cybersecuritate pot folosi PowerShell pentru a îmbogăți informațiile necesare rezolvării diverselor sarcini în munca lor. Adăugând scriptul în autostart, se pot obține anumite informații fără a face dump-uri, imagini etc.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster