Senda Oscura

Linux y Seguridad

Archive for January, 2008


Cómo hacer que la batería dure más tiempo

Todos alguna vez nos hemos (o nos han) preguntado: ¿Por qué la batería me dura más en Windows que en Linux? Pues simplemente porque los fabricantes de portátiles se encargan de hacer buenos programas para gestionar la energía bajo Windows. Estas pequeñas joyas que cada compañía hace a medida para su equipo, son capaces de controlar y desactivar todo aquello que no se usa, suspenden el bluetooth, ponen el wifi en modo ahorro, bajan el brillo a medida que se consume la batería, suspenden la energía de los puertos usb que no se están usando, etc, etc. En conjunto todas estos pequeños ahorros de energía producen un ahorro significativo que expande considerablemente la duración de la batería.

En Linux hemos ido siempre un paso por detrás en este sentido, es cierto que existen algunos programas que son capaces de reaccionar a ciertos eventos ACPI, haciendo, por ejemplo, que el portátil se comporte de manera diferente según la batería que nos quede. Pero nunca habíamos tenido una herramienta que nos permitiera identificar con claridad los ‘agujeros negros’ de nuestro equipo, es decir, esos procesos que consumen más de lo que estamos dispuestos a permitir o esas carencias de configuración que hacen que el portátil gaste energía en algo que es innecesario.

Pero estamos de enhorabuena, Intel ha desarrollado y liberado una pequeña herramienta que nos permitirá identificar cuales son los procesos que más energía consumen, además esta pequeña utilidad nos dará consejos sobre como configurar nuestro equipo para hacer un mejor uso de la batería, es más, muchas veces bastará pulsar una tecla para que la aplicación aplique el consejo (eso sí, para hacerlo persistente tendremos que crear un script que ejecute las medidas recomendadas durante el arranque del sistema).

La utilidad se llama PowerTop y si tienes un portátil Intel ya deberías estarla usando (si usas una distribución Debian o similar también puedes descargarla vía apt-get).

Coloreando patrones

Hoy estaba revisando algunos logs y pensé: ojalá pudiera resaltar con colores algunos patrones, me ayudaría mucho. Por supuesto, la primera idea que se me vino a la cabeza fue usar el grep:

# grep –colour PATRON /var/log/messages

Pero el grep elimina todas las líneas que no contienen el patrón y eso tampoco me interesaba. Busqué en la web un rato y encontré varias utilidades que coloreaban ficheros de logs completos, pero tampoco era lo que quería.

Lo que necesitaba era una utilidad que me resaltara sólo ciertos patrones y que me devolviera el contenido íntegro del fichero de logs. Eso sí que estaría bien. Y diría que hace tiempo me encontré con una utilidad que hacía exactamente eso… pero como no daba con ella y tampoco quería pasarme toda la mañana buscándola, escribí un pequeño script en perl que hacía todo lo que yo necesitaba. No soporta expresiones regulares (de momento) pero es suficiente para lo que yo lo quiero. Os pongo un par de ejemplos de uso:

1. Si lo ejecutamos sin parámetros nos sale una ayuda muy cutre. Básicamente nos dice que necesita al menos un patrón que colorear. El script sólo admite cuatro patrones como máximo (pero es muy sencillo modificarlo para que admita más). Cada patrón será resaltado con un color distinto.

# highlight
ERROR: Necesito al menos un patrón que sobresaltar
Uso: /usr/local/bin/highlight patron [patron2] [patron3] [patron4]

2. Coloreamos el log del iptables para que resalte los patrones ‘SPT=’, ‘DPT=’ y ‘Output’.

# cat iptables.log | highlight SPT= DPT= Output

3. Similar al anterior pero usanto un tail:

# tail -f iptables.log | highlight Input SPT= DPT= src= DST=


Descargar Highlight Script

Seguridad básica con IPTables

Esta semana he visto como un importante número de sistemas eran comprometidos de manera sistemática por no haber sido parcheados en su momento. Este tipo de ataques suelen ser realizados por scripts que operan de manera autónoma, comprometen el sistema usando algún bug no parcheado, instalan alguna puerta trasera para permitir su acceso posterior y algún bot que comprometa otras máquinas usando la actual. Nada complicado, ni siquiera se preocupan por conseguir privelegios de administrador. Pero eso no importa, la máquina está comprometida y en cualquier momento el atacante puede acceder a ella para intentar elevar sus privilegios. Por otra parte, nuestra máquina infectada podría estar siendo usada para comprometer otras, lo que ya en sí es un problema importante.

Huelga decir que lo ideal sería tener siempre nuestro sistema actualizado y parcheado, pero me temo que es casi una utopía. En el día a día las cosas no funcionan así, no hay un departamente encargado de la seguridad de los sistemas y habitualmente los administradores tienen tantas cosas que hacer que en lo último que piensan es aplicar un parche a un servicio que funciona perfectamente.

Así pues se hace necesario añadir una nueva capa de seguridad, que aunque no elimina la necesidad de parchear nuestros sistemas cuando es descubierto un nuevo bug, sí que minimiza el impacto de un posible compromiso. Me estoy refieriendo a los cortafuegos. Si nuestra máquina está protegida por un cortafuegos correctamente configurado, éste debería impedir el acceso a nuevos puertos abiertos (puertas trasearas) y además debería cortar cualquier conexión saliente hacia hosts/servicios no permitidos (bot malicioso).

No voy a hablar de arquitecturas de red, de DMZs, ni de la mejor manera de organizar nuestras redes para que sean lo más segura posibles. Y no voy a hablar de esto porque nuestras redes ya están montadas y por mucho que yo os diga no se van a cambiar. Si por el contrario estáis pensando en diseñar vuestra red, hacedme caso e incluid una DMZ, ya me lo agradeceréis.

Bueno, a lo que iba, si tenéis algún servidor con presencia en Internet y no está dentro de una DMZ, lo mejor es protegerlo con un pequeño cortafuegos que sólo permita el acceso a los servicios legítimos y que, además, impida cualquier conexión saliente ilegítima. He escrito un pequeño script IPTables a modo de plantilla (muy sencillo) que os invito a modificar y adaptar a vuestras necesidades. No se trata de un script para servidores que operen como enrutadores, si no para servidores finales que ofrezcan servicios de usuario; y por supuesto, no es un firewall personal, es demasiado restrictivo para eso.

En fin, espero que os sea tan útil como a mí.


Descargar Plantailla IPTables

Análisis Forense: persiguiendo a un script kiddie

El año nuevo me trajo un bonito regalo: una máquina comprometida. Me pidieron lo que se suele pedir en estos casos, buscar como lograron acceso y que medidas tomar para evitar intrusiones futuras. La máquina en cuestión ofrecía servicios de webhosting y no podía desconectarse bajo ningún concepto, tampoco existía una máquina de respaldo para casos como estos. Las copias de seguridad se hacían rigurosamente, pero no es suficiente en esta situación, es necesario que exista una máquina de respaldo lista para entrar en funcionamiento con la última copia de seguridad limpia.

Pero esto es lo que te enseña la experiencia, las cosas no son como dicen en los manuales… ahí estaba mi máquina con signos evidentes de compromiso y yo no podía desconectarla para analizarla con calma. Tampoco podía obtener un volcado del disco para su posterior análisis, se trataba de una máquina remota y, además, la carga adicional del volcado a un medio externo afectaría notablemente al desempeño del sistema.

Bueno, hay que jugar la mano con las cartas que te tocan, así que me puse manos a la obra. Tras un primer vistazo al sistema descubrí un bouncer y varias instancias del eggdrop campando a sus anchas, además todo ejecutado por el usuario ‘www-data’. Aquello olía a script kiddie. Era evidente que la máquina había sido comprometido por el fallo de algún CMS, pero en aquel momento sentía más curiosidad por la personalidad del atacante que por el fallo que le permitió entrar. Escribí unas cuantas reglas IPTables para asegurar mínimamente la máquina y fui a la caza del intruso. Tras tracearle un poco la pista lo encontré en un IRC dejado de la mano de Dios, estaba en un canal rodeado de todos sus eggdrops. Os aseguro que había muchos y cada uno de ellos era señal inequívoca de que una máquina había sido comprometida en algún lado. El servidor IRC no ocultaba la IP, así que tenía todas las direcciones de todas las máquinas comprometidas, supongo que debería haber notificado a los afectados… pero lo que hice fue hablar con mi pequeño intruso. Era un chaval chino con ganas de impresionar a sus amigos y obtener privilegios de operador en algún canal hacker. Estaba conectado a través de un bouncer, así que localizar su IP real me iba a costar mucho trabajo y tiempo… y tediosas negociaciones con administradores negligentes.

Ya conocía al intruso, así que volví a la máquina. Primero había que ver el alcance del ataque. No había indicios de que hubiera conseguido privilegios de root, aunque claro, siendo root nada te impide borrar tus huellas. De todas formas no parecía probable (y sin desconectar la máquina no podía hacer análisis más concienzudos). Había varios bouncers instalados en el sistema, por su fecha y ubicación era más que posible que fueran creados por distintos scripts, así pues podríamos estar hablando de varias webs vulnerables. Eliminé bouncers, eggdrops y una bonita puerta trasera colocada en el cron y fui a por el fallo que permitió entrar al intruso. Identifiqué varias vulnerabilidades que presentaba el sistema y estudié con detenimiento los logs del servidor web. Vi muchos rastreos automáticos de bots bien conocidos y alguno que otro sin precedentes, no me extrañaba nada que la máquina hubiera sido comprometida. Lo que me sigue extrañando es no haber encontrado más malware.

Informé sobre los problemas y di por acabado el trabajo. Pero aún tengo al sistema bajo vigilancia, estoy seguro de que en esa máquina hay más de lo que veo (también es posible que esté paranoico, esa es una de las consecuencias de este trabajo).

Para acabar un dilema, debería lanzarme en una cruzada contra el chaval que ejecutó el bot o debería dejarlo pasar sin una colleja… ninguna de las dos opciones me parece adecuada, pero haré lo que se suele hacer en estos casos (así va el mundo), tomaré la alternativa fácil… lo dejaré pasar.

Felices Fiestas