Utilizzo di PowerShell per raccogliere informazioni sugli incidenti

PowerShell è uno strumento di automazione abbastanza comune che viene spesso utilizzato sia dagli sviluppatori di malware che dagli specialisti della sicurezza delle informazioni.
Questo articolo discuterà la possibilità di utilizzare PowerShell per raccogliere in remoto dati dai dispositivi finali quando si risponde a incidenti di sicurezza delle informazioni. Per fare ciò, dovrai scrivere uno script che verrà eseguito sul dispositivo finale e poi ci sarà 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 '*Майкрософт*' | 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, crea una funzione CSIRT, che accetterà un argomento: il percorso per salvare i dati ricevuti. Dato che la maggior parte dei cmdlet funziona in Powershell v5, è stato verificato il corretto funzionamento della versione di PowerShell.

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

Per facilitare la navigazione tra i file creati, vengono inizializzate due variabili: $date e $Computer, alle quali verranno 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"

Otteniamo l'elenco dei processi in esecuzione per conto dell'utente corrente nel modo seguente: creiamo una variabile $process, assegnandole il cmdlet get-ciminstance con la classe win32_process. Utilizzando il cmdlet Select-Object, è possibile aggiungere ulteriori parametri di output, nel nostro caso questi saranno parentprocessid (ID processo principale PPID), Creationdate (data di creazione del processo), elaborato (ID processo PID), processname (nome processo), riga di comando ( eseguire il comando).

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

Per ottenere un elenco di tutte le connessioni TCP e UDP, creare le variabili $netTCP e $netUDP assegnando loro rispettivamente i cmdlet Get-NetTCPConnection e 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

Sarà importante scoprire l'elenco delle attività e degli incarichi pianificati. A tale scopo, utilizziamo i cmdlet get-ScheduledTask e Get-ScheduledJob. Assegnamo loro le variabili $task e $job, perché Inizialmente, nel sistema sono presenti molte attività pianificate, quindi per identificare attività dannose vale la pena filtrare le attività pianificate legittime. Il cmdlet Select-Object ci aiuterà in questo.

$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

Nel file system NTFS esistono flussi di dati alternativi (ADS). Ciò significa che un file in NTFS può facoltativamente essere associato a più flussi di dati di dimensione arbitraria. Utilizzando ADS, puoi nascondere dati che non sarebbero visibili attraverso i controlli di sistema standard. Ciò rende possibile inserire codice dannoso e/o nascondere dati.

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

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

Sarà utile conoscere la lista degli utenti loggati nel sistema; per questo creeremo una variabile $user e la assegneremo all'esecuzione del programma quser.

$user = quser

Gli aggressori possono apportare modifiche all'esecuzione automatica per prendere piede nel sistema. Per visualizzare gli oggetti di avvio, è possibile utilizzare il cmdlet Get-ItemProperty.
Creiamo due variabili: $runUser - per visualizzare l'avvio per conto dell'utente e $runMachine - per visualizzare l'avvio per conto del computer.

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

Affinché tutte le informazioni vengano scritte su file diversi, creiamo un array con variabili e un array con nomi di 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 ricevuti verranno scritti su file.

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

Dopo aver eseguito lo script, verranno creati 9 file di testo contenenti le informazioni necessarie.

Oggi, i professionisti della sicurezza informatica possono utilizzare PowerShell per arricchire le informazioni di cui hanno bisogno per risolvere una serie di attività nel loro lavoro. Aggiungendo uno script all'avvio, puoi ottenere alcune informazioni senza rimuovere dump, immagini, ecc.

Fonte: habr.com

Aggiungi un commento