Sie wollen mehr?
Weitere Artikel im Archiv

In den bisherigen Teilen dieser Schriftenreihe haben wir uns ausschliesslich auf die Entwicklung von sogenannten portrules konzentriert. Diese definieren, bei welchen Port-Konstellationen ein NSE-Skript ausgeführt wird. Dieses kann pro Host n mal ausgeführt werden, wobei eine maximale Ausführung pro Port auf 1 festgelegt ist.
In siebten Teil werden wir nun sogenannte hostrule-Skripte anschauen. Damit wird die Grundlage für Skripte geschaffen, die unabhängig von Ports ausgeführt werden. Stattdessen werden diese je nach Konstellation eines Hosts und damit maximal 1 mal pro Zielsystem, ausgeführt. Es gibt eine Reihe von Möglichkeiten, die sich mit einem hostrule-Skript erschliessen. Damit werden breitflächige Analysen von Hosts und deren Funktionen möglich:
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 lässt. Zum Beispiel könnten sämtliche Systeme, die im letzten Oktett der IP-Adresse die Zahl 1 haben, angegangen werden. Die meisten hostrule-Skripte werden jedoch in jedem Fall ausgeführt, weshalb wir in unserem Beispiel ebenfalls stets true zurückliefern werden:
hostrule = function(host, port) return true end
Danach wird, wie wir dies schon von den Skripten mit portrule gewohnt sind, die entsprechende Action-Funktion ausgeführt. Unser Skript soll sämtliche Ports des Portscans durchgehen und die als offen deklarierten Ports dokumentieren. Hierzu wird in einer for-Schleife sämtliche möglichen Ports durchgegangen.
Um auf die generischen Daten zurückzugreifen, 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 für 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
endWie 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 durchläuft sämtliche Ports von 1 bis 65535, dann kann explizit nur für die beiden Ports 80 und 443 ein konkreter Status ermittelt werden.
In dieser siebenteiligen Artikelserie haben wir die Möglichkeiten 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 durchgesetzt werden kann. Damit lässt sich nmap zu einem vollumfänglichen Vulnerability Scanner erweitern.
Unsere Spezialisten kontaktieren Sie gern!

Marc Ruef

Marc Ruef

Marc Ruef

Marc Ruef
Unsere Spezialisten kontaktieren Sie gern!