1
1
require 'metasploit/framework/data_service/remote/http/remote_service_endpoint'
2
2
require 'metasploit/framework/data_service'
3
3
require 'metasploit/framework/data_service/remote/http/data_service_auto_loader'
4
+ require 'net/http'
5
+ require 'net/https'
4
6
5
7
#
6
8
# Parent data service for managing metasploit data in/on a separate process/machine over HTTP(s)
@@ -47,15 +49,15 @@ def post_data(path, data_hash)
47
49
48
50
puts "#{ Time . now } - Posting #{ data_hash } to #{ path } "
49
51
client = @client_pool . pop ( )
50
- request_opts = build_request_opts ( POST_REQUEST , data_hash , path )
51
- request = client . request_raw ( request_opts )
52
- response = client . _send_recv ( request )
52
+ request = Net :: HTTP :: Post . new ( path )
53
+ request = build_request ( request , data_hash )
54
+ response = client . request ( request )
53
55
54
- if response . code == 200
56
+ if response . code == " 200"
55
57
#puts "POST request: #{path} with body: #{json_body} sent successfully"
56
58
return SuccessResponse . new ( response )
57
59
else
58
- puts "POST request: #{ path } with body: #{ json_body } failed with code: #{ response . code } message: #{ response . body } "
60
+ puts "POST request: #{ path } with body: #{ request . body } failed with code: #{ response . code } message: #{ response . body } "
59
61
return FailedResponse . new ( response )
60
62
end
61
63
rescue Exception => e
@@ -81,11 +83,11 @@ def get_data(path, data_hash = nil)
81
83
82
84
puts "#{ Time . now } - Getting #{ path } with #{ data_hash ? data_hash : "nil" } "
83
85
client = @client_pool . pop ( )
84
- request_opts = build_request_opts ( GET_REQUEST , data_hash , path )
85
- request = client . request_raw ( request_opts )
86
- response = client . _send_recv ( request )
86
+ request = Net :: HTTP :: Get . new ( path )
87
+ request = build_request ( request , data_hash )
88
+ response = client . request ( request )
87
89
88
- if ( response . code == 200 )
90
+ if response . code == " 200"
89
91
# puts 'request sent successfully'
90
92
return SuccessResponse . new ( response )
91
93
else
@@ -94,6 +96,7 @@ def get_data(path, data_hash = nil)
94
96
end
95
97
rescue Exception => e
96
98
puts "Problem with GET request: #{ e . message } "
99
+ e . backtrace . each { |line | puts "#{ line } \n " }
97
100
ensure
98
101
@client_pool << client
99
102
end
@@ -205,13 +208,8 @@ def append_workspace(data_hash)
205
208
data_hash
206
209
end
207
210
208
- def build_request_opts ( request_type , data_hash , path )
209
- request_opts = {
210
- 'method' => request_type ,
211
- 'ctype' => 'application/json' ,
212
- 'uri' => path
213
- }
214
-
211
+ def build_request ( request , data_hash )
212
+ request . content_type = 'application/json'
215
213
if ( !data_hash . nil? && !data_hash . empty? )
216
214
data_hash . each do |k , v |
217
215
if v . is_a? ( Msf ::Session )
@@ -223,25 +221,23 @@ def build_request_opts(request_type, data_hash, path)
223
221
end
224
222
end
225
223
json_body = append_workspace ( data_hash ) . to_json
226
- request_opts [ 'data' ] = json_body
224
+ request . body = json_body
227
225
end
228
226
229
227
if ( !@headers . nil? && !@headers . empty? )
230
- request_opts [ 'headers' ] = @headers
228
+ #TODO: This probably needs to be converted for the net/http client
229
+ request [ 'headers' ] = @headers
231
230
end
232
231
233
- request_opts
232
+ request
234
233
end
235
234
236
235
def build_client_pool ( size )
237
236
@client_pool = Queue . new ( )
238
237
( 1 ..size ) . each {
239
- @client_pool << Rex ::Proto ::Http ::Client . new (
240
- @endpoint . host ,
241
- @endpoint . port ,
242
- { } ,
243
- @endpoint . use_ssl ,
244
- @endpoint . ssl_version )
238
+ http = Net ::HTTP . new ( @endpoint . host , @endpoint . port )
239
+ http . use_ssl = true if @endpoint . use_ssl
240
+ @client_pool << http
245
241
}
246
242
end
247
243
0 commit comments