Auslesen, welche geräte sich im WLan befinden

  • Wenn IP und/oder MAC bekannt sind, kannst du den ARP-Cache auslesen... denn da stehen die drin, wenn das Gerät verbunden ist.

  • Wenn IP und/oder MAC bekannt sind, kannst du den ARP-Cache auslesen... denn da stehen die drin, wenn das Gerät verbunden ist.

    Ich bin kein Netzwerkprofi aber: Bist du sicher?
    Meines Wissens nach ist der ARP-Cache lediglich ein Zwischenspeicher in dem sich gemerkt wird, welche MAC-Adresse eine IP zu der bereits mal eine Verbindung bestand im Ethernet hat.
    Sonst müsste vor jeder Verbindung erst ein ARP-Request ins Netz gebrüllt werden.

    Dies bedeutet meiner Ansicht nach:

    • Wenn bisher keine Verbindung seitens des Rechners mit einem Gerät bestand, gibt es auch keinen Eintrag für dieses Gerät im Arp-Cache. Unabhängig davon ob das Gerät existiert oder nicht.
    • Ein Eintrag im Arp-Cache ist unabhängig davon ob das Gerät aktuell im Netz ist - es sagt nichts über den aktuellen Zustand aus.

    Um wirklich die aktuelle MAC zu einer IP zu ermitteln, löscht man daher in der Regel den Arp-Cache (arp -d) und macht dann einen Ping auf die IP. Das führt implizit zu einem Arp-Request und wenn das Gerät im Netz existiert, sollte ein Eintrag hierfür im Arp-Cache landen.

    Wenn die Sachlage andersherum ist - nämlich das nur die MAC-Adresse aber nicht die IP bekannt ist, dann könnte folgendes funktionieren:

    • Arp-Cache löschen: arp -d
    • Ein Ping auf die Broadcast-Adresse des Subnetzes (bei einem 192.168.0.0/24 wäre diese 192.168.0.255) ausführen.
    • Wenn die Geräte Broadcast-Requests nicht ignorieren dann solltest du einen Response bekommen und der Arp-Cache sollte sich schnell füllen.
    • Im Arp-Cache nachschauen ob die gesuchte Mac auftaucht.

    Es gibt da wohl auch das RARP-Protokoll aber das ist wohl mittlerweile eher out of date. ÜBer DHCP würde es wohl auch gehen.

  • Bist du sicher?

    Ziemlich...

    arp -a Zeigt aktuelle ARP-Einträge durch Abfrage der Protokoll-Daten an.

    Arp-Cache löschen: arp -d

    arp -d funktioniert nicht ohne einen zweiten Parameter.

    So...

    arp -d Inet-Adr.

    oder so...

    arp -d *


    Aktuelle Einträge (arp -a) zu löschen macht wenig Sinn, da sich diese bei der nächsten Abfrage mit arp -a (ohne vorheriges Ping) wieder im Cache befinden.

    Ein Ping auf die Broadcast-Adresse des Subnetzes

    Das wäre natürlich sehr bequem, doch leider mit hoher Wahrscheinlichkeit nicht erfolgreich... ein Ping an jeden Host im Subnetz zu senden, ist sicherer.

  • Ziemlich...


    arp -a Zeigt aktuelle ARP-Einträge durch Abfrage der Protokoll-Daten an.

    "aktuelle" Einträge des lokalen Arp-Cache.

    Das hat nix mit dem tatsächlichen Zustand im Netz zu tun.

    Hab es auch mal kurz ausprobiert und schlage vor das auch selbst nochmal zu probieren:

    • arp -a ausgeführt um zu schauen ob mein Handy, welches sich gerade im selben Netz befindet, im Arp-Cache auftaucht.
      Ergebnis: Das Handy taucht nicht auf obwohl es online im Netz ist (diese Frage zu beantworten war ja eigentlich der Sinn dieser Übung hier)
    • Daraufhin habe ich einen ping auf die IP-Adresse des Handys abgesetzt, woraufhin meiner Theorie nach nun implizit ein ARP-Request getriggert werden sollte.
    • Wieder arp -a um zu schauen ob nun das Handy auftaucht - siehe da: Das Handy ist nun im lokalen Arp-Cache gelandet.
    • Nun habe ich das Handy durch Ausschalten seines W-LAN aus dem Netz rausgenommen.
    • Wieder arp -a ausgeführt - Ergebnis: Das Handy ist, wie vermutet, weiterhin im ARP-Cache obwohl es sich tatsächlich nicht mehr im Netz befindet.

    Der arp-Befehl scheint demnach also tatsächlich lediglich den lokalen Cache auszulesen und würde demnach nicht dazu dienen können um zu überprüfen ob sich ein bestimmtes Gerät gerade im Netz befindet.

    Aktuelle Einträge (arp -a) zu löschen macht wenig Sinn, da sich diese bei der nächsten Abfrage mit arp -a (ohne vorheriges Ping) wieder im Cache befinden.

    Wie oben beschrieben werden alle Einträge aus dem lokalen Cache gelöscht.
    Macht man das nicht hat man auch noch Einträge mit drin von Geräten, zu welchen seitens des Rechners bereits eine Verbindung bestand, die tatsächlich aber nicht mehr im Netz sind.

    Also einmal den Cache bereinigen und durch einen Arp-Broadcast wieder mit dem aktuellen Zustand befüllen.

    arp -d funktioniert nicht ohne einen zweiten Parameter.

    [...]

    arp -d *

    :thumbup:- super Tipp!

    ein Ping an jeden Host im Subnetz zu senden, ist sicherer.

    Ja viele Betriebssysteme blocken Anfragen auf der Broadcast-Adresse.
    Und so ne Schleife über alle IPs ist auch in AutoIt schnell gebastelt - nur halt unheimlich langsam.

    Daher wüsste ich jetzt nicht wie man auf die Schnelle rausfindet ob ein Gerät mit einer bestimmten MAC-Adresse sich gerade im Netz befindet. :(

  • Ich habe hier zwei Scripts für euch...

    ScanArpCache.au3 - ist von mir und erfordert erhöhte Rechte für das Löschen des Arp-Cache!

    Examples:

    ScanArpCache.exe <MAC-Address>|<HostName>|<IP-Address> [<Wait>]

    ScanArpCache.exe <SubNet> [<Start>] [<End>] [<Wait>]


    arpscan.au3 - erste Version ist von SoulA, hier aber die von mir geänderte Version von dexto und diese erfordert keine erhöhten Rechte!

    Zusätzlich benötigt wird (ist aber alles im Archiv arpscan.zip enthalten):

    winpcapau3.zip - Hiervon wird die winpcap.au3 von arpscan.au3 als include geladen.

    npcap-0.9994.exe - Packet capture library for Windows - um (ARP-)Pakete mitlesen zu können, muss installiert werden, damit arpscan.au3 funktioniert.

    Alle nötigen Links sind in arpscan.au3 enthalten.

    PS: Habe winpcap.au3 entpackt und ein paar Zeilen geändert, das Archiv winpcapau3.zip ist aber original.

    Examples:

    arpscan.exe 192.168.1.1

    arpscan.exe 192.168.1.1-192.168.1.10

    Und so ne Schleife über alle IPs ist auch in AutoIt schnell gebastelt - nur halt unheimlich langsam.

    In ScanArpCache.au3 habe ich das so gelöst:

    AutoIt
    ; Sorgt dafür, dass die angepingten IPs inkl. MAC im ARP-Cache landen, wenn das Gerät erreichbar ist.
    Func _PingSubNet($sSubNet, $iStart = 1, $iEnd = 254, $iWait = 0)
        RunWait(@ComSpec & StringFormat(' /C FOR /L %%L IN (%i,1,%i) DO @ping >nul -4 -n 1 -w %i %s.%%L', $iStart, $iEnd, $iWait, $sSubNet), '', @SW_HIDE)
    EndFunc   ;==>_PingSubNet