Usando PowerShell para recompilar información sobre incidentes

PowerShell é unha ferramenta de automatización bastante común que adoita utilizar tanto os desenvolvedores de malware como os especialistas en seguridade da información.
Este artigo considerará o uso de PowerShell para a recollida remota de datos dos dispositivos finais ao responder a incidentes de seguridade da información. Para iso, cómpre escribir un script que se executará no dispositivo final e, a continuación, haberá unha descrición detallada deste 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
		}

	}

}

Para comezar, crea unha función Extensión CSIRT, que levará un argumento: o camiño para gardar os datos recibidos. Debido ao feito de que a maioría dos cmdlets funcionan en Powershell v5, realizouse unha comprobación da versión de PowerShell para que funcione correctamente.

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

Para facilitar a navegación polos ficheiros creados, inícianse dúas variables: $date e $Computer, aos que se lles asignará o nome do ordenador e a 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"

Obtemos a lista de procesos en execución en nome do usuario actual do seguinte xeito: cree a variable $process asignándolle o cmdlet get-ciminstance coa clase win32_process. Usando o cmdlet Select-Object, pode engadir parámetros de saída adicionais, no noso caso, estes serán parentprocessid (ID do proceso principal PPID), data de creación (data de creación do proceso), procesado (ID do proceso PID), nome do proceso (nome do proceso), liña de comandos. (comando de inicio).

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

Para obter unha lista de todas as conexións TCP e UDP, cree as variables $netTCP e $netUDP asignándolles os cmdlets Get-NetTCPConnection e Get-NetTCPConnection, respectivamente.

$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á importante coñecer a lista de tarefas e tarefas programadas. Para iso, usamos os cmdlets get-ScheduledTask e Get-ScheduledJob. Asignámoslles as variables $task e $job, porque Inicialmente, hai moitas tarefas programadas no sistema, entón, para identificar a actividade maliciosa, paga a pena filtrar as tarefas programadas lexítimas. O cmdlet Select-Object axudaranos con isto.

$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

No sistema de ficheiros NTFS, existe tal cousa como fluxos de datos alternativos (Alternate Data Streams, ADS). Isto significa que un ficheiro en NTFS pode asociarse aínda máis con varios fluxos de datos de tamaño arbitrario. Con ADS, pode ocultar datos que non serán visibles polas comprobacións estándar do sistema. Isto pode inxectar código malicioso e/ou ocultar datos.

Para mostrar fluxos de datos alternativos en PowerShell, utilizaremos o cmdlet get-item e a ferramenta de fluxo de Windows integrada co símbolo * para ver todos os fluxos posibles, para iso crearemos a variable $ADS.

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

Será útil coñecer a lista de usuarios iniciados no sistema, para iso crearemos unha variable $user e asignaremoslle a execución do programa quser.

$user = quser

Para conseguir un punto de apoio no sistema, os atacantes poden facer cambios na execución automática. Podes usar o cmdlet Get-ItemProperty para ver os elementos na reprodución automática.
Imos crear dúas variables: $runUser - para ver a carga automática en nome do usuario e $runMachine - para ver a carga automática en nome do ordenador.

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

Para que toda a información se escriba en diferentes ficheiros, creamos unha matriz con variables e unha matriz con nomes de ficheiros.


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

E, usando un bucle for, os datos resultantes escribiranse nos ficheiros.

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

Despois de executar o script, crearanse 9 ficheiros de texto que conteñen a información necesaria.

Hoxe, os profesionais da ciberseguridade poden usar PowerShell para enriquecer a información que necesitan para resolver unha variedade de tarefas no seu traballo. Engadindo un script á carga automática, podes obter información sen descargas, imaxes, etc.

Fonte: www.habr.com

Engadir un comentario