it-swarm.com.de

Analysieren der nmap-Ausgabe

Ein Projekt, mit dem ich mich vertraut machen möchte, besteht darin, ein nmap-Ergebnis zu analysieren.

(Ich kenne die Option -oG, arbeite aber mit grep-, awk-, for- und while-Schleifen hier).

Ich versuche, Folgendes zu analysieren:

Starting Nmap 7.60 ( https://nmap.org ) at 2017-12-05 11:26 EST
Nmap scan report for house.router.nick (192.168.1.1)


Host is up (0.00059s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
53/tcp   open  domain
427/tcp  open  svrloc
1900/tcp open  upnp

MAC Address: 50:C7:BF:A8:CF:C8 (Tp-link Technologies)


Nmap scan report for 192.168.1.2


Host is up (0.00034s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
139/tcp   open  netbios-ssn
445/tcp   open  Microsoft-ds

MAC Address: 48:F8:B3:C9:AE:BB (Cisco-Linksys)

Was ich bekommen möchte, ist Folgendes:

22/ssh
====
192.168.1.1
192.168.1.2

http
===
192.168.1.2

Bisher habe ich Folgendes:

grep -E "tcp.*open" nmap.txt | awk '{ print $3 }' | sort | uniq

Für das Leben von mir kann ich nicht herausfinden, wie ich das in eine Art Schleife bringe und die gewünschte Ausgabe von oben bekomme.

Können Sie mir bitte helfen, zu lernen und zu erklären, warum Sie zu der Lösung gekommen sind, die Sie getan haben? Es macht keinen Sinn, eine mögliche Lösung zu finden, wenn ich die Logik dahinter nicht verstehe.

8
Nick

Sie sollten eine Allzweck-Programmiersprache (Python, Perl, awk) verwenden, in der Sie die IP-Adresse erfassen können, wenn Sie den "Scan-Bericht für" -Schlüsselwörter sehen, und dann eine Datenstruktur pflegen, die die Dienstnamen der Liste zuordnet von IP-Adressen, auf denen diese Dienste ausgeführt werden.

Bei dieser Ausgabe wird beispielsweise dieser Perl-Einzeiler (ohne Erläuterung angeboten)

Perl -ne '
    if (/Nmap scan report for .*?(\d+\.\d+\.\d+\.\d+)/) {
        $ip = $1
    }
    elsif (/^(\d+)\/tcp\s+open\s+(.*)/) {
        Push @{$services{"$1/$2"}}, $ip
    }
    END {
        for $svc (sort {$a <=> $b} keys %services) {
            printf "%s\n%s\n\n", $svc, join("\n", @{$services{$svc}})
        }
    }
'

produziert

22/ssh
192.168.1.1
192.168.1.2

53/domain
192.168.1.1

80/http
192.168.1.2

139/netbios-ssn
192.168.1.2

427/svrloc
192.168.1.1

445/Microsoft-ds
192.168.1.2

1900/upnp
192.168.1.1
5
glenn jackman
$ cat tst.awk
BEGIN { FS="[[:space:]/]+" }

/Nmap scan report/ {
    ip = $NF
    gsub(/[()]/,"",ip)
}

/tcp.*open/ {
    key = $1 "/" $4
    ips[key] = (key in ips ? ips[key] ORS : "") ip
}

END {
    for (key in ips) {
        print key
        print "===="
        print ips[key]
        print ""
    }
}

.

$ awk -f tst.awk file
80/http
====
192.168.1.2

1900/upnp
====
192.168.1.1

427/svrloc
====
192.168.1.1

445/Microsoft-ds
====
192.168.1.2

53/domain
====
192.168.1.1

22/ssh
====
192.168.1.1
192.168.1.2

139/netbios-ssn
====
192.168.1.2

Ich denke, es ist sehr offensichtlich, was es tut, aber wenn Sie nach ein paar Blicken auf die awk-Manpage noch Fragen haben, können Sie diese gerne stellen.

Das Obige funktioniert mit jedem awk in jeder Shell auf jedem UNIX-System.

1
Ed Morton