Uso de PowerShell para recopilar información sobre incidentes

PowerShell es una herramienta de automatización bastante común que suelen utilizar tanto los desarrolladores de malware como los especialistas en seguridad de la información.
Este artículo considerará el uso de PowerShell para la recopilación remota de datos de dispositivos finales al responder a incidentes de seguridad de la información. Para hacer esto, debe escribir una secuencia de comandos que se ejecutará en el dispositivo final y luego habrá una descripción detallada de esta secuencia de comandos.

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 empezar, crea una función. CSIRT, que tomará un argumento: la ruta para guardar los datos recibidos. Debido al hecho de que la mayoría de los cmdlets funcionan en Powershell v5, se ha realizado una verificación de la versión de PowerShell para que funcione correctamente.

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

Para facilitar la navegación por los archivos creados, se inicializan dos variables: $fecha y $Equipo, a las que se les asignará el nombre del equipo y la fecha 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"

Obtenemos la lista de procesos en ejecución en nombre del usuario actual de la siguiente manera: cree la variable $process asignándole el cmdlet get-ciminstance con la clase win32_process. Con el cmdlet Select-Object, puede agregar parámetros de salida adicionales, en nuestro caso, estos serán parentprocessid (ID del proceso principal PPID), createddate (fecha de creación del proceso), procesado (ID del proceso PID), nombre del proceso (nombre del proceso), línea de comando (comando de inicio).

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

Para obtener una lista de todas las conexiones TCP y UDP, cree las variables $netTCP y $netUDP asignándoles los cmdlets Get-NetTCPConnection y 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 conocer la lista de tareas y tareas programadas. Para hacer esto, usamos los cmdlets get-ScheduledTask y Get-ScheduledJob. Asignémosles las variables $tarea y $trabajo, porque Inicialmente, hay muchas tareas programadas en el sistema, luego, para identificar actividades maliciosas, vale la pena filtrar las tareas programadas legítimas. El cmdlet Select-Object nos ayudará con esto.

$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

En el sistema de archivos NTFS, existen flujos de datos alternativos (Flujos de datos alternativos, ADS). Esto significa que un archivo en NTFS se puede asociar además con múltiples flujos de datos de tamaño arbitrario. Con ADS, puede ocultar datos que no serán visibles en las comprobaciones estándar del sistema. Esto puede inyectar código malicioso y/u ocultar datos.

Para mostrar flujos de datos alternativos en PowerShell, usaremos el cmdlet get-item y la herramienta de flujo integrada de Windows con el símbolo * para ver todos los flujos posibles, para esto crearemos la variable $ADS.

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

Será útil conocer la lista de usuarios registrados en el sistema, para ello crearemos una variable $user y le asignaremos la ejecución del programa quser.

$user = quser

Para afianzarse en el sistema, los atacantes pueden realizar cambios en la ejecución automática. Puede usar el cmdlet Get-ItemProperty para ver los elementos en la reproducción automática.
Vamos a crear dos variables: $runUser: para ver la carga automática en nombre del usuario y $runMachine: para ver la carga automática en nombre de la computadora.

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

Para que toda la información se escriba en diferentes archivos, creamos una matriz con variables y una matriz con nombres de archivos.


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

Y, usando un bucle for, los datos resultantes se escribirán en archivos.

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

Después de ejecutar el script, se crearán 9 archivos de texto que contienen la información necesaria.

Hoy en día, los profesionales de la ciberseguridad pueden usar PowerShell para enriquecer la información que necesitan para resolver una variedad de tareas en su trabajo. Al agregar un script para cargar automáticamente, puede obtener información sin volcar, imágenes, etc.

Fuente: habr.com

Añadir un comentario