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 où 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?
$aConnection.OwningProcess
renverrait 0 si $aConnection.State
est, 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_NetTCPConnection
classe ; vous pouviez le voir courir netstat -o 1
.
Get-Process
renvoie "Idle" (ou PID 0). Essayez de vous en débarrasserForEach-Object
et faites-le à lanetstat -ab >> C:\Temp\procs.txt
place (le script devra exécuter une version élevée).