Bajo el Radar: [PDF, 2167 kB] - Linux Magazine
Bajo el Radar: [PDF, 2167 kB] - Linux Magazine
Bajo el Radar: [PDF, 2167 kB] - Linux Magazine
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
PORTADA Evitando Detección<br />
Técnicas para sortear los sistemas IDS e IPS<br />
Las herramientas de detección de intrusos tipo Snort sirven de ayuda a la hora de seguir <strong>el</strong> rastro a los intru-<br />
sos, pero no debemos sentirnos demasiado cómodos. Mostraremos algunas de las técnicas y herramientas<br />
usadas por los atacantes para evitar que sus intrusiones sean detectadas.<br />
POR KURT SEIFRIED<br />
Acabamos de instalar y configurar<br />
nuestro sistema de detección de<br />
intrusos con la intención de proteger<br />
nuestra red frente a ataques, y ya<br />
estamos listos para empezar a recibir<br />
alertas que nos informen sobre cualquier<br />
actividad que parezca mínimamente sospechosa<br />
¿Estamos ya seguros? ¿De verdad<br />
lo creemos? Los expertos en seguridad<br />
invierten mucho tiempo y dinero<br />
estudiando técnicas que les permitan<br />
evadir los sistemas de detección de intrusiones<br />
(Intrusion Detection System o<br />
ISD) porque saben que los atacantes<br />
están ahí afuera haciendo exactamente<br />
lo mismo.<br />
Las herramientas IDS e IPS (sistemas<br />
de prevención de intrusiones, o Intrusion<br />
Prevention Systems en inglés) no carecen<br />
de problemas. Los sistemas de detección<br />
de intrusiones basados en host<br />
(HIDS) deben ser instalados y ejecutados,<br />
como su nombre indica, en <strong>el</strong> host<br />
que deseamos controlar. Esto estaría<br />
muy bien si tuviéramos <strong>el</strong> control total<br />
d<strong>el</strong> equipo y pudiéramos instalar nuestro<br />
sistema HIDS en él. (Buena suerte al<br />
intentarlo con todas las impresoras<br />
conectadas a la red, los escáneres, las<br />
fotocopiadoras, los sistemas punto de<br />
venta, los escáneres inalámbricos para<br />
inventariado, etc.)<br />
Cuando se trabaja en redes con<br />
muchos equipos, los administradores<br />
su<strong>el</strong>en desplegar herramientas IDS basadas<br />
en red. Estos sistemas incorporan<br />
sofisticados mecanismos de prevención<br />
de intrusiones (IPS) capaces de abortar<br />
ataques, por ejemplo, enviando paquetes<br />
TCP de reinicio para cerrar las conexiones<br />
problemáticas.<br />
Por desgracia, incluso estas herramientas<br />
de detección de ataques de niv<strong>el</strong><br />
empresarial pueden plantear alguna que<br />
otra complicación. Por ejemplo, <strong>el</strong> bloqueo<br />
d<strong>el</strong> ataque puede llegar demasiado<br />
tarde para que sea realmente efectivo;<br />
los sistemas IPS tienen que estar normal-<br />
22 Número 69 WWW.LINUX- MAGAZINE.ES<br />
mente en línea para que puedan bloquear<br />
los ataques antes de que consigan<br />
pasar, o bien tienen que ser algo más<br />
agresivos en <strong>el</strong> bloqueo de tráfico<br />
“malo”.<br />
Ambas soluciones llevan asociadas<br />
nuevos problemas – la primera alternativa<br />
introduce una latencia y un punto de<br />
fallo adicional en nuestra red, mientras<br />
que la segunda produce falsos positivos<br />
que pueden bloquear <strong>el</strong> tráfico web legítimo.<br />
Los atacantes con experiencia pueden<br />
aprovechar estos problemas para colarse<br />
dentro de la red de seguridad. En este<br />
artículo repasaremos algunas de las<br />
herramientas y técnicas que su<strong>el</strong>en usar<br />
para seguir ocultos incluso de los IDS<br />
mejor configurados.<br />
Evasión vs. Ataque<br />
Los intrusos disponen básicamente de<br />
dos opciones cuando quieren permanecer<br />
ocultos. Pueden esconderse usando<br />
© piai - Fotolia.com
técnicas de ocultación, o bien pueden<br />
intentar enmascarar sus actividades creando<br />
algún tipo de encubrimiento (como<br />
<strong>el</strong> caso d<strong>el</strong> hombre que contrató un montón<br />
de señu<strong>el</strong>os usando Craigslist [2] con<br />
<strong>el</strong> objetivo de robar un furgón blindado).<br />
En general, esconderse su<strong>el</strong>e funcionar<br />
mejor que enmascarar, especialmente<br />
frente a los sistemas IPS que bloquean<br />
ataques – claro está, a menos que deseemos<br />
atacar al sistema IDS de forma<br />
(in)directa inundando al administrador<br />
con mucha información (no hay nada<br />
como pasar de 100 alertas diarias a 100<br />
alertas por minuto).<br />
Básicamente, estas estrategias pueden<br />
reducirse a dos alternativas: o bien nos<br />
ocultamos entre las sombras para poder<br />
fisgonear, o bien creamos algo parecido a<br />
una estampida de ganado y vamos tras<br />
<strong>el</strong>los aprovechando <strong>el</strong> ruido y <strong>el</strong> descontrol<br />
generado.<br />
Alteración de Paquetes<br />
La modificación o alteración de paquetes<br />
constituye una técnica clásica para la<br />
evasión de sistemas IDS e IPS, y por clásico<br />
nos referimos a 1998. Primero se<br />
publicó Fragrouter [3], al que luego le<br />
siguió Fragroute [4] (observe la “r” que<br />
falta). El Fragrouter original disponía de<br />
un número reducido de opciones – principalmente<br />
r<strong>el</strong>acionadas con <strong>el</strong> particionamiento<br />
de datos en fragmentos de 8,<br />
16 y 24 bytes, con opciones para duplicar<br />
paquetes y enviarlos de forma desordenada<br />
(lo que en 1999 era más que suficiente<br />
para sortear muchos sistemas<br />
IDS). Naturalmente, la mayoría de los<br />
desarrolladores de IDS corrigieron sus<br />
productos, por lo que los autores de Fragrouter<br />
se vieron obligados a mejorarlo,<br />
hasta transformarlo en Fragroute. Fragroute<br />
funciona como un proxy a niv<strong>el</strong><br />
de red; toma un flujo de paquetes TCP<br />
correctamente formados y los altera de<br />
tal forma que hace tambalear algunos<br />
equipos y sistemas IDS.<br />
Fragroute puede retener, <strong>el</strong>iminar y<br />
duplicar paquetes (tanto <strong>el</strong> primero, <strong>el</strong><br />
último, como cualquiera escogido al<br />
azar), creando “basurilla” con niv<strong>el</strong>es<br />
diferentes de carga, opciones IP no válidas<br />
y valores TTL modificados. De<br />
manera alternativa, puede fragmentar<br />
paquetes en tamaños arbitrarios, añadir<br />
opciones IP y modificar los valores ToS<br />
(tipo de servicio o Type of Service en<br />
inglés). Si de verdad queremos hacer la<br />
vida miserable a<br />
los sistemas IDS<br />
más frágiles,<br />
podremos reordenar<br />
los paquetes<br />
de forma aleatoria<br />
o en orden inverso<br />
(lo que podría<br />
saturar los buffers disponibles en <strong>el</strong> IDS<br />
para <strong>el</strong> almacenamiento y reensamblado<br />
de datos). Básicamente, con Fragroute es<br />
posible generar cualquier cosa defectuosa<br />
que aún puede ser considerada<br />
como dato y que un equipo puede reestructurar<br />
y procesar.<br />
Los intrusos también pueden usar <strong>el</strong><br />
escáner de seguridad Nmap (Figura 1)<br />
para fragmentar paquetes. Nmap nos<br />
permite establecer un MTU pequeño<br />
(unidad máxima de transmisión, o Maximum<br />
Transmit Unit en ingles). Para<br />
divertirnos podemos probar un MTU de<br />
“1” (un byte de datos para cada paquete<br />
TCP); aunque esto produce una transmisión<br />
muy lenta y conlleva un enorme<br />
consumo de ancho de banda, resulta sorprendente<br />
ver con qué frecuencia tumbamos<br />
(o como poco tambaleamos) a los<br />
servidores remotos y los sistemas IDS/<br />
IPS escaneados.<br />
Disponemos además de otras técnicas<br />
también clásicas de alteración de paquetes,<br />
como enviarlos con sumas de comprobación<br />
incorrectas, o modificar aleatoriamente<br />
algunos de los bits de la<br />
cabecera (activando, por ejemplo, los<br />
campos para paquetes urgentes entre<br />
otras opciones TCP). Podemos usar<br />
herramientas como hping [5] para generar<br />
paquetes completamente personalizados<br />
y, si queremos integrar <strong>el</strong> trabajo<br />
con un lenguaje de programación como<br />
Python, la herramienta Scpay [6] puede<br />
resultar interesante.<br />
La forma más simple y efectiva de tratar<br />
los ataques basados en <strong>el</strong> envío de<br />
paquetes modificados es poner un cortafuegos<br />
que sea capaz de reensamblarlos.<br />
El iptables de <strong>Linux</strong> puede hacer esto si<br />
activamos los módulos de seguimiento<br />
de conexiones, ya que éstos reensamblan<br />
paquetes de forma automática. Usando<br />
<strong>el</strong> parámetro fragment reassemble de la<br />
opción scrub d<strong>el</strong> PF de OpenBSD, haremos<br />
que se reserve memoria para un<br />
buffer donde se almacenarán los paquetes<br />
entrantes y se reensamblarán en<br />
paquetes completos y bien formados<br />
antes de su reenvío al interior de la red.<br />
WWW.LINUX- MAGAZINE.ES<br />
Evitando Detección PORTADA<br />
Figura 1: Opciones de evasión de nmap.<br />
Ambas herramientas introducen algo<br />
de latencia adicional, pero evitan que los<br />
paquetes fragmentados con secciones<br />
solapadas atraviesen la red. La idea<br />
general es poner un sistema operativo<br />
con una pila TCP robusta d<strong>el</strong>ante d<strong>el</strong><br />
resto de los sistemas que tengan pilas<br />
TCP más débiles.<br />
De la misma forma que las herramientas<br />
de modificación de paquetes han<br />
mejorado con los años, la mayoría de los<br />
sistemas IDS e IPS también han evolucionado.<br />
El mejor ejemplo de esto es <strong>el</strong> proyecto<br />
de código libre Snort, que tiene un<br />
preprocesador llamado Stream5 (sucesor<br />
d<strong>el</strong> preprocesador Stream4). Stream5<br />
dispone de un reensamblador y detector<br />
de anomalías de paquetes TCP bastante<br />
avanzado capaz de localizar muchos<br />
tipos de alteraciones en las conexiones y<br />
en los paquetes. Los desarrolladores de<br />
soluciones propietarias también han<br />
sabido actualizarse. Deberemos mirar la<br />
documentación de nuestra solución y<br />
asegurarnos de tener instaladas las últimas<br />
actualizaciones.<br />
Alteración d<strong>el</strong> Protocolo<br />
Dado un protocolo de red ¿qué constituye<br />
tráfico “correcto” y “válido”? Una<br />
respuesta puede ser: todo lo que <strong>el</strong><br />
cliente o <strong>el</strong> servidor al que estemos<br />
conectado acepte. Muchas veces lo que<br />
dice <strong>el</strong> estándar no es tan importante<br />
cuando se trata de realizar una implementación<br />
concreta de ese protocolo.<br />
Esto dificulta mucho la creación de software<br />
de calidad para <strong>el</strong> análisis de protocolos.<br />
Si seguimos las especificaciones,<br />
pronto veremos que los desarrolladores<br />
de software (incluidas las empresas más<br />
grandes) aceptan muchas veces datos<br />
mal formados como si fueran válidos (es<br />
una forma educada de decir que nunca<br />
siguen las especificaciones).<br />
El mejor ejemplo es <strong>el</strong> capturador y<br />
analizador de paquetes Wireshark (antes<br />
conocido como Ethereal), que contiene<br />
cientos de analizadores de protocolos y<br />
203 entradas en la base de datos de vulnerabilidades<br />
de seguridad CVE – la<br />
Número 69<br />
23
PORTADA Evitando Detección<br />
mayoría de las cuales son debidas a estos<br />
mismos analizadores de protocolos.<br />
Existen herramientas que nos permiten<br />
capitalizar estas características que<br />
no cumplen con <strong>el</strong> estándar d<strong>el</strong> protocolo<br />
para sortear los sistemas IDS e IPS.<br />
Ya en <strong>el</strong> número 53 [7] de <strong>Linux</strong> <strong>Magazine</strong><br />
vimos 10 tipos diferentes de fuzzers,<br />
de los que cinco eran para redes. De <strong>el</strong>los<br />
<strong>el</strong> mejor es Peach Fuzzing Platform [8],<br />
que actualmente se encuentra en<br />
desarrollo (con una última actualización<br />
a finales de diciembre de 2010). Algunas<br />
de las otras herramientas de alteración<br />
de protocolos no han tenido continuidad.<br />
Por ejemplo, de SPIKE no ha salido<br />
ninguna versión nueva desde hace años.<br />
Apuntando a la Web<br />
No es sorprendente saber que <strong>el</strong> vector<br />
de entrada de muchas de las intrusiones<br />
es la web. Muchos servicios y dispositivos<br />
ofrecen ahora capacidades web<br />
(impresoras, escáneres, servidores y dispositivos<br />
empotrados). De hecho, casi<br />
todo lo que no está basado en web se<br />
encuentra tras un cortafuegos, con lo<br />
que los servidores web se sitúan en los<br />
primeros puestos de las listas de objetivos<br />
de los atacantes.<br />
La web presenta algunas oportunidades<br />
interesantes para <strong>el</strong> atacante: casi<br />
todos los servidores web soportan uno o<br />
varios lenguajes de programación<br />
(scripts CGI, PHP, SQL, etc.). Esto da al<br />
atacante muchas más oportunidades de<br />
interactuar con <strong>el</strong> sistema de formas no<br />
previstas, y que pueden ocasionar más<br />
de un desbordamiento de buffer – inyección<br />
de SQL, vulnerabilidades XSS<br />
(Cross-Site Scripting), etc..<br />
La parte cliente proporciona además<br />
un conjunto de tecnologías software<br />
increíblemente complejas y potencialmente<br />
problemáticas. Los principales<br />
navegadores web (Internet Explorer,<br />
Firefox, Opera, Safari y Chrome) tienen<br />
todos una larga historia de fallos de<br />
seguridad. Además, hay que considerar<br />
al omnipresente Flash, que se encuentra<br />
instalado en virtualmente toda máquina<br />
Windows y en muchas de las máquinas<br />
<strong>Linux</strong>. (Si queremos ver vídeos, hay<br />
muchas probabilidades de que necesitemos<br />
Flash – al menos hasta que HTML5<br />
sea más popular). Flash tiene un triste<br />
registro de vulnerabilidades. No hace<br />
mucho, por ejemplo, apareció un nuevo<br />
ataque y se publicó <strong>el</strong> código que explo-<br />
taba la vulnerabilidad. Adobe tardó<br />
entre 2 y 3 semanas en corregir <strong>el</strong><br />
problema.<br />
Aunque todavía no es muy conocido,<br />
los atacantes disponen de una<br />
forma muy simple de sortear completamente<br />
los sistemas IDS e IPS.<br />
Se trata de usar sesiones web<br />
HTTPS cifradas para lanzar ataques<br />
contra servidores y clientes. A<br />
menos que dispongamos de un<br />
balanceador de carga HTTP y nuestro<br />
sistema IDS/ IPS esté situado entre <strong>el</strong><br />
balanceador y <strong>el</strong> servidor, no habrá una<br />
manera fácil de analizar <strong>el</strong> contenido<br />
enviado al servidor web.<br />
En <strong>el</strong> lado d<strong>el</strong> cliente, si somos suficientemente<br />
paranoicos, podemos comprar<br />
algún producto tipo Packet Forensics<br />
[9], que nos permite descifrar sesiones<br />
HTTPS al vu<strong>el</strong>o instalando un certificado<br />
personalizado en <strong>el</strong> cliente que<br />
deseamos proteger. Hay que tener en<br />
cuenta, sin embargo, que este producto<br />
está orientado principalmente para ser<br />
usado por las fuerzas de seguridad que<br />
quieren explotar un solo servidor web, y<br />
no está realmente diseñado para proteger<br />
sistemas clientes (al menos hasta<br />
donde yo se, y es que esta empresa es<br />
algo reservada). Lo peor de que un atacante<br />
use HTTPS es que <strong>el</strong> protocolo<br />
HTTPS es legítimamente necesario en<br />
muchos sitios, por lo que es complicado<br />
bloquearlo, ya que podría cabrear a<br />
muchos usuarios.<br />
Otra alternativa que tienen los intrusos<br />
para sortear nuestro sistema de detección<br />
es usar algún tipo de ataque que<br />
codifique la información. Hay varias técnicas<br />
que permiten codificar peticiones y<br />
respuestas HTTP. Normalmente enviamos<br />
al servidor texto plano, pero podemos<br />
indicar un Content-Type diferente,<br />
que puede tener varios valores, como<br />
UTF-8 o UTF-7. Lo que es más, podemos<br />
codificar <strong>el</strong> texto usando notación porcentual<br />
(por ejemplo, un espacio es<br />
“%20”), hexadecimal, decimal y por<br />
nombres. Podemos<br />
además usar dobles<br />
comillas y una variedad<br />
de código de páginas<br />
para otros idiomas<br />
(ver la tabla “Nombres<br />
de Dominio Internacionales”).<br />
También es<br />
posible mezclar un<br />
poco las cosas (mien-<br />
24 Número 69 WWW.LINUX- MAGAZINE.ES<br />
Figura 2: Algunos ejemplos con porcentajes, dobles<br />
porcentajes, Unicode, UTF-8 y varias codifica-<br />
ciones.<br />
tras <strong>el</strong> servidor o <strong>el</strong> cliente lo acepte y<br />
decodifique, es, en todo caso “legítimo”).<br />
Ya que no hay forma de diseñar expresiones<br />
regulares o patrones que nos permitan<br />
filtrar toda posible codificación<br />
que <strong>el</strong> atacante puede usar, necesitaremos<br />
normalizar <strong>el</strong> tráfico antes de escanearlo<br />
en búsqueda de potenciales problemas.<br />
Esto significa que, para toda<br />
cabecera HTTP que examina nuestro<br />
IDS/ IPS, primero debemos detectar si los<br />
datos están codificados y luego ver <strong>el</strong><br />
tipo de codificación, normalizarlos y<br />
finalmente escanearlos. Debemos hacer<br />
esto para cualquier dato susceptible de<br />
ser codificado en más de un niv<strong>el</strong>, o que<br />
permite usar simultáneamente varios sistemas<br />
de codificación en una misma<br />
cadena.<br />
El escáner de seguridad Nikto2 [10]<br />
hace uso de la librería libwhisker [11] e<br />
incorpora una serie de trucos de cifrado<br />
anti-IDS, como por ejemplo la inserción<br />
de directorios autoreferenciados (“/ ./ ”)<br />
o la inserción de parámetros falsos en la<br />
URL, como tabuladores, retornos de<br />
carro o valores binarios en vez de espacios.<br />
Si <strong>el</strong> intruso se enfrenta a un servidor<br />
Windows, puede probar cambiando<br />
de forma aleatoria las mayúsculas y<br />
minúsculas (ya que la mayoría de los<br />
servidores web de Windows no diferencian<br />
entre mayúsculas y minúsculas<br />
cuando procesan las peticiones) y cambiar<br />
las “/ ” por “\”. O, simplemente,<br />
puede insertar caracteres UTF-8 aleatorios;<br />
por desgracia con esto solo ya es<br />
Nombres de Dominios Internacionales<br />
Quizás pensemos que simplemente podemos hacer filtros<br />
basados en los nombres de dominios, poniendo a los chicos<br />
malos en una lista negra. Desafortunadamente, con los<br />
IDN (nombres de dominios internacionales, o International<br />
Domain Names [12] en inglés) podremos tener múltiples<br />
representaciones para un mismo dominio usando IDN,<br />
UTF-7 y Punycode. Deberíamos comprobar si nuestro software<br />
gestiona correctamente nombres IDN y representaciones<br />
Punycode.
posible causar problemas (y es que parece que hay programadores<br />
que no son muy buenos tratando cadenas Unicode)<br />
(Figura 2).<br />
JavaScript y Flash<br />
Si lo que queremos es sortear sistemas IDS e IPS, JavaScript<br />
y Flash son un auténtico sueño hecho realidad. Los dos son<br />
lenguajes Turing-completos, por lo que en principio no hay<br />
forma de saber si <strong>el</strong> código que vamos a ejecutar es malicioso<br />
o no. La única forma posible de identificar este código<br />
es ejecutarlo y tratar de pillarlo en <strong>el</strong> momento que haga<br />
algo sospechoso.<br />
JavaScript (al igual que la mayoría de los lenguajes interpretados)<br />
es bastante prolijo o verboso y su<strong>el</strong>e incluir<br />
muchos espacios en blanco. Los diseñadores de páginas web<br />
y los usuarios desean que las páginas carguen rápidamente,<br />
y los scripts llenos de largas palabras y muchos espaciados<br />
ocupan más espacio, ralentizando la carga de las páginas<br />
web. Para resolver esto, muchos sitios se han visto obligados<br />
a comprimir sus JavaScripts para reducir <strong>el</strong> tamaño de los<br />
ficheros a descargar. La forma más simple de compresión<br />
consiste en <strong>el</strong>iminar todos los espacios en blanco sobrantes,<br />
aunque, claro está, esto por sí solo no va a reducir de<br />
manera significativa <strong>el</strong> tamaño total d<strong>el</strong> fichero.<br />
Por suerte hay alternativas más avanzadas; una muy<br />
conocida es la herramienta “Packer” [13] de Dean Edwards<br />
(ver Figura 3). Lo que hace Packer es crear una función<br />
envoltorio que descomprime datos, luego comprime <strong>el</strong> contenido<br />
de nuestro JavaScript y lo convierte a una cadena de<br />
texto que se incluye, junto con la función descompresora, en<br />
un nuevo fichero. Packer puede reducir los nombres de las<br />
variables (al ordenador no le importa si la variable se llama<br />
“nombre_de_usuario” o sólo “a”) y codificar los datos en<br />
Base62 (con lo que se usarán sólo los caracteres a-z, A-Z y 0-<br />
9). Otra alternativa es <strong>el</strong> compresor YUI [14] – <strong>el</strong> compresor<br />
JavaScript y CSS de Yahoo!. Al igual que Packer, esta herramienta<br />
puede acortar <strong>el</strong> tamaño de las variables, <strong>el</strong>iminar los<br />
espacios en blanco e incluir ciertas macros de optimización.<br />
Ambas herramientas son compresores JavaScript bien documentados<br />
y “políticamente correctos”.<br />
Hay formas menos educadas (léase: maliciosas) de realizar<br />
esta compresión. Una de <strong>el</strong>las requiere usar ciertos trucos<br />
basados en unescape(), <strong>el</strong> cual permite al intruso mezclar<br />
varias codificaciones usando, por ejemplo, caracteres<br />
codificados con <strong>el</strong> código porcentual dentro d<strong>el</strong> flujo de<br />
datos. El problema es que muchos sitios (incluido Google)<br />
usan unscape() para empaquetar datos, de tal forma que<br />
caracteres como < y > puedan ser filtrados en los formularios<br />
de entrada, haciendo por tanto mucho más difícil distinguir<br />
los usos lícitos de los maliciosos.<br />
Las aplicaciones Flash una vez escritas son compiladas en<br />
ficheros .SWF y alojadas en los servidores web. Sin<br />
embargo, al igual que otros ficheros binarios con estructuras<br />
conocidas, son fáciles de descompilar y volver a su versión<br />
en código fuente. Por eso, al igual que se comprimen los<br />
JavaScript (por rendimiento), muchos sitios ofuscan los<br />
ficheros Flash para evitar su desensamblado.<br />
Los programas de ofuscación normalmente renombran<br />
todas las variables usando nombres aleatorios, cifrando cier-
PORTADA Evitando Detección<br />
tos datos d<strong>el</strong>icados como contraseñas y<br />
cadenas de texto, aleatorizando ciertas<br />
instrucciones y modificando <strong>el</strong> flujo de<br />
control d<strong>el</strong> programa para dificultar su<br />
análisis mediante <strong>el</strong> decompilador. Estas<br />
herramientas proporcionan a los intrusos<br />
una forma de ocultar las intenciones de<br />
una aplicación Flash aparentemente inocente.<br />
De forma realista, lo mejor que se<br />
puede hacer para detectar ficheros Flash<br />
dañinos es buscar una copia d<strong>el</strong> fichero<br />
malicioso y enviarlo a una empresa antivirus<br />
para que añadan su firma a la base<br />
de datos.<br />
<strong>PDF</strong> y Adobe Reader<br />
<strong>PDF</strong> es una tecnología aún menos segura<br />
que JavaScript y Flash. No es sólo que <strong>el</strong><br />
formato <strong>PDF</strong> tiene una larga lista de problemas,<br />
es que podemos incrustar casi<br />
cualquier contenido que queramos en un<br />
fichero <strong>PDF</strong> (incluido JavaScript y<br />
Flash). También podemos ofuscar los<br />
ficheros <strong>PDF</strong> de modos que nos hacen<br />
dudar d<strong>el</strong> equipo de desarrollo de Adobe<br />
Reader. Algunas de las técnicas de ofuscación<br />
de <strong>PDF</strong> [15] incluyen:<br />
Llamar a OpenAction sobre objetos<br />
creados.<br />
Usar codificaciones especiales para<br />
sustituir ciertos caracteres (representaciones<br />
nombradas).<br />
Partir una cadena usando la barra<br />
invertida, creando un carácter por<br />
línea.<br />
Convertir cadenas a hexadecimal y<br />
añadir caracteres de espacio dentro de<br />
la cadena.<br />
Cifrar (otra vez para proteger <strong>el</strong> contenido).<br />
Podemos además comprimir <strong>el</strong> <strong>PDF</strong><br />
usando /FlateDecode, crear un montón<br />
¿Legítimo?<br />
Hay que tener en cuenta que un atacante no necesita seguir<br />
técnicas de intrusión convencionales para atacar nuestra<br />
red. Incluso si logramos bloquear todo dato codificado,<br />
cifrado, comprimido y cualquier otro oculto, los atacantes<br />
más int<strong>el</strong>igentes pueden en ocasiones atacar la red<br />
enviando peticiones completamente legítimas.<br />
Por ejemplo, consideremos <strong>el</strong> caso de una web de reservas<br />
aéreas que permite al visitante buscar un vu<strong>el</strong>o y reservar<br />
un asiento determinado. El sistema mantiene la reserva d<strong>el</strong><br />
asiento por un periodo determinado mientras <strong>el</strong> usuario<br />
introduce su número de tarjeta de crédito entre otros datos.<br />
Un atacante puede, simplemente, establecer varios cientos<br />
de conexiones y apartar todos los asientos libres, y volver a<br />
s<strong>el</strong>eccionarlos en otra sesión cuando <strong>el</strong> sistema los libere<br />
transcurrido un tiempo. Identificar este tipo de ataque en<br />
un sistema IDS o IPS es prácticamente imposible.<br />
de anotaciones de documento<br />
aleatorias y,<br />
luego, usar getAnnots()<br />
[16] para obtener un<br />
array de anotaciones y<br />
crear un conjunto mayor<br />
de documentos. Otra<br />
cosa que podemos hacer<br />
es crear una lista de<br />
cadenas debidamente<br />
modificadas, para luego<br />
usar la función replace() JSMin y Packer.<br />
y transformarlas en algo<br />
malicioso que pueda ser ejecutado a través<br />
de la función eval().<br />
¡Ah! También podemos codificar<br />
JavaScript dentro d<strong>el</strong> <strong>PDF</strong> usando notación<br />
octal (por ejemplo, “\72” para <strong>el</strong><br />
carácter “:”); podemos codificar uno o<br />
varios caracteres y <strong>PDF</strong> los gestionará sin<br />
problemas.<br />
En resumen: un intruso puede usar la<br />
notación octal sobre varios caracteres d<strong>el</strong><br />
código JavaScript, romper la bomba<br />
lógica en pedacitos aparentemente inocuos,<br />
reemplazar algunas subcadenas<br />
por otras de apariencia más segura (que<br />
luego serán reemplazaras usando expresiones<br />
regulares), y ocultar las cadenas<br />
codificadas dentro de las anotaciones d<strong>el</strong><br />
documento (que curiosamente algunos<br />
sistemas no van a escanear, ya que se<br />
consideran “seguras”).<br />
Esto significa que si queremos escanear<br />
adecuadamente un documento <strong>PDF</strong>,<br />
necesitaremos extraer toda la cadena,<br />
ejecutar sobre <strong>el</strong>la las expresiones regulares<br />
contenidas en <strong>el</strong> documento, concatenarlas,<br />
y luego escanear <strong>el</strong> resultado<br />
final buscando algo sospechoso.<br />
Conclusiones<br />
Los atacantes con determinación (también<br />
conocidos como<br />
APT en sus siglas en<br />
inglés – “Advanced<br />
Persistent Threat” o<br />
“Amenaza Persistente<br />
Avanzada”) tienen<br />
acceso al mismo hardware<br />
y herramientas<br />
software que usamos<br />
para defender nuestras<br />
redes. No es que los<br />
vendedores de soluciones<br />
IDS e IPS hagan<br />
algún tipo de estudio<br />
en profundidad de sus<br />
clientes antes de ven-<br />
26 Número 69 WWW.LINUX- MAGAZINE.ES<br />
Figura 3: Un sencillo programa JavaScript comprimido usando<br />
der sus productos. Los chicos malos terminarán<br />
encontrando algún fallo en las<br />
herramientas que usamos.<br />
Mi consejo es que se bloquee todo dato<br />
mal formado que sea posible (por ejemplo,<br />
fragmentos TCP con solapamiento,<br />
algunos tipos de codificación, etc.) y<br />
registremos <strong>el</strong> resto. Si un atacante aún<br />
así consigue penetrar en la red, al menos<br />
<strong>el</strong> fichero de registro nos puede ayudar a<br />
averiguar cómo lo hizo. ■<br />
RECURSOS<br />
[1] OSSEC: http:// www. ossec. net/<br />
[2] Enmascarando ataques usando<br />
Craigslist: http:// arstechnica. com/ old/<br />
content/ 2008/ 10/<br />
bank-robber-crowdsources-disguise-t<br />
o-craigslist-floats-away. ars<br />
[3] Fragrouter: http:// archive. ubuntu.<br />
com/ ubuntu/ pool/ universe/ f/<br />
fragrouter/<br />
[4] Fragroute: http:// monkey. org/<br />
~dugsong/ fragroute/<br />
[5] hping: http:// www. hping. org/<br />
[6] Scapy: http:// www. secdev. org/<br />
projects/ scapy/<br />
[7] Fuzzing; <strong>Linux</strong> <strong>Magazine</strong> Nº53 Edición<br />
en Cast<strong>el</strong>lano, pags. 8-9: http://<br />
www. linux-magazine. es/ issue/ 53/<br />
008-009_Inseguridades53. pdf<br />
[8] Plataforma Peach Fuzzing: http://<br />
peachfuzzer. com/<br />
[9] Análisis Forense de Pacquetes: http://<br />
www. wired. com/ threatlev<strong>el</strong>/ 2010/ 03/<br />
packet-forensics/<br />
[10]Nikto2: http:// cirt. net/ nikto2<br />
[11]libwhisker: http:// www. wiretrip. net/<br />
rfp/ lw. asp<br />
[12]Nombres de dominios internacionalizados:<br />
http:// en. wikipedia. org/ wiki/<br />
Internationalized_domain_name<br />
[13]Packer: http:// dean. edwards. name/<br />
packer/<br />
[14]Compresor YUI: http:// dev<strong>el</strong>oper.<br />
yahoo. com/ yui/ compressor/<br />
[15]Ofuscador <strong>PDF</strong>: http:// blog.<br />
didierstevens. com/ 2008/ 04/ 29/<br />
pdf-let-me-count-the-ways/<br />
[16]Ofuscación de <strong>PDF</strong> usando getAnnots():<br />
http:// blog. fireeye. com/<br />
research/ 2010/ 01/ pdf-obfuscation.<br />
html