Eigentlich ist die Überschrift "Risiko" nicht ganz korrekt, denn eine konkrete Gefahr geht von einem Portscan alleine nicht aus. Ich lese häufiger die Threads besorgter User in Foren, in dem sie erzählen, das ihr PC / Server gerade "Opfer" eines Portscans geworden ist. Nachdem ich heute von einem Freund ähnliches gefragt worden bin, möchte ich im Folgenden die Frage beantworten, was ein Portscan ist und ob ein Portscan etwas gefährliches ist.
Eine kurze Erinnerung an meinen Post Grundlagen: Netzwerke: Hinter einem Port steckt ein Service der von dem IT-Gerät angeboten wird.
Was ist ein Portscan?
Ein Portscan ist eine (meist automatisierte) Prüfung, ob ein Service hinter einem Port angeboten wird. Theoretisch wären einige Funktionen eines Portscanners auch manuell möglich: Um zu prüfen, ob an der Adresse 192.168.0.16 beispielsweise ein MySQL Server auf Befehle wartet, könnte man einfach einen SQL Client starten und eine Verbindung zum Server aufbauen. Bei einem MySQL Server würde auch die Browserabfrage http://192.168.0.16:3306/ ausreichen, um folgende Antwort zu erhalten:
5.5.31-0ubuntu0.12.04.2 (...) mysql_native_password (...)
Der Port 3306 ist der Standardport eines MySQL Servers, in den Konfigurationsdateien des Servers lässt sich dieser jedoch auch verändern.
Die Arbeit all dieser manuellen Schritte lässt sich mit Hilfe eines Portscanners automatisieren, so wäre es etwa möglich, sich alle Services anzeigen zu lassen, die auf den Ports 5-1000 lauschen.
Einige rechtliche Anmerkungen zu Portscans
Bevor wir zu den technischen Details kommen, ein Hinweis: Ein Portscan lässt sich in den Protokollen eines Servers sehr leicht identifizieren. Ein Portscan gegen ein fremdes System stellt aus Sicht einiger Juristen die erste Instanz eines Einbruchsversuchs dar und ist daher rechtlich umstritten. Portscans sollten also ausschließlich auf eigenen Systemen oder auf Systemen durchgeführt werden, von denen ihr vom Besitzer zuvor eine Erlaubnis eingeholt habt.
In der Praxis sind Portscans etwas alltägliches, wer einen Rootserver im Internet betreibt, wird dies wissen. Würde ich wegen jedem Portscan eine Abuse-Meldung an den Provider des Urhebers senden, würde ich wahrscheinlich nichts anderes mehr tun. Aus meiner Erfahrung werden Abuse-Meldungen die mit Portscans zu tun haben, von den meisten Providern bzw. Hostern nicht weiter verfolgt. Technisch gesehen ist ein Portscan nichts weiter als ein Mechanismus, der an eine Tür klopft und auf eine Reaktion wartet. Er tritt nicht hinein, überwindet keine Schutzmaßnahmen und verändert keine Daten.
Die Möglichkeiten eines Portscanners möchte ich im Folgenden am Beispiel des bekannten Open Source Portscanners Nmap erläutern. Ich finde das Wissen über die Funktionsweise wichtig, denn nur wer die Methoden der "Angreifer" kennt, hat eine Chance, korrekt mit den Risiken umgehen und diese abwehren zu können.
Ein tieferer Blick in den Portscanner Nmap
Nmap ist ein Kommandozeilentool, es gibt jedoch zahlreiche graphische Oberflächen für das Tool. Nmap ist kein reiner Portscanner, sondern bietet zahlreiche weitere Features an:
- Versions-Erkennung - Nmap ist in der Lage, den Namen und meist auch die Version der Anwendung zu erkennen, die hinter einem Port auf Befehle wartet. Dies ist insbesondere nützlich, um darauf aufbauend Schwachstellen in den Services identifizieren zu können.
- Betriebssystem-Erkennung - Durch aktive Möglichkeiten oder passives "mithören" des Netzwerktraffics ist es durch eine Beobachtung diverser Reaktionsweisen des Systems möglich, mit einer gewissen Wahrscheinlichkeit ein Betriebssystem identifizieren zu können. Eine Möglichkeit wäre beispielsweise die Erkennung auf Basis einer Analyse der TCP/IP-Protokollstapel-Implementierung, denn Betriebssysteme haben meist eine unterschiedliche Implementierung des Protokollstapels.
- Der Portscanner Nmap beinhaltet die Nmap Scripting Engine (NSE), welche es unter anderem ermöglicht, zahlreiche Möglichkeiten automatisiert kombinieren zu können.
Ein kurzer Aufruf des Tools in der Konsole bietet eine Übersicht über die Funktionen:
testuser@testpc:~$ nmap Nmap 5.21 ( http://nmap.org ) Usage: nmap [Scan Type(s)] [Options] {target specification} TARGET SPECIFICATION: Can pass hostnames, IP addresses, networks, etc. Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254 -iL : Input from list of hosts/networks -iR : Choose random targets --exclude <host1[,host2][,host3],...>: Exclude hosts/networks --excludefile <exclude_file>: Exclude list from file HOST DISCOVERY: -sL: List Scan - simply list targets to scan -sP: Ping Scan - go no further than determining if host is online -PN: Treat all hosts as online -- skip host discovery -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes -PO[protocol list]: IP Protocol Ping -n/-R: Never do DNS resolution/Always resolve [default: sometimes] --dns-servers <serv1[,serv2],...>: Specify custom DNS servers --system-dns: Use OS's DNS resolver --traceroute: Trace hop path to each host SCAN TECHNIQUES: -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans -sU: UDP Scan -sN/sF/sX: TCP Null, FIN, and Xmas scans --scanflags : Customize TCP scan flags -sI : Idle scan -sY/sZ: SCTP INIT/COOKIE-ECHO scans -sO: IP protocol scan -b : FTP bounce scan PORT SPECIFICATION AND SCAN ORDER: -p : Only scan specified ports Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080 -F: Fast mode - Scan fewer ports than the default scan -r: Scan ports consecutively - don't randomize --top-ports : Scan most common ports --port-ratio : Scan ports more common than SERVICE/VERSION DETECTION: -sV: Probe open ports to determine service/version info --version-intensity : Set from 0 (light) to 9 (try all probes) --version-light: Limit to most likely probes (intensity 2) --version-all: Try every single probe (intensity 9) --version-trace: Show detailed version scan activity (for debugging) SCRIPT SCAN: -sC: equivalent to --script=default --script=: is a comma separated list of directories, script-files or script-categories --script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts --script-trace: Show all data sent and received --script-updatedb: Update the script database. OS DETECTION: -O: Enable OS detection --osscan-limit: Limit OS detection to promising targets --osscan-guess: Guess OS more aggressively TIMING AND PERFORMANCE: Options which take <time> are in milliseconds, unless you append 's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m). -T: Set timing template (higher is faster) --min-hostgroup/max-hostgroup : Parallel host scan group sizes --min-parallelism/max-parallelism <time>: Probe parallelization --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies probe round trip time. --max-retries : Caps number of port scan probe retransmissions. --host-timeout <time>: Give up on target after this long --scan-delay/--max-scan-delay <time>: Adjust delay between probes --min-rate : Send packets no slower than per second --max-rate : Send packets no faster than per second FIREWALL/IDS EVASION AND SPOOFING: -f; --mtu : fragment packets (optionally w/given MTU) -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys -S <IP_Address>: Spoof source address -e : Use specified interface -g/--source-port : Use given port number --data-length : Append random data to sent packets --ip-options : Send packets with specified ip options --ttl : Set IP time-to-live field --spoof-mac : Spoof your MAC address --badsum: Send packets with a bogus TCP/UDP/SCTP checksum --adler32: Use deprecated Adler32 instead of CRC32C for SCTP checksums OUTPUT: -oN/-oX/-oS/-oG : Output scan in normal, XML, s|and Grepable format, respectively, to the given filename. -oA : Output in the three major formats at once -v: Increase verbosity level (use twice or more for greater effect) -d[level]: Set or increase debugging level (Up to 9 is meaningful) --reason: Display the reason a port is in a particular state --open: Only show open (or possibly open) ports --packet-trace: Show all packets sent and received --iflist: Print host interfaces and routes (for debugging) --log-errors: Log errors/warnings to the normal-format output file --append-output: Append to rather than clobber specified output files --resume : Resume an aborted scan --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML --webxml: Reference stylesheet from Nmap.Org for more portable XML --no-stylesheet: Prevent associating of XSL stylesheet w/XML output MISC: -6: Enable IPv6 scanning -A: Enables OS detection and Version detection, Script scanning and Traceroute --datadir : Specify custom Nmap data file location --send-eth/--send-ip: Send using raw ethernet frames or IP packets --privileged: Assume that the user is fully privileged --unprivileged: Assume the user lacks raw socket privileges -V: Print version number -h: Print this help summary page
Um alle reservierten TCP-Ports auf einem Host (im Beispiel 192.168.0.1) zu scannen, ist folgendes Kommando notwendig:
# nmap -v 192.168.0.1
Ausgabe:
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-19 16:21 CEST Initiating Ping Scan at 16:21 Scanning 192.168.0.1 [4 ports] Completed Ping Scan at 16:21, 0.14s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 16:21 Completed Parallel DNS resolution of 1 host. at 16:21, 0.00s elapsed Initiating SYN Stealth Scan at 16:21 Scanning 192.168.0.1 [1000 ports] Discovered open port 80/tcp on 192.168.0.1 Discovered open port 8080/tcp on 192.168.0.1 Discovered open port 3306/tcp on 192.168.0.1 Completed SYN Stealth Scan at 16:21, 2.27s elapsed (1000 total ports) Nmap scan report for 192.168.0.1 Host is up (0.027s latency). Not shown: 997 closed ports PORT STATE SERVICE 80/tcp open http 3306/tcp open mysql 8080/tcp open http-proxy Read data files from: /usr/share/nmap Nmap done: 1 IP address (1 host up) scanned in 2.44 seconds Raw packets sent: 1013 (44.548KB) | Rcvd: 1001 (40.040KB)
Ein etwas "komplizierteres" Beispiel:
# nmap -p 1-65535 -T4 -A -v -PE -PS22,25,80 -PA21,23,80,3389 192.168.0.1
Hierbei wird versucht
- alle Ports (-p 1-65535) zu scannen,
- das Betriebssystem und die Serviceversionen festzustellen, einen Traceroute auf das System durchzuführen (-A) und
- die Nmap Ausgabe zu detaillieren (-v).
Die Ausgabe wäre auf unserem Beispielserver wie folgt:
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-19 16:27 CEST NSE: Loaded 36 scripts for scanning.
Nmap wurde gestartet.
Initiating Ping Scan at 16:27 Scanning 192.168.0.1 [8 ports] Completed Ping Scan at 16:27, 0.07s elapsed (1 total hosts)
Es wurde ein Ping Scan durchgeführt. Dieser wird häufig beim Scan großer Subnetze vorangestellt, um mögliche Ziele filtern zu können und sinnlose Scans zu vermeiden.
Initiating Parallel DNS resolution of 1 host. at 16:27 Completed Parallel DNS resolution of 1 host. at 16:27, 0.00s elapsed
Ein Reverse-DNS Lookup, um einen möglichen Hostname herauszufinden, in diesem Fall ohne Erfolg.
Initiating SYN Stealth Scan at 16:27 Scanning 192.168.0.1 [65535 ports] Discovered open port 8080/tcp on 192.168.0.1 Discovered open port 3306/tcp on 192.168.0.1 Discovered open port 80/tcp on 192.168.0.1 SYN Stealth Scan Timing: About 29.44% done; ETC: 16:28 (0:01:14 remaining) SYN Stealth Scan Timing: About 59.28% done; ETC: 16:28 (0:00:42 remaining) Discovered open port 6085/tcp on 192.168.0.1 Completed SYN Stealth Scan at 16:28, 103.47s elapsed (65535 total ports)
Es wurde ein SYN Stealth Scan durchgeführt, dies ist Standard, wenn der Nmap Prozess mit Administratorprivilegen bzw. root-Priviligen unter Linux läuft. Bei einem SYN Stealth Scan wird keine komplette TCP Verbindung aufgebaut, anders als beim Connect Scan. Es wird beim SYN Stealth Scan nur ein TCP-Paket mit SYN-Flag an den Ziel-Host gesendet, um einen Verbindungsversuch vorzutäuschen. Auf unserem Beispielserver wurden vier offene Ports identifiziert.
Initiating Service scan at 16:28 Scanning 4 services on 192.168.0.1 Completed Service scan at 16:30, 89.38s elapsed (4 services on 1 host)
In diesem Schritt wurde geprüft, welche Services auf den vier offenen Ports laufen könnten.
Initiating OS detection (try #1) against 192.168.0.1 Retrying OS detection (try #2) against 192.168.0.1 Retrying OS detection (try #3) against 192.168.0.1 Retrying OS detection (try #4) against 192.168.0.1 Retrying OS detection (try #5) against 192.168.0.1
Bei einer OS detection wurde versucht, unter anderem das Betriebssystem des Zielhosts zu ermitteln.
Initiating Traceroute at 16:30 Completed Traceroute at 16:30, 3.03s elapsed
Der Traceroute: Welchen Weg nimmt ein Paket zum Zielhost?
NSE: Script scanning 192.168.0.1. NSE: Starting runlevel 1 (of 1) scan. Initiating NSE at 16:30 Completed NSE at 16:30, 0.55s elapsed NSE: Script Scanning completed.
Es wurde ein vordefiniertes Script gegen einen Service ausgeführt, dazu später mehr.
Nmap scan report for 192.168.0.1 Host is up (0.026s latency).
Der Report: Nmap hat herausgefunden, das der Zielhost eingeschaltet ist.
Not shown: 65531 closed ports PORT STATE SERVICE VERSION 80/tcp open http? 3306/tcp open mysql MySQL 5.5.31-0ubuntu0.12.04.2 | mysql-info: Protocol: 10 | Version: 5.5.31-0ubuntu0.12.04.2 | Thread ID: 353 | Some Capabilities: Long Passwords, Connect with DB, Compress, ODBC, Transactions, Secure Connection | Status: Autocommit |_Salt: b;@n*$vG 6085/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.1 (protocol 2.0) | ssh-hostkey: 1024 b2:48:42:1a:14:b3:21:a9:c7:37:a9:14:9c:c8:1c:26 (DSA) |_2048 32:24:da:b3:23:17:8c:bb:7a:11:ad:26:a7:d5:14:5b (RSA) 8080/tcp open http-proxy? |_http-open-proxy: Proxy might be redirecting requests
Details zu den offenen Ports und den Services die dort laufen. In einem weiteren Schritt könnten beispielsweise Schwachstellen in der MySQL Version 5.5.31 oder in den Ubuntu Kernels der Reihe 12.04.02 gesucht werden.
In diesem Protokoll ausgelassen habe ich den (relativ langen) Finterprint des HTTP-Proxys und HTTP Servers. Eine ähnliche Ausgabe bietet beispielsweise der Betriebessystem Finterprint:
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ). TCP/IP fingerprint: OS:SCAN(V=5.21%D=7/19%OT=80%CT=1%CU=42593%PV=Y%DS=2%DC=T%G=Y%TM=51E94D90%P= OS:x86_64-unknown-linux-gnu)SEQ(SP=103%GCD=1%ISR=109%TI=Z%CI=Z%II=I%TS=8)OP OS:S(O1=M538ST11NW4%O2=M538ST11NW4%O3=M538NNT11NW4%O4=M538ST11NW4%O5=M538ST OS:11NW4%O6=M538ST11)WIN(W1=3890%W2=3890%W3=3890%W4=3890%W5=3890%W6=3890)EC OS:N(R=Y%DF=Y%T=40%W=3908%O=M538NNSNW4%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F= OS:AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5( OS:R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z% OS:F=R%O=%RD=0%Q=)T7(R=N)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G OS:%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)
Abschließend folgenden noch einige weitere Informationen und der Traceroute:
Uptime guess: 39.553 days (since Mon Jun 10 03:14:45 2013) Network Distance: 2 hops TCP Sequence Prediction: Difficulty=259 (Good luck!) IP ID Sequence Generation: All zeros Service Info: OS: Linux TRACEROUTE (using port 23/tcp) HOP RTT ADDRESS 1 ... 2 26.59 ms 192.168.0.1 Read data files from: /usr/share/nmap OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 208.28 seconds Raw packets sent: 66061 (2.911MB) | Rcvd: 65664 (2.630MB)
Soweit ein kurzer Abriss rund um Nmap, die Funktionen von Nmap sind weit umfangreicher als hier dargestellt. Ein Portscan ist also kein "Angriff" gegen ein System sondern eine Analyse der Informationen, die ein System den anderen Netzwerkteilnehmern bereitstellt. Eine weitere Möglichkeit eines Portscanners wäre es, Systeme hinter einem Router oder einer Firewall zu identifizieren, beispielsweise mit Hilfe einer von den Sender vorgegeben Route (Source Routing Attacke). Durch eine Abwandlung dieser Möglichkeit ist es beispielsweise auch möglich, die Absende-IP-Adresse zu fälschen und trotzdem die Ergebnisse eines Scanns erhalten zu können.
Viele Desktop-Firewalls zeigen Portscans als "erfolgreich abgewehrten Angriff" an, um den Nutzer ein subjektives Gefühl von Sicherheit zu vermitteln. Über den Sinn- und Unsinn von Desktopfirewalls gibt es zahlreiche Meinungen, ich werde das Thema in diesem BLOG in nächster Zeit ebenfalls einmal behandeln (Update: Artikel findet sich hier).
Bildnachweis:
- Beitragsbild: © Nmedia - Fotolia.com