diff --git a/extensions/dns/api.rb b/extensions/dns/api.rb
index 1161a7ae8..5177026f2 100644
--- a/extensions/dns/api.rb
+++ b/extensions/dns/api.rb
@@ -10,10 +10,19 @@ module API
module NameserverHandler
- BeEF::API::Registrar.instance.register(BeEF::Extension::DNS::API::NameserverHandler,
- BeEF::API::Server,
- 'pre_http_start')
+ BeEF::API::Registrar.instance.register(
+ BeEF::Extension::DNS::API::NameserverHandler,
+ BeEF::API::Server,
+ 'pre_http_start'
+ )
+ BeEF::API::Registrar.instance.register(
+ BeEF::Extension::DNS::API::NameserverHandler,
+ BeEF::API::Server,
+ 'mount_handler'
+ )
+
+ # Begins main DNS server run-loop at BeEF startup
def self.pre_http_start(http_hook_server)
config = BeEF::Core::Configuration.instance
@@ -28,6 +37,11 @@ module API
print_info "DNS Server: #{address}:#{port}"
end
+ # Mounts handler for processing RESTful API calls
+ def self.mount_handler(beef_server)
+ beef_server.mount('/api/dns', BeEF::Extension::DNS::DNSRest.new)
+ end
+
end
end
diff --git a/extensions/dns/dns.rb b/extensions/dns/dns.rb
index 75483662d..c8ec1a5a5 100644
--- a/extensions/dns/dns.rb
+++ b/extensions/dns/dns.rb
@@ -77,6 +77,34 @@ module DNS
end
end
+ # Returns an AoH representing the entire current DNS ruleset where each element is a
+ # hash with the following keys:
+ #
+ # * :id
+ # * :pattern
+ # * :type
+ # * :block
+ #
+ # @return [Array] DNS ruleset (empty if no rules are currently loaded)
+ def get_rules
+ @lock.synchronize do
+ result = []
+
+ BeEF::Core::Models::DNS::Rule.each do |rule|
+ element = {}
+
+ element[:id] = rule.id
+ element[:pattern] = rule.pattern
+ element[:type] = rule.type
+ element[:block] = rule.block
+
+ result << element
+ end
+
+ result
+ end
+ end
+
end
end
diff --git a/extensions/dns/extension.rb b/extensions/dns/extension.rb
index 59f56543d..9618bd5f9 100644
--- a/extensions/dns/extension.rb
+++ b/extensions/dns/extension.rb
@@ -20,5 +20,6 @@ end
require 'extensions/dns/api'
require 'extensions/dns/dns'
-require 'extensions/dns/ruby'
require 'extensions/dns/model'
+require 'extensions/dns/rest/dns'
+require 'extensions/dns/ruby'
diff --git a/extensions/dns/rest/dns.rb b/extensions/dns/rest/dns.rb
new file mode 100644
index 000000000..74fc69c15
--- /dev/null
+++ b/extensions/dns/rest/dns.rb
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2006-2013 Wade Alcorn - wade@bindshell.net
+# Browser Exploitation Framework (BeEF) - http://beefproject.com
+# See the file 'doc/COPYING' for copying permission
+#
+
+# GET:
+# * Rule count
+# * List of rules
+
+# POST:
+# * Add rule
+# * Remove rule
+
+
+# /api/dns/rules
+# {
+# "rules": [
+# {
+# "id": 1,
+# "pattern": "foobar.com",
+# "type": "Resolv::DNS::Resource::IN::A"
+# "block": "proc {|t| ...do shit... }"
+# },
+#
+# {
+# },
+#
+# {
+# },
+# ]
+# }
+
+
+
+module BeEF
+module Extension
+module DNS
+
+ class DNSRest < BeEF::Core::Router::Router
+
+ before do
+ config = BeEF::Core::Configuration.instance
+
+ error 401 unless params[:token] == config.get('beef.api_token')
+ halt 401 unless BeEF::Core::Rest.permitted_source?(request.ip)
+
+ headers 'Content-Type' => 'application/json; charset=UTF-8',
+ 'Pragma' => 'no-cache',
+ 'Cache-Control' => 'no-cache',
+ 'Expires' => '0'
+ end
+
+ # Returns the entire current DNS ruleset
+ get '/rules' do
+ result = {}
+ result[:rules] = BeEF::Extension::DNS::DNS.instance.get_rules
+ result.to_json
+ end
+
+ end
+
+end
+end
+end