Padrão correspondente aos campos do gnmap com o SED

0

Estou testando o regex necessário para criar extração de campo com o Splunk para nmap e acho que posso estar perto ...

Exemplo de linha 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

Eu usei o sublinhado "_" como delimitador porque facilita a leitura.

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

O mesmo regex com os caracteres de escape removidos:

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

Saída:

... ... ...
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 você pode ver, a correspondência de padrões parece estar funcionando, embora eu não possa:

1 - corresponde ao padrão no final da linha (vírgula e branco / tabspace). A última linha contém texto indesejado (neste caso, as informações de tempo do sistema operacional e TCP). Um booleano "OR" para os dois caracteres (vírgula e espaço em branco) parece não corresponder.

...(\,|\s)

e

2 - remova qualquer um dos dados desnecessários - ou seja, imprima apenas o padrão correspondente. Na verdade, está imprimindo toda a linha. Se eu remover a sinalização sed -n, o conteúdo restante do arquivo também será impresso. Não consigo localizar uma maneira de imprimir apenas o regex correspondente.

por exemplo, quando digo explicitamente que não, é sed imprimir essas linhas? = >

Host: 10.0.0.1 (host) Ports:

e

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

Sendo bastante novo para sed e regex, qualquer ajuda ou ponteiros é muito apreciada!

    
por Ovid 31.05.2012 / 04:55

1 resposta

0

Primeiramente, eu gostaria de encorajá-lo a examinar a saída XML do Nmap (disponível com o -oX flag), que é o formato de saída legível por máquina oficialmente suportado. A saída Greppable ( -oG ou .gnmap ) está obsoleta e, portanto, não inclui informações úteis de recursos mais novos do Nmap, como scripts traceroute e NSE.

Para responder às suas perguntas diretamente,

  1. o problema de corresponder uma vírgula ou um espaço está causando erros porque o caractere de barra de alternância ( | ) deve ter o escape, não a vírgula. Além disso, você provavelmente sempre deseja corresponder a um caractere de espaço em branco, mas apenas às vezes a vírgula. É assim que eu faria isso:

    ,\?\s
    

Eu não estou usando o agrupamento, já que não há alternação ("ou" pipe).

  1. sed não está imprimindo "linhas" que você não quer, está imprimindo o espaço do padrão. A página de informações do sed explica como o sed funciona e é uma ótima referência para escrever scripts sed. Você essencialmente tem 2 espaços para trabalhar, e sed imprimirá todo o conteúdo do espaço de padrão quando você usar o comando p .

Como um exemplo de como você pode fazer isso, aqui está minha opinião sobre um script sed para imprimir apenas as informações da porta de um arquivo .gnmap :

#!/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_\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 em uma linha, seriam parecidos com isto:

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

Note também que você não pode contar com alguns dos campos na especificação da porta para estar sempre vazio. Se a detecção de versão foi feita em um serviço RPC, por exemplo, o campo de informações do SunRPC será preenchido.

    
por 27.06.2012 / 18:54

Tags