diff --git a/lib/msf/core/framework.rb b/lib/msf/core/framework.rb index b983fffb8327..f9e6ae9a5ba8 100644 --- a/lib/msf/core/framework.rb +++ b/lib/msf/core/framework.rb @@ -95,10 +95,6 @@ def initialize(options={}) events.add_ui_subscriber(subscriber) end - def dns_resolver - self.dns_resolver - end - def inspect "#" end diff --git a/lib/rex/proto/dns/resolver.rb b/lib/rex/proto/dns/resolver.rb index ed7105e2c00c..0006591608f9 100644 --- a/lib/rex/proto/dns/resolver.rb +++ b/lib/rex/proto/dns/resolver.rb @@ -314,41 +314,43 @@ def send_udp(packet,packet_data) response = "" nameservers = nameservers_for_packet(packet) nameservers.each do |ns, socket_options| - begin - @config[:udp_timeout].timeout do - begin - config = { - 'PeerHost' => ns.to_s, - 'PeerPort' => @config[:port].to_i, - 'Context' => @config[:context], - 'Comm' => @config[:comm] - } - config.update(socket_options) - unless config['Comm'].nil? || config['Comm'].alive? - @logger.warn("Session #{config['Comm'].sid} not active, and cannot be used to resolve DNS") - throw :next_ns - end + catch(:next_ns) do + begin + @config[:udp_timeout].timeout do + begin + config = { + 'PeerHost' => ns.to_s, + 'PeerPort' => @config[:port].to_i, + 'Context' => @config[:context], + 'Comm' => @config[:comm] + } + config.update(socket_options) + unless config['Comm'].nil? || config['Comm'].alive? + @logger.warn("Session #{config['Comm'].sid} not active, and cannot be used to resolve DNS") + throw :next_ns + end - if @config[:source_port] > 0 - config['LocalPort'] = @config[:source_port] - end - if @config[:source_host] != IPAddr.new('0.0.0.0') - config['LocalHost'] = @config[:source_host] unless @config[:source_host].nil? + if @config[:source_port] > 0 + config['LocalPort'] = @config[:source_port] + end + if @config[:source_host] != IPAddr.new('0.0.0.0') + config['LocalHost'] = @config[:source_host] unless @config[:source_host].nil? + end + socket = Rex::Socket::Udp.create(config) + rescue + @logger.warn "UDP Socket could not be established to #{ns}:#{@config[:port]}" + throw :next_ns end - socket = Rex::Socket::Udp.create(config) - rescue - @logger.warn "UDP Socket could not be established to #{ns}:#{@config[:port]}" - throw :next_ds + @logger.info "Contacting nameserver #{ns} port #{@config[:port]}" + #socket.sendto(packet_data, ns.to_s, @config[:port].to_i, 0) + socket.write(packet_data) + ans = socket.recvfrom(@config[:packet_size]) end - @logger.info "Contacting nameserver #{ns} port #{@config[:port]}" - #socket.sendto(packet_data, ns.to_s, @config[:port].to_i, 0) - socket.write(packet_data) - ans = socket.recvfrom(@config[:packet_size]) + break if ans + rescue Timeout::Error + @logger.warn "Nameserver #{ns} not responding within UDP timeout, trying next one" + throw :next_ds end - break if ans - rescue Timeout::Error - @logger.warn "Nameserver #{ns} not responding within UDP timeout, trying next one" - next end end return ans