Analisar (grepable) a saída do nmap para imprimir uma lista de IP \ t [todas as portas abertas] com utilitários de texto como o awk

4

Eu gostaria de encontrar uma maneira de imprimir para cada endereço IP encontrado para ter pelo menos uma porta aberta, para imprimir esse endereço IP, seguido por uma lista de portas abertas separadas por vírgulas. As portas e o endereço IP devem ser separados por um delimitador de tabulação.

Eu posso fazer isso de uma forma feia, usando apenas o endereço IP, escrevendo isso para o arquivo, depois voltando ao arquivo nmap usando o arquivo de resultado do endereço IP como o arquivo de entrada e aparando as portas abertas com o corte e sed, escrevendo isso para arquivar e juntando os dois arquivos. Este é um processo feio e não funciona de forma confiável em situações periféricas.

Existe uma maneira fácil de fazer isso em uma linha com o awk? Eu acho que precisaria ter uma função no awk para encontrar todas as portas abertas e retorná-las para que pudessem ser impressas junto com o endereço IP, mas não encontrei como fazer isso.

Exemplo de dados de origem:

Host: 10.0.0.101 ()Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///, 23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 53/closed/tcp//domain///, 110/closed/tcp//pop3///, 139/open/tcp//netbios-ssn///, 143/closed/tcp//imap///, 445/open/tcp//microsoft-ds///, 3389/closed/tcp//ms-wbt-server///

Dados de saída esperados:

10.0.0.101    139,445
    
por Jason Kidd 10.07.2016 / 19:33

1 resposta

3

Este programa awk deve fazê-lo:

$ echo "Host: 10.0.0.101 ()Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///, 23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 53/closed/tcp//domain///, 110/closed/tcp//pop3///, 139/open/tcp//netbios-ssn///, 143/closed/tcp//imap///, 445/open/tcp//microsoft-ds///, 3389/closed/tcp//ms-wbt-server///" |
awk '{printf "%s\t", $2;
      for (i=4;i<=NF;i++) {
        split($i,a,"/");
        if (a[2]=="open") printf ",%s",a[1];}
      print ""}' |
sed -e 's/,//'

10.0.0.101  139,445

Antes de você editar sua pergunta, eu supus, sua saída seria do shell nmap , então eu preparei esta resposta:

$ nmap -sT 127.0.0.1-3 |
  awk '/^Nmap scan report/{cHost=$5;}
       /open/ { split($1,a,"/"); result[cHost][a[1]]=""}
       END {
       for (i in result) {
         printf i;
         for (j in result[i])
           printf ",%s", j ;
         print ""} }' |
  sed -e 's/,/\t/'   

localhost   445,25,139,631,22,80
127.0.0.2   445,139,22,80
127.0.0.3   445,139,22,80

Se você precisar de explicações para eles, deixe um comentário. Se você puder ajudar a eliminar as chamadas sed seguidas ou melhorar qualquer uma das invocações, edite.

    
por 10.07.2016 / 23:25