#!/usr/bin/perl -w # # $Id: wcdns,v 1.5 2003/09/16 22:25:52 jmates Exp $ # # The author disclaims all copyrights and releases this script into the # public domain. # # Checks whether domain(s) listed on command line (or failing that # STDIN) are wildcard domains. # # Run perldoc(1) on this file for more documentation. use strict; # how to match Top Level Domains (TLD) my $tld_re = qr/( \.\w+ )/x; # domain portion option so can handle just TLD input my $domain_re = qr/( (?:[\w-]+)? $tld_re )/x; use Net::DNS; my $dns = Net::DNS::Resolver->new; $dns->defnames(0); # do not search default domain chomp(@ARGV = ) unless @ARGV; for my $input (@ARGV) { my ($domain, $tld) = $input =~ / $domain_re \W* $ /x; # real TLD should have SOA records unless ($dns->query($tld, 'SOA')) { warn "notice: skipping as no SOA record: $tld\n"; next; } my $wildcard = '*' . $tld; my @wc_ip = get_ip_list($dns, $wildcard); # no wildcards for this TLD next unless @wc_ip; if ($domain eq $tld) { print "tld $tld wildcard @wc_ip\n"; } else { my @dom_ip = get_ip_list($dns, $domain); die "error: no addresses for domain $domain\n" unless @dom_ip; my (%union, %isect); for my $ip (@wc_ip, @dom_ip) { $union{$ip}++ && $isect{$ip}++ } if (keys %isect) { print "domain $domain wildcard ", join (" ", keys %isect), "\n"; } } } # Accepts Net::DNS::Resolver object and item to lookup for A records, # returns undef or list of ip addresses sub get_ip_list { my $dns = shift; my $what = shift; my $query = $dns->query($what, 'A'); return unless $query; my @ips; for my $rr ($query->answer) { push @ips, $rr->address if $rr->type eq 'A'; } return @ips; } __END__ =head1 NAME wcdns - report wildcard DNS domains =head1 SYNOPSIS List Top Level Domains (TLD) with wildcard records enabled. $ wcdns .com .net .org .edu tld .com wildcard 64.94.110.11 tld .net wildcard 64.94.110.11 Check whether host is a wildcard domain. $ wcdns an17iqz4dhxm6es532feaxrkyidvoh7fkav.net domain an17iqz4dhxm6es532feaxrkyidvoh7fkav.net wildcard 64.94.110.11 =head1 DESCRIPTION =head2 Overview Provides means to determine which TLD have wildcard DNS records, or whether particular domains resolve to the wildcard address(es). =head2 Normal Usage $ wcdns domain [domain2 ...] If no domains (top level domains, domain names, hostnames, or domainish input) are listed on the command line, the script will attempt to read the list from standard input, which allows input from a file or pipe: $ wcdns < domainlistfile Output will be sent to stdout, errors to stderr. Problems will result in a non-zero exit code. No news is good news; TLD or domains will only be listed if there are wildcard entries infesting the data. See L<"SYNOPSIS"> for the two output formats; one is whether the TLD speicifed has wildcard support; the other is whether a domain is wildcarded. =head1 BUGS =head2 Reporting Bugs Newer versions of this script may be available from: http://sial.org/code/perl/ If the bug is in the latest version, send a report to the author. Patches that fix problems or add new features are welcome. =head2 Known Issues No known issues. =head1 TODO More sanity checking, especially on multiple IP address results where there is only a partial overlap between the TLD wildcard addresses and the addresses for the domain in question. =head1 SEE ALSO perl(1), Net::DNS =head1 AUTHOR Jeremy Mates, http://sial.org/contact/ Based heavily on code posted by John Rowan Littell to the MIMEDefang mailing list. http://lists.roaringpenguin.com/pipermail/mimedefang/2003-September/008061.html =head1 COPYRIGHT The author disclaims all copyrights and releases this script into the public domain. =head1 VERSION $Id: wcdns,v 1.5 2003/09/16 22:25:52 jmates Exp $ =cut