Improved coding style (a la ruby-style-guide and rubocop).
Because I'm too tired to start testing and need a little victory. ;)
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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] }
|
||||
"'%<address>s'" % data
|
||||
when 'AAAA'
|
||||
data = { :address => rdata[0] }
|
||||
"'%<address>s'" % data
|
||||
when 'CNAME'
|
||||
data = { :cname => rdata[0] }
|
||||
"Resolv::DNS::Name.create('%<cname>s')" % data
|
||||
when 'HINFO'
|
||||
data = { :cpu => rdata[0], :os => rdata[1] }
|
||||
"'%<cpu>s', '%<os>s'" % data
|
||||
when 'MINFO'
|
||||
data = { :rmailbx => rdata[0], :emailbx => rdata[1] }
|
||||
args = case type
|
||||
when 'A'
|
||||
data = { :address => rdata[0] }
|
||||
sprintf "'%<address>s'", data
|
||||
when 'AAAA'
|
||||
data = { :address => rdata[0] }
|
||||
sprintf "'%<address>s'", data
|
||||
when 'CNAME'
|
||||
data = { :cname => rdata[0] }
|
||||
sprintf "Resolv::DNS::Name.create('%<cname>s')", data
|
||||
when 'HINFO'
|
||||
data = { :cpu => rdata[0], :os => rdata[1] }
|
||||
sprintf "'%<cpu>s', '%<os>s'", data
|
||||
when 'MINFO'
|
||||
data = { :rmailbx => rdata[0], :emailbx => rdata[1] }
|
||||
|
||||
"Resolv::DNS::Name.create('%<rmailbx>s'), " \
|
||||
"Resolv::DNS::Name.create('%<emailbx>s')" % data
|
||||
when 'MX'
|
||||
data = { :preference => rdata[0], :exchange => rdata[1] }
|
||||
"'%<preference>d', Resolv::DNS::Name.create('%<exchange>s')" % data
|
||||
when 'NS'
|
||||
data = { :nsdname => rdata[0] }
|
||||
"Resolv::DNS::Name.create('%<nsdname>s')" % data
|
||||
when 'PTR'
|
||||
data = { :ptrdname => rdata[0] }
|
||||
"Resolv::DNS::Name.create('%<ptrdname>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('%<rmailbx>s'), " +
|
||||
"Resolv::DNS::Name.create('%<emailbx>s')",
|
||||
data
|
||||
when 'MX'
|
||||
data = { :preference => rdata[0], :exchange => rdata[1] }
|
||||
sprintf "'%<preference>d', Resolv::DNS::Name.create('%<exchange>s')", data
|
||||
when 'NS'
|
||||
data = { :nsdname => rdata[0] }
|
||||
sprintf "Resolv::DNS::Name.create('%<nsdname>s')", data
|
||||
when 'PTR'
|
||||
data = { :ptrdname => rdata[0] }
|
||||
sprintf "Resolv::DNS::Name.create('%<ptrdname>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('%<mname>s'), " \
|
||||
"Resolv::DNS::Name.create('%<rname>s'), " \
|
||||
"%<serial>d, " \
|
||||
"%<refresh>d, " \
|
||||
"%<retry>d, " \
|
||||
"%<expire>d, " \
|
||||
"%<minimum>d" % data
|
||||
when 'TXT'
|
||||
data = { :txtdata => rdata[0] }
|
||||
"'%<txtdata>s'" % data
|
||||
when 'WKS'
|
||||
data = {
|
||||
:address => rdata[0],
|
||||
:protocol => rdata[1],
|
||||
:bitmap => rdata[2]
|
||||
}
|
||||
sprintf "Resolv::DNS::Name.create('%<mname>s'), " +
|
||||
"Resolv::DNS::Name.create('%<rname>s'), " +
|
||||
'%<serial>d, ' +
|
||||
'%<refresh>d, ' +
|
||||
'%<retry>d, ' +
|
||||
'%<expire>d, ' +
|
||||
'%<minimum>d',
|
||||
data
|
||||
when 'TXT'
|
||||
data = { :txtdata => rdata[0] }
|
||||
sprintf "'%<txtdata>s'", data
|
||||
when 'WKS'
|
||||
data = {
|
||||
:address => rdata[0],
|
||||
:protocol => rdata[1],
|
||||
:bitmap => rdata[2]
|
||||
}
|
||||
|
||||
"'%<address>s', %<protocol>d, %<bitmap>d" % data
|
||||
else
|
||||
raise InvalidJsonError, 'Unknown "type" key passed to endpoint /api/dns/rule'
|
||||
end
|
||||
sprintf "'%<address>s', %<protocol>d, %<bitmap>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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user