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)
Achtung: Die Verwendung eines Port-Scanners sollte immer im Einklang mit geltenden Gesetzen und Ethikstandards erfolgen und nicht für bösartige Angriffe eingesetzt werden!
Ich möchte meine Leser daran erinnern, dass das Scannen von Ports auf Systemen, für die keine ausdrückliche Erlaubnis vorliegt, illegal und ethisch fragwürdig ist. Werkzeuge wie der in diesem Artikel vorgestellte Powershell-basierte Port-Scanner sollen dazu dienen, Netzwerkanalysen auf eigenen Systemen durchzuführen oder als Mittel zur Überprüfung der Firewall-Funktionalität.
Es ist wichtig, sicherzustellen, dass solche Werkzeuge verantwortungsbewusst und im Rahmen legaler Richtlinien verwendet werden.
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:
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:
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 in der Regel 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:
Einen PowerShell basierten Portscanner mit grafischer Benutzeroberfläche (GUI) programmieren
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.
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 erstellt, das wir zweifellos den Online-Portscannern vorziehen sollten. Wir dürfen nicht vergessen, dass bei der Verwendung eines webbasierten Scanners von einem Drittanbieter im Internet auch wiederum Daten, wie unsere eigene IP-Adresse, übermittelt werden. Viel Spaß beim Ausprobieren der in diesem Beitrag bereitgestellten PowerShell-Skripte!