fix a number of TODO's in the HTTP handler, remove duplication in handlers

MS-2855/keylogger-mettle-extension
Brent Cook 2017-12-10 12:54:51 -06:00
parent 528a423fc0
commit bb5ea540ab
1 changed files with 21 additions and 48 deletions

View File

@ -339,6 +339,13 @@ protected
self.pending_connections += 1 self.pending_connections += 1
resp.body = ''
resp.code = 200
resp.message = 'OK'
url = payload_uri(req) + conn_id
url << '/' unless url[-1] == '/'
# Process the requested resource. # Process the requested resource.
case info[:mode] case info[:mode]
when :init_connect when :init_connect
@ -354,58 +361,27 @@ protected
pkt.add_tlv(Rex::Post::Meterpreter::TLV_TYPE_TRANS_URL, conn_id + "/") pkt.add_tlv(Rex::Post::Meterpreter::TLV_TYPE_TRANS_URL, conn_id + "/")
resp.body = pkt.to_r resp.body = pkt.to_r
when :init_python, :init_native, :init_java when :init_python, :init_native, :init_java, :connect
# TODO: at some point we may normalise these three cases into just :init # TODO: at some point we may normalise these three cases into just :init
url = payload_uri(req) + conn_id + '/'
# Damn you, python! Ruining my perfect world! if info[:mode] == :connect
url += "\x00" unless uuid.arch == ARCH_PYTHON print_status("Attaching orphaned/stageless session...")
else
begin
blob = self.generate_stage(url: url, uuid: uuid, uri: conn_id)
blob = encode_stage(blob) if self.respond_to?(:encode_stage)
# TODO: does this have to happen just for windows, or can we set it for all? print_status("Staging #{uuid.arch} payload (#{blob.length} bytes) ...")
resp['Content-Type'] = 'application/octet-stream' if uuid.platform == 'windows'
begin resp['Content-Type'] = 'application/octet-stream'
blob = self.generate_stage( resp.body = blob
url: url,
uuid: uuid,
uri: conn_id
)
blob = encode_stage(blob) if self.respond_to?(:encode_stage) rescue NoMethodError
print_error("Staging failed. This can occur when stageless listeners are used with staged payloads.")
print_status("Staging #{uuid.arch} payload (#{blob.length} bytes) ...") return
end
resp.body = blob
# Short-circuit the payload's handle_connection processing for create_session
create_session(cli, {
:passive_dispatcher => self.service,
:conn_id => conn_id,
:url => url,
:expiration => datastore['SessionExpirationTimeout'].to_i,
:comm_timeout => datastore['SessionCommunicationTimeout'].to_i,
:retry_total => datastore['SessionRetryTotal'].to_i,
:retry_wait => datastore['SessionRetryWait'].to_i,
:ssl => ssl?,
:payload_uuid => uuid
})
rescue NoMethodError
print_error("Staging failed. This can occur when stageless listeners are used with staged payloads.")
return
end end
when :connect
print_status("Attaching orphaned/stageless session...")
resp.body = ''
url = payload_uri(req) + conn_id
url << '/' unless url[-1] == '/'
# Damn you, python! Ruining my perfect world!
url += "\x00" unless uuid.arch == ARCH_PYTHON
# Short-circuit the payload's handle_connection processing for create_session
create_session(cli, { create_session(cli, {
:passive_dispatcher => self.service, :passive_dispatcher => self.service,
:conn_id => conn_id, :conn_id => conn_id,
@ -422,8 +398,6 @@ protected
unless [:unknown_uuid, :unknown_uuid_url].include?(info[:mode]) unless [:unknown_uuid, :unknown_uuid_url].include?(info[:mode])
print_status("Unknown request to #{request_summary}") print_status("Unknown request to #{request_summary}")
end end
resp.code = 200
resp.message = 'OK'
resp.body = datastore['HttpUnknownRequestResponse'].to_s resp.body = datastore['HttpUnknownRequestResponse'].to_s
self.pending_connections -= 1 self.pending_connections -= 1
end end
@ -435,6 +409,5 @@ protected
end end
end end
end end
end end