Parse (grepable) output nmap per stampare un elenco di IP \ t [tutte le porte aperte] con utilità di testo come awk


4

Vorrei trovare un modo per stampare per ogni indirizzo IP trovato avere almeno una porta aperta, per stampare quell'indirizzo IP, seguito da un elenco di porte aperte separate da virgole. Le porte e l'indirizzo IP devono essere separati da un delimitatore di tabulazione.

Posso farlo in modo brutto, trascinando solo l'indirizzo IP, scrivendolo su file, quindi riaccompagnando il file nmap usando il file dei risultati dell'indirizzo IP come file di input, quindi tagliando le porte aperte con cut e sed, scrivendolo su un file e quindi unendo entrambi i file. Questo è un processo brutto e non funziona in modo affidabile per situazioni marginali.

C'è un modo semplice per farlo in una riga con awk? Penserei che avrei bisogno di avere una funzione in awk per trovare tutte le porte aperte e restituirle in modo che possano essere stampate insieme all'indirizzo IP, ma non ho trovato il modo di farlo.

Dati sorgente di esempio:

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

Dati di output previsti:

10.0.0.101    139,445

Non so che la modifica del titolo aggiunga chiarezza, poiché l'output nmap visualizzabile è l'unico file di output adatto a questo tipo di elaborazione del testo. Ciò potrebbe essere menzionato nella domanda forse.
Jason Kidd l'

"Questo tipo di elaborazione del testo" si chiama "analisi", ecco perché ho aggiunto la parola "Parse" nel titolo per renderla più intuitiva per la ricerca.
Alex Stragies,

Risposte:


2

Questo awkprogramma dovrebbe farlo:

$ 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

Prima di modificare la tua domanda, avevo ipotizzato che il tuo output sarebbe stato dalla shell nmap, quindi avevo preparato questa risposta:

$ 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 hai bisogno di spiegazioni per loro, lascia un commento. Se puoi aiutare a eliminare le chiamate sed finali o a migliorare una delle invocazioni, modifica.


Il secondo frammento dàawk: line 3: syntax error at or near [ awk: line 11: syntax error at or near [
Suncatcher il

@Suncatcher: l'ho appena provato qui sull'antico awk Debian, e funziona. Il problema deve essere dalla tua parte.
Alex Stragies,

No, dà errore sulla parentesi quadra. La mia versione di nmap è 7.01, sembra che abbiano cambiato il formato di output. Comunque, ho creato un parser più conciso
Suncatcher il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.