Skip to content

Commit f351d7b

Browse files
committed
Don't create DNS cached resolver on every test, because it'll exhaust the OS's resources
1 parent d0585e0 commit f351d7b

File tree

5 files changed

+29
-10
lines changed

5 files changed

+29
-10
lines changed

lib/msf/core/framework.rb

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ def initialize(options={})
8181
# Configure the SSL certificate generator
8282
require 'msf/core/cert_provider'
8383
Rex::Socket::Ssl.cert_provider = Msf::Ssl::CertProvider
84-
initialize_dns_resolver
84+
85+
if options.include?('CustomDnsResolver')
86+
self.dns_resolver = options['CustomDnsResolver']
87+
Rex::Socket._install_global_resolver(self.dns_resolver)
88+
end
8589

8690
subscriber = FrameworkEventSubscriber.new(self)
8791
events.add_exploit_subscriber(subscriber)
@@ -91,13 +95,6 @@ def initialize(options={})
9195
events.add_ui_subscriber(subscriber)
9296
end
9397

94-
def initialize_dns_resolver
95-
self.dns_resolver = Rex::Proto::DNS::CachedResolver.new
96-
self.dns_resolver.extend(Rex::Proto::DNS::CustomNameserverProvider)
97-
self.dns_resolver.load_config
98-
Rex::Socket._install_global_resolver(self.dns_resolver)
99-
end
100-
10198
def dns_resolver
10299
self.dns_resolver
103100
end

lib/msf/ui/console/command_dispatcher/dns.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def commands
4444
# @param words [Array<String>] the previously completed words on the command line. words is always
4545
# at least 1 when tab completion has reached this stage since the command itself has been completed
4646
def cmd_dns_tabs(str, words)
47+
return if driver.framework.dns_resolver.nil?
48+
4749
if words.length == 1
4850
options = ['add','del','remove','flush','print']
4951
return options.select { |opt| opt.start_with?(str) }
@@ -132,6 +134,8 @@ def cmd_dns_help
132134
# Manage Metasploit's DNS resolution rules
133135
#
134136
def cmd_dns(*args)
137+
return if driver.framework.dns_resolver.nil?
138+
135139
args << 'print' if args.length == 0
136140
# Short-circuit help
137141
if args.delete("-h") || args.delete("--help")

lib/msf/ui/console/driver.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,16 @@ def initialize(prompt = DefaultPrompt, prompt_char = DefaultPromptChar, opts = {
8080

8181
# Initialize attributes
8282

83+
dns_resolver = Rex::Proto::DNS::CachedResolver.new
84+
dns_resolver.extend(Rex::Proto::DNS::CustomNameserverProvider)
85+
dns_resolver.load_config
86+
8387
# Defer loading of modules until paths from opts can be added below
84-
framework_create_options = opts.merge('DeferModuleLoads' => true)
88+
framework_create_options = opts.merge({
89+
'DeferModuleLoads' => true,
90+
'CustomDnsResolver' => dns_resolver
91+
}
92+
)
8593
self.framework = opts['Framework'] || Msf::Simple::Framework.create(framework_create_options)
8694

8795
if self.framework.datastore['Prompt']

lib/rex/proto/dns/resolver.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Resolver < Net::DNS::Resolver
1515

1616
Defaults = {
1717
:config_file => "/etc/resolv.conf",
18-
:log_file => "/dev/null", # formerly $stdout, should be tied in with our loggers
18+
:log_file => File::NULL, # formerly $stdout, should be tied in with our loggers
1919
:port => 53,
2020
:searchlist => [],
2121
:nameservers => [IPAddr.new("127.0.0.1")],

spec/lib/rex/proto/dns/custom_nameserver_provider_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,14 @@ def packet_for(name)
111111
expect(ns).to eq([[ruled_nameserver, {}], [ruled_nameserver2, {}]])
112112
end
113113
end
114+
115+
context 'When a packet contains multiple questions that have different nameserver results' do
116+
it 'Throws an error' do
117+
packet = packet_for('subdomain.metasploit.com')
118+
q = Dnsruby::Question.new('subdomain.notmetasploit.com', Dnsruby::Types::A, Dnsruby::Classes::IN)
119+
120+
packet.question.append(q)
121+
expect {many_ruled_provider.nameservers_for_packet(packet)}.to raise_error(ResolverError)
122+
end
123+
end
114124
end

0 commit comments

Comments
 (0)