74_Nmap

Begonnen von igami, 18 September 2016, 10:28:34

Vorheriges Thema - Nächstes Thema

igami

Nmap ist das FHEM Modul um einen Netzwerkscan mit Nmap durchzuführen und Informationen über die erreichbaren Netzwerkgeräte darzustellen.

Das Modul ist ab dem 23.03.2016 per update verfügbar.

Originalbeitrag


Hi zusammen,

ich überlege gerade wie es möglich ist, einen nmap scan über das Netzwerk durchzuführen und auszuwerten.
Dadurch soll z.B. eine Gäste erkennung stattfinden (https://forum.fhem.de/index.php/topic,55159.15.html).

Umsetzten würde ich das ganze mit einem at welchem dann die Readings <hostname>_ip, <hostname>_latency und <hostname>_MAC gegeben werden. (Ähnlich wie bei dem unifi Modul)

Es gibt auch den Nmap::Parser (http://search.cpan.org/~apersaud/Nmap-Parser/Parser.pm)

Da ich mit zusätlichen Perl Modulen bisher noch nicht gearbeitet habe scheitert es bei mir noch an dem Verständnis wie das angewendet wird.
Bisher habe ich mir eine sub in den myUtils angelegt

sub nmap {
  my $np = new Nmap::Parser;
  $np->parsescan("/usr/bin/nmap", "-sn", "192.168.1.2/24");
  return;
}

beim Aufruf erhalte ich jedoch die Fehlermeldung Edit: man sollte auch "usr" statt "urs" im Pfad angeben :D

Vielleicht kann mir ja jemand einen Tip geben wie ich weiter komme.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

igami

Soweit, sogut.


Voraussetzung:
nmap und Nmap::Parser müssen installiert sein. Bei Debian geht das mittels

sudo apt-get install nmap libnmap-parser-perl


myUtils erweitern:

use Nmap::Parser;

sub nmap($$) {
  my ($name, $network) = @_;
  my $hash = $defs{$name};
  my $np = new Nmap::Parser;
  $np->parsescan("/usr/bin/nmap", "-sn", $network);
 
  my @hosts_up = $np->all_hosts("up");
  readingsBeginUpdate($hash);
  readingsBulkUpdate($hash, "hosts_up", int(@hosts_up));
  for (@hosts_up){
    my $hostname = $_->hostname() ? $_->hostname() : $_->addr();
    fhem("trigger $name new host: $hostname") if(!$hash->{READINGS}{$hostname});
    readingsBulkUpdate($hash, $hostname, $_->addr());
  }
  readingsEndUpdate($hash, 1);
  return;
}


Gerät in fhem anlegen:

define nmap at +*00:15:00 {nmap("nmap", "192.168.1.0/24")}



Nun bekommen wir alle 15 Minuten die Meldung wie viele Geräte erreichbar sind und welchen hostname und IP sie haben.
Zusätzlich wird bei neuen Geräten ein Event erzeugt.

Vielleicht kann es ja noch jemand gebrauchen.

Grüße
igami

PS: wie geht das nun mit dem nonblocking?
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

igami

#2
Zitat von: igami am 18 September 2016, 15:20:27
PS: wie geht das nun mit dem nonblocking?
Die minimale myUtils sollte nun so aussehen:

package main;
  use strict;
  use warnings;
  use POSIX;

  use Blocking;
 
  use Nmap::Parser;

sub myUtils_Initialize($$) {
  my ($hash) = @_;
}

sub nmapPingScan($$){
  my ($name, $network) = @_;
  my $hash = $defs{$name};
  $hash->{helper}{RUNNING_PID} = BlockingCall("blocking_nmapPingScan", $name."|".$network, "nmapPingScan_Done", 300, "nmapPingScan_Aborted", $hash) unless(exists($hash->{helper}{RUNNING_PID}));
  return;
}

sub blocking_nmapPingScan($$) {
  my ($string) = @_;
  my ($name, $network) = split("\\|", $string);
  my $hash = $defs{$name};
  my $np = new Nmap::Parser;
  $np->parsescan("/usr/bin/nmap", "-sn", $network);

  my @ret = $name;
 
  my @hosts_up = $np->all_hosts("up");

  for (@hosts_up){
    my $hostname = $_->hostname() ? $_->hostname() : $_->addr();
    push(@ret, "$hostname|".$_->addr());
  }
  return join("||", @ret);
}

sub nmapPingScan_Done($) {
  my ($string) = @_;
 
  return unless(defined($string));

  my @hosts_up = split("\\|\\|", $string);
  my $name  = shift @hosts_up;
  my $hash = $defs{$name};

  delete($hash->{helper}{RUNNING_PID});

  readingsBeginUpdate($hash);
  readingsBulkUpdate($hash, "hosts_up", int(@hosts_up));
  for (@hosts_up){
    my ($hostname, $ip) = split("\\|", $_);
    fhem("trigger $name new host: $hostname") if(!$hash->{READINGS}{$hostname});
    readingsBulkUpdate($hash, $hostname, $ip);
  }
  readingsEndUpdate($hash, 1);
  return;
}

sub nmapPingScan_Aborted($) {
  my ($hash) = @_;
  delete($hash->{helper}{RUNNING_PID});
}

1;

Die DEF vom at ändert sich zu

define nmap at +*00:15:00 {nmapPingScan("nmap", "192.168.1.0/24")}

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Otto123

Hallo igami,

ich finde das interessant. Ich wollte vorhin mal mit wegen non Blocking schauen (obwohl ich zugegeben wenig Ahnung von Perl habe) und bevor ich alles richtig probiert hatte kamst Du mit der neuen Version  8)

Was mir auffällt, irgendwie wird die Anzahl begrenzt. Von meinen 24 Geräten (mit Fing unter Android ermittelt) werden nur 16 angezeigt plus hosts_up und state.
Wobei ein paar Geräte mehrere IPs haben.
nmap auf der Kommandozeile liefert sie alle, allerdings bei meinem Pi3 kann er die Mac Adressen nicht ermitteln.

Eigenartig, hast Du da eine Idee? Ist irgendwie die Zahl/Größe der Readings beschränkt?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

igami

Zitat von: Otto123 am 18 September 2016, 17:52:23
Wobei ein paar Geräte mehrere IPs haben.
Zitat
addr()
    Returns the main IP address of the host. This is usually the IPv4 address. If there is no IPv4 address, the IPv6 is returned (hopefully there is one).
Könnte damit zusammenhängen.
Zitat von: Otto123 am 18 September 2016, 17:52:23
nmap auf der Kommandozeile liefert sie alle, allerdings bei meinem Pi3 kann er die Mac Adressen nicht ermitteln.
MAC Adresse wird nur beim ausführen als root angezeigt
Zitat von: Otto123 am 18 September 2016, 17:52:23
Eigenartig, hast Du da eine Idee? Ist irgendwie die Zahl/Größe der Readings beschränkt?
Muss ich mir gleich nochmal anschauen wie man alle Adressen bekommt. Dann müsste ich aber auch den Namen des Readings eindeutiger machen, ist ja bisher Hostname, bzw. IP falls das Gerät keinen Hostname sendet
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Otto123

#5
Also ganz praktisch. Das liefert nmap (als root)  8)
Starting Nmap 6.47 ( http://nmap.org ) at 2016-09-18 18:24 CEST
Nmap scan report for fritz.box (192.168.178.1)
Host is up (0.00045s latency).
MAC Address: 38:10:D5:0F:98:0F (Unknown)
Nmap scan report for 192.168.178.3
Host is up (0.00059s latency).
MAC Address: 9C:C7:A6:FA:D2:BD (AVM GmbH)
Nmap scan report for SonosZP.fritz.box (192.168.178.20)
Host is up (0.00083s latency).
MAC Address: 00:0E:58:AA:AD:9C (Sonos)
Nmap scan report for NEXUS7.fritz.box (192.168.178.23)
Host is up (0.11s latency).
MAC Address: AC:22:0B:A3:1B:09 (Asustek Computer)
Nmap scan report for NEXUS5-2.fritz.box (192.168.178.24)
Host is up (0.010s latency).
MAC Address: CC:FA:00:F0:3D:0D (LG Electronics)
Nmap scan report for LSK2012.fritz.box (192.168.178.32)
Host is up (-0.10s latency).
MAC Address: 78:24:AF:43:AC:E5 (Asustek Computer)
Nmap scan report for et9x00.fritz.box (192.168.178.33)
Host is up (-0.099s latency).
MAC Address: 00:16:B4:03:F5:0E (Private)
Nmap scan report for WBP-A78C.fritz.box (192.168.178.34)
Host is up (-0.100s latency).
MAC Address: 00:24:E4:10:A7:8C (Withings)
Nmap scan report for AsusTransformer.fritz.box (192.168.178.35)
Host is up (-0.089s latency).
MAC Address: F4:6D:04:4D:A5:AC (Asustek Computer)
Nmap scan report for SonosZP.fritz.box (192.168.178.40)
Host is up (-0.069s latency).
MAC Address: 00:0E:58:6B:E2:A2 (Sonos)
Nmap scan report for openmediavault.fritz.box (192.168.178.44)
Host is up (0.00025s latency).
MAC Address: 00:26:2D:00:10:91 (Wistron)
Nmap scan report for SonosZP.fritz.box (192.168.178.45)
Host is up (-0.060s latency).
MAC Address: 00:0E:58:F4:2D:52 (Sonos)
Nmap scan report for SonosZP.fritz.box (192.168.178.46)
Host is up (-0.059s latency).
MAC Address: 00:0E:58:C7:7D:38 (Sonos)
Nmap scan report for SonosZP.fritz.box (192.168.178.48)
Host is up (-0.057s latency).
MAC Address: 00:0E:58:C7:89:4E (Sonos)
Nmap scan report for All3691.fritz.box (192.168.178.49)
Host is up (-0.10s latency).
MAC Address: 00:0F:C9:01:1B:96 (Allnet GmbH)
Nmap scan report for fritz.repeater (192.168.178.52)
Host is up (-0.097s latency).
MAC Address: 3E:10:D5:14:82:B7 (Unknown)
Nmap scan report for LPK10.fritz.box (192.168.178.54)
Host is up (0.00019s latency).
MAC Address: 9C:5C:8E:74:85:26 (Unknown)
Nmap scan report for LEQ0102164.fritz.box (192.168.178.66)
Host is up (-0.100s latency).
MAC Address: 00:1A:22:04:3F:3E (eQ-3 Entwicklung GmbH)
Nmap scan report for LGwebOSTV.fritz.box (192.168.178.70)
Host is up (-0.100s latency).
MAC Address: 3C:CD:93:99:10:33 (LG Electronics)
Nmap scan report for raspib.fritz.box (192.168.178.80)
Host is up (0.00034s latency).
MAC Address: E8:DE:27:14:42:68 (Tp-link Technologies Co.)
Nmap scan report for raspibplus.fritz.box (192.168.178.81)
Host is up (-0.100s latency).
MAC Address: B8:27:EB:9C:45:06 (Raspberry Pi Foundation)
Nmap scan report for raspib2.fritz.box (192.168.178.82)
Host is up (-0.10s latency).
MAC Address: B8:27:EB:AE:D5:C8 (Raspberry Pi Foundation)
Nmap scan report for raspib.fritz.box (192.168.178.90)
Host is up (0.00042s latency).
MAC Address: E8:DE:27:14:42:68 (Tp-link Technologies Co.)
Nmap scan report for 192.168.178.201
Host is up (0.38s latency).
MAC Address: 38:10:D5:0F:98:0F (Unknown)
Nmap scan report for raspib3.fritz.box (192.168.178.83)
Host is up.
Nmap scan report for raspib3.fritz.box (192.168.178.93)
Host is up.
Nmap done: 256 IP addresses (26 hosts up) scanned in 4.68 seconds

Diese Readings stehen in FHEM: 192.168.178.3 192.168.178.3 2016-09-18 18:18:49
All3691.fritz.box 192.168.178.49 2016-09-18 18:18:49
AsusTransformer.fritz.box 192.168.178.35 2016-09-18 18:18:49
LEQ0102164.fritz.box 192.168.178.66 2016-09-18 18:18:49
LGwebOSTV.fritz.box 192.168.178.70 2016-09-18 18:18:49
NEXUS5.fritz.box 192.168.178.26 2016-09-18 18:03:49
NEXUS7.fritz.box 192.168.178.23 2016-09-18 17:34:07
SonosZP.fritz.box 192.168.178.48 2016-09-18 18:18:49
WBP-A78C.fritz.box 192.168.178.34 2016-09-18 18:18:49
et9x00.fritz.box 192.168.178.33 2016-09-18 18:18:49
fritz.box 192.168.178.1 2016-09-18 18:18:49
fritz.repeater 192.168.178.52 2016-09-18 18:18:49
hosts_up 21 2016-09-18 18:18:49
openmediavault.fritz.box 192.168.178.44 2016-09-18 18:18:49
raspib.fritz.box 192.168.178.90 2016-09-18 18:18:49
raspib2.fritz.box 192.168.178.82 2016-09-18 18:18:49
raspib3.fritz.box 192.168.178.93 2016-09-18 18:18:49
raspibplus.fritz.box 192.168.178.81 2016-09-18 18:18:49
state Next: 18:33:46 2016-09-18 18:18:46


Verstehe mich nicht falsch, Du musst das für mich nicht lösen.  8)
Ich finde bloß die geringere Anzahl irgendwie unklar, zumal sie sich vorhin auf 19 erhöht hat. Ja, dass was nmap bei mir ermittelt ist auch nicht ganz konstant, wahrscheinlich schlafen immer mal ein WLAN Geräte.

Edit: Und irgendwie wird es in jeder Runde ein reading mehr  :o
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

igami

Aber ich sollte schonmal berücksichtigen, dass die IP eindeutig ist und der hostname nicht.
Habe Name und Wert vom Reading mal umgedreht und statt all_hosts($status) wird nun iget_ips($status) geprüft.

package main;
  use strict;
  use warnings;
  use POSIX;

  use Blocking;
 
  use Nmap::Parser;

sub myUtils_Initialize($$) {
  my ($hash) = @_;
}

sub nmapPingScan($$){
  my ($name, $network) = @_;
  my $hash = $defs{$name};
  $hash->{helper}{RUNNING_PID} = BlockingCall("blocking_nmapPingScan", $name."|".$network, "nmapPingScan_Done", 300, "nmapPingScan_Aborted", $hash) unless(exists($hash->{helper}{RUNNING_PID}));
  return;
}

sub blocking_nmapPingScan($$) {
  my ($string) = @_;
  my ($name, $network) = split("\\|", $string);
  my $hash = $defs{$name};
  my $np = new Nmap::Parser;
  $np->parsescan("/usr/bin/nmap", "-sn", $network);

  my @ret = $name;
 
  my @hosts_up = $np->get_ips("up");

  for (@hosts_up){
    my $hostname = $_->hostname() ? $_->hostname() : $_->addr();
    push(@ret, $_->addr()."|$hostname");
  }
  return join("||", @ret);
}

sub nmapPingScan_Done($) {
  my ($string) = @_;
 
  return unless(defined($string));

  my @hosts_up = split("\\|\\|", $string);
  my $name  = shift @hosts_up;
  my $hash = $defs{$name};

  delete($hash->{helper}{RUNNING_PID});

  readingsBeginUpdate($hash);
  readingsBulkUpdate($hash, "hosts_up", int(@hosts_up));
  for (@hosts_up){
    my ($ip, $hostname) = split("\\|", $_);
    fhem("trigger $name new host: $hostname ($ip)") if(!$hash->{READINGS}{$ip});
    readingsBulkUpdate($hash, $ip, $hostname);
  }
  readingsEndUpdate($hash, 1);
  return;
}

sub nmapPingScan_Aborted($) {
  my ($hash) = @_;
  delete($hash->{helper}{RUNNING_PID});
}

1;
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Otto123

Aber damit funktioniert es nicht mehr, die readings bleiben leer...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

igami

Zitat von: igami am 18 September 2016, 19:09:48
... und statt all_hosts($status) wird nun iget_ips($status) geprüft.
Damit scheint es nicht zu funktionieren, also wieder zurück. Aber ich habe gesehen, dass hosts_up auch mehr zählt als Readings angelegt wurden, also alles ok.
Readings werden dann auch wieder gefüllt :)

package main;
  use strict;
  use warnings;
  use POSIX;

  use Blocking;
 
  use Nmap::Parser;

sub myUtils_Initialize($$) {
  my ($hash) = @_;
}

sub nmapPingScan($$){
  my ($name, $network) = @_;
  my $hash = $defs{$name};
  $hash->{helper}{RUNNING_PID} = BlockingCall("blocking_nmapPingScan", $name."|".$network, "nmapPingScan_Done", 300, "nmapPingScan_Aborted", $hash) unless(exists($hash->{helper}{RUNNING_PID}));
  return;
}

sub blocking_nmapPingScan($$) {
  my ($string) = @_;
  my ($name, $network) = split("\\|", $string);
  my $hash = $defs{$name};
  my $np = new Nmap::Parser;
  $np->parsescan("sudo /usr/bin/nmap", "-sn", $network);

  my @ret = $name;
 
  my @hosts_up = $np->all_hosts("up");

  for (@hosts_up){
    my $hostname = $_->hostname() ? $_->hostname() : $_->addr();
    push(@ret, $_->addr()."|$hostname");
  }
  return join("||", @ret);
}

sub nmapPingScan_Done($) {
  my ($string) = @_;
 
  return unless(defined($string));

  my @hosts_up = split("\\|\\|", $string);
  my $name  = shift @hosts_up;
  my $hash = $defs{$name};

  delete($hash->{helper}{RUNNING_PID});

  readingsBeginUpdate($hash);
  readingsBulkUpdate($hash, "hosts_up", int(@hosts_up));
  for (@hosts_up){
    my ($ip, $hostname) = split("\\|", $_);
    fhem("trigger $name new host: $hostname ($ip)") if(!$hash->{READINGS}{$ip});
    readingsBulkUpdate($hash, $ip, $hostname);
  }
  readingsEndUpdate($hash, 1);
  return;
}

sub nmapPingScan_Aborted($) {
  my ($hash) = @_;
  delete($hash->{helper}{RUNNING_PID});
}

1;
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

igami

Hmm, irgendwie werden sehr viele perl Prozesse erzeugt. Bitte nicht im Produktivsystem testen!
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Otto123

Kann ich nur unterstreichen. Hat auf meinem Testsystem gestern ziemliches Chaos im Logfile erzeugt und irgendwann dem FHEM das Leben ausgehaucht...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

igami

So, nachdem ich nun die ganze Woche beruflich unterwegs war hab ich nun wieder Zeit mich dem Scanner zu widmen.
Hast du selbst schon weiter gebastelt?
Ich überlege ob ich nicht einfach ein kleines Modul draus machen soll. Ich befürchte nur, dass das Potential hat kein kleines Modul zu bleiben :D Nmap ist ja schon mächtig.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Otto123

Zitat von: igami am 23 September 2016, 19:59:16
Hast du selbst schon weiter gebastelt?
Ne war mir zu heiß  :-X und ich habe von Perl noch relativ wenig Ahnung.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

igami

#14
So, anbei die erste Version. Bitte mal vorsichtig testen. Läuft bei mir soweit ganz gut.

Voraussetzungen

sudo apt-get install nmap libnmap-parser-perl


define

define <name> Nmap <target specification>


set

  • clear Readings
    löscht alle Readings außer state
  • statusRequest
    stößt einen Scan an

Attribute


  • interval
    Intervall für die Abfrage. Minimum 30 Sekunden, Vorgabe 900 Sekunden

  • path
    Pfad unter dem nmap zu erreichen ist. Vorgabe /urs/bin/nmap

ToDo
- sudo / MAC-Adressen
- args
- disabled
- CommandRef

Ich freue mich auf eure Rückmeldungen.

Grüße
igami

Edit: Aktuelle Version im ersten Beitrag
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED