DNS Reverse Lookup mit multiplen IP Adressen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
silenzer
User
Beiträge: 2
Registriert: Dienstag 15. März 2022, 15:15

Hallo Zusammen!

Ich bräuchte etwas hilfe bei meiner Umsetzung. Ich google jetzt schon seit Stunden und komme einfach nicht weiter und hoffe hier den richtigen anstoß zu finden.

Folgendes Szenario:

Ich habe mir auf FreeBSD mit der Shell das folgende kleine Script zusammen gebastelt:

Code: Alles auswählen

#!/bin/sh

#lösche Verzeichnis falls bereits vorhanden

if [-e verzeichnis.txt]: then
	sudo rm verzeichnis.txt
fi

for net in $(seq 196 199)
do
        for loct in $(seq 1 254)
        do
                name="$(drill -x 192.168.${net}.${loct} | grep -A1 "ANSWER" | tail -n1 | awk '{print $5}' | cut -d'.' -f 1)"
                if ! [ "${name}" = "" ]; then
			printf "Hostname: $name\n IP Adresse: 192.168.${net}.${loct}\n" >> verzeichnis.txt
                fi
        done
done
Mit diesem Script lasse ich mir auf den Adressbereichen 192.168.196.X, 192.168.197.X, 192.168.198.X & 192.168.199.X alle Hostname in einem kleinen Textfile ausgeben von IP Adressen die in diesem Bereich aufgelöst werden können.

Dieses Script wollte ich mir nun in Python "übersetzen" da ich anschließend einträge in Redmine via Python Script machen möchte. Leider bin ich mit der Sprache noch nicht bewandert und habe mich nun Stunden ohne wirklichen Erfolg daran versucht mein bisheriges Werk zumindest mal zu übesetzen bevor ich an der neuen Lösung arbeiten kann.

Folgendes ist bisher dabei herumgekommen. Bis zur Definition von Destination läuft alles so wie gehabt, allerdings scheitert es dann mit einem unkown host.

Bei meiner googlelei stoße ich immer auf socket.gethostbyaddr also dachte ich mir, das sollte mein drill von der unix bash ersetzen und habe mich darauf gestürzt. Leider sind so gut wie alle stackoverflow oder python beispiel codes darauf ausgelegt, beim Aufruf des Python scripts eine IP Adresse zu übergeben. Da ich das ganze aber automatisiert machen möchte über 4 komplette Netzbereiche, wirkt das ganze hier etwas ausladend.

Den Teil mit in Datei schreiben habe ich bewusst außen vorgelassen.

Code: Alles auswählen

import socket

for net in range(196, 198):
   # print(net)
    for host in range(0, 255):
       
	#print(host)
        network = ("192.168."+str(net))
        destination = network+"."+str(host)
        #print(destination)
        hostname = socket.gethostbyaddr(destination)
			
			if hostname is not None:
			   print('IP: ', destination, '\n\' 'Hostname: ', hostname)
			   
Ich hoffe es ist einigermaßen Verständlich für euch.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Eingerückt wird in Python mit 4 Leerzeichen.
Aus

Code: Alles auswählen

network = ("192.168."+str(net))
destination = network+"."+str(host)
wird

Code: Alles auswählen

destination = f"192.168.{net}.{host}"
Was genau ist denn dein Problem? Du übergibst doch eine IP-Adresse? Genau wie gefordert.
Oder gibt es die Adresse, die du Ansprechen willst gar nicht im Netz und du bekommst deshalb eine Ausnahme? Dann müsstest du einen entsprechenden Traceback bekommen, den du auch immer zeigen solltest. Sollte dem so sein, solltest du über "try" und "except" lesen und so lernen, wie man Exceptions "fängt" und abarbeitet.
silenzer
User
Beiträge: 2
Registriert: Dienstag 15. März 2022, 15:15

sparrow hat geschrieben: Dienstag 15. März 2022, 16:31 Was genau ist denn dein Problem? Du übergibst doch eine IP-Adresse? Genau wie gefordert.
Oder gibt es die Adresse, die du Ansprechen willst gar nicht im Netz und du bekommst deshalb eine Ausnahme? Dann müsstest du einen entsprechenden Traceback bekommen, den du auch immer zeigen solltest. Sollte dem so sein, solltest du über "try" und "except" lesen und so lernen, wie man Exceptions "fängt" und abarbeitet.
Das script bircht im einem Unkown host ab. Sollte eine Adresse nicht aufgelöst werden, soll er nichts machen (ignorieren), außer die Schleife einfach bis zum Ende auszuführen und für alle weiteren Adressen den Namen weiter versuchen aufzulösen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

In dem Fall musst du mit einem try/except mit der passenden Exception diesen Fehler abfangen, und damit ignorieren.
imonbln
User
Beiträge: 191
Registriert: Freitag 3. Dezember 2021, 17:07

Mein Vorschlag ist, das Script etwas generischer zu machen, zum Beispiel kannst du mit der Funktion ipaddress.ip_network('192.168.96.0/22') dir die Netrange erzeugen lassen, das könnte sogar in mit IPv6 umgehen, falls gewünscht. Insgesamt würde dann ungefähr das rauskommen.

Code: Alles auswählen

for ip in ipaddress.ip_network('192.168.96.0/22'):        
    with contextlib.suppress(socket.herror):                                                                           
        hostname, _, _ = socket.gethostbyaddr(str(ip))                                                                 
        print(f'IP: {ip:15s} Hostname: {hostname}')       
Benutzeravatar
DeaD_EyE
User
Beiträge: 1244
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Damit kann man unter anderem seine Nachbarn ausspionieren.
Welcher Server davon meiner ist, verrate ich nicht.
Das ist z.B. ein IP-Bereich des Hosters Hetzner (ist ein guter Hoster).

Code: Alles auswählen

from ipaddress import ip_network
from socket import gethostbyaddr, herror
from contextlib import suppress


for ip in ip_network("5.9.0.0/16"):
    with suppress(herror):
        name, *_ = gethostbyaddr(str(ip))
        if name.startswith("static"):
            continue
        print(ip, name)
Alle PTR Einträge mit static werden von Hetzner automatisch vergeben. Einträge, die anders beginnen, sind dann von dem Serveradmin über das Webinterface festgelegt worden.

PS: Wenn man Unbound als Resolver nutzt, bekommt der ISP vom Scan nichts mit, da die entsprechenden Nameserver rekursiv abgefragt werden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten