Zugewiesene IP-Adressen von unbekannten Netzwerkgeräten mittels MAC-Adresse ausfindig machen


Bei aktuellen Betriebssystemen gibt es zig Protokolle, wie man die IP-Adresse von Netzwerkgeräten ausfindig machen kann. da wäre mDNS, Bonjour, LLMNR, SSDP, NDP, UPNP usw. usf. Alle bewegen sich auf unterschiedlichen Schichten. Der Klassiker der Zuordnung zwischen IP-Adresse und Gerät ist aber die MAC-Adresse. Jedes Netzwerkgerät hat eine MAC-Adresse. Wenn man also die MAC-Adresse eines Geräts kennt, wie kann man die zugehörige IP-Adresse rausfinden, wenn keines der obigen Discovery Protokolle aktiv ist bzw. unterstützt wird?

Gehen wir davon aus, dass das zu ermittelnde Gerät auf den DHCP-Modus eingestellt ist und somit seine IPv4-Adresse von einem DHCP-Server im Netz bekommt. Nun könnte man auf diesem Server nachschauen, wie die IP-Adresse lautet. In der Praxis hat man aber nicht immer diese Möglichkeit wegen verschlampter Passwörter und dergleichen. Gehen wir weiter davon aus, dass wir uns in einem üblichen privaten IPv4 Netz mit dem Adressraum 192.168.0.x bewegen.

In diesem Fall könnte man alle Adressen von 192.168.0.0 bis 255 anpingen, falls keine Firewall die Pakete filtert. Das betreffende Gerät würde ein Antwort ICMP-Paket schicken und würde sich damit verraten, bzw. bekannt machen.

Ping.exe 192.168.0.0

Dieser Vorgang kann aber recht mühsam werden, wenn man alle Adressen von Hand eintippen würde. Außerdem schickt Ping 4 Pakete (unter Windows) ab und wartet jeweils eine Sekunde auf eine Antwort.

Für das erste Problem kann man Powershell bemühen und einfach das anpingen automatisieren:

0..255 | % {Ping.exe 192.168.0.$_}

Damit würde man vom gesuchten Gerät irgendwann eine Pingantwort bekommen. Die Vorgehensweise hat allerdings zwei Haken, weil jede Anfrage immer ca. 4 Sekunden dauert. Bei 256 Adressen *4 hat man eine Wartezeit von 1024 Sekunden, also über 17 Minuten. Diese Zeit gilt aber auch nur, wenn ein Gerät auf der Gegenseite antwortet. Wenn das Paket ins Leere läuft, dann dauert es pro Paket 4 Sekunden, also im schlimmsten Fall über eine Stunde! Das ist unpraktikabel. Zum Glück kann aber die Anzahl der Pakete von Ping mittels Parameter N eingestellt werden, also optimiert:

0..255 | % {Ping.exe 192.168.0.$_ –n 1}

Damit bekommt man eine deutliche Geschwindigkeitssteigerung hin.

Aber es gibt noch eine weitere Optimierungsmöglichkeit. Man kann den sogenannten Timeoutwert als Parameter W angeben. Setzt man diesen auf einen sehr kleinen Wert wie z. B. 1ms, dann hat man den kompletten Bereich in ca. zwei Minuten durchforstet.

0..255 | % {Ping.exe 192.168.0.$_ –n 1 –w 1}

Jetzt bleibt noch ein Problem, dass die Ausgabe mehr als unübersichtlich ist. Im Grunde muss man sowieso nicht sehen, ob eine Antwort von einem Ping zurückkommt. Denn sobald eine IP-Adresse mittels Ping erreichbar ist, wird in der ARP-Tabelle, welche mittels ARP.EXE einsehbar ist, ein Eintrag mit der zugehörigen IP- und MAC-Adresse generiert. Hier haben wir nun auch die Verbindung zwischen beiden. Dies sieht z. B. so aus:

arp.exe -a

Schnittstelle: 192.168.0.2 — 0xc
  Internetadresse       Physische Adresse     Typ
  192.168.0.1           00-a4-6c-ee-11-f2     dynamisch
  192.168.0.5           00-03-05-63-12-d9     dynamisch
  192.168.0.255         ff-ff-ff-ff-ff-ff     statisch
  224.0.0.22            01-00-5e-00-00-16     statisch
  224.0.0.252           01-00-5e-00-00-fc     statisch
  239.255.255.250       01-00-5e-7f-ff-fa     statisch

Wir können also die Rückgabe des Ping-Befehls ignorieren und statt dessen die Ausgabe des ARP-Befehls interpretieren.

Damit könnte man so etwas bauen:

0..255|% {$ip="192.168.0.$_"; ping.exe -4 -n 1 -w 1 $ip | out-null; $arp=arp.exe -a | select-string "$ip(?s)(.*)dynam"; If ($arp) {$ip} }

Hier werden einfach nacheinander die IP-Adressen ausgegeben. Natürlich kann man auch die Ausgabe der ARP.EXE direkt verwenden.

arp.exe -a| select -Skip 3

Problem sind hier die weiteren Angaben für die Broadcastadressen.

Um die Sache nun etwas einfacher zu gestalten wäre es toll, wenn man den IP-Adressbereich (hier: 192.158.0.x) automatisch ermitteln könnte, dies könnte man z. B. durch:

Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin dhcp

IPAddress         : 192.168.0.2
InterfaceIndex    : 12
InterfaceAlias    : Ethernet
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Dhcp
SuffixOrigin      : Dhcp
AddressState      : Preferred
ValidLifetime     : 22:17:34
PreferredLifetime : 22:17:34
SkipAsSource      : False
PolicyStore       : ActiveStore

Damit hat man die lokale IP-Adresse seines Rechners. So könnte man den Adressbereich ermitteln:

$iprange=((Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin dhcp).IPAddress)
$iprange=$iprange.Substring(0,$iprange.LastIndexOf(".")+1)
$iprange

Dadurch kann man nun

arp.exe -a| select -Skip 3 |  Select-String $iprange

  192.168.0.1           00-a4-6c-ee-11-f2     dynamisch
  192.168.0.5           00-03-05-63-12-d9     dynamisch
  192.168.0.255         ff-ff-ff-ff-ff-ff     statisch

aufrufen, besser noch:

arp.exe -a| select -Skip 3 |  Select-String $iprange | Select-String -NotMatch "ff-ff-ff-ff-ff-ff"

Fast am Ziel! Jetzt noch alles in Objekte verpacken:

arp.exe -a| select -Skip 3 |  Select-String $iprange | Select-String -NotMatch "ff-ff-ff-ff-ff-ff"| %  { [PSCustomObject]@{IP=($_ -split "\s+")[1];MAC=($_ -split "\s+")[2] } }

IP          MAC
–          —
192.168.0.1 00-a4-6c-ee-11-f2
192.168.0.5 00-03-05-63-12-d9

Ach übrigens, seit Windows 8 gibt es auch ein Cmdlet welches ähnliche, ja sogar noch viel mehr Informationen liefert! Es nennt sich Get-NetNeighbor: https://technet.microsoft.com/en-us/library/hh826147. Bin ich aber auch jetzt erst am Ende des Artikel bei der Recherche drauf gestoßen. Bei Get-NetNeighbor gibt es eine State-Eigenschaft, die nach recht kurzer Zeit von Reachable nach Stale wechselt. Dazu gibt es einen Timeout, näheres ist hier beschrieben: https://support.microsoft.com/en-us/kb/949589. Offensichtlich gibt es auch noch ein Neighbor-Cache-Limit.

Zu obiger Arp-Ausgabe kann man also auch Get-NetNeighbor verwenden:

Get-NetNeighbor -AddressFamily IPv4 | where {$_.state -eq "stale" -or $_.state -eq "reachable"}

Um nun nochmal alles in einen sinnvollen Zusammenhang zu bringen:

$iprange=((Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin dhcp).IPAddress)
$iprange=$iprange.Substring(0,$iprange.LastIndexOf(".")+1)
$iprange

0..255|% {$ip="$iprange$_"; ping.exe -4 -n 1 -w 1 $ip | out-null; $arp=arp.exe -a | select-string "$ip(?s)(.*)dynam"; If ($arp) {$ip} }

$arp=arp.exe -a| select -Skip 3 |  Select-String $iprange | Select-String -NotMatch "ff-ff-ff-ff-ff-ff"| %  { [PSCustomObject]@{IP=($_ -split "\s+")[1];MAC=($_ -split "\s+")[2] } }

$arp

An diesem Punkt vielleicht noch interessant: Manchmal hat man nur eine MAC-Adresse und möchte den zugehörigen Hersteller feststellen, dazu gibt es verschiedene Datenbanken im Internet. Z. B. www.coffer.com/mac_find. Man kann auch direkt eine Abfrage starten http://www.coffer.com/mac_find/?string=00-1b-00.

Noch eine interessante Variante mittel PingAsync: https://p0w3rsh3ll.wordpress.com/2018/04/18/fast-ping/

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s


%d Bloggern gefällt das: