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