Mit Hilfe des Tools nmap ist ein gezielter Scan von vorliegenden Systemen im eigenen Netzwerk möglich. Zur Verbesserung der Geschwindkeit, werden die zu scannenden Ports auf die sinnvollen reduziert um anschließend nach erfolgter Filterung über eine SNMP-Abfrage und der OID: 1.3.6.1.2.1.43.5.1.1.17.1 die Seriennummer abzufragen.

Zur Nutzung dieses Beispiels verwende ich ein Linux mit Debian 6 und die Pakete für snmp und nmap. Die Installation erfolgte als root mit dem Befehl:

  • apt-get install nmap snmp

In diesem Beispiel wird als Voraussetzung eine gleiche Konfiguration der SNMP-Einstellungen am Drucker vorausgesetzt. Im Standard ist oft SNMP aktiviert, die verwendete Version ist meist 2c und der Community-Name ist public.

Von Druckern und teilweise Druckservern werden die folgenden Ports verwendet:

  • 515: LPR/LPD-Port – wird vorwiegend von älteren Druckermodellen verwendet
  • 631: IPP-Port – wird häufig von modernen und auf CUPS-basierenden Druckern verwendet
  • 9100: RAW-Port / direct-IP

Zur Ermittlung von Druckern und Druckserver kann nun der Befehl für ein Teilnetz (Beispiel: 192.168.12.1 bis 192.168.12.254) wie folgt verwendet werden:

nmap -p 515,631,9100 -oG - 192.168.12.0/24 | grep 'Ports:' | grep '631/open\|515/open\|9100/open'

verwendet werden. Die Ausgabe sieht ähnlich der folgenden aus:

  • Host: 192.168.12.10 ()     Ports: 515/open/tcp//printer///, 631/closed/tcp//ipp///, 9100/open/tcp//jetdirect///

Zum nmap-Befehl folgende Informationen:

  • -p 515,631,9100 legt die zu scannenden Ports fest
  • -oG steuert die Ausgabe zur späteren Nutzung von grep
  • 192.168.12.0/24 ist der scannende IP-Bereich. Kann hierbei auch mit Leerzeichen getrennt weitere IP-Bereiche umfassen oder auch einzelne IP-Adressen wie 192.168.12.10
  • | grep ‚Ports:‘ reduziert die Ausgabe auf die Zeilen auf den String Ports:
  • | grep ‚631/open\|515/open\|9100/open‘ reduziert die Ausgabe auf die Zeilen, wo mindesten einer der Ports verwendet wird. \| wird hierbei als logisches ODER verwendet.

In der aktuell bestehenden Variante werden jedoch auch Server mit den entsprechend verwendeten Ports aufgeführt. Zusätzlich sollen nur die IPs und auch nur in Frage kommende Drucker, ausgegeben werden. Zur Reduzierung hilft uns folgende Variante:

nmap -p 445,515,631,901,9100 -oG - 192.168.12.0/24 | grep 'Ports:' | grep -v '445/open' | grep -v '901/open' | grep '631/open\|515/open\|9100/open' | awk '{print $2}'

Die zusätzlichen Ports sind:

  • 445: microsoft-ds
  • 901: samba-swat

Durch | grep -v ‚139/open‘ | grep -v ‚445/open‘ | grep -v ‚901/open‘ wird die Ausgabe um die Systeme reduziert, die mindestens einen der entsprechende Ports aktiv haben. Mit | awk ‚{print $2}‘ wird die Ausgabe auf die IP reduziert.

Damit jetzt die Seriennummer gelesen wird, müssen wir für die jeweils ausgegebene IP den Befehl für den snmpwalk wie folgt verwenden:

snmpwalk -c public -v 2c 192.168.12.10 iso.3.6.1.2.1.43.5.1.1.17.1
Als Ergebnis erhalten wir ähnlich folgende Zeile
iso.3.6.1.2.1.43.5.1.1.17.1 = STRING: "39127xxxxx"

Unter Vorgabe, dass das Ergebnis lesbar ist, soll nur noch die Seriennummer ohne die Anführungszeichen, ausgegeben werden.

snmpwalk -c public -v 2c 192.168.12.10 iso.3.6.1.2.1.43.5.1.1.17.1 | awk '{print $4}' | sed 's/^"\(.*\)"$/\1/'

Ergebnis:

39127xxxxx

Zum snmpwalk-Befehl folgende Informationen:

  • -c: Namen der Community
  • -v: die zu verwendente Version (1, 2c, 3 …)
  • die IP-Adresse und die entsprechende OID für die Seriennummer

Mit | awk ‚{print $4}‘ wird die Ausgabe auf die Seriennummer in Anführungszeichen reduziert und mit | sed ’s/^“\(.*\)“$/\1/‘ werden das erste und letzte Anführungszeichen entfernt.

Jetzt noch alles in einen Befehl übergeben:

nmap -p 445,515,631,901,9100 -oG - 192.168.12.0/24 | grep 'Ports:' | grep -v '445/open' | grep -v '901/open' | grep '631/open\|515/open\|9100/open' | awk '{print $2}' | xargs -i@ snmpwalk -c public -v 2c @ iso.3.6.1.2.1.43.5.1.1.17.1 | awk '{print $4}' | sed 's/^"\(.*\)"$/\1/'

Mit xargs wird die Ausgabe an einen weiteren Befehl übergeben. Die Besonderheit ist jetzt, dass beim Befehl snmpwalk die Position für die IP nicht am Ende des Befehls angefügt wird. Daher muss die Ausgabe im nachfolgenden Befehl festgelegt werden. Dies erfolgt durch den xargs-Parameter: -i und dem Platzhalter @:

... | xargs -i@ snmpwalk -c public -v 2c @ iso.3.6.1.2.1.43.5.1.1.17.1

Epilog:

Durch den hier aufgeführten Befehl ist es für mich, über mehrere Standorte und durch Verwendung von mehreren Teilnetzwerken im Befehl, möglich, von sehr vielen Druckern die Seriennummern zu erfassen. Natürlich gibt es auch hier Abweichungen, die jedoch, bei abweichender Community und/oder Version erneut nach Befehlsanpassungen und der gezielten Ausgabe in eine Datei, ich die Werte ohne Probleme vereinen kann. Bei Druckern mit fehlender Unterstützung gibt es ggf. die Möglichkeit via wget und der entsprechenden Drucker-Seite, die Seriennummer zu erfassen. Bei ggf abweichender OID für die Seriennummer, was mir derzeit nicht bekannt ist, kann am Beispiel mit bekannter Seriennummer, Community-Name und SNMP-Version die OID wie folgt ermittelt werden:

snmpwalk -c public -v 2c 192.168.12.10 | grep '39127xxxxx'
Ergebnis: iso.3.6.1.2.1.43.5.1.1.17.1 = STRING: "39127xxxxx"

Zusätzlich kann es vorkommen, dass die Ausgabe von nmap, mit mehr als 1024 abgefragten Elementen, nicht vollständig ist. Hier hilft ggf folgende Lösung:

sh -c 'echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh3'

Die Verwendung dieses Befehls erfolgt auf eigene Gefahr!

Nachtrag:

Nach einer Vielzahl von Tests habe ich den Befehl zu folgenden verändert.

nmap -p 445,515,631,901,5900,6000,9100,10010 -oG - 192.168.12.0/24 | grep 'Ports:' | grep -v '445/open' | grep -v '901/open' | grep -v '6000/open' | grep -v '5900/open' | grep -v '10010/open'| grep '631/open\|515/open\|9100/open' | awk '{print $2}' | xargs -i@ snmpwalk -c public -v 2c @ iso.3.6.1.2.1.43.5.1.1.17.1 | awk '{print $4}' | sed 's/^"\(.*\)"$/\1/'

Folgende OIDs enthalten je nach Hersteller die Information für die Seriennummer (ggf unvollständig):

  • iso.3.6.1.2.1.43.5.1.1.17.1
  • iso.3.6.1.4.1.1248.1.2.2.1.1.1.5.1
  • iso.3.6.1.4.1.2435.2.3.9.4.2.1.5.5.1.0
  • iso.3.6.1.4.1.2001.1.1.1.1.11.1.10.45.0