Musterabgleich von gnmap-Feldern mit SED

Musterabgleich von gnmap-Feldern mit SED

Ich teste den für die Erstellung der Feldextraktion erforderlichen regulären Ausdruck mit Splunk für nmap und glaube, dass ich nah dran bin ...

Beispiel vollständige Zeile:

Host: 10.0.0.1 (host)   Ports: 21/open|filtered/tcp//ftp///, 22/open/tcp//ssh//OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)/, 23/closed/tcp//telnet///, 80/open/tcp//http//Apache httpd 2.2.22 ((Ubuntu))/,  10000/closed/tcp//snet-sensor-mgmt///  OS: Linux 2.6.32 - 3.2  Seq Index: 257  IP ID Seq: All zeros

Ich habe den Unterstrich „_“ als Trennzeichen verwendet, da dies die Lesbarkeit etwas erleichtert.

root@host:/# sed -n -e 's_\([0-9]\{1,5\}\/[^/]*\/[^/]*\/\/[^/]*\/\/[^/]*\/.\)_\n\1_pg' filename

Derselbe reguläre Ausdruck ohne Escape-Zeichen:

root@host:/# sed -n -e 's_\([0-9]\{1,5\}/[^/]*/[^/]*//[^/]*//[^/]*/.\)_\n\1_pg' filename

Ausgabe:

... ... ...
Host: 10.0.0.1 (host)   Ports: 
21/open|filtered/tcp//ftp///, 
22/open/tcp//ssh//OpenSSH 2.0p1 Debian 2ubuntu1 (protocol 2.0)/, 
23/closed/tcp//telnet///, 
80/open/tcp//http//Apache httpd 5.4.32 ((Ubuntu))/, 
10000/closed/tcp//snet-sensor-mgmt///   OS: Linux 9.8.76 - 7.3  Seq Index: 257 IPID Seq: All zeros
... ... ...

Wie Sie sehen, scheint die Musterübereinstimmung zu funktionieren. Folgendes gelingt mir allerdings nicht:

1 - Muster an beiden Zeilenenden (Komma und Leerzeichen/Tabulatorzeichen) abgleichen. Die letzte Zeile enthält unerwünschten Text (in diesem Fall die OS- und TCP-Zeitinformationen). Ein Boolesches „ODER“ für die beiden Zeichen (Komma und Leerzeichen) scheint nicht zuzutreffen.

...(\,|\s)

Und

2 - Entfernen Sie alle unnötigen Daten, d. h. drucken Sie nur das passende Muster. Es wird tatsächlich die ganze Zeile gedruckt. Wenn ich das Flag sed -n entferne, wird auch der verbleibende Dateiinhalt gedruckt. Ich kann anscheinend keine Möglichkeit finden, nur den passenden regulären Ausdruck zu drucken.

dh warum druckt sed diese Zeilen, wenn ich es ausdrücklich nicht anweise? =>

Host: 10.0.0.1 (host) Ports:

Und

OS: Linux 2.6.32 - 3.2  Seq Index: 257  IP ID Seq: All zeros

Da ich mit sed und Regex noch relativ neu bin, bin ich für jede Hilfe und jeden Hinweis sehr dankbar!

Antwort1

Zunächst möchte ich Sie dazu ermutigen, sich die XML-Ausgabe von Nmap anzusehen (verfügbar mit dem -oXFlag). Dabei handelt es sich um das offiziell unterstützte maschinenlesbare Ausgabeformat. Die greppbare ( -oGoder .gnmap) Ausgabe ist veraltet und enthält daher keine hilfreichen Informationen aus neueren Funktionen von Nmap wie Traceroute und NSE-Skripten.

Um Ihre Fragen direkt zu beantworten,

  1. Das Problem beim Abgleichen von Kommas oder Leerzeichen verursacht Fehler, da das alternierende Pipe-Zeichen ( |) maskiert werden muss, nicht das Komma. Außerdem möchten Sie wahrscheinlich immer ein Leerzeichen abgleichen, aber nur manchmal das Komma. So würde ich das machen:

    ,\?\s
    

Ich verwende keine Gruppierung, da keine Abwechslung (oder „Pipe“) vorliegt.

  1. seddruckt keine „Zeilen“, die Sie nicht möchten, sondern den Musterbereich.Die Sed-Infoseiteerklärt, wie sed funktioniert, und ist eine hervorragende Referenz zum Schreiben von sed-Skripten. Sie haben im Wesentlichen 2 Leerzeichen zum Arbeiten, und sed druckt den gesamten Inhalt des Musterbereichs, wenn Sie den pBefehl verwenden.

Als Beispiel, wie Sie dabei vorgehen könnten, ist hier meine Version eines Sed-Skripts zum Drucken nur der Portinformationen aus einer .gnmapDatei:

#!/usr/bin/sed -n 

#First, strip the beginning (Host and Ports labels) off
s/.*Ports: //

#Now match a port entry, consuming the optional comma and whitespace
#The comma and whitespace are replaced with a newline
s_\([0-9]\{1,5\}/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/\),\?\s_\1\n_

#If we made a successful substitution, jump to :matched, 
t matched
#otherwise skip to the next input line
d

:matched
#Print the pattern space up to the first newline
P
#Then delete up to the first newline and start over with what's left
D

Alles zusammen in einer Zeile sähe das dann etwa so aus:

sed -n -e 's/.*Ports: //;s_\([0-9]\{1,5\}/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/\),\?\s_\1\n_;t matched;d;:matched;P;D' file.gnmap

Beachten Sie auch, dass Sie sich nicht darauf verlassen können, dass einige Felder in der Portspezifikation immer leer bleiben. Wenn beispielsweise die Versionserkennung für einen RPC-Dienst durchgeführt wurde, wird das SunRPC-Infofeld ausgefüllt.

verwandte Informationen