Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
beefproject
GitHub Repository: beefproject/beef
Path: blob/master/extensions/dns/rest/dns.rb
1154 views
1
#
2
# Copyright (c) 2006-2025 Wade Alcorn - [email protected]
3
# Browser Exploitation Framework (BeEF) - https://beefproject.com
4
# See the file 'doc/COPYING' for copying permission
5
#
6
module BeEF
7
module Extension
8
module Dns
9
# This class handles the routing of RESTful API requests that query BeEF's DNS server
10
class DnsRest < BeEF::Core::Router::Router
11
# Filters out bad requests before performing any routing
12
before do
13
@dns ||= BeEF::Extension::Dns::Server.instance
14
config = BeEF::Core::Configuration.instance
15
16
# Require a valid API token from a valid IP address
17
halt 401 unless params[:token] == config.get('beef.api_token')
18
halt 403 unless BeEF::Core::Rest.permitted_source?(request.ip)
19
20
headers 'Content-Type' => 'application/json; charset=UTF-8',
21
'Pragma' => 'no-cache',
22
'Cache-Control' => 'no-cache',
23
'Expires' => '0'
24
end
25
26
# Returns the entire current DNS ruleset
27
get '/ruleset' do
28
ruleset = @dns.get_ruleset
29
count = ruleset.length
30
31
result = {}
32
result[:count] = count
33
result[:ruleset] = ruleset
34
result.to_json
35
rescue StandardError => e
36
print_error "Internal error while retrieving DNS ruleset (#{e.message})"
37
halt 500
38
end
39
40
# Returns a specific rule given its id
41
get '/rule/:id' do
42
id = params[:id]
43
44
rule = @dns.get_rule(id)
45
raise InvalidParamError, 'id' if rule.nil?
46
47
halt 404 if rule.empty?
48
49
rule.to_json
50
rescue InvalidParamError => e
51
print_error e.message
52
halt 400
53
rescue StandardError => e
54
print_error "Internal error while retrieving DNS rule with id #{id} (#{e.message})"
55
halt 500
56
end
57
58
# Adds a new DNS rule
59
post '/rule' do
60
body = JSON.parse(request.body.read)
61
62
pattern = body['pattern']
63
resource = body['resource']
64
response = body['response']
65
66
# Validate required JSON keys
67
raise InvalidJsonError, 'Empty "pattern" key passed to endpoint /api/dns/rule' if pattern.nil? || pattern.eql?('')
68
raise InvalidJsonError, 'Invalid "resource" key passed to endpoint /api/dns/rule' if resource !~ /\A[A-Z]+\Z/
69
raise InvalidJsonError, 'Non-array "response" key passed to endpoint /api/dns/rule' unless response.is_a?(Array)
70
raise InvalidJsonError, 'Empty "response" array passed to endpoint /api/dns/rule' if response.empty?
71
72
# Validate resource
73
case resource
74
when 'A'
75
dns_resource = Resolv::DNS::Resource::IN::A
76
when 'AAAA'
77
dns_resource = Resolv::DNS::Resource::IN::AAAA
78
when 'CNAME'
79
dns_resource = Resolv::DNS::Resource::IN::CNAME
80
when 'HINFO'
81
dns_resource = Resolv::DNS::Resource::IN::HINFO
82
when 'MINFO'
83
dns_resource = Resolv::DNS::Resource::IN::MINFO
84
when 'MX'
85
dns_resource = Resolv::DNS::Resource::IN::MX
86
when 'NS'
87
dns_resource = Resolv::DNS::Resource::IN::NS
88
when 'PTR'
89
dns_resource = Resolv::DNS::Resource::IN::PTR
90
when 'SOA'
91
dns_resource = Resolv::DNS::Resource::IN::SOA
92
when 'TXT'
93
dns_resource = Resolv::DNS::Resource::IN::TXT
94
when 'WKS'
95
dns_resource = Resolv::DNS::Resource::IN::WKS
96
else
97
raise InvalidJsonError, 'Invalid "resource" key passed to endpoint /api/dns/rule'
98
end
99
100
# Add rule
101
id = @dns.add_rule(
102
pattern: pattern,
103
resource: dns_resource,
104
response: response
105
)
106
107
# Return result
108
result = {}
109
result['success'] = true
110
result['id'] = id
111
result.to_json
112
rescue InvalidJsonError => e
113
print_error e.message
114
halt 400
115
rescue StandardError => e
116
print_error "Internal error while adding DNS rule (#{e.message})"
117
halt 500
118
end
119
120
# Removes a rule given its id
121
delete '/rule/:id' do
122
id = params[:id]
123
124
removed = @dns.remove_rule!(id)
125
raise InvalidParamError, 'id' if removed.nil?
126
127
result = {}
128
result['success'] = removed
129
result.to_json
130
rescue InvalidParamError => e
131
print_error e.message
132
halt 400
133
rescue StandardError => e
134
print_error "Internal error while removing DNS rule with id #{id} (#{e.message})"
135
halt 500
136
end
137
138
# Raised when invalid JSON input is passed to an /api/dns handler.
139
class InvalidJsonError < StandardError
140
DEFAULT_MESSAGE = 'Invalid JSON input passed to /api/dns handler'
141
142
def initialize(message = nil)
143
super(message || DEFAULT_MESSAGE)
144
end
145
end
146
147
# Raised when an invalid named parameter is passed to an /api/dns handler.
148
class InvalidParamError < StandardError
149
DEFAULT_MESSAGE = 'Invalid parameter passed to /api/dns handler'
150
151
def initialize(message = nil)
152
str = 'Invalid "%s" parameter passed to /api/dns handler'
153
message = format str, message unless message.nil?
154
super(message)
155
end
156
end
157
end
158
end
159
end
160
end
161
162