Portscan: 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 -PN -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;.

  1. Marius

    Sunday, December 10, 2017 - 16:00:39

    Dein Wunsch wird erhört :)

    Streiche NetworkManager …
    vergiß mal Ping…(weil geblockt)…

    nmap -PR `ip -f inet -h a | grep inet |grep -v -E “(127.0.0.1|::1)” | awk ‘{print $2}’`

    tada :D

    Wenn man lo Interface mitscannt gibts lustige Rückmeldungen von nicht existenten IPs ;)

  2. inne

    Sunday, December 10, 2017 - 16:29:42

    Hallo Marius,

    ein “richtiger” Portscan ist für den Artikel – und Leser, als Ausgangsbasis, sicher besser geeignet. Das werde ich wohl wirklich nochmal dahingehen umschreiben.

    Nur dauert ein Nmap Standard Scan entsprechend länger, wenn man eigentlich nur die Anzahl an Rechner sehen will. Und das war die eigentliche Intention.

    Und klar, man kann sich vor einem Pingscan verstecken :-)

    LG,
    Inne

    PS: Danke auch für den Hint mit dem lo Interface.

  3. Jens

    Tuesday, December 12, 2017 - 16:21:52

    Für Leute, die NetworkManager nicht einsetzen, kann lsip z.B. folgendermaßen lauten:

    function lsip { ip -f inet -br a | awk ‘!/^loW/ {print $3}’; }

  4. inne

    Tuesday, December 12, 2017 - 16:37:18

    Hi Jens,

    dem Kommando ip(8) werde jetzt auch den Vorzug geben und alle weiteren unter der Überschrift “Alternative lsip-Funktionen” Sammeln.

    Aber kannst du bitte zuerst noch erklären, was der Schalter -br und a, sowie was welche Spalte von dem ip-Konstukt bedeutet, gerade die 2. Spalte!

    LG,
    Inne