суббота, 21 ноября 2015 г.

Powershell. Прокачиваем Netstat.

Доброго дня, уважаемый читатель!


Во время расследования инцидентов ИБ связанных с аномальной или вредоносной сетевой активностью необходимо в первую очередь определить приложение или скрипт генерирующие трафик.

Предположим, что нам стал известен компьютер генерирующий аномальную активность и 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



Комментариев нет:

Отправить комментарий