Merge branch 'dns_postmods' of git://github.com/mubix/metasploit-framework into mubix-dns_postmods
commit
e6df113a05
|
@ -15,19 +15,19 @@ class Metasploit3 < Msf::Post
|
||||||
'Name' => 'Windows Recon Resolve Hostname',
|
'Name' => 'Windows Recon Resolve Hostname',
|
||||||
'Description' => %q{ This module resolves a hostname to IP address via the victim, similiar to the Unix dig command},
|
'Description' => %q{ This module resolves a hostname to IP address via the victim, similiar to the Unix dig command},
|
||||||
'License' => MSF_LICENSE,
|
'License' => MSF_LICENSE,
|
||||||
'Author' => [ 'Rob Fuller <mubix[at]hak5.org>'],
|
'Author' => [ 'mubix <mubix[at]hak5.org>'],
|
||||||
'Platform' => [ 'windows' ],
|
'Platform' => [ 'windows' ],
|
||||||
'SessionTypes' => [ 'meterpreter' ]
|
'SessionTypes' => [ 'meterpreter' ]
|
||||||
))
|
))
|
||||||
|
|
||||||
register_options(
|
register_options(
|
||||||
[
|
[
|
||||||
OptString.new('HOSTNAME', [true, 'Hostname to lookup', nil])
|
OptString.new('HOSTNAME', [false, 'Hostname to lookup', nil]),
|
||||||
|
OptPath.new('HOSTFILE', [false, 'Line separated file with hostnames to resolve', nil])
|
||||||
], self.class)
|
], self.class)
|
||||||
end
|
end
|
||||||
|
|
||||||
def run
|
def resolve_hostname(hostname)
|
||||||
### MAIN ###
|
|
||||||
|
|
||||||
if client.platform =~ /^x64/
|
if client.platform =~ /^x64/
|
||||||
size = 64
|
size = 64
|
||||||
|
@ -37,14 +37,11 @@ class Metasploit3 < Msf::Post
|
||||||
addrinfoinmem = 24
|
addrinfoinmem = 24
|
||||||
end
|
end
|
||||||
|
|
||||||
hostname = datastore['HOSTNAME']
|
|
||||||
|
|
||||||
## get IP for host
|
|
||||||
begin
|
begin
|
||||||
vprint_status("Looking up IP for #{hostname}")
|
vprint_status("Looking up IP for #{hostname}")
|
||||||
result = client.railgun.ws2_32.getaddrinfo(hostname, nil, nil, 4 )
|
result = client.railgun.ws2_32.getaddrinfo(hostname, nil, nil, 4 )
|
||||||
if result['GetLastError'] == 11001
|
if result['GetLastError'] == 11001
|
||||||
print_error("Failed to resolve the host")
|
print_error("Failed to resolve #{hostname}")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
addrinfo = client.railgun.memread( result['ppResult'], size )
|
addrinfo = client.railgun.memread( result['ppResult'], size )
|
||||||
|
@ -57,5 +54,20 @@ class Metasploit3 < Msf::Post
|
||||||
print_error(e)
|
print_error(e)
|
||||||
print_status('Windows 2000 and prior does not support getaddrinfo')
|
print_status('Windows 2000 and prior does not support getaddrinfo')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
if datastore['HOSTNAME']
|
||||||
|
resolve_hostname(datastore['HOSTNAME'])
|
||||||
|
end
|
||||||
|
|
||||||
|
if datastore['HOSTFILE']
|
||||||
|
::File.open(datastore['HOSTFILE'], "rb").each_line do |hostname|
|
||||||
|
if hostname.strip != ""
|
||||||
|
resolve_hostname(hostname.strip)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
##
|
||||||
|
# $Id $
|
||||||
|
##
|
||||||
|
|
||||||
|
##
|
||||||
|
# This file is part of the Metasploit Framework and may be subject to
|
||||||
|
# redistribution and commercial restrictions. Please see the Metasploit
|
||||||
|
# web site for more information on licensing and terms of use.
|
||||||
|
# http://metasploit.com/
|
||||||
|
##
|
||||||
|
|
||||||
|
require 'msf/core'
|
||||||
|
require 'rex'
|
||||||
|
|
||||||
|
class Metasploit3 < Msf::Post
|
||||||
|
|
||||||
|
def initialize(info={})
|
||||||
|
super( update_info( info,
|
||||||
|
'Name' => 'Windows Recon Resolve IP',
|
||||||
|
'Description' => %q{ This module reverse resolves a range or IP to a hostname},
|
||||||
|
'License' => MSF_LICENSE,
|
||||||
|
'Author' => [ 'mubix <mubix[at]hak5.org>'],
|
||||||
|
'Version' => '$Revision$',
|
||||||
|
'Platform' => [ 'windows' ],
|
||||||
|
'SessionTypes' => [ 'meterpreter' ]
|
||||||
|
))
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
OptAddress.new("ADDRESS" , [ false, "Enumerate currently configured shares"]),
|
||||||
|
OptAddressRange.new("RANGE" , [ false, "Enumerate Recently mapped shares"])
|
||||||
|
], self.class)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def resolve_ip(ip)
|
||||||
|
ip_ino = Rex::Socket.addr_aton(ip)
|
||||||
|
begin
|
||||||
|
ptr2dns = session.railgun.ws2_32.gethostbyaddr(ip_ino,4,2)
|
||||||
|
memtext = client.railgun.memread(ptr2dns['return'],255)
|
||||||
|
host_inmem = memtext.split(ip_ino)[1].split("\00")[0]
|
||||||
|
print_good("#{ip} resolves to #{host_inmem}")
|
||||||
|
rescue ::Exception => e
|
||||||
|
print_error("Failed to resolve #{ip}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
if datastore['ADDRESS']
|
||||||
|
resolve_ip(datastore['ADDRESS'])
|
||||||
|
end
|
||||||
|
|
||||||
|
if datastore['RANGE']
|
||||||
|
rexrange = Rex::Socket::RangeWalker.new(datastore['RANGE'])
|
||||||
|
rexrange.each do |ip|
|
||||||
|
resolve_ip(ip)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue