Recherche DNS inversée en perl
-
01-07-2019 - |
Question
Comment effectuer une recherche DNS inversée, c’est-à-dire comment résoudre une adresse IP en son nom d’hôte DNS en Perl?
La solution
gethostbyaddr et les appels similaires. Voir http://perldoc.perl.org/functions/gethostbyaddr.html
Autres conseils
Si vous avez besoin d'informations DNS plus détaillées, utilisez le . Module Net :: DNS , voici un exemple:
use Net::DNS;
my $res = Net::DNS::Resolver->new;
# create the reverse lookup DNS name (note that the octets in the IP address need to be reversed).
my $IP = "209.85.173.103";
my $target_IP = join('.', reverse split(/\./, $IP)).".in-addr.arpa";
my $query = $res->query("$target_IP", "PTR");
if ($query) {
foreach my $rr ($query->answer) {
next unless $rr->type eq "PTR";
print $rr->rdatastr, "\n";
}
} else {
warn "query failed: ", $res->errorstring, "\n";
}
Source originale EliteHackers.info , plus de détails là aussi.
use Socket;
$iaddr = inet_aton("127.0.0.1"); # or whatever address
$name = gethostbyaddr($iaddr, AF_INET);
perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("69.89.27.250"), AF_INET)'
Retourne: Impossible de trouver le terminateur de chaîne " '" n'importe où avant EOF à -e ligne 1.
perl -MSocket -E "say scalar gethostbyaddr(inet_aton(\"69.89.27.250\"), AF_INET)"
Retours: box250.bluehost.com
Je dois changer la ligne pour utiliser les guillemets doubles, puis échapper les guillemets autour de l'adresse IP
one-liner:
perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("79.81.152.79"), AF_INET)'
Il existe peut-être un moyen plus simple, mais pour IPv4, si vous pouvez effectuer des recherches DNS ordinaires, vous pouvez toujours construire vous-même la requête inverse. Pour l'adresse IPv4 A.B.C.D, recherchez tous les enregistrements PTR à l'adresse D.C.B.A.in-addr.arpa. Pour IPv6, prenez les 128 nœuds hexagonaux, retournez-les et ajoutez ipv6.arpa. et faire la même chose.
Si gethostbyaddr ne répond pas à vos besoins, Net :: DNS est plus flexible.
Cela pourrait être utile ...
$ip = "XXX.XXX.XXX.XXX" # IPV4 address.
my @numbers = split (/\./, $ip);
if (scalar(@numbers) != 4)
{
print "$ip is not a valid IP address.\n";
next;
}
my $ip_addr = pack("C4", @numbers);
# First element of the array returned by gethostbyaddr is host name.
my ($name) = (gethostbyaddr($ip_addr, 2))[0];