#!/usr/bin/perl
#
# Egatobas Advanced Research Labs (copyright 2000)
# "Making Script Kiddies more efficient since 1998"
#
# DNSHoe.pl v1.0.0 by Xram_LraK (kmx@egatobas.org)
# greets: ADM krew, farm9, counterpane, rfp, Travis, Anne_T 
#
# Dns lookup a whole class A B C or part of a Class C
# Nice to have when people don't allow zone transfers
#
# Bugs, I have ugly subroutines. They work they are ugly
# 
# Future Improvements
# Add multithread support
# Add support for multiple - options all in one line
#
# Usage: DNSHoe.pl <dnserver> <ip range>
# range = 172.16.10.0-256 or 172.16.10-11.0 etc
#
# This requires NET:DNS


use Net::DNS; 

if ($#ARGV < 1) {
	print "Usage: dnslooker.pl <dnserver> <ip range>\n";
		print "IP range in either Cider or num-num2 notation\n";
		}

		print "First arg: $ARGV[0]\n";
		print "Second arg: $ARGV[1]\n";

		$DNSServer = $ARGV[0];
		$IPRange = $ARGV[1];

		if ($IPRange =~ "/") {
			print "CIDR Not working yet\n";
		}
		else
		{
			($num1, $num2, $num3, $num4) = split(/\./ , $IPRange);
			print "$num1, $num2, $num3, $num4\n";
			if ($num1 =~ "-") {
				print "Some Class A's\n";
				($low, $hi) = split("-", $num1);
				ClassA();
			}
			if ($num2 =~ "-" ) {
				print "Some Class B's\n";
				($low, $hi) = split("-", $num2);
				ClassB();
			}
			if ($num3 =~ "-" ) {
				print "Some Class C's\n";
				($low, $hi) = split("-", $num3);
				ClassC();
			}
			if ($num4 =~ "-" ) {
				print "Part of a Class C\n";
				($low, $hi) = split("-", $num4);
				ClassCP();
			}
		}


sub ClassA {
	for($low; $low <= $hi; $low++) {
		for($i = 0; $i <= 256; $i++) {
			for($j = 0; $j <= 256; $j++) {
				for ($k = 0; $k <= 256; $k++) {
					$res = new Net::DNS::Resolver;
					$res->nameservers($DNSServer);
					$answer = $res->query("$low.$i.$j.$k");
					if (defined($answer)) {
						$foo = ($answer->answer)[0];
						$foo2 = $foo->string;
						($crap1, $crap2, $crap3, $crap4, $ipaddr) = split(/\t/, $foo2);
						print "$low.$i.$j.$k   ===   $ipaddr\n";
					}
					else {
						print "query failed: ", $res->errorstring, "\n";
					}
				}
			}
		}
	}
}

sub ClassB {
	for($low; $low <= $hi; $low++) {
		for($i = 0; $i <= 256; $i++) {
			for($j = 0; $j <= 256; $j++) {
	                        $res = new Net::DNS::Resolver;
				$res->nameservers($DNSServer);
				$answer = $res->query("$num1.$low.$i.$j");
				if (defined($answer)) {
					$foo = ($answer->answer)[0];
					$foo2 = $foo->string;
					($crap1, $crap2, $crap3, $crap4, $ipaddr) = split(/\t/, $foo2);
					print "$num1.$low.$i.$j   ===   $ipaddr\n";
				}
				else {
					print "query failed: ", $res->errorstring, "\n";
				}
			}
		}
	}
}

sub ClassC {

	for($low; $low <= $hi; $low++) {
		for($i = 0; $i <= 256; $i++) {
			$res = new Net::DNS::Resolver;
			$res->nameservers($DNSServer);
			$answer = $res->query("$num1.$num2.$low.$i");
			if (defined($answer)) {
				$foo = ($answer->answer)[0];
				$foo2 = $foo->string;
				($crap1, $crap2, $crap3, $crap4, $ipaddr) = split(/\t/, $foo2);
				print "$num1.$num2.$low.$i   ===   $ipaddr\n";
			}
			else {
				print "query failed: ", $res->errorstring, "\n";
			}
		}
	}
}

sub ClassCP {

	for($low; $low <= $hi; $low++) {

		$res = new Net::DNS::Resolver;
		$res->nameservers($DNSServer);
		$answer = $res->query("$num1.$num2.$num3.$low");
		if (defined($answer)) {
		$foo = ($answer->answer)[0];
		$foo2 = $foo->string;
		($crap1, $crap2, $crap3, $crap4, $ipaddr) = split(/\t/, $foo2);
		print "$num1.$num2.$num3.$low   ===   $ipaddr\n";
		}
		else {
			print "query failed: ", $res->errorstring, "\n";
	        }
	}
}
