PowerShell è uno strumento di automazione piuttosto comune, spesso utilizzato sia da sviluppatori di malware che da esperti di sicurezza informatica.
In questo articolo verrà esaminato un metodo di utilizzo di 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 e seguirà 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 a lavorare, 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 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 a nome dell'utente corrente nel seguente modo: creiamo una variabile $process assegnandole il cmdlet get-ciminstance con la classe win32_process. Utilizzando il cmdlet Select-Object possiamo aggiungere parametri di output aggiuntivi, che in questo caso saranno parentprocessid (ID del processo genitore PPID), creationdate (data di creazione del processo), processid (ID del processo PID), processname (nome del processo), commandline (comando di avvio).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidPer ottenere l'elenco di tutte le connessioni TCP e UDP, creiamo le variabili $netTCP e $netUDP assegnando loro i cmdlet Get-NetTCPConnection e Get-NetUDPEndpoint rispettivamente.
$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 delle attività programmate e dei lavori. A tal fine utilizziamo i cmdlet get-ScheduledTask e Get-ScheduledJob. Assegneremo loro le variabili $task e $job; poiché inizialmente esistono molte attività programmate nel sistema, per identificare un'attività malevola è opportuno filtrare le attività programmate legittime. In questo ci aiuterà il cmdlet Select-Object.
$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 autori che contengono “Microsoft”, “*@%systemroot%*”, oltre agli autori «vuoti».
$job = Get-ScheduledJobNel file system NTFS esiste un concetto chiamato 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. Utilizzando gli ADS si possono nascondere dati che non saranno visibili alle normali verifiche di sistema. Questo consente di iniettare codice malevolo e/o nascondere dati.
Per visualizzare i flussi di dati alternativi in PowerShell utilizzeremo il cmdlet get-item e lo strumento Windows stream incorporato con il simbolo * per visualizzare tutti i flussi possibili, quindi creeremo la variabile $ADS.
$ADS = get-item * -stream * | where stream –ne ':$Data' Sarà utile anche conoscere l'elenco degli utenti connessi al sistema, per fare ciò creeremo la variabile $user e le assegneremo l'esecuzione del programma quser.
$user = quser I malintenzionati, per integrarsi nel sistema, possono apportare modifiche all'avvio automatico. Per visualizzare gli oggetti nell'avvio automatico è possibile utilizzare il cmdlet Get-ItemProperty.
Creiamo 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 cybersecurity possono utilizzare PowerShell per arricchire le informazioni necessarie nella risoluzione di varie attività nel loro lavoro. Aggiungendo lo script all'avvio automatico, è possibile ottenere alcune informazioni senza effettuare dump, immagini, ecc.
Fonte: habr.com
