Portscan mit nmap: Hosts/Rechner und offene Ports im Netzwerk finden

Saturday, December 9, 2017

Um sich einen Überblick über das Netzwerk (LAN/WLAN) zu verschaffen, zu dem man sich verbunden hat, kann man einen Portscan auf das Netzwerk durchführen, um verbundene Hosts und angebotene Services/Dienste zu finden.

Unter Linux/GNOME kann der NetworkManager bzw. nmcli(1) verwenden werden, um sich die Netze anzuzeigen, zu denen man verbunden ist:

$ export LC_ALL=C # Damit der reguläre Ausdruck s.u. korrekt ist
$ lsip () {
>	nmcli -f uuid,device connection show --active \
>	| awk 'NR>1 && $2!="lo" {print $1}' \
>	| xargs nmcli -t connection show \
>	| sed -n -E "/^IP4.ADDRESS\[[0-9]+\]:/{s///;p}"
> }
$ lsip
192.168.1.91/24
10.230.42.59/28
192.168.10.200/24

Und dann mit z.B. nmap(1) einen Standard Nmap scan ausführen, um sich alle Hosts/Rechner anzuzeigen, die erreichbar sind (Ping), sowie deren offene Ports:

$ lsip | xargs nmap

Starting Nmap 7.40 ( https://nmap.org ) at 2017-12-14 18:20 CET
Nmap scan report for o2.box (192.168.1.1)
Host is up (0.00091s latency).
Not shown: 992 filtered ports
PORT     STATE SERVICE
21/tcp   open  ftp
80/tcp   open  http
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
515/tcp  open  printer
631/tcp  open  ipp
5431/tcp open  park-agent
9100/tcp open  jetdirect

Nmap scan report for 192.168.1.10
Host is up (0.00041s latency).
Not shown: 996 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
443/tcp open  https

Nmap scan report for mydebian (192.168.1.91)
Host is up (0.00012s latency).
All 1000 scanned ports on 192.168.1.91 are closed

Nmap scan report for frei.funk (10.230.42.49)
Host is up (0.0032s latency).
Not shown: 996 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
53/tcp  open  domain
80/tcp  open  http
443/tcp open  https

Nmap scan report for android-a65183dd756bed42.lan (10.230.42.55)
Host is up (0.027s latency).
All 1000 scanned ports on android-a65183dd756bed42.lan (10.230.42.55) are closed

Nmap scan report for android-42250764e309f587.lan (10.230.42.56)
Host is up (0.022s latency).
All 1000 scanned ports on android-42250764e309f587.lan (10.230.42.56) are closed

Nmap scan report for 10.230.42.59
Host is up (0.000051s latency).
All 1000 scanned ports on 10.230.42.59 are closed

Nmap scan report for 192.168.10.200
Host is up (0.00030s latency).
All 1000 scanned ports on 192.168.10.200 are closed

Nmap done: 528 IP addresses (8 hosts up) scanned in 92.28 seconds

Vor einem Ping scan (oder auch Ping sweep) verstecken

Nmap sendet vor dem Portscan einen Ping, um die Erreichbarkeit einer IP-Adresse festzustellen und überspringt Adressen, die darauf keine Antwort senden (Pong).

Damit keine Antwort gesendet wird, müssen folgende Kernel-Parameter gesetzt werden:

# cat <<! >>/etc/sysctl.d/00-local.conf
> net.ipv4.icmp_echo_ignore_all=1
> net.ipv4.icmp_echo_ignore_broadcasts=1
> !
# sysctl -p

Alles scannen

Um den Ping scan zu deaktivieren und alle IP-Adressen zu scannen (-PN) und so auch verstecke Ports zu finden (-p), sowie die Betriebssystemerkennung (-O), die Versionserkennung (-sV), das Scannen mit Scripts (-sC) und traceroute (--traceroute) zu aktivieren und so mehr Details angezeigt zu bekommen, nutzt man folgende Parameter (Viele der genannten Parameter sind unter dem Parameter -A zusammengefasst, denn dieser soll einen umfassenden Satz von Scan-Optionen aktivieren, ohne dass man sich viele Parameter merken muss):

$ lsip | xargs nmap -A -p "T:0-65535,U:0-65535"

Ein solcher Scan benötigt allerdings auch entsprechend mehr Zeit und wird als aufdringlich betrachtet.

Sie sollten dies nicht ohne Genehmigung anwenden.

Alternative lsip-Funktionen

In den Kommentaren, wurden noch Alternativen für die Funktion lsip aufgezeigt.

Von mir adaptiert (Für Leute die NetworkManager nicht einsetzen):

$ ip -f inet -br a | awk '$1!="lo" && $2!="DOWN" {print $NF}'

Beide obigen Methoden haben Nachteile: Das ip(8) z.B. bei Point-to-Point-Verbindungen und dem Filtern des Output mit awk/sed/usw. und das nmcli(1) bei nicht mit dem NetworkManager verwalteten Interfaces. Wer das als Gefrickel ansieht, kann sich auch ein Perl-Skript schreiben, das sauber alle Netzwerke auflistet. Die dafür nötigen Module sind über die Paketverwaltung in den Paketen libio-interface-perl und libnet-netmask-perl vorhanden:

#!/usr/bin/env perl

use IO::Interface::Simple;
use Net::Netmask;

for ( IO::Interface::Simple->interfaces ) {

    next if ( !$_->is_running );
    next if ( $_->is_loopback );

    $block = Net::Netmask->new( $_->address, $_->netmask );

    print "$block\n";
}

Um die IP-Adresse statt des Netzes auszugeben, schreib man folgendes Kommando: printf "%s/%s", $_->address, $block->bits;

Labskaus

Sunday, October 15, 2017

Labskaus ist mein Leibgericht. Dass weiss ich, aber der Labskaus nicht.

Zähne und Klauen

Thursday, September 21, 2017

Was daraus auch werden wird, es ist unsere Welt.
Nicht das Ende, auch nicht der Beginn – Nur anders.

Wir leben im Licht, weil das die Gesellschaft es von uns verlangt. Aber wir sind alle Kinder der Finsternis.
Gesetze sind das einzige, was uns von der Barbarei trennt. Denn die Bestie ist da, steckt in uns allen, beobachtet und lauert.

Wenn es keine Zivilisation mehr gibt die uns beschützt, wenn die Bestie das einzige ist was zwischen uns und dem Tod steht, werden wir mit Zähnen und Klauen, um unser Überleben kämpfen.

Perl: Zufälligen Schlüssel/Key eines Hash

Friday, August 4, 2017

Auf einen zufälligen Schlüssel eines Hash, kann man mit der Funktion keys zugreifen. Die Funktion keys, gibt alle Schlüssel eines Hash, als Liste zurück, von der dann ein Wert zufällig abgefragt werden kann:

#!/usr/bin/perl

my %alphabet = (
    A => 1,
    B => 2,
    C => 3,
    D => 4,
    E => 5,
    F => 6,
    G => 7,
    H => 8,
    I => 9,
    J => 10,
    K => 11,
    L => 12,
    M => 13,
    N => 14,
    O => 15,
    P => 16,
    Q => 17,
    R => 18,
    S => 19,
    T => 20,
    U => 21,
    V => 22,
    W => 23,
    X => 24,
    Y => 25,
    Z => 26,
);

my @keys = keys %alphabet;

# zufälliger Key

my $buchstabe = $keys[ rand @keys ];
my $position  = $alphabet{$buchstabe};

printf "Der Buchstabe %s, ist der %i. im Alphabet.\n", $buchstabe, $position;

Es ist auch möglich, direkt auf einen zufälligen Wert eines Hash zuzugreifen. Das funktioniert, analog mit der Funktion values:

my @values = values %alphabet;
print $values[ rand @values ] . "\n";

PS: In den Kommentaren, hat Christian eine etwas schnellere Möglichkeit aufgezeigt:

my @list = %alphabet;
my $random_key = $list[(1|rand@list) -1];
my $random_val = $list[1|rand@list];

Das bitweise ODER mit 1 sorgt dafür, dass das letzte Bit des Ergebnisses von rand auf 1 gesetzt wird. Dadurch entsteht immer eine ungerade Zahl (1|0 => 1, 1|1 => 1, 1|2 => 3, 1|3 => 3, …). Es wird also nur auf ungerade Indizes des Arrays zugegriffen, wo in diesem Fall die Values abgelegt sind. Da dabei immer eine Zahl größer 0 generiert wird, kann mit einem einfachen -1 immer auf die geraden Indizes mit den Keys zugegriffen werden.

Debian 9 (Stretch): Predictable Network Interface Names – Umstellung auf das neue Verfahren zur Namensvergabe von Netzwerkschnittstellen

Sunday, July 23, 2017

Spätestens ab Debian 10 (Buster) wird das alte Verfahren zur Namensvergabe von Netzwerkschnittstellen nicht mehr unterstützt, und das System muss auf das neue Verfahren umgestellt sein (Predictable Network Interface Names).

Bei einer Neuinstallation von Debian 9 (Stretch) passiert diese Umstellung automatisch. Bei einem Upgrade von Debian 8 (Jessie) muss hingegen manuell umgestellt werden.

Auf das neue Verfahren zur Namensvergabe von Netzwerkschnittstellen umstellen

Um auf das Verfahren Predictable Network Interface Names umzustellen, muss die Datei /etc/udev/rules.d/70-persistent-net.rules gelöscht werden:

mv /etc/udev/rules.d/70-persistent-net.rules{,.old}

Danach muss das System neu gestartet werden.

Dieser Schritt stellt eine entsprechend weitreichende Änderung am System da. Eventuelle Konfigurationsdateien müssen angepasst und getestet werden. Wer statt des Network-Manager die Datei interfaces(5) nutzt, muss zumindest diese anpassen.

Siehe auch: https://www.debian.org/releases/stable/amd64/release-notes/ch-whats-new.de.html#new-interface-names, https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-net_id.c#L20 (Beschreibt nach welchen Regeln, die neuen voraussagbaren/vorhersagbaren Namen aufgebaut sind), https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/, file:///usr/share/doc/udev/README.Debian.gz

Benutzerdefinierte Namen für Netzwerkschnittstellen

In manchen Fällen ist es praktisch, eigene Namen für Netzwerkschnittstellen zu definieren.

Dies kann mittels zwei verschiedener Methoden erreicht werden. Einmal mittels Network Device Configuration: systemd.link(5) und einmal mittels Dynamic Device Management: udev(7), welche wesentlich mehr Möglichkeiten bietet.

In folgenden Beispielen, wird der Netzwerkschnittstelle mit der MAC-Adresse 00:a0:de:63:7a:e6, der feste Namen dmz zugewiesen:

  • Dynamic Device Management – udev(7):
    Beispielsweise kann /etc/udev/rules.d/76-netnames.rules erstellt und dort Netzwerkgeräte anhand beliebiger Attribute und Eigenschaften identifiziert und benannt werden.
    Hier ein Beispiel, um ein Gerät über die MAC-Adresse zu identifizieren und zu benennen:

    cat /etc/udev/rules.d/76-netnames.rules
    # identify device by MAC address
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:a0:de:63:7a:e6", NAME="dmz"
    

    Gegenüber systemd.link(5), bietet diese Methode auch die Möglichkeit Geräte anhand anderer Übereinstimmungsschlüssel, wie der Vendor/Model-ID oder des Gerätepfads zu Identifizieren. Siehe dazu auch die Handbuchseite udev(7), für die Dokumentation, wie man udev-Regeln schreibt.

  • Network Device Configuration – systemd.link(5):
    Alternativ geht auch eine Konfiguration ohne udev(7), mittels systemd.link(5) und des Name-Schlüssels:

    cat /etc/systemd/network/10-dmz.link
    [Match]
    MACAddress=00:a0:de:63:7a:e6
    [Link]
    Name=dmz
    

Damit diese Änderungen übernommen werden, ist ggf. eine Aktualisierung der initrd-Datei mittels update-initramfs -u und ein Neustart des Systems erforderlich.