Доброго дня, уважаемый читатель!
Во время расследования инцидентов ИБ связанных с аномальной или вредоносной сетевой активностью необходимо в первую очередь определить приложение или скрипт генерирующие трафик.
Предположим, что нам стал известен компьютер генерирующий аномальную активность и tcp/udp-порт источник данной активности. Скрипт, представленный ниже, позволяет получить соответствие между списком процессов и списком tcp/udp-портов.
$sockets_all = netstat -ano | Select-String -Pattern '\s+(TCP|UDP)' | Select-String -Pattern '\:\:' -notmatch
$process_list = Get-WmiObject -Class Win32_Process
$ProcessCollection=@()
foreach($socket in $sockets_all) {
$parse = $socket.line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)
$ID_tcp = $parse[4]
$ID_udp = $parse[3]
$local = $parse[1] -split ":"
$remote = $parse[2] -split ":"
$local_ip = $local[0]
$local_port = $local[1]
$remote_ip = $remote[0]
$remote_port = $remote[1]
foreach($process in $process_list) {
if (($process.ProcessID -eq $ID_tcp) -and ($parse[0] -eq "TCP"))
{
$MemoryUsed = "{0:N2} MB" -f ($process.WS / 1MB)
$obj_proc = New-Object psobject
$obj_proc | Add-Member -type noteproperty -name Protocol -Value $parse[0]
$obj_proc | Add-Member -type noteproperty -name LocalIP -Value $local_ip
$obj_proc | Add-Member -type noteproperty -name LocalPort -Value $local_port
$obj_proc | Add-Member -type noteproperty -name RemoteIP -Value $remote_ip
$obj_proc | Add-Member -type noteproperty -name RemotePort -Value $remote_port
$obj_proc | Add-Member -type noteproperty -name PID -Value $ID_tcp
$obj_proc | Add-Member -type noteproperty -name ProcName -Value $process.ProcessName
$obj_proc | Add-Member -type noteproperty -name procPath -Value $process.ExecutablePath
$obj_proc | Add-Member -type noteproperty -name MemUsed -Value $MemoryUsed
$obj_proc | Add-Member -type noteproperty -name CompName -Value $process.CSName
$ProcessCollection += $obj_proc
}
if (($process.ProcessID -eq $ID_udp) -and ($parse[0] -eq "UDP"))
{
$MemoryUsed = "{0:N2} MB" -f ($process.WS / 1MB)
$obj_proc = New-Object psobject
$obj_proc | Add-Member -type noteproperty -name Protocol -Value $parse[0]
$obj_proc | Add-Member -type noteproperty -name LocalIP -Value $local_ip
$obj_proc | Add-Member -type noteproperty -name LocalPort -Value $local_port
$obj_proc | Add-Member -type noteproperty -name PID -Value $ID_udp
$obj_proc | Add-Member -type noteproperty -name ProcName -Value $process.ProcessName
$obj_proc | Add-Member -type noteproperty -name procPath -Value $process.ExecutablePath
$obj_proc | Add-Member -type noteproperty -name MemUsed -Value $MemoryUsed
$obj_proc | Add-Member -type noteproperty -name CompName -Value $process.CSName
$ProcessCollection += $obj_proc
}
}
}
$ProcessCollection | ft
Логика у скрипта достаточно простая, вначале получаем список сетевых подключений, за исключением IPv6 и получаем перечень процессов с помощью WMI запроса в класс Win32_Process.
Вывод команды netstat и результат WMI-запроса содержат process id (PID) по которому можно связать результаты между собой. Для удобства последующего использования найденное соответствие сохраняется в коллекцию объектов. Естественно подразумевается, что использоваться скрипт будет для удаленного запуска, советую использовать - командлет Invoke-Command.
Во время расследования инцидентов ИБ связанных с аномальной или вредоносной сетевой активностью необходимо в первую очередь определить приложение или скрипт генерирующие трафик.
Предположим, что нам стал известен компьютер генерирующий аномальную активность и tcp/udp-порт источник данной активности. Скрипт, представленный ниже, позволяет получить соответствие между списком процессов и списком tcp/udp-портов.
$sockets_all = netstat -ano | Select-String -Pattern '\s+(TCP|UDP)' | Select-String -Pattern '\:\:' -notmatch
$process_list = Get-WmiObject -Class Win32_Process
$ProcessCollection=@()
foreach($socket in $sockets_all) {
$parse = $socket.line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)
$ID_tcp = $parse[4]
$ID_udp = $parse[3]
$local = $parse[1] -split ":"
$remote = $parse[2] -split ":"
$local_ip = $local[0]
$local_port = $local[1]
$remote_ip = $remote[0]
$remote_port = $remote[1]
foreach($process in $process_list) {
if (($process.ProcessID -eq $ID_tcp) -and ($parse[0] -eq "TCP"))
{
$MemoryUsed = "{0:N2} MB" -f ($process.WS / 1MB)
$obj_proc = New-Object psobject
$obj_proc | Add-Member -type noteproperty -name Protocol -Value $parse[0]
$obj_proc | Add-Member -type noteproperty -name LocalIP -Value $local_ip
$obj_proc | Add-Member -type noteproperty -name LocalPort -Value $local_port
$obj_proc | Add-Member -type noteproperty -name RemoteIP -Value $remote_ip
$obj_proc | Add-Member -type noteproperty -name RemotePort -Value $remote_port
$obj_proc | Add-Member -type noteproperty -name PID -Value $ID_tcp
$obj_proc | Add-Member -type noteproperty -name ProcName -Value $process.ProcessName
$obj_proc | Add-Member -type noteproperty -name procPath -Value $process.ExecutablePath
$obj_proc | Add-Member -type noteproperty -name MemUsed -Value $MemoryUsed
$obj_proc | Add-Member -type noteproperty -name CompName -Value $process.CSName
$ProcessCollection += $obj_proc
}
if (($process.ProcessID -eq $ID_udp) -and ($parse[0] -eq "UDP"))
{
$MemoryUsed = "{0:N2} MB" -f ($process.WS / 1MB)
$obj_proc = New-Object psobject
$obj_proc | Add-Member -type noteproperty -name Protocol -Value $parse[0]
$obj_proc | Add-Member -type noteproperty -name LocalIP -Value $local_ip
$obj_proc | Add-Member -type noteproperty -name LocalPort -Value $local_port
$obj_proc | Add-Member -type noteproperty -name PID -Value $ID_udp
$obj_proc | Add-Member -type noteproperty -name ProcName -Value $process.ProcessName
$obj_proc | Add-Member -type noteproperty -name procPath -Value $process.ExecutablePath
$obj_proc | Add-Member -type noteproperty -name MemUsed -Value $MemoryUsed
$obj_proc | Add-Member -type noteproperty -name CompName -Value $process.CSName
$ProcessCollection += $obj_proc
}
}
}
$ProcessCollection | ft
Логика у скрипта достаточно простая, вначале получаем список сетевых подключений, за исключением IPv6 и получаем перечень процессов с помощью WMI запроса в класс Win32_Process.
Вывод команды netstat и результат WMI-запроса содержат process id (PID) по которому можно связать результаты между собой. Для удобства последующего использования найденное соответствие сохраняется в коллекцию объектов. Естественно подразумевается, что использоваться скрипт будет для удаленного запуска, советую использовать - командлет Invoke-Command.
Invoke-Command -ComputerName Comp -ScriptBlock {....script text....} -Credential Domain\User
Комментариев нет:
Отправить комментарий