Land #2760
commit
a4811bd0c3
|
@ -0,0 +1,28 @@
|
||||||
|
www.es-web.sophos.com
|
||||||
|
www.es-web.sophos.com.edgesuite.net
|
||||||
|
www.es-web-2.sophos.com
|
||||||
|
www.es-web-2.sophos.com.edgesuite.net
|
||||||
|
www.dnl-01.geo.kaspersky.com
|
||||||
|
www.downloads2.kaspersky-labs.com
|
||||||
|
www.liveupdate.symantecliveupdate.com
|
||||||
|
www.liveupdate.symantec.com
|
||||||
|
www.update.symantec.com
|
||||||
|
www.update.nai.com
|
||||||
|
www.download797.avast.com
|
||||||
|
www.guru.avg.com
|
||||||
|
www.osce8-p.activeupdate.trendmicro.com
|
||||||
|
www.forefrontdl.microsoft.com
|
||||||
|
es-web.sophos.com
|
||||||
|
es-web.sophos.com.edgesuite.net
|
||||||
|
es-web-2.sophos.com
|
||||||
|
es-web-2.sophos.com.edgesuite.net
|
||||||
|
dnl-01.geo.kaspersky.com
|
||||||
|
downloads2.kaspersky-labs.com
|
||||||
|
liveupdate.symantecliveupdate.com
|
||||||
|
liveupdate.symantec.com
|
||||||
|
update.symantec.com
|
||||||
|
update.nai.com
|
||||||
|
download797.avast.com
|
||||||
|
guru.avg.com
|
||||||
|
osce8-p.activeupdate.trendmicro.com
|
||||||
|
forefrontdl.microsoft.com
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,116 @@
|
||||||
|
##
|
||||||
|
# This module requires Metasploit: http//metasploit.com/download
|
||||||
|
# Current source: https://github.com/rapid7/metasploit-framework
|
||||||
|
##
|
||||||
|
|
||||||
|
require 'msf/core'
|
||||||
|
require 'net/dns/resolver'
|
||||||
|
|
||||||
|
class Metasploit3 < Msf::Auxiliary
|
||||||
|
include Msf::Auxiliary::Report
|
||||||
|
|
||||||
|
def initialize(info = {})
|
||||||
|
super(update_info(info,
|
||||||
|
'Name' => 'DNS Non-Recursive Record Scraper',
|
||||||
|
'Description' => %q{
|
||||||
|
This module can be used to scrape records that have been cached
|
||||||
|
by a specific nameserver. The module allows the user to test
|
||||||
|
every record from a specified file.
|
||||||
|
},
|
||||||
|
'Author' => [
|
||||||
|
'Brandon McCann "zeknox" <bmccann[at]accuvant.com>',
|
||||||
|
'Rob Dixon "304geek" <rob.dixon[at]accuvant.com>'
|
||||||
|
],
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'References' => [
|
||||||
|
['URL', 'http://304geeks.blogspot.com/2013/01/dns-scraping-for-corporate-av-detection.html'],
|
||||||
|
['URL', 'http://www.rootsecure.net/content/downloads/pdf/dns_cache_snooping.pdf']
|
||||||
|
]))
|
||||||
|
|
||||||
|
register_options([
|
||||||
|
OptString.new('DOMAIN', [ false, "Domain name to query for"]),
|
||||||
|
OptPath.new('WORDLIST', [ false, "Wordlist for domain name queries", ::File.join(Msf::Config.data_directory, "wordlists", "av-update-urls.txt")]),
|
||||||
|
OptAddress.new('NS', [ true, "Specify the nameserver to use for queries" ]),
|
||||||
|
], self.class)
|
||||||
|
|
||||||
|
register_advanced_options([
|
||||||
|
OptBool.new('TCP_DNS', [false, "Run queries over TCP", false]),
|
||||||
|
OptInt.new('DNS_TIMEOUT', [true, "DNS Timeout in seconds", 5])
|
||||||
|
], self.class)
|
||||||
|
end
|
||||||
|
|
||||||
|
# method to scrape dns
|
||||||
|
def scrape_dns(domain)
|
||||||
|
|
||||||
|
# dns request with recursive disabled
|
||||||
|
use_tcp = datastore['TCP_DNS']
|
||||||
|
res = Net::DNS::Resolver.new(:nameservers => "#{datastore['NS']}", :recursive => false, :use_tcp => use_tcp)
|
||||||
|
use_tcp ? res.tcp_timeout = datastore['DNS_TIMEOUT'] : res.udp_timeout = datastore['DNS_TIMEOUT']
|
||||||
|
|
||||||
|
# query dns
|
||||||
|
begin
|
||||||
|
query = res.send(domain)
|
||||||
|
rescue ResolverArgumentError
|
||||||
|
print_error("Invalid domain: #{domain}")
|
||||||
|
return
|
||||||
|
rescue NoResponseError
|
||||||
|
print_error("DNS Timeout Issue: #{domain}")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
# found or not found
|
||||||
|
if query.answer.empty?
|
||||||
|
vprint_status("#{domain} - Not Found")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
@is_vulnerable = true
|
||||||
|
print_good("#{domain} - Found")
|
||||||
|
report_goods(domain)
|
||||||
|
end
|
||||||
|
|
||||||
|
# method to read each line from file
|
||||||
|
def read_file
|
||||||
|
::File.open("#{datastore['WORDLIST']}", "rb").each_line do |line|
|
||||||
|
scrape_dns(line.chomp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# log results to database
|
||||||
|
def report_goods(domain)
|
||||||
|
if datastore['TCP_DNS']
|
||||||
|
proto = "tcp"
|
||||||
|
else
|
||||||
|
proto = "udp"
|
||||||
|
end
|
||||||
|
|
||||||
|
report_note(
|
||||||
|
:host => datastore['NS'],
|
||||||
|
:name => "dns",
|
||||||
|
:port => 53,
|
||||||
|
:proto => proto,
|
||||||
|
:type => "dns.cache.scrape",
|
||||||
|
:data => "#{domain} cached",
|
||||||
|
:update => :unique_data
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# main control method
|
||||||
|
def run
|
||||||
|
@is_vulnerable = false
|
||||||
|
|
||||||
|
print_status("Making queries against #{datastore['NS']}")
|
||||||
|
|
||||||
|
if datastore['DOMAIN'].blank?
|
||||||
|
read_file
|
||||||
|
else
|
||||||
|
scrape_dns(datastore['DOMAIN'])
|
||||||
|
end
|
||||||
|
|
||||||
|
report_vuln(
|
||||||
|
:host => datastore['NS'],
|
||||||
|
:name => "DNS Cache Snooping",
|
||||||
|
) if @is_vulnerable
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue