Diferencia entre revisiones de «Detección de intrusos»

Contenido eliminado Contenido añadido
m robot Eliminado: en:Intrusion detection
m Robot: Fixing wiki syntax; cambios triviales
Línea 2:
== Introducción ==
Dentro de las soluciones tecnológicas que en la actualidad están disponibles para reforzar la seguridad de una red, los firewalls son muy populares. Un [[firewall]] es un sistema encargado del cumplimiento de las políticas de control de acceso a la red, lo cual se hace a través de reglas. Un firewall actúa como guardia perimetral de una red: protege una red de ataques que provengan del exterior de ésta. Pero el escenario se puede complicar de la siguiente forma:
* Un atacante puede lograr pasar el firewall, dejando la red a su merced.
* Un firewall protege de los accesos no autorizadas hacia la red interna, pero no protege a las máquinas ubicadas en la red perimetral como servidores web, servidores de correo, servidores [[FTP]], en otras palabras, a las bases funcionales de Internet.
* Un firewall no protege contra ataques desde adentro.
 
En estos casos lo que nos queda detectar el ataque o la intrusión lo antes posible para que cause el menor daño en el sistema. Antes de continuar vamos a definir qué se entiende normalmente por intrusión. Normalmente un intruso intenta:
* Acceder a una determinada información.
* Manipular cierta información.
* Hacer que el sistema no funcione de forma segura o inutilizarlo.
 
Una [[intrusión]] es cualquier conjunto de acciones que puede comprometer la [[integridad]], [[confidencialidad]] o [[disponibilidad]] de una información o un recurso informático. Los intrusos pueden utilizar debilidades y brechas en la arquitectura de los sistemas y el conocimiento interno del sistema operativo para superar el proceso normal de autenticación.
La '''detección de intrusos''' se puede realizar a partir de la caracterización anómala del comportamiento y del uso que hacen de los recursos del sistema. Este tipo de detección pretende cuantificar el comportamiento normal de un usuario. Para una correcta distinción hay que tener en cuenta las tres distintas posibilidades que existen en un ataque, atendiendo a quién es el que lo lleva a cabo:
* Penetración externa. Que se define como la intrusión que se lleva a cabo a partir un usuario o un sistema de computadores no autorizado desde otra red.
* Penetraciones internas. Son aquellas que llevan a cabo por usuarios internos que no están autorizados al acceso.
* Abuso de recursos. Se define como el abuso que un usuario lleva a cabo sobre unos datos o recursos de un sistema al que está autorizado su acceso.
 
La idea central de este tipo de detección es el hecho de que la actividad intrusiva es un subconjunto de las actividades anómalas. Esto puede parecer razonable por el hecho de que si alguien consigue entrar de forma ilegal en el sistema, no actuará como un usuario normal. Sin embargo en la mayoría de las ocasiones una actividad intrusiva resulta del agregado de otras actividades individuales que por sí solas no constituyen un comportamiento intrusivo de ningún tipo. Idealmente el conjunto de actividades anómalas es el mismo del conjunto de actividades intrusivas, de todas formas esto no siempre es así:
* Intrusivas pero no anómalas. Se les denomina falsos negativos y en este caso la actividad es intrusiva pero como no es anómala y no se consigue detectarla. Se denominan falsos negativos porque el sistema erróneamente indica ausencia de intrusión.
* No intrusivas pero anómalas. Se denominan falsos positivos y en este caso la actividad es no intrusiva, pero como es anómala el sistema decide que es intrusiva. Se denominan falsos positivos, porque el sistema erróneamente indica la existencia de intrusión.
* Ni intrusiva ni anómala. Son negativos verdaderos, la actividad es no intrusiva y se indica como tal.
* Intrusiva y anómala. Se denominan positivos verdaderos, la actividad es intrusiva y es detectada.
 
Los primeros no son deseables, porque dan una falsa sensación de seguridad del sistema y el intruso en este caso puede operar libremente en el sistema. Los falsos positivos se deben de minimizar, en caso contrario lo que puede pasar es que se ignoren los avisos del sistema de seguridad, incluso cuando sean acertados. Los detectores de intrusiones anómalas requieren mucho gasto computacional, porque se siguen normalmente varias métricas para determinar cuánto se aleja el usuario de lo que se considera comportamiento normal.
Línea 28:
En caso de que exista la suficiente certeza de la detección de un incidente, el SDI tiene como función principal alertar al administrador o personal de seguridad, para que tome acciones al respecto. Otras implementación más complejas son capaces de ir más allá de la notificación de un posible ataque, es decir pueden ejecutar acciones automáticas que impidan el desarrollo de éste.
 
== Clasificación de los SDI ==
Los SDI pueden clasificarse con base en varios aspectos: método de detección, tipo de monitoreo y forma de recolección y análisis de la información.
Según el método de detección, los hay de detección de mal uso y detección de anomalías.
Línea 34:
Estas firmas pueden ser simples, como cadenas de caracteres, estructuras de memoria o bits, pero también pueden ser más complejas como vectores ó expresiones matemáticas. Una ventaja de este método es que permite centralizar las labores de detección en el conjunto de firmas que posee el SDI, minimizando así, la carga de procesamiento del sistema. Muchos productos comerciales utilizan este enfoque e inclusive periódicamente proporcionan actualizaciones de éstas firmas.
En cambio, el modelo de detección de anomalías se basa en constantemente monitorear el sistema para así detectar cualquier cambio en los patrones de utilización o el comportamiento del mismo. Si algunos de los parámetros monitoreados sale de su regularidad, el sistema generará una alarma que avisará al administrador de la red sobre la detección de una anomalía. Este tipo de detección es bastante compleja, debido a que la cuantificación de los parámetros a observar no es sencilla y a raíz de esto, se pueden presentar los siguientes inconveniente:
* Pueden generarse falsas alarmas si el ambiente cambia repentinamente, por ejemplo, cambio en el horario de trabajo.
* Un atacante puede ir cambiando lentamente su comportamiento para así engañar al sistema.
 
Los inconvenientes antes mencionados pueden ser controlados mediante una implementación robusta y minuciosa.
Línea 43:
Los SDI que utilizan el modelo orientado a red, fundamentan su monitoreo en información recolectada de la red. Generalmente, ésta información es capturada mediante mecanismos de "sniffing". El "sniffing" consiste en habilitar la interfaz de red en modo promiscuo para que así capture todos los paquetes que reciba, incluso aquellos que no le han sido destinados. En base al mecanismo antes expuesto, se pueden definir patrones o firmas de ataques, según la estructura, información y ocurrencia de los paquetes.
 
== Características deseables de un SDI ==
* Debe ejecutarse continuamente sin intervención o supervisión de un operador humano.
* Debe ser confiable, lo suficiente como para ejecutarse en background, pero no debe ser una caja negra, es decir, que su funcionamiento interno pueda ser examinado.
* Debe ser capaz de tolerar fallas, en el sentido de que pueda sobrevivir a una caída del sistema, sin tener que reconstruir su base de datos de conocimientos al reiniciarse.
* El sistema debe estar en capacidad de automonitorearse para asegurar su correcto funcionamiento.
* Debe ser ligero, es decir su ejecución no debe cargar al sistema de una manera tal que le impida ejecutar otras tareas con relativa normalidad
* Debe observar desviaciones del comportamiento estándar.
* Debe poder adaptarse al comportamiento cambiante del sistema, es decir, si la configuración del sistema cambia, el SDI se adaptará.
* Debe ser difícil de engañar.
 
== Metodología para la detección de intrusos ==
=== Introducción ===
La labor de un administrador o de la persona encargada de la seguridad de un sistema informático puede ser realmente frustrante. Sobre todo cuando el sistema ha sido invadido por un intruso o hacker. En principio, si se ha configurado correctamente un servidor y se está al día en materia de seguridad, así como de fallas (bugs) que van surgiendo, no habrá problemas de que un intruso entre en el sistema. Realmente con un poco de esfuerzo se puede tener un servidor altamente seguro que evitará alrededor del 85% de los intentos de acceso no autorizados al sistema. Pero en muchas ocasiones el peligro viene de los propios usuarios internos del sistema, los cuales presentan un gran riesgo debido a que ya tiene acceso al sistema.
 
=== Pasos a seguir para detectar a un intruso ===
Lo primero que debemos hacer es seguir una serie de pasos los cuales nos ayudarán a descubrir si realmente ha entrado un intruso, ya que en muchas ocasiones pensamos que ha entrado alguien, pero no es cierto. Por eso, ante todo calma; esto es lo más importante para un buen administrador.
Realmente en muchas ocasiones es fácil detectar a un intruso en ambiente [[Unix]], ya que suelen seguir un patrón detectable, el cual podría ser el mostrado en la figura.
Este esquema representa básicamente los pasos que sigue de un intruso: Primero entra al sistema, y si sólo tiene acceso como usuario, explotará alguna debilidad o falla del sistema para así obtener ID 0 (o lo que es lo mismo, privilegios de root). En caso de entrar como root u obtenerlo de alguna otra manera, se dedicará a controlar el sistema, dejando algún mecanismo para volver cuando quiera. Seguramente copiará el archivo /etc/passwd y el /etc/shadow (en caso de que el sistema use "shadow"), luego le dará rienda suelta a su imaginación, como por ejemplo, instalar un sniffer, troyanos, leer mails ajenos, etc. Y en caso de ser un pirata malicioso puede causar desastres en el sistema, como sería modificar páginas web, borrar archivos o mails, producir un [[DoS]] (Denial of Service), cambiar passwords de usuarios legítimos, etc.
 
A continuación se exponen los diferentes pasos a seguir de acuerdo a los expertos en seguridad como son el [[CERT]][http://www.cert.org| CERT], [[Improvement Support Systems|ISS]], etc.
Esto son los pasos a seguir:
* Examinar los archivos log como el 'last' log, contabilidad, syslog, y los C2 log buscando conexiones no usuales o cosas sospechosas en el sistema. Aunque hay que tener especial cuidado en guiarnos por los logs, ya que muchos intrusos utilizaran diversas herramientas para borrar sus huellas.
* Buscar por el sistema archivos ocultos o no usuales (archivos que empiezan por un '.' (punto), no salen con un simple 'ls'), ya que pueden ser usado para esconder herramientas para violar la seguridad del sistema, por ejemplo un crackeador o incluso contener el /etc/passwd del sistema o de otros sistemas al cual ha entrado nuestro intruso. Muchos piratas suelen crear directorios ocultos utilizando nombres como '...' (punto-punto-punto), '..' (punto-punto), '..^g' (punto-punto control+G). En algunos casos un pirata ha utilizado nombres como '.x' o '.hacker' o incluso '.mail'.
* Buscar archivos SET-UID por el sistema. Ya que en muchas ocasiones los piratas suelen copiar y dejar escondido copias del /bin/sh para obtener root. Podemos utilizar la orden 'find' para buscar este tipo de archivos por el sistema (la orden 'find' puede ser sustituido por un troyano para esconder archivos del pirata, por lo que no es totalmente confiable), para ello ejecutamos la siguiente línea:
 
# find / -user root -perm -4000 -print
 
* Revisar los archivos binarios del sistema para comprobar que no han sido sustituidos por un troyano, como por ejemplo los programas 'su', 'login', 'telnet' y otros programas vitales del sistema. (Existen varias herramientas conocidas como 'RootKit' que permite a un pirata cambiar los binarios del sistema por troyanos que son copias exactas de los originales). Lo recomendado es comparar con las copias de seguridad aunque puede que las copias de seguridad también hayan sido sustituidas por un troyano.
* Examinar todos los archivos que son ejecutados por 'cron' y 'at'. Ya que algunos piratas depositan puertas traseras que le permiten volver al sistema aunque los hayamos echado del sistema. Asegurarse que todos los archivos son nuestros y no tienen permiso de escritura.
* Examinar el archivo /etc/inetd.conf en busca de cambios, en especial aquellas entradas que ejecuten un shell (por ejemplo: /bin/sh o /bin/csh) y comprobar que todos los programas son legítimos del sistema y no troyanos.
* Examinar los archivos del sistema y de configuración en busca de alteraciones. En particular, buscar entradas con el signo '+' o 'host names' no apropiados en archivos como /etc/hosts.equiv, /etc/hosts.lpd y en todos los archivos .rhost del sistema, con especial interés los de 'root', 'uucp', 'ftp' y otras cuentas del sistema. Estos archivos no deberían tener atributo de escritura.
* Examinar cuidadosamente todos los computadores de nuestra red local en busca de indicios que nuestra red ha sido comprometida. En particular, aquellos sistemas que compartan NIS+ o NFS, o aquellos sistemas listados en el /etc/hosts.equiv. Logícamente también revisar los sistemas informéticos que los usuarios comparten mediante el acceso del .rhost.
* Examinar el archivo /etc/passwd, en busca de alteraciones en las cuentas de los usuarios o la creación de cuentas nuevas, especialmente aquellas cuentas con ID 0, las que no tienen password, etc.
 
Estos nueve puntos son los pasos a seguir recomendados por el CERT, los cuales están muy bien, pero se quedan un poco cortos de soluciones prácticas para el administrador. Para ello nos vamos a basar en un excelente trabajo de un grupo de Hackers conocidos como Technotronic (http://www.technotronic.com), los cuales se basan en el mismo documento pero explicando los métodos de los piratas y como combatirlos. Se trata de lo siguiente:
 
Los archivos Log:
* messages: Este archivo contiene bastante información, por lo que debemos buscar sucesos poco usuales.
* xferlog: Si el sistema comprometido tiene servicio FTP, este archivo contiene la bitácora de todos los procesos del FTP. Podemos examinar qué tipo de herramientas ha subido el pirata y qué archivos ha bajado de nuestro servidor.
* utmp: Este archivo contiene información en binario de todos los usuarios conectados al sistema en el momento. Por lo que puede ser muy útil para determinar quién está conectado al sistema en este momento. Para ello ejecutaremos la orden 'who' o 'w'.
* wtmp: Cada vez que un usuario entra al servidor y sale del mismo, la máquina modifica este archivo. Al igual que el anterior, este archivo está en binario, por lo que tendremos que usar alguna herramienta especial para ver el contenido de este archivo. El mismo contiene la información en formato: usuario, hora de conexión, e IP origen del usuario, por lo que podemos averiguar de dónde provino el pirata. Pero aunque contemos con esta información, puede que haya sido falseada por el pirata utilizando alguna técnica para ocultar su IP original o haya borrado su entrada.
* secure: Algunos sistemas Unix loggean mensajes en archivo secure, ya que utilizan algún software de seguridad para ello, como el [[TCP Wrapper]].
 
Muchos piratas intentaran borrar sus huellas utilizando unos programas conocidos como 'Zapper's' o 'Zap'. Los más populares, debido a que están ampliamente disponibles por Internet, son los siguientes:
* marry.c
* zap.c
* zap2.c
* remove.c
* cloak.c
 
Por supuesto contamos con mecanismos para detectar este tipo de programas, lo cual se explica en la sección de herramientas.
Línea 106:
 
Debemos buscar troyanos en nuestros archivos binarios, ya que suele ser una de las tareas principales de un pirata cuando ha comprometido la seguridad de un servidor. Una lista no exhaustiva de posibles binarios que un pirata puede sustituir, es la siguiente: login
* su
* telnet
* netstat
* ifconfig
* ls
* find
* du
* df
* libc
* sync
 
Así como los binarios listados en /etc/inetd.conf.
Línea 121:
Al igual que antes, tenemos varias utilidades ampliamente disponibles para detectar estos troyanos, pero por otro lado, los piratas también tienen ampliamente disponible estos paquetes de troyanos, conocidos como 'RootKit', como ya mencionamos antes.
Otras de las principales tareas de un pirata consiste en la utilización de sniffers, para capturar información confidencial. Los más usados son los siguientes:
* linsniff666.c
* esniff.c
* solsniff.c
* sunsniff.c
* sniffit
 
Ahora nos enfocaremos en la parte de los passwords. Un pirata intentará por todos los medios obtener el archivo de passwords, para luego usar un programa especial que le permitirá averiguar los passwords de los usuarios. Los principales 'crackeadores' son:
* Crack
* John The Ripper 1.5
* Cracker Jack
* Hades
 
Ya hemos visto diferentes técnicas que emplearan los piratas contra nuestro sistema, por lo que ahora estamos mejor preparados para enfrentarnos a ellos. A continuación nos enfocaremos de forma más practica a los diferentes pasos a seguir cuando hemos detectado un pirata.
Si hemos pillado al intruso en el momento, tenemos varias opciones:
 
* Hablar con él, usando la orden 'talk', aunque debemos tener en cuenta que puede contestar de forma amistosa (ayudándonos en relación a la seguridad del sistema) o agresiva (borrando el sistema para no dejar rastro).
 
* Desconectarle del sistema, usando la orden 'kill', pero para evitarnos que vuelva a entrar, antes de usar 'kill', usaremos la orden 'passwd' para cambiar el password de la cuenta por el cual el pirata entró. Por ejemplo, podemos ejecutar las siguientes órdenes:
 
# ps -aux
Línea 152:
# kill -9 147 321 339
 
* Utilizar las utilidades del sistema para recopilar información sobre el pirata, la cual será necesaria en caso de denuncia. Por lo que trataremos de 'tracearle', usando las siguientes órdenes:
** who
**w
** last
** lastcomm
** netstat
** snmpnetstat
** Obtener información del router.
** Examinar el archivo /var/adm/messages.
** Examinar el syslog.
** Examinar los log del wrapper.
** Ejecutar la orden 'finger' en todos los usuarios locales, para comprobar cuando fue la última vez que estuvieron en el sistema.
** Examinar los archivos history del shell, como el .history, .rchist y archivos similares.
 
* Ejecutando la orden 'finger', intentaremos sacar información del host de donde provino el ataque, como por ejemplo:
 
# finger @intruso.es
Línea 174:
Si tenemos suerte podremos obtener la información.
 
* También podemos dirigirnos a [[Internic]][http://www.internic.net| Internic] donde podemos pedir información sobre cualquier servidor en el mundo, siempre y cuando no sea militar. Allí ponemos el dominio del servidor de donde provino el ataque, y podremos ver con quién debemos ponernos en contacto con el servidor atacante. Si existe un teléfono de contacto, lo mejor sería llamar a la persona encargada, ya que si enviamos un e-mail informándole que tiene un pirata, puede que el pirata intercepte el mensaje y se haga pasar por el administrador. En caso de vernos forzados a escribir un e-mail, poner cualquier pretexto para tener que hablar por teléfono con el administrador del servidor atacante, y si es necesario ofrecernos a pagar la llamada nosotros mismos, en calidad de buenas intenciones. A parte del website de Internic, también podemos conectar vía telnet para solicitar información de un servidor.
 
* Ahora que tenemos bastante información del atacante, lo mejor sería desconectar nuestro servidor de Internet y dedicarnos unos días a repasar cuidadosamente lo sucedido. Además, si nadie accede al servidor durante unos días, podremos trabajar mejor y más rápido.
 
* Tendremos que hacer una copia de seguridad, por lo que ejecutaremos la siguiente orden:
 
# dd if=/dev/sda of=/dev/sdb
Línea 184:
En caso de duda de cómo usar la orden 'dd', lo mejor sería recurrir a la orden 'man'.
 
* Tener a mano un block de notas y un lápiz, para escribir todo lo que nos parezca importante, así como todos los pasos que estamos realizando en el sistema comprometido.
 
* Ahora sólo nos queda realizar un exhaustivo análisis mediante los pasos anteriormente descritos.
 
Ya a estas alturas conocemos los peligros y pasos a seguir para recuperar el control en nuestro sistema, así cómo echar al pirata. Ahora se muestra un lista más generalizada de los puntos que hay que mirar con detalle.
** Creación de cuentas nuevas o alteración de algunas existentes.
** Excesivo consumo de memoria o disco duro.
** Directorios o archivos sospechosos.
** Alteración en la configuración del sistema.
** Procesos sospechosos.
** Conexiones de servidores poco usuales.
** Reconfiguración de los módems.
** Serie de repeticiones de conexión al mismo puerto.
** Conexión de usuarios en horas o días poco usuales.
 
=== Diversas utilidades para la tarea ===
Ahora nos dedicaremos a explicar las diferentes herramientas que están disponibles en el cyberespacio. Lo mejor es que casi todas son [[freeware]], por lo que no existe excusa alguna para no usarlas. Además usando habitualmente estas herramientas, mantendremos nuestro sistema seguro demostrando lo bueno que somos administrando el servidor.
Las herramientas que se describen a lo largo de este apartado son anti-zapper's, detectores de sniffers, detectores de troyanos, así como diversas herramientas de análisis, e incluso algunas herramientas que también utilizan los piratas, para nuestro propio beneficio. Debido a la gran cantidad de herramientas disponibles (no he puesto todas las que existen, debido a que es imposible), no se ha incluido la utilización de las mismas, ya que este documento sería muy largo, por lo que se incluye la dirección en Internet donde encontrarlas y así poder familiarizarse con esas herramientas.
 
* Detectores de Sniffers.
** Podemos usar la orden 'netstat', pero no es 100% confiable.
** promisc.c: Es un programa escrito en lenguaje C, el cual nos ayuda a detectar un sniffer en nuestra red. (promisc.c).
** cpm (ftp://coast.cs.purdue.edu/pub/tools/unix/cpm/cpm.1.2.tar.gz).
** ifstatus (ftp://coast.cs.purdue.edu/pub/tools/unix/ifstatus/ifstatus.tar.Z).
** NePED: Es un detector de sniffers. (ftp://apostols.org/ AposTools/snapshots/neped/).
 
Muchos sniffers logean las conexiones de la misma forma, la cual es la siguiente:
Línea 221:
Lógicamente debemos ajustar este script a nuestras necesidades.
 
* Detectores de troyanos.
** Podemos usar la orden 'sum' pero tampoco es 100% confiable.
** También podemos usar la orden 'cmp', pero lo mismo que la orden anterior.
** El popular, y más aconsejable de usar, es el programa de verificación MD5.
** Otro, también bastante utilizado, es Tripwire. (Tripwire).
 
* Detectores de zapper's.
** Antizap.c
** Antizap2.c
 
* Herramientas de análisis.
** Satan111: Posiblemente la herramienta más conocida. (SATAN). Extensiones. (SATAN Extensions).
** TCP_Wrapper: Es un conjunto de utilidades para controlar nuestro servidor. (tcp_wrappers_7.6.tar.gz).
** Netcat 1.10: Para saber por dónde nos puede entrar un pirata, ya que este programa es capaz de crear cualquier tipo de conexión. (netcat 1.10 for Unix).
** COPS: Otro conjunto de herramientas de muy buena calidad. (ftp://info.cert.org/pub/tools/cops).
** Roses Software Check Tool V.1.2.2: Interesante herramienta de anaálisis para servidores Linux. (http://web.jet.es/~simon_roses/).
** Rhino9 Security Check Tool: Interesante programa. (http://rhino9.technotronic.com).
** Stalker Audit-Trail Tool: Interesante herramienta para auditar los log's.(http://www.haystack.com).
** IDES/NIDES (Intrusion-Detection Expert System/Next-Generation IDES): Una herramienta de detección de piratas en tiempo real. (http://www.sri.com).
** WatchDog: Herramienta para auditar los log's para SunOS. (http://www.infstream.com).
** Saint (Security Analisys INtegration Tool): Herramienta en español para auditar.(http://www.super.unam.mx).
** Asax (Advanced Security Audit Trail Analysis on Unix): Programa en francés.(http://www.info.fundp.ac.be/~cri/DOCS/asax.html).
** Aid (Adaptive Intrusion Detection System): Herramienta en alemán.(http://www.rnks.informatik.tucottbus.de/~sobirey/aid.e.html).
** NetSuite Professional Audit: Herramienta profesional para auditar.(http://www.netsuite.com/Pi/audit.htm).
** Audit Trails: Lo mismo que el anterior.(http://promatrix.com/audit.htm).
** ISS SafeSuite: Potente herramienta de análisis. (http://www.iss.net).
** Proyecto Nessus: Una recomendable herramienta de auditoría. (The Nessus Project).
** Firewalk: Interesante técnica para analizar una red. (Enterprise Security Services, Inc.).
** Lsof (List Open Files): Programa que lista todos los archivos abiertos, incluidos los sockets abiertos. (ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/).
** tcplist: Lista todos los puertos abiertos que tenemos, además de suministrar diversa información más. (ftp://ftp.cdf.toronto.edu/pub/tcplist).
 
* Crakeadores de passwords.
** Crack V5: Posiblemente el crakeador más conocido. (Crack v5 (Source)).
** John The Ripper: Un excelente crakeador. (John the Ripper 1.5 linux).