Ús de PowerShell per recopilar informació sobre incidents

PowerShell és una eina d'automatització força comuna que sovint utilitzen tant els desenvolupadors de programari maliciós com els especialistes en seguretat de la informació.
En aquest article es tindrà en compte l'ús de PowerShell per a la recollida remota de dades dels dispositius finals en respondre a incidents de seguretat de la informació. Per fer-ho, heu d'escriure un script que s'executarà al dispositiu final i, a continuació, hi haurà una descripció detallada d'aquest 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 començar, creeu una funció Extensió CSIRT, que prendrà un argument: el camí per desar les dades rebudes. A causa del fet que la majoria de cmdlets funcionen a Powershell v5, s'ha fet una comprovació de la versió de PowerShell per al correcte funcionament.

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

Per facilitar la navegació pels fitxers creats, s'inicialitzen dues variables: $date i $Computer, als quals se'ls assignarà el nom de l'ordinador i la data actual.

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

Obtenim la llista de processos en execució en nom de l'usuari actual de la següent manera: creeu la variable $process assignant-li el cmdlet get-ciminstance amb la classe win32_process. Mitjançant el cmdlet Select-Object, podeu afegir paràmetres de sortida addicionals, en el nostre cas, aquests seran parentprocessid (ID de procés pare PPID), data de creació (data de creació del procés), processat (ID de procés PID), nom de procés (nom del procés), línia d'ordres. (comanda d'inici).

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

Per obtenir una llista de totes les connexions TCP i UDP, creeu les variables $netTCP i $netUDP assignant-los els cmdlets Get-NetTCPConnection i Get-NetTCPConnection, respectivament.

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

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

Serà important conèixer la llista de tasques i tasques programades. Per fer-ho, utilitzem els cmdlets get-ScheduledTask i Get-ScheduledJob. Assignem-los les variables $task i $job, perquè Inicialment, hi ha moltes tasques programades al sistema, després, per identificar l'activitat maliciosa, val la pena filtrar les tasques programades legítimes. El cmdlet Select-Object ens ajudarà amb això.

$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

Al sistema de fitxers NTFS, hi ha una cosa com a fluxos de dades alternatius (Alternate Data Streams, ADS). Això significa que un fitxer a NTFS es pot associar encara més amb diversos fluxos de dades de mida arbitrària. Amb ADS, podeu amagar dades que no seran visibles per les comprovacions estàndard del sistema. Això pot injectar codi maliciós i/o ocultar dades.

Per mostrar fluxos de dades alternatius a PowerShell, utilitzarem el cmdlet get-item i l'eina de flux de Windows integrada amb el símbol * per veure tots els fluxos possibles, per a això crearem la variable $ADS.

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

Ens serà útil conèixer la llista d'usuaris connectats al sistema, per això crearem una variable $user i li assignarem l'execució del programa quser.

$user = quser

Per tal d'assentar-se al sistema, els atacants poden fer canvis a l'execució automàtica. Podeu utilitzar el cmdlet Get-ItemProperty per veure els elements a la reproducció automàtica.
Creem dues variables: $runUser - per veure la càrrega automàtica en nom de l'usuari i $runMachine - per veure la càrrega automàtica en nom de l'ordinador.

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

Per tal que tota la informació s'escrigui en diferents fitxers, creem una matriu amb variables i una matriu amb noms de fitxers.


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

I, utilitzant un bucle for, les dades resultants s'escriuran als fitxers.

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

Després d'executar l'script, es crearan 9 fitxers de text amb la informació necessària.

Actualment, els professionals de la ciberseguretat poden utilitzar PowerShell per enriquir la informació que necessiten per resoldre una varietat de tasques en el seu treball. Si afegiu un script a la càrrega automàtica, podeu obtenir informació sense descàrrega, imatges, etc.

Font: www.habr.com

Afegeix comentari