Utilizarea PowerShell pentru a culege informații despre incident

PowerShell este un instrument de automatizare destul de comun, care este adesea folosit atât de dezvoltatorii de programe malware, cât și de specialiștii în securitatea informațiilor.
Acest articol va discuta despre opțiunea de a utiliza PowerShell pentru a colecta de la distanță date de pe dispozitivele finale atunci când răspundeți la incidente de securitate a informațiilor. Pentru a face acest lucru, va trebui să scrieți un script care va rula pe dispozitivul final și apoi va exista 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 '*Майкрософт*' | 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, creați o funcție extensia CSIRT, care va lua un argument - calea pentru salvarea datelor primite. Datorită faptului că majoritatea cmdlet-urilor funcționează în Powershell v5, versiunea PowerShell a fost verificată pentru funcționarea corectă.

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

Pentru ușurința navigării prin fișierele create, sunt inițializate două variabile: $date și $Computer, cărora li se va atribui 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"

Obținem lista proceselor care rulează în numele utilizatorului curent, după cum urmează: creați o variabilă $process, atribuindu-i cmdlet-ul get-ciminstance cu clasa win32_process. Folosind cmdlet-ul Select-Object, puteți adăuga parametri de ieșire suplimentari, în cazul nostru aceștia vor fi parentprocessid (ID-ul procesului părinte PPID), data creației (data creării procesului), procesat (ID-ul procesului PID), numele procesului (numele procesului), linia de comandă ( executa comanda).

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

Pentru a obține o listă a tuturor conexiunilor TCP și UDP, creați variabilele $netTCP și $netUDP alocandu-le cmdlet-urile Get-NetTCPConnection și, respectiv, 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

Va fi important să aflați lista sarcinilor și sarcinilor planificate. Pentru a face acest lucru, folosim cmdleturile get-ScheduledTask și Get-ScheduledJob. Să le atribuim variabilele $task și $job, deoarece Inițial, există o mulțime de sarcini programate în sistem, apoi, pentru a identifica activitățile rău intenționate, merită să filtrați sarcinile programate legitime. Cmdletul Select-Object ne va ajuta în acest sens.

$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

În sistemul de fișiere NTFS există fluxuri de date alternative (ADS). Aceasta înseamnă că un fișier în NTFS poate fi asociat opțional cu mai multe fluxuri de date de dimensiune arbitrară. Folosind ADS, puteți ascunde datele care nu ar fi vizibile prin verificări standard ale sistemului. Acest lucru face posibilă injectarea de cod rău intenționat și/sau ascunderea datelor.

Pentru a afișa fluxuri de date alternative în PowerShell, vom folosi cmdletul get-item și instrumentul de flux Windows încorporat 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ă aflați lista utilizatorilor conectați la sistem; pentru aceasta vom crea o variabilă $user și o vom atribui execuției programului quser.

$user = quser

Atacatorii pot face modificări la autorun pentru a obține un punct de sprijin în sistem. Pentru a vizualiza obiectele de pornire, puteți utiliza cmdletul Get-ItemProperty.
Să creăm două variabile: $runUser - pentru a vedea pornirea în numele utilizatorului și $runMachine - pentru a vedea pornirea în numele computerului.

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

Pentru ca toate informațiile să fie scrise în fișiere diferite, creăm o matrice cu variabile și o matrice cu nume de fișiere.


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

Și folosind o buclă for, datele primite vor fi scrise în fișiere.

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

După executarea scriptului, vor fi create 9 fișiere text care conțin informațiile necesare.

Astăzi, profesioniștii în securitate cibernetică pot folosi PowerShell pentru a îmbogăți informațiile de care au nevoie pentru a rezolva o varietate de sarcini în munca lor. Adăugând un script la pornire, puteți obține unele informații fără a elimina depozitele, imaginile etc.

Sursa: www.habr.com

Adauga un comentariu