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:
soh_cah_toa
2013-06-03 00:11:41 -04:00
parent c8c9e1e139
commit 0f8221918b
5 changed files with 84 additions and 79 deletions

View File

@@ -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

View File

@@ -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')

View File

@@ -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

View File

@@ -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.

View File

@@ -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