Seite 1 von 1

DNS Reverse Lookup mit multiplen IP Adressen

Verfasst: Dienstag 15. März 2022, 15:44
von silenzer
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.

Re: DNS Reverse Lookup mit multiplen IP Adressen

Verfasst: Dienstag 15. März 2022, 16:31
von sparrow
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.

Re: DNS Reverse Lookup mit multiplen IP Adressen

Verfasst: Dienstag 15. März 2022, 16:38
von silenzer
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.

Re: DNS Reverse Lookup mit multiplen IP Adressen

Verfasst: Dienstag 15. März 2022, 17:07
von __deets__
In dem Fall musst du mit einem try/except mit der passenden Exception diesen Fehler abfangen, und damit ignorieren.

Re: DNS Reverse Lookup mit multiplen IP Adressen

Verfasst: Donnerstag 17. März 2022, 13:11
von imonbln
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}')       

Re: DNS Reverse Lookup mit multiplen IP Adressen

Verfasst: Samstag 19. März 2022, 12:28
von DeaD_EyE
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.