PowerShell unter Windows als Portscanner verwenden (Tutorial)

Erst kürzlich erhielt ich die Anfrage, ob es möglich sei, Domains und IP-Adressen mit der PowerShell nach bestimmten Ports zu scannen. Daraufhin habe ich mich ein wenig mit den Möglichkeiten beschäftigt, die uns mit der PowerShell unter Microsoft Windows 11 und 10 zur Verfügung stehen.

In diesem Artikel zeige ich euch, wie ihr nach geöffneten Ports von beliebigen IP-Adressen und Domainnamen scannen könnt. Der Portscanner kann für Netzwerkanalysen oder indirekt für geplante Cyberangriffe auf bestimmte Ziele verwendet werden. Ein Port ist die erste Barriere in ein fremdes Netzwerk, welche es für den Angreifer zu überwinden gilt.

Verwenden wir den Portscanner für die PowerShell z. B. für unsere eigenen IP-Adressen und Server, können wir die Funktionalität der Firewall austesten oder die Erreichbarkeit von bestimmten Diensten kontrollieren. Ich scanne nach der Freigabe eines Ports am Router (NAT) vorsorglich immer den konfigurierten Port, damit ich mir sicher sein kann, dass der Port ordnungsgemäß geöffnet ist.

Inhaltsverzeichnis: Einen Portscanner mit der PowerShell Skripten (3-Varianten)

Einen einzelnen Port von einer IP-Adresse/Domain scannen

Möchten wir jetzt überprüfen, ob ein Port von einer bestimmten Domain/IP-Adresse geöffnet ist, können wir ein PowerShell-Skript zum Scannen von Ports erstellen. Das funktioniert mit dem folgenden Skript:

# Variablen mit IP-Adresse/Domain und Port ergänzen
$targetHost = "77.111.241.77"
$targetPort = 443
$timeoutMilliseconds = 2500

# Eine TCP-Verbindung mit dem Zielcomputer herstellen
try {
   $tcpClient = New-Object System.Net.Sockets.TcpClient
   $asyncResult = $tcpClient.BeginConnect($targetHost, $targetPort, $null, $null)

# Verbindungsaufbau (Portscan)
   if ($asyncResult.AsyncWaitHandle.WaitOne($timeoutMilliseconds, $false)) {
       if ($tcpClient.Connected) {
           Write-Host "Der Port $targetPort auf $targetHost ist geöffnet."
       } else {
           Write-Host "Der Port $targetPort auf $targetHost ist geschlossen."
       }
   } else {
       Write-Host "Der Port $targetPort auf $targetHost ist nicht geöffnet (Timeout)."
   }
   $tcpClient.Close()
}
catch {
   Write-Host "Host nicht gefunden: $_.Exception.Message"
}

Beispiel: Verwenden wir den PowerShell basierten Portscanner mit der Domain oder IP-Adresse meiner Webseite, um den Port 80 oder 443 zu scannen, erhalten wir die folgende Ausgabe:

Portscanner PowerShell Skript zum Scannen von Ports

Ausgabe (Beispiel IP/Domain):

Der Port 443 auf 77.111.241.77 is geöffnet

Probieren wir einen anderen Port aus, wie beispielsweise den Port 21, erhalten wir die folgende Ausgabe:

Einen Port mit der PowerShell scannen von beliebiger Domain oder IP-Adresse

Ausgabe: Der Port 21 auf veuhoff.net ist nicht geöffnet (Timeout).

Die Ergebnisse waren in meinem Fall zu erwarten. Die Domain verweist auf einen Webserver, der ausschließlich über die geöffneten Ports 80 und 443 verfügt. Alles andere wäre ein von mir unerwünschtes Sicherheitsrisiko. 

Dasselbe funktioniert selbstverständlich auch bei der Verwendung einer IP-Adresse. Dafür ermitteln wir zunächst die IP-Adresse von einer bestimmten Domain und anschließend führen wir den Portscanner erneut aus:

nslookup veuhoff.net

Ergebnis:

Nicht autorisierende Antwort:

Name: veuhoff.net

Adresse: 77.111.241.77

Wie auf dem ersten Screenshot ersichtlich ist der Port 443 (HTTPS), von der über das PowerShell-Skript gescannten IP-Adresse, nach außen hin geöffnet. Ein Webserver bietet allerdings nur wenig Angriffsfläche im Vergleich zu anderen Services. Bei Datenbanken, Clouds und branchenspezifische Software sieht das Ganze häufig anders aus. 

Verwendet das Zielsystem keine Firewall, haben wir beinahe unbegrenzt viel Zeit und so viele Versuche wie wir mögen (Brute-Force), um in das System/Netzwerk einzudringen. Im nächsten Abschnitt erweitern wir das Portscan-Skript für die PowerShell um weitere Ports, damit wir eine vordefinierte Auswahl von unterschiedlichen Eingangsports scannen können.

Mehrere Ports über die PowerShell per Skript von einer beliebigen Domain/IP-Adresse scannen (Portscanner)

Häufig ist es so, dass wir einen Portscanner für die Abfrage von mehreren Ports benötigen. Das spart Zeit, müssten wir doch sonst jeden Port einzeln über das PowerShell-Skript scannen. 

Dafür erweitern wir das Skript aus dem ersten Abschnitt um ein Array:

# Variablen mit IP-Adresse/Domain und Port ergänzen
$targetHost = "77.111.241.70"
$portsToScan = @(80, 443, 8080, 61005, 21)  # Trage hier die gewünschten Ports zum Scannen ein
$timeoutMilliseconds = 2500
foreach ($port in $portsToScan) {

# Eine TCP-Verbindung mit dem Zielcomputer herstellen
   try {
       $tcpClient = New-Object System.Net.Sockets.TcpClient
       $asyncResult = $tcpClient.BeginConnect($targetHost, $port, $null, $null)

# Verbindungsaufbau (Portscan)
       if ($asyncResult.AsyncWaitHandle.WaitOne($timeoutMilliseconds, $false)) {
           if ($tcpClient.Connected) {
               Write-Host "Der Port $port auf $targetHost ist geöffnet."
           } else {
               Write-Host "Der Port $port auf $targetHost ist geschlossen."
           }
       } else {
           Write-Host "Der Port $port auf $targetHost ist nicht geöffnet. (Timeout"
       }
       $tcpClient.Close()
   }
   catch {
       Write-Host "Keine Verbindung zum Host: $_.Exception.Message"
  }
}

Wir erhalten innerhalb weniger Sekunden das Scan-Ergebnis:

Ergebnis vom Portscanner

Einen PowerShell basierten Portscanner mit grafischer Benutzeroberfläche (GUI) selbst bauen

Der Portscanner arbeitet über die PowerShell zwar sehr zuverlässig, dennoch erweitern wir unser Port-Scan-Programm noch um eine grafische Benutzeroberfläche. Dann erhalten wir die Möglichkeit, Domains und IP-Adressen noch komfortabler nach geöffneten Ports zu überprüfen.

GUI für den PowerShell basierten Portscanner programmieren

Außerdem können wir das Programm mit Benutzeroberfläche (GUI) auf dem Desktop speichern, so erhalten wir ein praktisches Werkzeug zum Analysieren von Netzwerkproblemen und für vieles mehr. 

Das Skript mit GUI könnt ihr wie folgt kopieren und verwenden:

Add-Type -AssemblyName System.Windows.Forms

# Das Formular erstellen (GUI)
$Form = New-Object Windows.Forms.Form
$Form.Text = "Portscanner für Windows-Computer"
$Form.Width = 400
$Form.Height = 400

# Das Label für die Port-Eingabe
$LabelPorts = New-Object Windows.Forms.Label
$LabelPorts.Text = "Ports eingeben:"
$LabelPorts.Location = New-Object Drawing.Point(20, 10)
$Form.Controls.Add($LabelPorts)

# Die Textbox für die Port-Eingabe
$TextBoxPorts = New-Object Windows.Forms.TextBox
$TextBoxPorts.Location = New-Object Drawing.Point(20, 40)
$Form.Controls.Add($TextBoxPorts)

# Label für das Zielsystem
$LabelTarget = New-Object Windows.Forms.Label
$LabelTarget.Text = "IP/Domain eingeben:"
$LabelTarget.Location = New-Object Drawing.Point(20, 70)
$Form.Controls.Add($LabelTarget)

# Textbox für das Zielsystem
$TextBoxTarget = New-Object Windows.Forms.TextBox
$TextBoxTarget.Location = New-Object Drawing.Point(20, 100)
$Form.Controls.Add($TextBoxTarget)

# Button zum starten des Programms
$Button = New-Object Windows.Forms.Button
$Button.Text = "Scannen"
$Button.Location = New-Object Drawing.Point(20, 130)
$Form.Controls.Add($Button)

# Das Ereignisfeld
$ResultBox = New-Object Windows.Forms.TextBox
$ResultBox.Multiline = $true
$ResultBox.Location = New-Object Drawing.Point(20, 160)
$ResultBox.Size = New-Object Drawing.Size(370, 120)
$ResultBox.ReadOnly = $true
$Form.Controls.Add($ResultBox)

# foreach Schleife mit der Funktion
$Button.Add_Click({
$target = $TextBoxTarget.Text
$ports = $TextBoxPorts.Text -split ","
$ResultBox.Clear()
foreach ($port in $ports) {
$port = $port.Trim()
$result = Test-NetConnection -ComputerName $target -Port $port
if ($result.TcpTestSucceeded) {
$ResultBox.AppendText("Port $port ist geöffnet.`r`n")
} else {
$ResultBox.AppendText("Port $port ist geschlossen.`r`n")
}
}
})

# Formular ausgeben
$Form.ShowDialog()

Jetzt haben wir ein sicheres Programm geschrieben, welches wir den Online-Portscannern definitiv vorziehen sollten. Wir dürfen nicht vergessen, dass wir während des Zugriffs auf einen webbasierten Scanner von einem Drittanbieter aus dem Internet auch wiederum Daten, wie unsere eigene IP-Adresse, übermitteln. Ich wünsche euch viel Spaß mit den in diesem Beitrag zur Verfügung gestellten PowerShell-Skripts.

Möchtest Du meine Arbeit unterstützen?

EIN KOMMENTAR SCHREIBEN:

Falls Du Fragen über das Thema hast oder Hilfe benötigst, verwende gern die Kommentarfunktion und ich werde Dir so bald wie möglich mit Rat und Tat zur Seite stehen. Vielen Dank für Deinen Besuch.

SOCIAL-MEDIA-KANÄLE:

Hat mein Beitrag Dir geholfen? Dann freue ich mich über Dein Follow auf Social Media! So erfährst Du als Erstes von neuen Beiträgen und unterstützt mich bei meinem Wachstum.

Informatiker T-Shirts für Geeks & Nerds
Langeweile im Kleiderschrank? Entdecke meine selbst designten Geek-Shirts!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert