Patrón que coincide con campos de gnmap con SED

Patrón que coincide con campos de gnmap con SED

Estoy probando la expresión regular necesaria para crear extracción de campos con Splunk para nmap y creo que podría estar cerca...

Ejemplo de línea completa:

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

He utilizado el guión bajo "_" como delimitador porque lo hace un poco más fácil de leer.

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

La misma expresión regular con los caracteres de escape eliminados:

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

Producción:

... ... ...
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
... ... ...

Como puede ver, la coincidencia de patrones parece estar funcionando, aunque no puedo:

1: haga coincidir el patrón en ambos extremos de la línea (coma y blanco/espacio de tabulación). La última línea contiene texto no deseado (en este caso, la información de sincronización del sistema operativo y TCP). Un "O" booleano para los dos caracteres (coma y espacio en blanco) parece no coincidir.

...(\,|\s)

y

2 - elimine todos los datos innecesarios, es decir, imprima sólo el patrón coincidente. En realidad, está imprimiendo toda la línea. Si elimino el indicador sed -n, el contenido restante del archivo también se imprime. Parece que no puedo encontrar una manera de imprimir solo la expresión regular coincidente.

es decir, ¿por qué, cuando le digo explícitamente que no lo haga, sed imprime estas líneas? =>

Host: 10.0.0.1 (host) Ports:

y

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

Al ser bastante nuevo en sed y regex, ¡cualquier ayuda o sugerencia será muy apreciada!

Respuesta1

Primero, le animo a que consulte la salida XML de Nmap (disponible con la -oXbandera), que es el formato de salida legible por máquina oficialmente admitido. La salida Greppable ( -oGo .gnmap) está obsoleta y, por lo tanto, no incluye información útil de las funciones más nuevas de Nmap, como traceroute y scripts NSE.

Para responder a sus preguntas directamente,

  1. El problema al hacer coincidir una coma o un espacio está provocando errores porque |se debe utilizar el carácter de barra vertical alternante ( ), no la coma. Además, probablemente siempre desee hacer coincidir un carácter de espacio en blanco, pero solo a veces la coma. Así es como lo haría:

    ,\?\s
    

No estoy usando agrupación, ya que no hay alternancia (tubería "o").

  1. sedno está imprimiendo "líneas" que no desea, está imprimiendo el espacio del patrón.La página de información del sed.explica cómo funciona sed y es una gran referencia para escribir scripts sed. Básicamente tienes 2 espacios para trabajar y sed imprimirá todo el contenido del espacio del patrón cuando uses el pcomando.

Como ejemplo de cómo podría hacer esto, aquí está mi opinión sobre un script sed para imprimir solo la información del puerto de un .gnmaparchivo:

#!/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

Todos juntos en una línea, se vería así:

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

Tenga en cuenta también que no puede contar con que algunos de los campos de la especificación del puerto estén siempre vacíos. Si la detección de versión se realizó en un servicio RPC, por ejemplo, se completará el campo de información SunRPC.

información relacionada