diff --git a/extensions/dns/api.rb b/extensions/dns/api.rb index 5177026f2..231ad993d 100644 --- a/extensions/dns/api.rb +++ b/extensions/dns/api.rb @@ -30,7 +30,7 @@ module API port = config.get('beef.extension.dns.port') Thread.new do - dns = BeEF::Extension::DNS::DNS.instance + dns = BeEF::Extension::DNS::Server.instance dns.run_server(address, port) end diff --git a/extensions/dns/dns.rb b/extensions/dns/dns.rb index 51ae3a256..7fa0f6ab9 100644 --- a/extensions/dns/dns.rb +++ b/extensions/dns/dns.rb @@ -13,7 +13,7 @@ module DNS # # Only a single instance will exist during runtime (known as the "singleton pattern"). # This makes it easier to coordinate actions across the various BeEF systems. - class DNS + class Server include Singleton @@ -35,10 +35,10 @@ module DNS # @param address [String] interface address server should run on # @param port [Integer] desired server port number def run_server(address = '0.0.0.0', port = 5300) - EventMachine::next_tick do - RubyDNS::run_server(:listen => [[:udp, address, port]]) do + EventMachine.next_tick do + RubyDNS.run_server(:listen => [[:udp, address, port]]) do server = self - BeEF::Extension::DNS::DNS.instance.instance_eval { @server = server } + BeEF::Extension::DNS::Server.instance.instance_eval { @server = server } # Pass unmatched queries upstream to root nameservers otherwise do |transaction| @@ -54,7 +54,7 @@ module DNS # # @example Adds an A record for foobar.com with the value 1.2.3.4 # - # dns = BeEF::Extension::DNS::DNS.instance + # dns = BeEF::Extension::DNS::Server.instance # # id = dns.add_rule('foobar.com', Resolv::DNS::Resource::IN::A) do |transaction| # transaction.respond!('1.2.3.4') diff --git a/extensions/dns/extension.rb b/extensions/dns/extension.rb index 9618bd5f9..c725fd1d5 100644 --- a/extensions/dns/extension.rb +++ b/extensions/dns/extension.rb @@ -11,9 +11,9 @@ module DNS @short_name = 'dns' @full_name = 'DNS Server' - @description = 'A configurable DNS nameserver for performing DNS spoofing, ' \ + @description = 'A configurable DNS nameserver for performing DNS spoofing, ' + 'hijacking, and other related attacks against hooked zombies' - + end end end diff --git a/extensions/dns/rest/dns.rb b/extensions/dns/rest/dns.rb index 2df9982d7..cec32c7d7 100644 --- a/extensions/dns/rest/dns.rb +++ b/extensions/dns/rest/dns.rb @@ -27,7 +27,7 @@ module DNS # Returns the entire current DNS ruleset get '/rules' do result = {} - result[:rules] = BeEF::Extension::DNS::DNS.instance.get_ruleset + result[:rules] = BeEF::Extension::DNS::Server.instance.get_ruleset result.to_json end @@ -40,7 +40,7 @@ module DNS raise InvalidJsonError, 'Invalid id passed to endpoint /api/dns/rule/:id' end - result = BeEF::Extension::DNS::DNS.instance.get_rule(id) + result = BeEF::Extension::DNS::Server.instance.get_rule(id) result.to_json rescue InvalidJsonError => e print_error e.message @@ -87,7 +87,7 @@ module DNS block_src = format_response(type, response) # Bypass #add_rule so that 'block_src' can be passed as a String - BeEF::Extension::DNS::DNS.instance.instance_eval do + BeEF::Extension::DNS::Server.instance.instance_eval do id = @server.match(pattern, type_obj, block_src) end @@ -99,7 +99,7 @@ module DNS rescue InvalidJsonError => e print_error e.message halt 400 - rescue Exception => e + rescue StandardError => e print_error "Internal error while adding DNS rule (#{e.message})" halt 500 end @@ -114,7 +114,7 @@ module DNS raise InvalidJsonError, 'Invalid id passed to endpoint /api/dns/rule/:id' end - BeEF::Extension::DNS::DNS.instance.remove_rule(id) + BeEF::Extension::DNS::Server.instance.remove_rule(id) rescue InvalidJsonError => e print_error e.message halt 400 @@ -130,67 +130,71 @@ module DNS # # @return [String] string representation of response callback def format_response(type, rdata) - src = "proc { |t| t.respond!(%s) }" + src = 'proc { |t| t.respond!(%s) }' - src % case type - when 'A' - data = { :address => rdata[0] } - "'%
s'" % data - when 'AAAA' - data = { :address => rdata[0] } - "'%
s'" % data - when 'CNAME' - data = { :cname => rdata[0] } - "Resolv::DNS::Name.create('%s')" % data - when 'HINFO' - data = { :cpu => rdata[0], :os => rdata[1] } - "'%s', '%s'" % data - when 'MINFO' - data = { :rmailbx => rdata[0], :emailbx => rdata[1] } + args = case type + when 'A' + data = { :address => rdata[0] } + sprintf "'%
s'", data + when 'AAAA' + data = { :address => rdata[0] } + sprintf "'%
s'", data + when 'CNAME' + data = { :cname => rdata[0] } + sprintf "Resolv::DNS::Name.create('%s')", data + when 'HINFO' + data = { :cpu => rdata[0], :os => rdata[1] } + sprintf "'%s', '%s'", data + when 'MINFO' + data = { :rmailbx => rdata[0], :emailbx => rdata[1] } - "Resolv::DNS::Name.create('%s'), " \ - "Resolv::DNS::Name.create('%s')" % data - when 'MX' - data = { :preference => rdata[0], :exchange => rdata[1] } - "'%d', Resolv::DNS::Name.create('%s')" % data - when 'NS' - data = { :nsdname => rdata[0] } - "Resolv::DNS::Name.create('%s')" % data - when 'PTR' - data = { :ptrdname => rdata[0] } - "Resolv::DNS::Name.create('%s')" % data - when 'SOA' - data = { - :mname => rdata[0], - :rname => rdata[1], - :serial => rdata[2], - :refresh => rdata[3], - :retry => rdata[4], - :expire => rdata[5], - :minimum => rdata[6] - } + sprintf "Resolv::DNS::Name.create('%s'), " + + "Resolv::DNS::Name.create('%s')", + data + when 'MX' + data = { :preference => rdata[0], :exchange => rdata[1] } + sprintf "'%d', Resolv::DNS::Name.create('%s')", data + when 'NS' + data = { :nsdname => rdata[0] } + sprintf "Resolv::DNS::Name.create('%s')", data + when 'PTR' + data = { :ptrdname => rdata[0] } + sprintf "Resolv::DNS::Name.create('%s')", data + when 'SOA' + data = { + :mname => rdata[0], + :rname => rdata[1], + :serial => rdata[2], + :refresh => rdata[3], + :retry => rdata[4], + :expire => rdata[5], + :minimum => rdata[6] + } - "Resolv::DNS::Name.create('%s'), " \ - "Resolv::DNS::Name.create('%s'), " \ - "%d, " \ - "%d, " \ - "%d, " \ - "%d, " \ - "%d" % data - when 'TXT' - data = { :txtdata => rdata[0] } - "'%s'" % data - when 'WKS' - data = { - :address => rdata[0], - :protocol => rdata[1], - :bitmap => rdata[2] - } + sprintf "Resolv::DNS::Name.create('%s'), " + + "Resolv::DNS::Name.create('%s'), " + + '%d, ' + + '%d, ' + + '%d, ' + + '%d, ' + + '%d', + data + when 'TXT' + data = { :txtdata => rdata[0] } + sprintf "'%s'", data + when 'WKS' + data = { + :address => rdata[0], + :protocol => rdata[1], + :bitmap => rdata[2] + } - "'%
s', %d, %d" % data - else - raise InvalidJsonError, 'Unknown "type" key passed to endpoint /api/dns/rule' - end + sprintf "'%
s', %d, %d", data + else + raise InvalidJsonError, 'Unknown "type" key passed to endpoint /api/dns/rule' + end + + sprintf(src, args) end # Raised when invalid JSON input is passed to an /api/dns handler. diff --git a/extensions/dns/ruby/rubydns.rb b/extensions/dns/ruby/rubydns.rb index af2990c47..309e1cfb1 100644 --- a/extensions/dns/ruby/rubydns.rb +++ b/extensions/dns/ruby/rubydns.rb @@ -11,7 +11,7 @@ # identifiers to rules, rule removal, and more. # # The core functionality of BeEF's DNS server is implemented here, whereas -# BeEF::Extension::DNS::DNS is simply a small wrapper around it. +# BeEF::Extension::DNS::Server is simply a small wrapper around it. # # @see http://rubydoc.info/gems/rubydns/frames module RubyDNS @@ -20,7 +20,7 @@ module RubyDNS def self.run_server(options = {}, &block) server = RubyDNS::Server.new(&block) - options[:listen] ||= [[:udp, "0.0.0.0", 53], [:tcp, "0.0.0.0", 53]] + options[:listen] ||= [[:udp, '0.0.0.0', 53], [:tcp, '0.0.0.0', 53]] EventMachine.run do server.fire(:setup) @@ -70,9 +70,9 @@ module RubyDNS # Break out and return id if rule is already present BeEF::Core::Models::DNS::Rule.each do |rule| - if pattern[0] == rule.pattern \ - && pattern[1] == rule.type \ - && block_src == rule.block + if pattern[0] == rule.pattern && + pattern[1] == rule.type && + block_src == rule.block id = rule.id throw :match @@ -81,6 +81,7 @@ module RubyDNS id = generate_id + # FIXME Use block case block.class.name when String @rules << Rule.new(id, pattern, eval(block_src)) @@ -171,7 +172,7 @@ module RubyDNS # New method that generates a unique id for a rule def generate_id begin - id = BeEF::Core::Crypto::secure_token.byteslice(0..6) + id = BeEF::Core::Crypto.secure_token.byteslice(0..6) # Make sure id isn't already in use BeEF::Core::Models::DNS::Rule.each { |rule| throw StandardError if id == rule.id } @@ -190,15 +191,15 @@ module RubyDNS def respond!(*data) options = data.last.kind_of?(Hash) ? data.pop : {} resource_class = options[:resource_class] || @resource_class - + if resource_class == nil raise ArgumentError, "Could not instantiate resource #{resource_class}!" end - + @server.logger.debug("Resource class: #{resource_class.inspect}") resource = resource_class.new(*data) @server.logger.debug("Resource: #{resource.inspect}") - + append!(resource, options) end