Freitag, 29. August 2008

entwickler.com Magazine Konferenzen Entwickler Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag

Portscanner Marke Eigenbau

Portscanner gehören in den Werkzeugkasten eines Administrators. Aber wozu sind solche Programme gut? Nun, sie helfen beispielsweise, das eigene System besser zu schützen sowie Fehler im Netzwerk aufzudecken. Ein sehr bekannter Portscanner ist nmap [1].
Wenn Sie die Arbeitsweise eines Scanners verstehen möchten, ist es am besten, selbst ein solches Programm zu schreiben. Die grundsätzliche Vorgehensweise ist für die meisten Sprachen ähnlich (diese Aussage gilt vor allem für Java, PHP, Ruby, Python und C). Der Beitrag verwendet die Highlevel-Sprache Python. Hier sehen Sie den Code, die Erklärungen folgen unten:


#!/usr/bin/env python
import sys
import socket as SK

def scan(remote, port=1, stop=3306):
RES = []
print '\nOffene Ports auf Rechner -> %s' % (remote)
while (port <= stop):
try:
sock = SK.socket(SK.AF_INET, SK.SOCK_STREAM) # tcp socket
sock.connect((remote, port))
except (SK.error, SK.gaierror), ex:
if isinstance(ex, SK.gaierror):
print '\nRechner unbekannt!\n'
sys.exit(1)
sock.close()
port += 1
else:
RES.append(port)
port += 1
sock.close()
return RES

def port_to_serv(FP, port, proto='tcp'):
RES = ''
for line in FP:
if port in line and proto in line:
RES = line.split()[0]
break
return RES

if __name__ == '__main__':
FP = open('/etc/services', 'r')
RES = scan(sys.argv[1])
for port in RES:
print '%6d /tcp \t%s' % (port, port_to_serv(FP, str(port)))
FP.close()

Es werden zwei Funktionen erstellt: scan() und port_to_serv(). Die Funktion scan() erzeugt das Socket-Objekt (ein Socket, auch Kommunikationsendpunkt genannt, besteht aus einer IP und einer Portnummer). Danach versucht das Socket-Objekt mit Hilfe von connect(), eine Verbindung zum Server herzustellen. Schlägt der Versuch fehl, wird eine Ausnahme „geworfen“ (vom Typ SK.error). Geben Sie auf der Kommandozeile einen unbekannten Rechner an, wird ebenfalls eine Ausnahme generiert – diesmal vom Typ SK.gaierror (das Programm beendet sich danach).
Kann eine Verbindung hergestellt werden, wird der Zähler (die Variable port in der while-Schleife) um eins erhöht. In der Liste RES befinden sich dann als Ergebnis die offenen Portnummern. Und das war es schon.
Die Funktion port_to_serv() ordnet den Portnummern die Dienste zu (wie ssh für Port 22). Das Programm wird auf der Kommandozeile folgendermaßen aufgerufen:

[ich@localhost ] python scan.py localhost

Viel Spass.

Thomas Kaufmann

[1] nmap: http://www.insecure.org/







Software & Support Verlag GmbH