Déterminer quel processus communique avec un port distant sur Windows Server

1

J'ai repris un produit d'un entrepreneur sur mon lieu de travail. L'outil collecte des métainformations. La nature exacte de l'information n'a pas d'importance pour la question, mais elle existe sous forme de fichier plat et / ou dans une base de données. D'une manière ou d'une autre, l'entrepreneur a configuré quelque chose sur le serveur pour transférer les journaux (sous forme de texte) à notre redirecteur Splunk. Nous ne pensons pas qu'il utilise Splunk Forwarder, car nous ne voyons aucune preuve de son existence (ni installée sur les lecteurs, ni en tant que services en cours d'exécution).

Nous ne savons quel port à distance vers l'avant va, et nous ne voyons le trafic du serveur Windows (sur lequel l'application est installée) au port distant.

Lorsque la connexion se produit, cela semble être aléatoire et de très courte durée. J'essaie de capturer quel processus établit cette connexion et il réside sur le serveur Windows.

J'ai écrit le script suivant à cette fin, mais je ne suis pas du tout marié à l'idée d'utiliser Powershell s'il existe une meilleure méthode:

$foundConnections = @()
$foundProcesses = @()

while($true)
{
    Start-Sleep -Milliseconds 100
    $connections = Get-NetTCPConnection -RemotePort 30117 -ErrorAction Ignore
    if($connections -ne $null)
    {
        if($connections.Count -ne $null -and $connections.Count -gt 1)
        {
            foreach($aConnection in $connections)
            {
                $foundConnections += $aConnection
                $process = Get-Process -Id $aConnection.OwningProcess
                Write-Output ($process)
                $foundProcesses += $process
                Add-Content -Path C:\Temp\procs.csv -Value ((Get-Date).ToString() + "," + $process.Name + "," + $process)
            }

        }
        else
        {
            $foundConnections += $connections
            $process = Get-Process -Id $connections.OwningProcess
            Write-Output ($process)
            $foundProcesses += $process
            Add-Content -Path C:\Temp\procs.csv -Value ((Get-Date).ToString() + "," + $process.Name + "," + $process)
        }

    }
}

... Ce qui finit par détecter le trafic, mais le CSV produit se présente comme suit:

... 08/11/2017 08:25:06,

08/11/2017 08:25:06,

08/11/2017 08:25:07 ,,

08/11/2017 08:25:07 ,,

08/11/2017 08:25:07 ,,

08/11/2017 08:25:07 ,,

08/11/2017 08:25:14, Inactif, System.Diagnostics.Process (Idle) 08/11/2017 08:25:14, Inactif, System.Diagnostics.Process (Idle) 11/8/2017 8 : 25: 15, Au repos, System.Diagnostics.Process (Au repos) 08/11/2017 08:25:15, Au repos, System.Diagnostics.Process (Au repos) 08/11/2017 08:25:15, Idle, System.Diagnostics.Process (Idle) 11/8/2017 08:25:15, Idle, System.Diagnostics.Process (Idle) 11/8/2017 8:25:15, Idle, System.Diagnostics. Process (inactif) 08/11/2017 08:25:15, inactif, System.Diagnostics.Process (inactif) 11/8/2017 08:25:15, inactif, System.Diagnostics.Process (inactif) 11 / 8/2017 08:25:16, Veille, System.Diagnostics.Process (Idle) 08/11/2017 08:25:16, Veille, System.Diagnostics.Process (Veille) 11/8/2017 8:25 : 16 heures, ralenti, System.Diagnostics.Process (Idle) 08/11/2017 08:25:16, Veille, System.Diagnostics.Process (Idle) 08/11/2017 08:25:16, Veille, System.Diagnostics.Process (Idle) 08/11/2017 08:25:16 heures, veille, System.Diagnostics.Process (Idle)

...

... Plusieurs centaines de lignes de cela.

Comment puis-je déterminer un processus en cours d'exécution si je connais le port distant utilisé et que son exécution ne semble pas être conforme à une planification et que la connexion est de très courte durée?

Nex Terren
la source
1
Je me demande si le PID que vous obtenez est vide, ce qui explique pourquoi Get-Processrenvoie "Idle" (ou PID 0). Essayez de vous en débarrasser ForEach-Objectet faites-le à la netstat -ab >> C:\Temp\procs.txtplace (le script devra exécuter une version élevée).
racine
@ root vous êtes proche. $aConnection.OwningProcessrenverrait 0 si $aConnection.Stateest, par exemple, TimeWait( attente d'un délai suffisant pour être sûr que le protocole distant a bien reçu l'accusé de réception de sa demande de fin de connexion ), voir la MSFT_NetTCPConnectionclasse ; vous pouviez le voir courir netstat -o 1.
JosefZ

Réponses:

0

Vous voudrez peut-être essayer d'utiliser un outil de capture de paquets tel que Netmon (également appelé Moniteur réseau). Utilisez un filtre de capture qui le gardera petit, filtre basé sur le port cible et l'adresse IP, laissez-le fonctionner pendant quelques heures et vous devriez voir le processus. Ensuite, recherchez simplement le disque pour cet exe. Netmon DL https://www.microsoft.com/en-us/download/details.aspx?id=4865 Netmon a été remplacé par le plus récent "Analyseur de messages" que je n'ai pas utilisé autant, certaines personnes aiment également Wireshark, mais Je ne suis pas sûr que Wireshark se situe au niveau du processus, à l'instar des outils de capture MS.

S'ils sont transférés via une tâche planifiée ... l'arborescence du planificateur de tâches peut s'avérer fastidieuse pour les recherches. Mais il existe également une interface de ligne de commande pour les tâches avec powershell, Get-ScheduledTaskqui renvoie tous les noms de tâches et le chemin d'accès à la tâche. Peut-être que ça vaut le coup de regarder ça.

Clayton
la source