Utilizzare PowerShell per raccogliere informazioni sugli incidenti

PowerShell è uno strumento di automazione piuttosto comune, spesso utilizzato sia da programmatori malevoli che da esperti di sicurezza informatica.
In questo articolo verrà esaminato un modo per utilizzare PowerShell per la raccolta remota di dati dai dispositivi finali durante la risposta agli incidenti di sicurezza informatica. A tal fine, sarà necessario scrivere uno script che verrà eseguito sul dispositivo finale, seguito da una descrizione dettagliata di questo 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
		}

	}

}

Per iniziare, viene creata una funzione CSIRT, che accetterà un argomento: il percorso per salvare i dati ottenuti. Poiché la maggior parte dei cmdlet funziona in Powershell v5, è stata effettuata una verifica della versione di PowerShell per garantire un funzionamento corretto.

function CSIRT{
		
param($path)# All'avvio dello script, è necessario specificare la directory per il salvataggio
if ($psversiontable.psversion.major -ge 5)

Per facilitare la navigazione tra i file creati, sono state inizializzate due variabili: $date e $Computer, a cui saranno assegnati il nome del computer e la data corrente.

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

Per ottenere l'elenco dei processi in esecuzione a nome dell'utente corrente, creeremo una variabile $process e assegneremo ad essa il cmdlet get-ciminstance con la classe win32_process. Utilizzando il cmdlet Select-Object, possiamo aggiungere parametri di output aggiuntivi; in questo caso, saranno parentprocessid (ID del processo padre PPID), creationdate (data di creazione del processo), processed (ID del processo PID), processname (nome del processo), commandline (comando di avvio).

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

Per ottenere l'elenco di tutte le connessioni TCP e UDP, creeremo le variabili $netTCP e $netUDP, assegnando ad esse rispettivamente i cmdlet Get-NetTCPConnection e Get-NetUDPEndpoint.

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

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

È importante conoscere l'elenco dei compiti e delle attività pianificate. A tale scopo, utilizziamo i cmdlet get-ScheduledTask e Get-ScheduledJob. Assegneremo loro le variabili $task e $job. Poiché ci sono molte attività pianificate nel sistema, per identificare attività malevole sarà necessario filtrare le attività pianificate legittime. Il cmdlet Select-Object ci sarà d'aiuto.

$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 esclude gli autori contenenti "Microsoft", "*@%systemroot%*", e anche gli autori "vuoti"
$job = Get-ScheduledJob

Nel file system NTFS esiste il concetto di flussi di dati alternativi (Alternate Data Streams, ADS). Questo significa che un file in NTFS può essere ulteriormente associato a più flussi di dati di dimensioni arbitrarie. Con gli ADS è possibile nascondere dati che non saranno visibili alle normali verifiche del sistema. Questo consente di incorporare codice dannoso e/o nascondere dati.

Per visualizzare i flussi di dati alternativi in PowerShell, utilizzeremo il cmdlet get-item e lo strumento integrato di Windows stream con il simbolo * per visualizzare tutti i flussi possibili; per farlo, creeremo la variabile $ADS.

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

Sarà utile conoscere anche l'elenco degli utenti connessi al sistema, quindi creeremo la variabile $user e le assegneremo l'esecuzione del programma quser.

$user = quser

Gli aggressori, per radicarsi nel sistema, possono apportare modifiche all'avvio automatico. Per visualizzare gli oggetti nell'avvio automatico, si può utilizzare il cmdlet Get-ItemProperty.
Creeremo due variabili: $runUser – per visualizzare l'avvio automatico a nome dell'utente e $runMachine – per visualizzare l'avvio automatico a nome del computer.

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

Per registrare tutte le informazioni in file diversi, creiamo un array con le variabili e un array con i nomi dei file.


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

E, utilizzando un ciclo for, i dati ottenuti verranno registrati nei file.

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

Dopo l'esecuzione dello script, verranno creati 9 file di testo contenenti le informazioni necessarie.

Attualmente, gli esperti di cybersicurezza possono utilizzare PowerShell per arricchire le informazioni necessarie per affrontare vari compiti nel loro lavoro. Aggiungendo lo script all'avvio automatico, è possibile ottenere alcune informazioni senza effettuare dump, immagini, ecc.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster