Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03257.jsonl.gz/151

MITRE ATT&CK
Marc Ruef
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 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 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
Unsere Spezialisten kontaktieren Sie gern!
Weitere Artikel im Archiv