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