PowerShell es una herramienta de automatización bastante común, utilizada tanto por los desarrolladores de software malicioso como por los especialistas en seguridad de la información.
Este artículo examinará un método para usar PowerShell para la recopilación remota de datos desde dispositivos finales durante la respuesta a incidentes de seguridad de la información. Para esto, será necesario escribir un script que se ejecute en el dispositivo final y se proporcionará una descripción detallada del mismo.
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
}
}
}Para comenzar a trabajar, se crea una función CSIRT, que tomará como argumento la ruta para guardar los datos obtenidos. Debido a que la mayoría de los cmdlets funcionan en PowerShell v5, se ha hecho una verificación de la versión de PowerShell para su correcto funcionamiento.
function CSIRT{
param($path)# al ejecutar el script, es necesario especificar un directorio para guardar
if ($psversiontable.psversion.major -ge 5)Para facilitar la navegación por los archivos creados, se inicializan dos variables: $date y $Computer, a las que se les asignarán el nombre del ordenador 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"La lista de procesos en ejecución bajo el nombre del usuario actual la obtendremos de la siguiente manera: crearemos una variable $process y le asignaremos el cmdlet get-ciminstance con la clase win32_process. Usando el cmdlet Select-Object podemos agregar parámetros adicionales a la salida; en nuestro caso, serán parentprocessid (identificador del proceso padre PPID), creationdate (fecha de creación del proceso), processed (identificador del proceso PID), processname (nombre del proceso) y commandline (comando de lanzamiento).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidPara obtener la lista de todas las conexiones TCP y UDP, crearemos las variables $netTCP y $netUDP y les asignaremos los cmdlets Get-NetTCPConnection y Get-NetUDPEndpoint, respectivamente.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateEs importante conocer la lista de tareas y trabajos programados. Para ello, utilizamos los cmdlets get-ScheduledTask y Get-ScheduledJob. Les asignaremos las variables $task y $job; dado que inicialmente existen muchas tareas programadas en el sistema, para detectar actividades maliciosas es necesario 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 '*Microsoft*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task excluye autores que contengan “Microsoft”, “*@%systemroot%*” y también autores “vacíos”
$job = Get-ScheduledJobEn el sistema de archivos NTFS existe el concepto de flujos de datos alternativos (Alternate Data Streams, ADS). Esto significa que un archivo en NTFS puede estar adicionalmente vinculado a varios flujos de datos de tamaño arbitrario. A través de ADS se pueden ocultar datos que no serán visibles mediante las verificaciones estándar del sistema. Esto permite inyectar código malicioso y/o ocultar datos.
Para mostrar los flujos de datos alternativos en PowerShell utilizaremos el cmdlet get-item y la herramienta integrada de Windows stream con el símbolo * para visualizar todos los flujos posibles; para ello, crearemos la variable $ADS.
$ADS = get-item * -stream * | where stream –ne ':$Data' También será útil conocer la lista de usuarios que han iniciado sesión en el sistema; para ello, crearemos la variable $user y le asignaremos la ejecución del programa quser.
$user = quser Los atacantes, para consolidarse en el sistema, pueden realizar cambios en el inicio automático. Para visualizar los objetos en el inicio automático, se puede utilizar el cmdlet Get-ItemProperty.
Crearemos dos variables: $runUser – para ver el inicio automático en nombre del usuario y $runMachine – para ver el inicio automático en nombre de la computadora.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"Para que toda la información se registre en diferentes archivos, creamos un array con variables y un array 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, utilizando un ciclo for, los datos obtenidos serán registrados 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 contendrán la información necesaria.
En la actualidad, los especialistas en ciberseguridad pueden utilizar PowerShell para enriquecer la información necesaria al abordar diversas tareas en su trabajo. Al agregar un script al inicio automático, se puede obtener cierta información sin la necesidad de realizar volcado de memoria, imágenes, etc.
Fuente: habr.com
