Está en la página 1de 64

Occams

Razor
Nmero 4, Ao 2009

Editorial Seguimos en Marcha


by The Occam Team

H
Direccin: David Martnez Oliveira Editores: David Martnez Oliveira Fernando Martn Rodrguez Colaboradores: Fernando Martn Rodrguez, David Martnez Oliveira, Snortel, Mappy Porto, Er Boyer, Huakin Paquete, Chinao, Tamariz el de la Perdiz.

a pasado ms de un ao y medio desde el ltimo nmero de Occams Razor y muchos de vosotros os habis estado preguntando cuando llegara el prximo nmero. Bien, pues aqu lo tenis. Como se suele decir ms vale tarde que nunca... o no hay tres sin cuatro.

Maquetacin y Grasmo

Publicidad Occams Razor Direct occams-razor@uvigo.es Impresin Por ahora tu mismo. . . Si te apetece c 2009 The Occams Razor Team Esta obra est bajo una licencia Reconocimiento 3.0 Espaa de Creative Commons. Para ver una copia de esta licencia, visite http://creativecommons.org/ licenses/by/3.0/es/ o envie una carta a Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.

Una revista libre tiene un montn de ventajas. Todos las conocis, pero tiene una desventaja muy grande. Solo se le puede dedicar el tiempo libre, algo que, en estos das, escasea tanto como el sentido comn. Este ltimo ao y medio ha sido un ao de grandes cambios para nuestros principales colaboradores. Nuevos trabajos, nuevos pases y nuevas criaturas sobre la faz de la tierra. A ellas va dedicado este nmero. Grandes cambios que consumen mucho tiempo. Pero, poco a poco, araando horas a los das hemos conseguido traer a la luz un nuevo nmero de Occams Razor. Esta vuestra revista. En este nmero os encontraris menos artculos, pero ms extensos. Esperamos que os agrade el formato y sobre todo, vuestros comentarios al respecto. Adems de la secciones habituales (con la excepcin de En la Prctica que intentaremos que vuelva en el prximo nmero), estrenamos una nueva seccin: La cacharrera, con la intencin de que os guste, tanto como nos ha gustado a nosotros escribirla, y que se acabe convirtiendo en una seccin habitual de Occams Razor. Otra novedad en este nmero es la inclusin de hiper enlaces en el documento PDF. Esto fue sugerido por un lector tras la edicin del segundo nmero (gracias Cruz Enrique Borges Hernndez) y nalmente lo hemos incorporado. Aprovechando los enlaces, hemos aadido en la mayora de los artculos un cuadro de recursos en Internet, para que os resulte ms sencillo conseguir informacin adicional. Como os habamos anunciado este nmero es un especial sobre seguridad, donde podris encontrar artculos sobre criptografa, vdeo vigilancia o reconocimiento biomtrico. A modo de dossier, hemos preparado tres artculos en los que os destripamos los entresijos de las redes TCP desde tres niveles diferentes. Las aplicaciones, las libreras y las llamadas al sistema. Todo lo que necesitis saber sobre paquetes y protocolos. Que disfrutis este nmero y, como siempre, vuestros comentarios y colaboraciones para seguir mejorando, sern muy bienvenidos.

The Occams Razor Team


Las opiniones expresadas en los artculos, as como los contenidos de los mismos, son responsabilidad de los autores de stos. Puede obtener la versin electrnica de esta publicacin, as como el cdigo fuente de la misma y los distintos cheros de datos asociados a cada artculo en el sitio web: http://webs.uvigo.es/occams-razor

3| OCCAMs Razor

RINCN DE LOS LECTORES

Vuestros comentarios, sugerencias,...

El Rincn de los lectores


por The Occams Razor Team

Erratas
enviado por Roberto Gonzlez Cardenete Hola, no s si esta errata os la han comunicado ya. Es en el tercer nmero, artculo sobre inteligencia articial y aprendizaje mquina, tabla 3. Para la previsin "lluvioso.el error es 2/5 y para "nublado.es 0/4. En la tabla aparece de forma opuesta, 0/4 para "lluvioso 2/5 para "nublado. De igual manera ocurre para el atributo "Hace viento". La regla "SI"tiene un error de 3/6 y la regla "NO"de 2/8. Enhorabuena por la revista y muchas gracias: es un placer leerla. Un saludo, Muchas gracias Roberto por apuntarnos esta errata. Ya le hemos includos estos cambios en la ltima edicin.

A Fuentes L TEX

enviado por muchos de vosotros Muchos de vosotros nos habis escrito solicitando las fuentes de todos los nmeros de Occams Razor. Eso es lo que decamos en la web. Como ya sabris tenemos algunos problemas de espacio y hasta ahora solo nos ha sido posible mantener las fuentes de la ltima revista, puesto que los cheros de fuentes son bastante voluminosos. Queremos agradecer a todos los que os habis ofrecido para hacer un mirror de estos cheros y comunicaros que a partir de este nmero todos los cheros estarn accesibles para descargar. Todos los que todava estis interesados en hacer un mirror de estos cheros podis poneros en contacto con nosotros de nuevo (para que no se nos despiste nadie entre todos los mails archivados) y en la pgina ocial de la revista (http://webs.uvigo.es/occams-razor )mantendremos una lista con todos estos mirrors y el tipo de acceso que proporciona.

Otra Utilidad de vim


enviado por Luis Rodrguez Se os ha olvidado comentar, como utilidad para programadores, que si presionamos la tecla " %.en modo comando sobre un {,( o [, el cursor se nos mover automticamente hacia el correspondiente },),], lo cual es tremendamente til a la hora de depurar programas que utilizan esta sintaxis de llaves, parntesis o corchetes para anidar estructuras de control, ya que un tem de estos sin emparejar no se mover. Un saludo, Totalmente de acuerdo, una muy til funcionalidad de vim. Como os comentbamos en el artculo, hay cientos de interesantes comandos ofrecidos por vim, como este que nos comenta nuestro amigo Luis. Simplemente ejecutad el comando help (ya sabis ESC : help) y a leer!.

OCCAMs Razor | 4

Felicitaciones
enviado por muchos de vosotros Seguimos recibiendo y agradeciendo todas vuestras felicitaciones que nos animan a continuar con esta vuestra revista, aunque a veces sea un poco a trompicones. Intentamos que esta seccin, al igual que todas las dems de la revista os resulte til y por esa razn no incluimos todos estos mensajes, que aunque muy necesarios para nosotros. En cualquier caso. MUCHAS GRACIAS POR VUESTRO APOYO!!

ENVIADNOS...
Vuestros comentarios, sugerencias, ideas, crticas (constructivas claro), correcciones, soluciones, disoluciones o cualquier cosa que se os ocurra... a: occams-razor@uvigo.es LOS ESPERAMOS!!!!

RATAS DE BIBLIOTECA

libpcap. Tu propio snier en 5 lneas


... bueno, 5 lneas y un call-back
por Snortel

Vale, no son exactamente cinco lneas, pero s cinco llamadas a funciones de libpcap. Aunque aparentemente este programa es muy tonto (cuenta paquetes en el interfaz eth0), enseguida veris que es mucho ms potente de lo que parece. Lo primero que aparece es nuestro callback. Esta es la funcin que libpcap ejecuta cada vez que captura Una de las herramientas bsicas relacionadas con la un paquete. En nuestro caso, esta funcin utiliza una seguridad informtica es el snier o capturador de pa- variable esttica para llevar la cuenta de los paquetes quetes o analizador de protocolos, o... Bueno, tienen capturados. muchos nombres, dependiendo del uso que se le quiera En el programa principal es donde est lo interesante. dar. Estos programas normalmente utilizan lo que se co- CONFIGURANDO LA CAPTURA noce como sockets RAW, los cuales, desafortunada- El programa comienza obteniendo informacin sobre mente, tienen un interfaz diferente en cada sistema la conguracin del interfaz eth0. Esta llamada os la operativo. La librera libpcap nos permite utilizar esta podis ahorrar si no vais a trabajar con paquetes de funcionalidad independientemente del sistema opera- broadcast ya que su nica nalidad es obtener la tivo. mscara de red asociada con el interfaz. A continuacin le decimos a libpcap que queremos capturar paquetes en directo en el interfaz eth0. De Sin ms prembulos vamos a ver el cdigo de nuestro especial inters es el tercer parmetro. Este parmesnier de cinco lneas y un callback utilizando libpcap. tro le dice a libpcap que intente congurar el interfaz de red en modo promiscuo, es decir, la tarjeta de red #include <pcap . h> informar al sistema operativo de todos los paquetes #include <s t d i o . h> que ve, no solo de los paquetes dirigidos a ella. #include < s t d l i b . h> En estos momentos ya estamos en condiciones de caps t a t i c int count = 1 ; turar paquetes, y la sentencia if (y la siguiente seccin) que sigue a continuacin os la podis ahorrar si void ip_cb ( u_char a rg s , no queris utilizar el ltrado de paquetes que ofrece const struct pcap_pkthdr ph , la librera. const u_char p ) {

pcap_loop ( h , 1, ip_cb , a r g s ) ; return 0 ; }

apturar paquetes es una de esas cosas Sinatra, vamos, que cada sistema hace a su manera. Afortunadamente para nosotros algunas personas se han preocupado de escribir una librera para poder llevar a cabo esta tarea de una forma portable. Estamos hablando de la librera libpcap.

EL CDIGO

p r i n t f ( "Hemos r e c i b i d o % d p a q u e t e s ! ! ! . " "Ha , ha , ha ! ! ! ! " "% d p a q u e t e s ! ! ! \ n" , c o u n t++, c o u n t ) ; } i n t main ( i n t a rg c , char a rg v ) { char e r r [PCAP_ERRBUF_SIZE] ; pcap_t h; struct bpf_program fp ; bpf_u_int32 maskp ; bpf_u_int32 netp ; u_char a r g s = NULL; pcap_lookupnet ( " e th 0 " , &netp , &maskp , e r r ) ; h = pcap_open_live ( " e th 0 " , BUFSIZ, 1 , 1 , e r r ) ; i f ( argc > 1) { pcap_compile ( h , &fp , a rg v [ 1 ] , 0 , netp ) ; p c a p _ s e t f i l t e r ( h , &f p ) ; } / Cuenta ! ! ! , Cuenta ! ! ! M al di t o ! ! ! Ha , ha , ha ! ! ! ! /

FILTRANDO PAQUETES
Como os decamos, la parte central del programa utiliza el sistema de ltrado de paquetes proporcionado por libpcap. En nuestro ejemplo, solamente activamos el ltro si hemos recibido algn parmetro a travs de la lnea de comandos (argc mayor que 1).

El sistema de ltrado de paquetes de libpcap es muy potente


Como podis ver,simplemente pasamos el primer parmetro del programa a la funcin pcap_compile. 5| OCCAMs Razor

RATAS DE BIBLIOTECA

Y a continuacin asignamos el nuevo ltro a nuestro manejador pcap. Supongo que ahora os estaris preguntando . . . Y cmo son esos ltros? Bueno, pues para tener una descripcin detallada de como denirlos solo tenis que consultar la pgina del manual del programa tcpdump. S, tcpdump, el capturador de paquetes por excelencia utiliza libpcap :).

Qu obtendrais ahora haciendo ping a una mquina que no existe?

UN CALLBACK MS INTERESANTE
Nuestro conde contador es gay, pero no resulta demasiado til. Como decamos ms arriba, el callback que pasemos como parmetro a pcap_loop recibir toda la informacin asociada al paquete que se ha capturado. Aqu tenis uno un poco ms interesante.
#include < n e t i n e t / e t h e r . h> #include < n e t i n e t / i p . h> void ip_cb ( u_char a r g s , const s tr u ct pcap_pkthdr ph , const u_char p ) { s tr u ct i p ip_pqt ; ip_pqt = ( s tr u ct i p ) ( p a c k e t + s i z e o f ( s tr u ct e t h e r _ h e a d e r ) ) ; p r i n t f ( " [ %16 s ]>" , i n e t _ n t o a ( ip_pqt >i p _ s r c ) ) ; p r i n t f ( " [ %16 s ] : (TTL: %03d p r o t o : %02d ) " , i n e t _ n t o a ( ip_pqt >i p _ d st ) , ip_pqt >i p _ t t l , ip_pqt >ip_p ) ; }

EL BUCLE PRINCIPAL
Finalmente, utilizamos la funcin pcap_loop para iniciar la captura. El programa entrar en un bucle innito en el que, cada vez que capture un paquete, ejecutar nuestra funcin ip_cb pasndole como primer parmetro el paquete capturado (bueno, pasa algo ms, pero en esencia eso es lo que hace). El segundo parmetro de pcap_loop, nos permite especicar el nmero de paquetes que queremos capturar. En este caso, el valor -1 indica que no hay lmite.

PROBANDO NUESTRO SNIFFER

Pues ya solo nos queda probar que todo funciona. Lo primero que haremos es compilar nuestro programa Lo primero que podis ver es un par de cheros de de la forma habitual. cabecera adicionales. Esto cheros contienen la denicin de las estructuras de datos asociadas a los pa$ g c c o count_pack et count_pack et . c l p c a p quetes de red que vamos a capturar. Como en nuestro programa, hemos decidido poner el La funcin simplemente muestra alguna informacin interfaz de red en modo promiscuo, tendremos que eje- general asociada al nivel IP: las direcciones IP de oricutar nuestro snier como usuario root. Para probar gen y destino del paquete, el TTL (Time To Live) y el el programa, vamos adems a utilizar un sencillo ltro protocolo asociado. Como podis ver, lo primero que y la utilidad ping (el parmetro -c2 le dice a ping que hacemos es saltarnos la cabecera ethernet para poder acceder a los datos IP. enve solo dos paquetes).
$ p i n g c2 una_ip

Esto es lo que obtendremos, al ejecutar nuestro programa en la misma mquina.


# . / count_packet Hemos r e c i b i d o 1 Hemos r e c i b i d o 2 Hemos r e c i b i d o 1 Hemos r e c i b i d o 2 icmp paquetes paquetes paquetes paquetes ! . Ha , ! . Ha , ! . Ha , ! . Ha , ha , ha , ha , ha , ha ! ha ! ha ! ha ! 1 2 3 4 paquetes paquetes paquetes paquetes ! ! ! !

Para escribir un snier personalizado, solo necesitis hacer 5 llamadas a la librera


Una explicacin detallada de como funciona una pila de protocolos se sale de los objetivos de este pequeo artculo, pero jugando con libpcap, un par de buenos libros y un puado de RFC, los protocolos de red no tendrn secretos para vosotros. Como siempre, recordad que en estos ejemplos, por cuestiones de espacio, hemos eliminado todas las comprobaciones de error. Vosotros no debis hacerlo. En el caso concreto de este ltimo ejemplo, es posible que obtengis algunos datos raros durante vuestras pruebas... No estamos comprobando si el paquete es realmente un paquete IP, no estamos comprobando la versin del protocolo (v4 o v6), ni si se trata de un paquete completo o un fragmento. Si tenis mucha curiosidad, una buena idea es echarle un ojo al cdigo fuente de tcpdump o wireshark. Ambos utilizan libpcap. Hasta el prximo nmero.

Como podis ver, estamos capturando el paquete ICMP ECHO que ping enva y el paquete ICMP ECHO-REPLY que recibimos de la mquina remota. Observad que si la ip que habis utilizado no est accesible, solamente recibiris dos paquetes ICMP HOST_UNREACH y, obviamente, ninguna respuesta del sistema remoto (que no existe). Probemos ahora algo ms elaborado.
# . / c o u n t _ p a c k e t icmp [ i c m p t y p e ] != icmpe c h o Hemos r e c i b i d o 1 p a q u e t e s ! . Ha , ha , ha ! 1 p a q u e t e s ! Hemos r e c i b i d o 2 p a q u e t e s ! . Ha , ha , ha ! 2 p a q u e t e s !

Si volvemos ha ejecutar nuestro ping... veremos que ahora nuestro programa solo muestra dos paquetes... claro, en nuestro ltro estamos diciendo que solo nos interesan los paquetes ECHO-REPLY y no los ECHO.

OCCAMs Razor | 6

MALA BESTIA

Escaneo de Puertos con nmap


Desvelamos los secretos de TCP/IP
por Mappy Porto

n cualquier ataque informtico, el primer paso es siempre la obtencin de informacin sobre la vctima. Existen distintas formas de llevar a cabo esta tarea, dependiendo del objetivo y el tipo de ataque que se desea realizar, pero si estamos hablando de ataques remotos, el anlisis de los servicios ofrecidos por la mquina vctima, suele ser obligatorio. Este proceso se conoce normalmente como mapeado o escaneado de puertos. De la mano de nmap, quizs el escner de puertos ms conocido y completo, vamos a introducirnos en los detalles ms tcnicos de esta proceso. Antes de meternos de lleno en el tema vamos a refrescar algunos de los conceptos generales que manejaremos a lo largo de este artculo. Y el primer concepto que se nos viene a la cabeza, es el del mar... bueno, navegar, barco, puerto... eso, puerto :) Lo primero que tenemos que saber es que los puertos estn asociados a lo que se llama la capa de transporte y lo que en el mundo TCP-IP equivale a la capa en la que funcionan los protocolos TCP y UDP. Justo bajo la capa de transporte est la capa de red (segn la nomenclatura OSI), que en el mundo real se corresponde con la capa que ocupa el protocolo IP (entre otros).

viar los datos, se encuentra en la capa de red... es decir, est al lado del IP, no encima como TCP o UDP, y por tanto, el concepto de puerto no existe. Muy pronto entenderemos que es lo que pretendan decir en ese manual de hackers.

LOS PUERTOS
Los puertos se introducen en la capa de transporte (TCP y UDP) y su nalidad es la de permitir establecer distintos puntos de conexin, en una misma mquina. As una determinada mquina con una determinada direccin IP puede ofrecer distintos servicios; un servicio de correo, un servicio web, un servicio ftp, etc...

Los puertos se introducen en la capa de transporte


Para poder referenciar cada uno de estos servicios, utilizamos un puerto distinto, o dicho de otra forma, cualquier servicio ofrecido por una mquina se puede identicar a partir de su direccin IP y su puerto asociado. Podemos verlo como una direccin postal. La direccin IP sera el equivalente a la ciudad, calle y nmero dentro de esa calle. Esos datos nos identicaran un edicio en el que vive un montn de gente. El botn del portero automtico en la puerta del edicio sera el equivalente al puerto. Dependiendo del botn que pulsemos (el puerto al que accedamos), obtendremos una respuesta u otra.

El primer paso de cualquier ataque es obtener informacin


El principal problema que aborda la capa de red es el del enrutamiento, es decir, como hacer que ciertos datos que salen de un ordenador lleguen a otro ordenador en la otra punta del mundo. Para resolver este problema, lo que necesitamos, como mnimo, es una forma de identicar ambas mquinas, y esa es la funcin de las direcciones IP. As que, aqu tenemos el primer concepto que tiene que estar claro. Las direcciones IP estn asociadas a mquinas. Punto. Para la mayora estar claro, pero en una ocasin, le en un manual de hackers una frase que deca algo as como: enviamos un paquete ICMP al puerto tal de la mquina. ICMP es un protocolo que, aunque utiliza IP para en-

ESCANEO DE PUERTOS
Bien, pues tras este rollo, qu es un escner de puertos?. Pues, siguiendo nuestro smil, un escner de puertos es un programa capaz de visitar un montn de edicios muy rpido y pulsar todos los botones del telefonillo, para luego decirnos cuantos apartamentos de ese edicio estn ocupados y cuantos estn vacos o simplemente no contestan. Aunque volveremos sobre esto ms tarde... Alguien puede imaginar quin sera el cortafuegos en nuestro ejemplo?.... nadie?... venga si es muy fcil... Exacto, un portero fsico. Cuando llegas al edicio, en lugar de encontrarte con el telefonillo y empezar a pulsar botones, lo que te encuentras es un seor que te pregunta a que piso vas. 7| OCCAMs Razor

MALA BESTIA

Si los ocupantes del piso no quieren ser molestados le dirn al portero que no deje pasar a nadie, y no sabremos si realmente hay alguien en ese piso o no. Si el portero nos conoce, o estamos en la lista de amigos, pues podremos pasar directamente, sin decir ms que un simple hola... y eso por que somos educados. Los escneres de puertos como nmap, son capaces de proporcionarnos esta informacin, y alguna ms. Por ejemplo, nos dir si la direccin existe o no (si la mquina est encendida), si se trata de un edicio de ocinas o de apartamentos (el sistema operativo) y si la persona que responde al telefonillo es un hombre, una mujer, un nio, un francs, un ingls o un alemn (el servicio que est corriendo y con suerte el programa que proporciona ese servicio y su versin). Vamos, una herramienta muy til.

Finalmente, aunque no vamos a tratar ese tema en este artculo (es otra historia como deca Conan), que un edicio no tenga ni puertas ni ventanas signicara que est desconectado de la red y en ese caso poco se puede hacer (entraramos en el mundo de la seguridad fsica). Pero que el portero no deje entrar a nadie y solo deje salir, eso sera un edicio con una nica puerta por la que solo pueden salir cosas... pues bueno... si hay una salida, hay una entrada :).

FUNDAMENTOS
El proceso de escaneo de puertos se basa fundamentalmente en dos tcnicas. La primera es el anlisis de paquetes ICMP, y la segunda es el anlisis de los paquetes de la capa de transporte (TCP o UDP), en condiciones atpicas. Veamos en que consiste cada una de ellas.

LA IMPORTANCIA DEL ESCANEO


Para terminar con esta introduccin y meternos a saco con el tema, vamos a explicaros porque determinar que puertos estn abiertos en una mquina es importante para un intruso. En nuestro ejemplo, hemos dicho que los apartamentos de nuestro edicio son los servicios de la mquina que est siendo escaneada. Si el objetivo de un atacante es tomar el control de la mquina, es decir, entrar en el edicio, pues la forma de entrar ser por una puerta o por una ventana. Si el intruso decide entrar por el sptimo C, y resulta que el sptimo C no existe en ese edicio, pues difcilmente va a poder hacer nada. Cuando llegue al edicio y vea que no hay sptimo C, pues se tendr que dar vuelta. En el mundo de los ordenadores, lo que ocurre es que la mayora de la gente tiene el mismo tipo de apartamentos... la misma cerradura y el mismo tipo de ventanas, de forma que si sabes abrir una de esas cerraduras, podrs entrar en cualquier apartamento de cualquier tipo de cualquier edicio... suponiendo que el edicio no tenga portero o puedas engaarlo :). Estos tipos de apartamentos son los servicios de la mquina. As nos encontraremos apartamentos del tipo Apache 1.0, Sendmail 8 o vsftp 3.4. Lo que le interesa al intruso es encontrar esos pisos y saber de que tipo son, todo ello de la forma ms sigilosa posible. Cuando encuentre una que conozca y sepa como abrir la cerradura podr entrar.

El anlisis de paquetes ICMP es un elemento bsico del escaneo de puertos


El protocolo ICMP, como ya os hemos comentado, se encuentra al mismo nivel que el protocolo IP. ICMP es el acrnimo de Internet Control Message Protocol, es decir, protocolo de mensajes de control inter-redes. Y eso es precisamente lo que hace, enviar y recibir mensajes de control. Los que queris ver la lista completa de todos esos mensajes, podis consultarlos en el RFC 792 que describe este protocolo. De todos los mensajes que podemos enviar con ICMP, hay unos cuantos que son de especial inters desde el punto de vista del escaneo de puertos. Estos mensajes pertenecen al grupo de Destino Inalcanzable representados por el cdigo nmero 3. Ciertos mensajes ICMP, como los que estamos analizando, requieren de un subcdigo que rena la informacin proporcionada por el mensaje. Para el grupo que nos interesa, los siguientes subcdigos nos resultarn muy tiles. Red inalcanzable (subcdigo 0) Mquina inalcanzable (subcdigo 1) Protocolo inalcanzable/inexistente (subcdigo 2) Puerto inalcanzable (subcdigo 3)

Como podis imaginar, el mensaje que ms nos interesa es el ltimo. Los otros los hemos incluido, puesto que nmap proporciona otras tcnicas de escaneo que hacen uso de ellos. Bien, pues para eso es un escner de puertos. Ob- Bueno, pues como funciona todo esto. Los mensajes viamente, la comunidad del edicio puede utilizar esa ICMP son generados por las capas inferiores. Depenmisma herramienta para comprobar si su edicio es diendo del tipo de mensaje, este puede generarse loseguro, si tiene que poner otro portero, o restringir la calmente (como en el caso de la red inalcanzable tambin se puede generar remotamente-), o remotaentrada y salida de gente. mente, como en el caso del protocolo inalcanzable.

Un escaner de puertos determina que servicios corre una mquina

OCCAMs Razor | 8

MALA BESTIA

Si intentamos conectarnos a un determinado puerto de una mquina remota, y ese puerto no existe (ningn proceso lo est utilizando), la mquina remota generar un menaje ICMP para indicar esta situacin, de forma que la mquina intentando conectar no tiene que esperar un tiempo prudencial para recibir una respuesta. Observad que la respuesta puede tardar porque la red est congestionada o porque realmente no ha habido respuesta. Volveremos sobre este concepto cuando hablemos del protocolo UDP.

ACK. Este es el paquete que una mquina enva a la otra para comunicarle que ha recibido ciertos datos correctamente. RST. Cuando sucede algo que no debera pasar, la pila TCP enva uno de estos paquetes, para re-iniciar la comunicacin.

Los paquetes SYN, ACK y RST son los que ms nos interesan
Pues bien, ya estamos en condiciones de empezar a jugar con nmap, sabiendo que es lo que estamos haciendo :).

PAQUETES TCP BSICOS


El otro elemento en el que se fundamentan los procesos de escaneo de puertos es en el anlisis de los paquetes TCP. Cada vez que nos conectamos, por ejemplo, a una pgina web, nuestro ordenador enva a travs de la red una serie de bloques de datos conteniendo cierta informacin, y recibe otros bloques de datos con la pgina web solicitada, y alguna informacin ms. Esa informacin que viaja por la red, debe seguir un determinado formato, lo que se conoce como el formato de paquete TCP. En general, todos estos protocolos funcionan de la misma forma. Toman los datos de una capa superior que en ltima instancia es el usuario, proporcionando el nombre de una pgina web (en nuestro ejemplo), y a esos datos les aade una cabecera. El nuevo bloque de datos se pasa al nivel inferior, y as sucesivamente, hasta que el bloque de datos (el paquete) alcanza el ltimo nivel y es enviado a travs de nuestro interfaz de red. En la siguiente gura, podis ver el formato de un paquete TCP. La parte nal, es la que contendr los datos que queremos enviar o recibir (nuestro mensaje de correo, o la pgina web que deseamos ver). El resto de campos son aadidos por el sistema, y estn ah para permitir la comunicacin able entre dos mquinas conectadas a travs de una red (eso es lo que hacen los protocolos de transporte como TCP:).

ESCANEO DE PUERTOS RESUMIDO


Con todo lo que hemos comentado hasta el momento, estamos en condiciones de presentaros las reglas bsicas utilizadas para el escaneo de puertos. Aunque veremos que nmap nos proporciona un montn de opciones (y sino lo podis ver en su pgina del manual; man nmap), el fundamento de todas ellas es ms o menos el mismo. Regla 1. Si enviamos un paquete a una mquina que no existe, recibiremos un paquete ICMP indicndolo. Regla 2. Si enviamos un paquete a un puerto no utilizado, recibiremos un paquete ICMP indicndolo (con UDP) o un paquete RST (con TCP). Regla 3. Si enviamos un paquete ilegal, en general, recibiremos un paquete RST como respuesta. S, as de tonto. Estas tres reglas son la base de cualquier escaneo de puertos. En el resto del artculo, veremos como nmap las aplica de diferentes maneras para solucionar diferentes problemas.

DESCUBRIENDO MQUINAS
Si has llegado hasta aqu, espero que tengas claro lo que es una direccin IP, un puerto, y cual es la nalidad de los escneres de puertos. A partir de aqu, y con la ayuda de nmap, vamos a entrar en detalle sobre cmo llamar a los telefonillos, evitar porteros y hacer todo esto sin que se note :) El primer paso, antes de llevar a cabo ningn tipo de accin ms complicada, es determinar si la mquina a analizar existe y est encendida. Este proceso se suele extender a analizar rangos de direcciones IPs, ya que quizs la mquina que interesa al intruso est muy protegida y el acceso desde fuera de la subred sea difcil, pero quizs otra mquina, en esa misma subred, no lo est tanto y accediendo a sta, resulte ms sencillo alcanzar el objetivo nal. 9| OCCAMs Razor

Paquete TCP (Fuente: Wikipedia)

Dependiendo de la operacin que deseemos realizar, las mquinas intercambiarn distintos tipos de paquetes. El tipo de paquete lo determina el campo ags. En la discusin que nos ocupa, nosotros estamos interesados especialmente en tres de ellos: SYN. Este es el tipo de paquete utilizado para establecer conexiones. Nos vamos a aburrir de l a lo largo del artculo :).

MALA BESTIA

Siguiendo con nuestro ejemplo. El edicio que nos interesa est muy protegido, con un portero que es un hueso, sin ventanas que den a la calle, etc... Sin embargo, tiene ventanas y puertas en un patio interior compartido por otros edicios adyacentes. Si alguno de esos edicios cercanos no est tan protegido, el intruso podr entrar primero en uno de ellos y luego pasar fcilmente al edicio objetivo a travs del patio interior que los comunica. En otras ocasiones, el intruso simplemente est interesado en localizar mquinas vulnerables que comprometer, para luego utilizarlas en un ataque de tipo DDoS o utilizarla como parte de una cadena de proxies para realizar un ataque a cualquier otra mquina. As, lo primero que tenemos que averiguar es cmo saber si una determinada direccin IP est asociada a una mquina. Nmap nos proporciona varias formas de averiguarlo.

enviar y recibir paquetes IP o ICMP (recordad que estn al mismo nivel), utilizando sockets normales. La opcin -sP es la que permite llevar a cabo esta operacin. Esta opcin, adems enva un paquete TCP al puerto 80, como prueba adicional (es comn ltrar paquetes ICMP, pero no el servicio web).

ENTORNO DE PRUEBAS
En este momento ya estamos en condiciones de empezar a hacer algunas pruebas para ver como nmap y la pila TCP-IP funcionan. El primer paso para ello es establecer un entorno de pruebas. Tendris que utilizar una segunda mquina, de forma que no se utilice el interfaz de loopback y los paquetes puedan ser capturados con un snier. Por ejemplo, podis utilizar vuestro router ADSL como mquina de test o montar una red virtual con qemu. Para nuestras pruebas, lanzaremos por un lado un snier. Podis utilizar el que ms rabia os d. Wireshark (el snier anteriormente conocido como Ethereal... vamos el Prince de los sniers :)) tiene un interfaz grco muy sencillo con el que resulta muy fcil ver los resultados de las pruebas. Nosotros vamos a utilizar tcpdump... es que somos asn. En otra consola lanzamos nuestro escaneo ping contra la mquina de prueba, obteniendo algo similar a lo que nos muestra la Figura 1. La Figura 2 muestra lo que tcpdump capturara.

ESCANEO PING
La primera forma es el denominado ping scan, que bsicamente hace lo mismo que la herramienta ping. Y cmo funciona ping? os preguntaris. Bueno, ping, compone un paquete ICMP ECHO (cdigo 8), al cual, la mquina destino responder con otro paquete ICMP ECHOREPLY (cdigo 0). Esto os debera resultar familiar. As es como est denido el protocolo ICMP, y esto funciona a no ser que un cortafuegos ltre los pings.

PING SCAN EXPLICADO


Bien, sin grandes sorpresas verdad?. Sin embargo tenemos que hacer algunos comentarios. El primero es relativo al uso del ag --send-ip. Este ag obliga a nmap a usar paquetes IP. Si no utilizamos este ag, al encontrarnos en una red local y ser un usuario privilegiado, nmap trata de utilizar el protocolo ARP para determinar si la mquina est funcionando. El segundo comentario es relativo a por qu enviar un paquete TCP al puerto 80 para determinar si una mquina est levantada. Si os jis en el log de tcpdump, la mquina razor, responde con un paquete TCP RST (la R que aparece en primer lugar). Esto sucede porque lo que nmap envi al puerto 80 de la mquina remota es un paquete ACK.

El escaneo PING nos permite saber si una mquina existe


Para poder enviar un paquete ICMP, al igual que la mayora de los paquetes especiales que veremos a lo largo del artculo, nmap requiere permisos de root puesto que debe utilizar un socket RAW para componer el paquete especco para cada prueba. De la misma forma para capturar el paquete ECHOREPLY de respuesta, nmap utiliza una versin modicada de libpcap que se distribuye con sus fuentes. No se pueden
FIGURA 1 - ESCANEO PING

occams # nmap --send-ip -sP razor Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2008-07-19 19:24 BST Host razor (192.168.1.1) appears to be up. MAC Address: 00:18:F8:67:FB:0B (Unknown) Nmap finished: 1 IP address (1 host up) scanned in 0.254 seconds FIGURA 2 - CAPTURA TCPDUMP # tcpdump icmp || (tcp port 80) tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 19:28:52.506536 IP occams > razor: ICMP echo request, id 38285, seq 46094, length 8 19:28:52.506809 IP occams.35381 > razor.www: . ack 42183966 win 2048 19:28:52.507046 IP razor > occams: ICMP echo reply, id 38285, seq 46094, length 8 19:28:52.507504 IP razor.www > occams.35381: R 42183966:42183966(0) win 0

OCCAMs Razor | 10

MALA BESTIA
FIGURA 3 - ESCANEO CONNECT # nmap --send-ip -sP test Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2008-07-19 19:37 BST Note: Host seems down. If it is really up, but blocking our ping probes, try -P0 Nmap finished: 1 IP address (0 hosts up) scanned in 0.140 seconds FIGURA 4 - CAPTURA TCPDUMP DE ESCANEO CONNECT 19:37:21.873327 19:37:21.873361 19:37:21.873889 19:37:21.874174 IP IP IP IP occams > test: ICMP echo occams.37620 > test.www: razor > occams: ICMP net razor > occams: ICMP net request, id 34080, seq 40155, length 8 . ack 418834206 win 3072 test unreachable, length 36 test unreachable, length 48

Ese paquete no se debera recibir si no existe una conexin establecida previamente y por lo tanto el sistema remoto responde con una peticin de RESET (paquete RST). Si la mquina estuviera apagada, obviamente no respondera nada. Vemoslo. Test es una mquina que no existe. Para evitar mensajes extra, aadid una entrada en el chero /etc/hosts de forma que no sea necesaria una peticin al DNS, o utilizad el ag -n. Los resultados los podis ver en las Figuras 3 y 4. Como podemos ver, nmap sigue enviando los dos paquetes (ECHO y TCP ACK), igual que antes, pero en este caso, nuestro router nos devuelve un mensaje ICMP indicando que la red en la que se encontrara test es inalcanzable... Obviamente, cuando aadis test a /etc/hosts usad una IP que este fuera de vuestra red. Para explicar esto en detalle tendramos que entrar en como se lleva a cabo el encaminamiento y algunas cosas ms, que ya salen fuera del objetivo de este artculo. Por el momento simplemente quedaros con que alguien es capaz de detectar si una red es inalcanzable y que nos lo comunicar con un mensaje ICMP.

se basan en hacer un ping, o dicho de otra forma, en enviarles algo que provoque algn tipo de respuesta. Recibir una respuesta implica que la mquina existe. As, nmap proporciona distintas tcnicas para hacer pings a mquinas. La pgina del manual de nmap contiene un montn de informacin sobre cuando interesa utilizar una u otra. Para no reproducirla aqu, nosotros solo os proporcionamos un pequeo resumen sobre qu ping hace cada una de ellas. -PS. Ping con paquete TCP SYN. Podemos recibir un paquete RST (puerto cerrado), ACK (puerto abierto) o un error ICMP (mquina no existe). -PA. Ping con paquete TCP ACK. Podemos recibir un paquete RST (puerto abierto/mquina existe) o un error ICMP (mquina no existe). -PU. Ping con paquete UDP. Podemos recibir un error ICMP puerto inalcanzable(mquina existe) u otro error ICMP (mquina no existe). Este tipo de escaneo puede ser muy lento. -PE, -PP, -PM. Ping con paquetes ICMP (ECHO, TIMESTAMP, ADDRESSMASK). Una respuesta a estos mensajes indica que la mquina existe. La falta de respuesta indica que la mquina no existe o el rewall ha ltrado los paquetes. -P0. No ping. Utilizada para no comprobar si la mquina existe :). -PE. Ping ARP. Esta tcnica solo funciona en redes LAN y hace uso del protocolo ARP. Este ltimo escaneo solo funciona en redes de rea local y es el que utiliza nmap por defecto cuando se trata de escaner direccin locales. La ventaja frente a las otras alternativas es que; es mucho ms rpido y mucho ms able. En la Figura 5 podemos ver un pequeo ejemplo.

MS TCNICAS
Hasta ahora hemos visto la forma estndar de determinar si un host est levantado, pero nmap nos proporciona una serie de opciones alternativas para llevar a cabo esta tarea. El uso de una u otra depender del caso particular de la mquina que se est escaneando. Por ejemplo, si la mquina est tras un rewall, los paquetes ICMP ECHO y los intentos de conexin hacia la red interna, probablemente sean ltrados, sin embargo el rewall debe dejar pasar los paquetes ACK (para poder permitir la comunicacin desde dentro). Cada caso es particular y esa es la razn porque son necesarias algunas herramientas ms que el escner de puertos :). Todas las tcnicas para detectar si una mquina existe
FIGURA 5 - ESCANEO CARP

# nmap -PR razor .... # tcpdump 11:18:46.760693 arp who-has razor (Broadcast) tell occams 11:18:46.760974 arp reply razor is-at 00:18:f8:67:fb:0b (oui Unknown)

11| OCCAMs Razor

MALA BESTIA

En este caso, nmap mantiene una lista de direcciones MAC y su fabricante asociado, siendo capaz, en algunos casos, de informarnos del fabricante de la mquina que estamos escaneando. Observad que, con la excepcin de los escaneos UDP, el no recibir ningn tipo de respuesta, en general signicar que hemos topado con un rewall con una regla DROP por el camino. Si el rewall utiliza una regla REJECT, recibiramos paquetes RST.

ESCANEO CONNECT

Hasta aqu, hemos visto como utilizar nmap para localizar mquinas activas. Una vez que el intruso sabe que la mquina est activa, es decir, existe, es el momento de averiguar toda la informacin posible sobre ella. La principal funcin de nmap es informar de qu puertos en la mquina vctima estn abiertos, pero, como ya adelantamos, tambin es capaz de proporcionar un CAPTURA DE UN ESCANEO CONmontn de informacin adicional muy til. Todo esNECT to lo veremos a continuacin, pero antes de continuar vamos a introducir algunos conceptos ms para que Y que es lo que nuestro snier ha capturado. La gura 7 es la respuesta. os resulte ms fcil de entener el resto del artculo. Lo que acabamos de ver es lo que se conoce como TCP 3-way handshake.. algo as como apretn de manos a tres bandas. Este es el proceso estndar para establecer una conexin TCP. El proceso se inicia enviando un paquete SYN al sistema remoto. Eso es lo que indica la S que nos enconLa tcnica de escaneo ms sencilla que existe consiste tramos al principio de la zona de datos de la primera simplemente en intentar una conexin a un determi- lnea. Cuando el sistema remoto recibe ese tipo de nado puerto. Vimos como hacer esto con Netcat, en paquetes se inicia el proceso. El sistema remoto resel primer nmero de la revista... recordis?. Este tipo ponde con un paquete SYN ACK (segunda lnea). Este de escaneo es proporcionado por nmap, pero se po- paquete sirva para decir vale, por mi no hay probledra calicar como escaneo ruidoso... el intento de ma para conectarnos... Quieres?. Este paquete tiene conexin hace sonar campanas incluso en los sistemas ambos ags, SYN y ACK activados en sus cabeceras. Cuando el sistema que intenta conectar (occams en menos protegidos :). El ag -sT (TCP connect scan) de nmap nos permite nuestro caso), recibe este paquete SYN ACK, para que hacer esto. Para verlo, necesitamos utilizar un puerto la conexin se complete, debe enviar una respuesta abierto en nuestra mquina destino. Nosotros vamos diciendo: S, quiero!. Ese es paquete ACK que podea utilizar el puerto de administracin https de nues- mos ver en la tercera lnea, tambin conocido como tro router ADSL, pero si disponis de otra mquina paquete de la novia (esto ltimo es broma :).

podris utilizar netcat con los ags -l y -p seguido del puerto que vayis a utilizar. Podis comprobar el resultado en la Figura 6. Antes de ver lo que nuestro snier a capturado vamos a describir rpidamente los ags que hemos utilizado. En primer lugar utilizamos el ag -P0, con el que le indicamos a nmap que no lleve a cabo el test de host activo. Esto lo hacemos para que, en la captura de nuestro snier no nos aparezcan los paquetes ECHO ICMP y el paquete ACK al puerto 80... eso ya sabemos como funciona. El siguiente ag es -sT con el que le indicamos que queremos hacer un escaneo de tipo connect. Finalmente, el ag -p nos permite indicarle a nmap que solo deseamos escaner una lista concreta de puertos no todos los posibles. En nuestro ejemplo estamos utilizando el puerto HTTPS (443) que nuestro router tiene abierto para permitir la administracin remota.

La forma ms sencilla de escaneo consiste en intentar una conexin

FIGURA 6 - ESCANEO CONNECT A UN PUERTO ABIERTO # nmap -P0 -sT razor -p 443 Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2008-07-20 11:50 BST Interesting ports on razor (192.168.100.1): PORT STATE SERVICE 443/tcp open https Nmap finished: 1 IP address (1 host up) scanned in 0.005 seconds FIGURA 7 - CAPTURA TCPDUMP DE UN ESCANEO CONNECT A UN PUERTO ABIERTO
11:56:50.970981 IP occams.52355 > razor.https: 11:56:50.971485 IP razor.https > occams.52355: 1645462,nop,wscale 0> 11:56:50.971520 IP occams.52355 > razor.https: 11:56:50.971589 IP occams.52355 > razor.https: S 2307061820:2307061820(0) win 5840 <mss 1460,sackOK,timestamp 1645462 0,nop,wscale 2> S 2928016144:2928016144(0) ack 2307061821 win 5792 <mss 1460,sackOK,timestamp 684084 . ack 1 win 1460 <nop,nop,timestamp 1645462 684084> R 1:1(0) ack 1 win 1460 <nop,nop,timestamp 1645463 684084>

OCCAMs Razor | 12

MALA BESTIA

En ese momento, la conexin est establecida y el intercambio de informacin podra empezar. Como nmap est escaneando el puerto y no est interesado en intercambiar ninguna informacin, inmediatamente enva un paquete RST para terminarla (cuarta lnea). Quizs algunos os estis preguntado qu es toda esa informacin adicional que proporciona tcpdump. Bien, todos esos datos son la informacin contenida en las cabeceras de los protocolos. Los que realmente queris saber que signica cada una de esas cosas, tenis dos opciones: O leer los RFCs de TCP e IP, o leer la biblia del TCP-IP, el libro de Stevens TCP-IP Illustrated. Nosotros solo os vamos a contar lo que son esos dos nmero grandes que aparecen en los paquetes SYN. Se trata de nmeros de serie aleatorios que, entre otras cosas, sirven para evitar lo que se conoce como spoong.

ga.... habla, habla que no te escucho. En el caso de TCP, existe un problema adicional, que acabamos de presentar en la seccin anterior; el 3-way handshake. Como os decamos, cuando se enva el paquete SYN, se incluye un nmero de serie que el sistema remoto se queda. El sistema remoto enva un paquete SYN ACK de vuelta, con su nmero de serie y el asentimiento del nmero de serie que haba recibido en el paquete SYN. En este punto, el sistema que est intentando establecer la conexin, tiene que enviar un nuevo paquete ACK para completar la conexin, como comentamos ms arriba. Este paquete ACK tiene que referenciar el nmero de serie recibido de la mquina remota (el del paquete SYN ACK). Si el cliente no proporciona el nmero correcto, la conexin no se puede establecer.

SPOOFING EXPLICADO
Ya que ha salido el tema, vamos a explicar m rpido en que consiste el spoong y como esos nmeros aleatorios pueden evitarlo. Desde el punto de vista ms general las tcnica de spoong buscan la forma de hacerse pasar por otro. Dependiendo de como se lleve a cabo podemos hablar de DNS spoong, IP spoong, o cualquier otra cosa. A nosotros nos interesa el IP spoong, puesto que es de lo que hemos estado hablando en este artculo. El IP Spoong busca permitir la comunicacin entre dos mquinas en una red TCP-IP en la que una de estas mquinas utiliza una direccin IP falsa. Generar paquetes con direcciones IP falsas es muy fcil, el problema es que el sistema remoto, va a enviar esos paquetes a la direccin falsa y por lo tanto el sistema del spoofer no va a recibir esas repuestas. En ese caso tiene dos opciones. O utilizar un snifer para capturar el trco, u obviar lo que la vctima di-

El apretn de manos a tres bandas diculta el spoong


Esta es la razn por la que estos nmeros de serie deben ser difciles de predecir. En el pasado, varias pilas TCP-IP generaban estos nmeros de serie de una forma ms determinista y por tanto, era posible adivinar cual sera el nmero de serie que el servidor, o mquina remota nos iba a enviar y as establecer la conexin incluso cuando no se vea el paquete SYN ACK. Nmap nos da algunas pistas sobre esto, y aunque hablaremos sobre el tema ms adelante, podis probar lo siguiente, el comando de la Figura 8. La opcin -O habilita la deteccin del sistema operativo, que comentaremos ms adelante, y la opcin -v es el clsico verbose. Si os jis hacia el nal del informe que nmap genera, nos encontramos una lnea que dice: TCP Sequence Prediction. Bueno, ahora ya sabis que signica :)

FIGURA 8 - SALIDA DE nmap EN MODO VERBOSE Y DETECCIN DE S.O. # nmap -v -O razor Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2008-07-24 07:28 BST Initiating ARP Ping Scan against 192.168.100.1 [1 port] at 07:28 The ARP Ping Scan took 0.01s to scan 1 total hosts. Initiating SYN Stealth Scan against lisa (192.168.100.1) [1679 ports] at 07:28 Discovered open port 443/tcp on 192.168.100.1 The SYN Stealth Scan took 0.57s to scan 1679 total ports. For OSScan assuming port 443 is open, 1 is closed, and neither are firewalled Host razor (192.168.100.1) appears to be up ... good. Interesting ports on razor (192.168.100.1): Not shown: 1678 closed ports PORT STATE SERVICE 443/tcp open https MAC Address: 00:18:F8:67:FB:0B (Unknown) Device type: general purpose Running: Linux 2.4.X|2.5.X OS details: Linux 2.4.0 - 2.5.20 Uptime 0.009 days (since Thu Jul 24 07:14:43 2008) TCP Sequence Prediction: Class=random positive increments Difficulty=2795417 (Good luck!) IPID Sequence Generation: All zeros Nmap finished: 1 IP address (1 host up) scanned in 2.736 seconds Raw packets sent: 1695 (75.086KB) | Rcvd: 1693 (78.296KB)

13| OCCAMs Razor

MALA BESTIA

PUERTOS CERRADOS

ejemplo. En nuestro primer ejemplo nos hemos asegurado de Como podis observar hemos aadido de nuevo el ag que el puerto estuviera abierto... pero qu sucede --send-ip para que no se generen los paquetes ARP cuando el puerto est cerrado?. Recordad que es tan y la captura de nuestro snier sea ms clara. Si no importante saber que el puerto est abierto como que estis en una red local podis prescindir de este ag. est cerrado. Veamos que sucedera en este caso (Fi- Lo que nuestro snier captura en este caso es lo esperado. El proceso es idntico al del connect scan (ag gura 9) Bien, nmap nos dice que el puerto est cerrado como -sT), pero en este caso, no se llega a completar la esperbamos, pero en la captura de tcpdump, vemos conexin con el tercer paquete ACK. como nuestro paquete SYN sale sin problemas hacia nuestro objetivo, pero en este caso, el sistema remoto, nos responde inmediatamente con un paquete RST indicando que el proceso de conexin debe cancelarse ...porque el puerto est cerrado :) (Regla 2). Recordad todo lo que hemos estado comentando hasta La ventaja de este escaneo es que los sistemas de log el momento. En este caso hemos obtenido un paquete ms sencillos no lo detectan. Muchos servidores graRST porque la mquina est ah. Si la mquina no estuban en su log informacin sobre las distintas conexioviera levantada, probablemente recibiramos un error nes que reciben. En este caso, la conexin no se llega ICMP, o en el peor de los casos no recibiramos nada a completar y por tanto nada se grabar en el log. si un cortafuegos tira nuestro paquete antes de que Sistemas de deteccin de intrusos ms sosticados son alcance la mquina destino. capaces de detectar estos accesos sin grandes complicaciones, despus de todo se trata de la opcin ms ESCANEOS DE MEDIA CONEXIN sencilla. Con la informacin que nos ha dado nuestro snier el siguiente tipo de escaneo es obvio. Por qu comple- Y UDP? tar el proceso de conexin con el tercer paquete, si el segundo ya nos ha dado la informacin que necesit- Os preguntaris algunos. UDP es distinto a TCP puesbamos?. Bueno, la respuesta es que el primer tipo de to que no existe el concepto de conexin. De hecho haescaneo no necesita permisos especiales, mientras que cer spoong sobre una comunicacin UDP es bastante sencillo. el que vamos a describir a continuacin s. El ag de nmap que nos permite hacer este tipo de El ag de nmap que permite hacer escaneos UDP es escaneo es -sS (SYN Scan). La Figura 10 muestra un -sU (obviamente :). En general estos escaneos son ms lentos que los TCP, y enseguida veremos por qu.

Los escaneos de media conexin son ms difciles de detectar

FIGURA 9 - ESCANEO CONNECT A UN PUERTO CERRADO Y CAPTURA TCPDUMP.

# nmap -P0 -sT razor -p 80 Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2008-07-20 12:29 BST Interesting ports on razor (192.168.100.1): PORT STATE SERVICE 80/tcp closed http

Nmap finished: 1 IP address (1 host up) scanned in 0.005 seconds ... 12:29:56.261524 IP occams.47587 > razor.www: S 108328587:108328587(0) win 5840 <mss 1460,sackOK,timestamp 2141754 0,nop,wsca 12:29:56.262056 IP razor.www > occams.47587: R 0:0(0) ack 108328588 win 0 FIGURA 10 - ESCANEO DE MEDIA CONEXIN Y CAPTURA TCPDUMP. # nmap -P0 --send-ip -sS razor -p 80 Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2008-07-20 12:47 BST Interesting ports on razor (192.168.100.1): PORT STATE SERVICE 443/tcp open https MAC Address: 00:56:28:77:23:AF (Unknown) Nmap finished: 1 IP address (1 host up) scanned in 0.158 seconds
.. 12:49:50.577217 IP occams.45430 > razor.https: S 1685995555:1685995555(0) win 3072 <mss 1460> 12:49:50.577723 IP razor.https > occams.45430: S 1990957085:1990957085(0) ack 1685995556 win 5840 <mss 1460> 12:49:50.577745 IP occams.45430 > razor.https: R 1685995556:1685995556(0) win 0

OCCAMs Razor | 14

MALA BESTIA

El proceso consiste en enviar un paquete UDP vaco al puerto que se desea comprobar. Si el puerto est cerrado, recibiremos como respuesta un mensaje de error a travs del protocolo ICMP (Regla 2), sin embargo si el puerto est abierto, lo ms probable es que no recibamos nada. Eso depender del servicio UDP que se est comprobando. En UDP no existe concepto de conexin, cada paquete viaja independientemente por la red. Tampoco existen paquetes ACK que el sistema remoto enve de vuelta. Si el servidor remoto enva algn dato tras recibir informacin desde algn sitio habremos tenido suerte, pero si el servidor no enva nada, no sabremos si hay alguien al otro lado o el cortafuegos ha tirado nuestro paquete. El gran problema con UDP es que normalmente existe un lmite en la cantidad de paquetes ICMP que un sistema puede enviar en un tiempo determinado (esto depende del sistema operativo). Esto implica que el escaneo no se puede realizar a toda velocidad puesto que ciertos paquetes no se recibiran nunca y se consideraran abiertos puertos que no lo estn. En general existen muchos menos servicios que utilizan UDP que los que utilizan TCP y muchas veces no se les presta toda la atencin que deberan.

-sN Null Scan. Con este ag enviaremos paquetes con todos los bits a cero. -sF FIN Scan. Este ag permite enviar paquetes con el bit TCP FIN activo. -sX Xmas scan. Este ag permite enviar paquetes con todos los bits activos. El nombre proviene de un smil con un rbol de navidad en el que todas las luces se encienden a la vez. Los ags TCP que manipulan estos tipos de escaneo son: FIN, PSH y URG. Los interesados en saber que hace cada uno de ellos deberan leerse el RFC-793 donde se describe en detalle TCP. Este tipo de escaneos son ms difciles de detectar, o cuanto menos requieren una conguracin especial del sistema de seguridad instalado. La contrapartida es que no todos los sistemas siguen el RFC al pie de la letra y, en esos casos, el escaneo puede producir resultados errneos o no decisorios. Para que os hagis una idea aqu tenis el resultado de tcpdump, para tres escaneos consecutivos al puerto 443 con cada una de las opciones que acabamos de describir. La Figura 11 nos muestra que en los tres casos, la salida de nmap clasica el puerto como open|ltered, no siendo capaz de determinar si el puerto est abierto o se encuentra tras un rewall. Si os jis en la salida de tcpdump, podris identicar (por las iniciales de los ags) que lneas se corresponden a cada escaneo... es decir, ver se ven, pero alguien tiene que tomar esos datos y decir que se trata de un escaneo de puertos. Observad que nmap genera dos paquetes en cada escaneo. Esto ocurre porque el primer test no fue denitivo y por tanto se inicia un segundo test (sabrais decir la diferencia). La Figura 12 muestra qu obtendramos si dirigimos nuestro escaneo a un puerto cerrado. Ahora podemos ver los paquetes RST provenientes del sistema remoto y como, en este caso, nmap nos dice sin lugar a dudas que los puertos estn cerrados. Observad tambin, como el segundo paquete ya no es necesario en este caso.

MS ESCANEOS SIGILOSOS
Al igual que suceda con las tcnicas de deteccin de mquinas, nmap proporciona una amplia gama de soluciones de escaneo de puertos sigilosos que, en general, son ms difciles de detectar, o, cuanto menos, requieren que el administrador del sistema remoto tome ciertas precauciones. Cosa que no siempre ocurre. Este tipo de escaneos se fundamentan en que el RFC que dene TCP establece que la respuesta a cualquier paquete que no contenga los bits SYN, RST o ACK debe ser RST (la Regla 3). De esta forma, jugando con el resto de los ags TCP es posible averiguar si un puerto esta abierto o no de forma sigilosa. Nmap proporciona tres tipos de escaneos de este tipo y una opcin para que el usuario especique cualquier combinacin que desee. Veamos rpidamente cuales son estas tres opciones.

FIGURA 11 - CAPTURA DE ESCANEOS NULL, FIN, XMAS A PUERTO CERRADO. 13:16:59.166446 13:17:00.163292 13:17:12.916484 13:17:13.917228 13:17:22.289316 13:17:23.290118 IP IP IP IP IP IP occams.53929 occams.53930 occams.53021 occams.53022 occams.63528 occams.63529 > > > > > > razor.https: razor.https: razor.https: razor.https: razor.https: razor.https: . win 4096 . win 3072 FP 2677994679:2677994679(0) win 2048 urg 0 FP 2678060214:2678060214(0) win 4096 urg 0 F 1455231218:1455231218(0) win 1024 F 1455165683:1455165683(0) win 2048

FIGURA 12 - CAPTURA DE ESCANEOS NULL, FIN, XMAS A PUERTO ABIERTO. 13:31:58.832801 13:31:58.833375 13:32:03.356435 13:32:03.356950 13:32:07.776070 13:32:07.776575 IP IP IP IP IP IP occams.52797 > razor.www: razor.www > occams.52797: occams.40594 > razor.www: razor.www > occams.40594: occams.56879 > razor.www: razor.www > occams.56879: . win 1024 R 0:0(0) ack 3074120381 win 0 F 1161376370:1161376370(0) win 3072 R 0:0(0) ack 1161376371 win 0 FP 3957574167:3957574167(0) win 2048 urg 0 R 0:0(0) ack 3957574168 win 0

15| OCCAMs Razor

MALA BESTIA

El escaneo TCP Maimon explota una caracterstica especial de los sistemas BSD

los paquetes recibidos del sistema remoto. Recordad que segn el tipo de escaneo, recibir un paquete RST o Algunas secciones antes hemos introducido tres reglas un tamao de ventana positivo puede signicar que el generales con las que pretendamos resumir el proceso puerto est abierto o cerrado, dependiendo de lo que de escaneo de puertos, sin embargo, como sucede con hayamos enviado. toda regla, siempre hay excepciones. La principal excepcin es el denominado escaneo TCP CORTAFUEGOS CON Y SIN CONEMaimon scan, que toma su nombre de Uriel Maimon, XIN la persona que lo descubri. La tcnica es idntica a los escaneos FIN, Null y Xmas que vimos en la sec- Como todos sabis, un cortafuegos o rewall, permite cin anterior, pero en este caso los ags utilizados son controlar el trco que entra y sale de una red, paFIN y ACK. Segn la especicacin de TCP, frente a ra evitar ataques, normalmente desde el exterior. La un paquete de este tipo, el sistema remoto debera conguracin ms habitual es que el cortafuegos, soresponder con un paquete RST, sin embargo, ciertos lo permita conexiones desde la red interna hacia el derivados BSD, tiran el paquete si el puerto al que va exterior, de forma que los usuarios de la red interna puedan navegar por internet o leer su correo. Si se dirigido est abierto. desea proporcionar algn servicio, en general se suele utilizar una conguracin ms complicada, con dos cortafuegos y una DMZ. La forma ms sencilla de evitar conexiones desde el exterior, es tirar los paquetes SYN, sin embargo, los paquetes ACK no se pueden tirar ya que son necesarios para que las mquinas tras el cortafuegos puedan El otro tipo de escaneo que queremos comentar no utilizar la red. es realmente una excepcin sino ms bien una alter- Los cortafuegos con estado o seguimiento de conexionativa, que se basa en el anlisis del campo TCP nes, son capaces de ltrar paquetes ACK inapropiaWindow de los paquetes TCP. dos. Para ello, mantienen una lista de todas las coEsta tcnica es similar al TCP ACK scan que acaba- nexiones activas entre el exterior y la red interna. Si mos de describir, pero utiliza otras propiedades de las recibe un paquete ACK que no se pueda asociar con pilas TCP que permiten determinar si el puerto est ninguna de las conexiones activas, ese paquete es desabierto o no. Para ello, esta tcnica analiza el campo cartado. TCP Window de los paquetes TCP. En ciertos sis- El escaneo ACK de nmap, est especialmente diseatemas, este campo es positivo si el puerto est abierto do para detectar estas conguraciones. y cero si el puerto est cerrado. Este tipo de escaneo es dependiente de la plataforma, ESCANEOS SOFISTICADOS es decir, no todos los sistemas responden de esta forComo deca aquel conocido super-roedor... No se vama, y por tanto, el resultado obtenido no siempre es yan todava, que an hay ms. Efectivamente, nmap able. En general, si el resultado del escaneo es una es una mala bestia :). mezcla de puertos abiertos y cerrados, probablemente el escaneo haya tenido xito. Si todos los puertos apa- No hace mucho tiempo, nmap incluy un nuevo morecen como cerrados, puede ser que realmente lo estn do de escaneo denominado Idlescan. La peculiaridad de este escaneo es que es indetectable. El problema o que este mtodo no funcione en este caso. es que no se puede utilizar en cualquier situacin, coPara terminar con esta tcnica, comentar que el commo sucede con las tcnicas que hemos visto hasta el portamiento del sistema remoto puede ser exactamenmomento.. te al contrario, es decir, si el escaneo informa de que todos los puertos estn abiertos, excepto un puado de ellos, probablemente los que componen ese puado sean los que realmente estn abiertos. Nmap proporciona adems un ag que nos permite enviar paquetes con la combinacin de ags que deseemos. Este ag es --scanflags y los campos TCP se indican con las cadenas de texto: URG ACK PSH RST La tcnica es indetectable en el sentido de que la mSYN FIN. As la siguiente lnea de comandos, activara quina del atacante no enva ningn paquete al sistema todos los ags: remoto, y por tanto no existe una forma directa de relacionar ambas mquinas. Evidentemente, para conse# nmap --scanflags URGACKPSHRSTSYNFIN razor Estos ags se pueden combinar con los tipos de esca- guir esto, hay que usar una tercera mquina, a la que neo que hemos comentado hasta el momento. El tipo la documentacin de nmap se reere como maquina de escaneo seleccionado (con el ags -s seguido del zombie. Est mquina es la que recibir la informatipo elegido), va a determinar como se interpretarn cin por nosotros.

EXCEPCIONES A LAS REGLAS

El escaneo IDLE es indetectable ya que la maquina del atacante no enva datos a la vctima

OCCAMs Razor | 16

MALA BESTIA

En el website de nmap, podis encontrar un detallado artculo sobre el funcionamiento de esta tcnica. Nosotros, como es habitual, solo os vamos a dar una breve descripcin para que podis seguir investigando por vuestra cuenta, que es lo realmente divertido. El proceso se basa en la monitorizacin de los nmeros de identicacin de fragmento IP (IP ID). Este nmero se enva en las cabeceras IP y normalmente se incrementa con cada paquete enviado, de forma que si podemos leer este nmero para una determinada mquina, sabremos cuantos paquetes IP ha enviado esa mquina hasta el momento.

da esta funcionalidad, porque ha dejado de ser prctica... pero siempre hay algn despistado por ah. Los que queris conocer ms detalles sobre este tipo de escaneo, podis consultar la pgina del manual de nmap o su sitio web. ESCANEO DE PROTOCOLOS Nmap proporciona un modo de escaneo de protocolos que se activa con el ag -sO. En este modo, en lugar de probar puertos de un determinado protocolo (UDP o TCP), nmap trata de comprobar que protocolos IP soporta una determinada mquina. El protocolo IP es un campo de la cabecera IP de los paquetes, as que nmap, simplemente enva paquetes con distintos valores en este campo. Como respuesta a estas pruebas, nmap espera mensajes ICMP, concretamente el mensaje Protocol Unreachable que signicar que ese protocolo no est soportado. La recepcin de otro tipo de mensaje ICMP har que nmap marque el puerto como ltrado. En cualquier otro caso, nmap determinar que el protocolo est soportado. Como podis observar el funcionamiento es muy similar al del escaneo UDP.

El IDLE SCAN utiliza los nmeros de identicacin de fragmento IP de las mquinas zombie
Con esta informacin, muchos de vosotros ya os estaris imaginando como funciona este tipo de escaneo. Efectivamente, los pasos son bastante evidentes (lo que no es evidente es que esto se le ocurra a cualquiera :). Obtener el IP ID de la mquina zombie.

PONINDOLO DIFCIL

Enviar un paquete SYN modicado con la direc- Adems de todas estas distintas formas de escaneo, cin IP de la mquina zombie, a la mquina que para otros tantos escenarios, nmap proporciona una serie de ags adicionales con los que poner en apuse quiere escanear. ros a los IDSs ms sosticados. Veamos rpidamente Comprobar de nuevo el IP ID de la mquina cuales son: zombie. -f: Fragmentado de paquetes. Utilizando esta opcin nmap enviar sus paquetes de prueba Un incremento de 1 en el ID signica que la mquina como pequeos fragmentos, de forma que la cazombie no ha recibido ningn paquete a excepcin de becera TCP se enve en varios paquetes IP, en la prueba realizada desde la mquina atacante. Esto lugar de en uno solo. Esto obliga a los rewall signica que el puerto remoto est cerrado, puesto que e IDSs a realizar el proceso de reensamblado de la mquina zombie habr recibido un paquete RST o paquetes que, requiere CPU y memoria, y por nada (en caso de existir un rewall). eso muchas veces se desactiva. AlternativamenSi el ID se ha incrementado en 2, el puerto estar te a esta opcin es posible especicar la MTU abierto. La mquina vctima habr respondido con un (Maximum Transfer Unit) con la que especicar SYN ACK a la prueba SYN que envi el atacante. Ante el tamao mximo de cada paquete que se eneste paquete, la mquina zombie enviar un paqueva (ejecutad ifcong para saber cual es la MTU te RST a la mquina vctima, puesto que, para ella, para vuestro interfaz de red :). ninguna conexin est en marcha. -D: Seuelos. Esta es una de las opciones ms inSi el ID se ha incrementado en ms de 2, signica que teresante para ofuscar un escaneo. Esta opcin el zombie no es una buena eleccin. S, eso todava permite especicar una lista de mquinas sepano lo hemos dicho, pero la mquina zombie debe ser radas por comas. Por cada una de las mquinas una que no tenga apenas actividad de red, de forma especicadas, nmap producir un paquete idnque durante el escaneo, no enve ningn paquete y la tico al de la prueba que est realizando, pero monitorizacin del IP ID sea efectiva. cambiando la direccin IP de origen por la de la Como os decamos, en el sitio web de nmap podis mquina especicada con -D. encontrar un extenso y detallado artculo sobre como De esta forma, desde el punto de vista del sistefunciona este tipo de escaneo (est traducido al espama remoto, parecer que est siendo escaneado ol y portugus). por todas esas mquinas simultneamente, rePara terminar, comentaros que existe una forma de sultando bastante complicado determinar, cual escaneo adicional denominada FTP bounce scan, que de ellas es la que realmente est llevando a cabo explota las denominadas conexiones proxy ftp. La mael escaneo de puertos. yora de los servidores FTP actuales tienen desactiva17| OCCAMs Razor

MALA BESTIA

-S: Spoong de direccin origen. A lo largo de este texto hemos hablado en varias ocasiones de cambiar la direccin origen de los paquetes IP. Esta opcin permite realizar precisamente eso. Si bien, su verdadera utilidad es la de indicarle a nmap cual es la direccin IP que debe utilizar cuando no es capaz de determinarla por si mismo (porque tengamos varios interfaces de red, por ejemplo), puede servir a otros usos maliciosos. Relacionado con este ltimo, el ag --source-port o -g que permite especicar el puerto de origen de los paquetes.

los ags -vS, para obtener informacin sobre la aplicacin asociada a un determinado puerto, y el ag -O para obtener informacin sobre el sistema operativo. En la seccin sobre spoong ya vimos que tipo de informacin nos proporciona el ag -O. La Figura 13, muestra lo que obtenemos al utilizar el ag -vS... da miedo eh? Bueno, la verdad es que no es para tanto. Si utilizamos nuestro querido netcat para una prueba rpida obtenemos:
# nc localhost 80 GET / HTTP/1.1 Host: localhost:8080

SACANDO EL MXIMO DE INFORMACIN


Para terminar con esta mala bestia, vamos a hablaros de una de las funcionalidades ms potentes de nmap (la otra es el lenguaje de script que proporciona, pero este artculo ya es demasiado largo). Nmap es capaz de realizar una batera de pruebas contra los puertos de una determinada mquina. Estas pruebas son un poco ms complejas que los mtodos de escaneo que hemos visto, y en general se basan en la ejecucin de una serie de scripts y de la consulta de una base de datos bastante completa.

HTTP/1.1 200 OK Date: Tue, 06 Jan 2009 20:54:31 GMT Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.4 with Suhosin-Patch Last-Modified: Tue, 30 Dec 2008 16:06:24 GMT ETag: "3c1ca-2d-45f45c5dfc000" Accept-Ranges: bytes Content-Length: 45 Content-Type: text/html <html><body><h1>It works!</h1></body></html>

Nmap utiliza un sistema de pruebas para obtener informacin adicional sobre el sistema remoto

El texto en color azul es lo que nosotros escribimos, y el texto en color rojo, es lo que el servidor nos cuenta de porque s. Si utilizis tcpdump, con un par de opciones que podis encontrar en su pgina del manual, veris que, entre otras cosas, nmap hace una peticin de este tipo. Si tenis un servidor ssh en vuestra mquina probad a repetir el experimento (el puerto ssh es el 22 ;).

MUCHAS MS OPCIONES

Nmap es una caja de sorpresas y os hemos dejado muchas cosas para que investiguis. Esperamos que con Con este proceso, nmap es capaz de darnos un mon- lo que os hemos contado en este artculo tengis las tn de informacin sobre la aplicacin asociada a un herramientas sucientes para utilizar a fondo nmap. determinado puerto y sobre el sistema operativo de Solo tenis que ejecutar man nmap en vuestra conla mquina remota. Esta informacin se obtiene con sola y empezar a leer. Hasta el prximo nmero.
FIGURA 13 - SALIDA DEL FLAG -vS CONTRA UN SERVIDOR WEB. # nmap -sV localhost -p 80 http://insecure.org ) at 2009-01-06 21:51 CET localhost (127.0.0.1): VERSION Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.4 with Suhosin-Patch)

Starting Nmap 4.53 ( Interesting ports on PORT STATE SERVICE 80/tcp open http

Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ . Nmap done: 1 IP address (1 host up) scanned in 6.160 seconds

RECURSOS
Sitio Web nmap
http://www.insecure.org

RFC 791 - Internet Protocol


http://www.faqs.org/rfcs/rfc791.html

RFC 792 - Internet Control MessageProtocol


http://www.faqs.org/rfcs/rfc792.html

RFC 793 - Transmission Control Protocol


http://www.faqs.org/rfcs/rfc793.html

OCCAMs Razor | 18

M RPIDO

Sistema de Videovigilancia Casero


Controla tu casa en dos patadas... y mucho ms
por Er Boyer

ale, para montar un sistema de videovigilancia casero m rpido, podemos usar motion... eso sera lo ms rpido, pero no sera tan divertido. En este nmero os vamos a contar como programar vuestros dispositivos de adquisicin de vdeo, como codicar imgenes, y como mostrarlas en plan Aero en una ventana. Mola no?

Al nal de este artculo habremos desarrollado un sistema de vdeo vigilancia muy rudimentario, es decir, no va a ser especialmente til, pero os proporcionar el punto de partida para desarrollos ms complejos, y sobre todo, para poder sacarle partido a vuestros dispositivos de adquisicin de imagen, ms all de ver guarreras decodicadas o chatear con el "mesenyer". Nuestro sistema, nos permitir capturar imgenes de varios dispositivos, almacenarlas comprimidas en el disco y visualizarlas de una forma gay... y como siempre, todo ello, m rpido!

ARQUITECTURA
Un sistema de vdeo vigilancia bsico debe ser capaz de realizar las siguientes tareas. A saber:

to de tres mdulos. Un mdulo con el que capturar imgenes, otro con el que codicar y decodicarlas y nalmente otro que nos permita visualizarlas. Obvio no? Para conseguir esto, vamos a utilizar distintos sistemas de soporte. Para la captura de vdeo utilizaremos el API V4L (Video 4 Linux) que proporciona nuestro querido kernel Linux. Este API, como veremos muy pronto, es un poco engorroso, por esa razn vamos a escribir un pequeo interfaz para hacer nuestra vida ms fcil. En este artculo utilizaremos la versin 1 del API, que, aunque obsoleta, es la que ms dispositivos soportan. Para la codicacin y decodicacin de las imgenes utilizaremos la librera libjpeg. Tambin os contaremos cmo utilizar un formato mucho ms sencillo y que podis incluir en vuestras aplicaciones "m rpido". Finalmente, para la visualizacin de las imgenes vamos a utilizar OpenGL. Esto si que es fcil, y adems nos va a permitir visualizar nuestros vdeos en un entorno 3D bastante impactante. Os daremos las bases para poder utilizarlo... que quede bonito depender de vosotros :).

EL HARDWARE

Lo que vamos a necesitar seguro es algn tipo de hardCapturar imgenes de al menos una fuente de ware de captura de imgenes. Aqu tenemos varias opciones y las buenas noticias son que, prcticamenvdeo. te, todas ellas funcionan con el API V4L (Video for Almacenar esas imgenes de forma eciente (va- Linux). mos, que no reventemos el disco duro). Nosotros vamos a utilizar dos webcams Logitech MesVisualizar las imgenes almacenadas y, por su- senger que estn bien soportadas en Linux y nos proporcionan, en un solo bloque, la cmara y el hardwapuesto, el vdeo en tiempo real. re de adquisicin. Adems solo cuestan unos 25 euros Con esto en mente, nuestro sistema estar compues- (julio 2008).

Fuente Video

v4l

Adquisicin de Video

Procesado y Almacenado de Imgenes Capturadas

Visualizacin de Imgenes Capturas

OpenGL

Pantalla

libjpeg

Disco Duro Secuencias de Imgenes

Arquitectura de nuestro sistema. Hardware, Software y APIs

19| OCCAMs Razor

M RPIDO

Si disponis de una tarjeta capturadora de TV BT848, static int ndevices = 1; necesitaris una fuente de vdeo adicional, una cmara externa o, en su defecto, un DVD o magnetoscopio. Si module_param( n d e v i c e s , int , 0 6 4 4 ) ; MODULE_PARM_DESC( n d e v i c e s , "Number o f d e v i c e s t o " utilizis la salida de vdeo compuesto, el cdigo que " use simultaneously . " ) ; vamos a comentar en el artculo debera funcionar casi sin modicaciones. Si, lo que queris es utilizar la Esta nueva variable la utilizamos en la funcin entrada de RF (la de la antena), sern necesarias algu- gspca_init_transfert para modicar el valor de la nas modicaciones. Os daremos algunas indicaciones variable nbalt, de la siguiente forma: de como hacerlas pero, por cuestiones de espacio, no i n t f = usb_ifnum_to_if ( dev , sp c a 5 0 x >i f a c e ) ; las vamos a incluir aqu. nbalt = intf >n u m _ a l t s e t t i n g 1 ;

Un par de webcams nos servirn para nuestro prototipo.

/ Nuestra nueva l n e a / nbalt = nbalt / ndevices ;

Por supuesto esto es un hack m rpido y probablemente haya mejores formas de hacerlo, pero para las pruebas que nosotros vamos a hacer es ms que En nuestro caso concreto, el de las webcams Logitech suciente. Messenger, tenemos que hacer un par de comentarios. Ahora podemos cargar nuestra nueva versin del driEl primero es que parece que las cmaras (o ms bien ver, de la siguiente forma: el driver) no funciona correctamente si se conectan a travs de un HUB USB externo. Para poder utilizar# rmmod gspca las deben estar conectadas directamente a los puertos # insmod ./gspca.ko ndevices=2 USB del ordenador. El segundo problema que nos encontramos con estas Et voil!.... tenemos nuestras dos webcams disponicmaras, fue que el driver no soporta ms de un dis- bles. positivos del mismo tipo. Mardita sea!. Para comprobar que todo funciona correctamente, podis utilizar la aplicacin spcaview descargable desde ARREGLANDO EL DRIVER la pgina del driver gspca. Este programa es espeAunque para lo que os vamos a contar en este artcu- cialmente interesante ya que se trata de un ejemplo lo, podramos utilizar una nica cmara, a nosotros completo de como manejar un dispositivo soportado nos interesaba poder utilizar dos o ms para poder por este driver. hacer cosas ms gays.... os suenan esas gafas rojas y Como esta es la seccin "m rpido", nuestro interfaz azules?. V4L va a ser muy simpln, y estudiar esta aplicacin As que nos bajamos el driver y le echamos un ojo, os permitir extenderlo si queris hacer que vuestros con la esperanza de poder modicarlo fcilmente para programas funcionen en el caso general. que nuestras dos cmaras funcionaran. Bendito software libre!. Con la informacin de depuracin del driver y mucha suerte, encontramos que el problema estaba en la funcin gspca_init_transfert. Por cada dispositivo, esta funcin reparte lo que en los logs aparece como un AlternateSet. Cuando la Si vuestro hardware utiliza otro driver, probad con primera cmara es inicializada, la funcin le asigna alguna aplicacin estndar como camorama o cheese. todos los recursos (por llamarlos de alguna forma) y al intentar inicializar la segunda, se produce un error, CAPTURANDO VIDEO ya que, aparentemente no hay recursos que asignarle Despus de todos estos preparativos vamos al ajo :). (los tiene todos la primera cmara). Lo primero que vamos a hacer es nuestro mdulo de Los recursos no son otra cosa que el ancho de banda captura de vdeo. En esta versin supersimplicada, USB que se asigna a ese dispositivo. En la FAQ de nuestro mdulo tendr tres funciones. Aqu tenis los motion, podris encontrar algunos detalles ms sobre prototipos. como utilizar varias cmaras USB. Bsicamente nei n t open_v4l ( DISP d , char d , i n t w, i n t h ) ; cesitarais una segunda tarjeta USB. Como nosotros void s t a r t _ v 4 l ( DISP d ) ; no la tenemos, hemos optado por este parche, como char c a p t u r e _ v 4 l _ f u l l ( DISP d ) ; solucin de compromiso. Para ello, aadimos un nuevo parmetro al driver que La primera de las funciones abre e inicializa el disllamamos ndevices. Las modicaciones en el chero positivo de captura. La segunda le dice al dispositivo que comience a capturar video. Por ltimo, la tercera, gspca_core.c fueron las siguientes: nos permite obtener la ltima imagen capturada por el dispositivo.

Para la captura de imgenes utilizaremos el API V4L

OCCAMs Razor | 20

M RPIDO

Para poder utilizar el API V4L, necesitamos los si- probablemente todo vaya como la seda, pero si esto guientes includes en nuestro cdigo: falla, nada funcionar. El segundo es que los dispositivos de vdeo, tienen #include <s y s / i o c t l . h> #include < f c n t l . h> nombres como /dev/video1 o /dev/video2. Tendremos tantos como dispositivos de captura hayamos ins#include <s y s /mman. h> #include <l i n u x / v i d e o d e v . h> talado en el sistema. Si vuestro hardware de captura est correctamente instalado los dispositivos deberan El primero es necesario para utilizar la llamada al estar ah. sistema ioctl, con la que poder enviar mensajes al driver. El segundo solo es necesario para la llamada CONFIGURANDO CANALES al sistema open, con la que acceder al dispositivo de El siguiente paso consiste en congurar el canal del captura. En seguida veremos como utilizarla. dispositivo que vamos a utilizar. Si estis utilizando El tercero lo necesitamos para el proceso de captura. una webcam como nosotros, probablemente solo tenNosotros vamos a utilizar un mapeado de memoria en gis un canal. Pero si estis utilizando una tarjeta de lugar del mtodo read. captura de televisin, normalmente tendris al menos Finalmente, el ltimo de los includes es el que dene 2 canales. Uno para la entrada de video compuesto (o todas las estructuras de datos especcas de los dis- banda base) y otro para el sintonizador de televisin. positivos de video. La mayora de las estructuras de datos que utiliza la funcin open_v4l estn denidas aqu. Para poder utilizar ms de un dispositivo de captura de video, hemos denido una estructura muy sencilla en la que almacenar los datos especcos de cada uno de ellos. Esta es:

Video 4 Linux nos permite congurar los parmetros de captura de nuestra webcam

typedef s tr u ct d i sp _ t { int fd ; s tr u ct video_mbuf mbuf_info ; s tr u ct video_mmap mmap_info ; / Mapa de memorua de d a t o s de v i d e o / char mm; char buffer ; / Info r m a c i n s o b r e l a imagen / int w, h , c a n a l , bpp ; double b r i l l o , contraste , c ol or ; } DISP ;

Si os veis obligados a utilizar la entrada del sintonizador de televisin, tendris que congurar el canal correcto, y programar el sintonizador para seleccionar el canal (de la TV) que queris capturar. No vamos a explicar como hacer todo esto, pero si alguien est utilizando una tarjeta de captura TV, le recomendamos que utilice la librera libbgrab. Volviendo al cdigo...
/ Conseguimos l a s c a r a c t e r i s t i c a s / i o c t l ( d >f d , VIDIOCGCAP, &d e v _ i n f o ) ; / Nos quedamos con e l ancho y a l t o mximos / d >w = d e v _ i n f o . maxwidth ; d >h = d e v _ i n f o . maxheight ; w = d >w ; h = d >h ; / Usamos c a n a l 0 . Entrada de v i d e o compuesto / c h a n n e l _ i n f o . c h a n n e l = d >c a n a l ; / Obtenemos info r m a c i n d e l c a n a l s e l e c c i o n a d o / i o c t l ( d >f d , VIDIOCGCHAN, &c h a n n e l _ i n f o ) ; / Activamos modo PAL / c h a n n e l _ i n f o . norm = 0 ; / Ac t u a l iza m o s l a info r m a c i n d e l c a n a l / i o c t l ( d >f d , VIDIOCSCHAN, &c h a n n e l _ i n f o ) ;

El uso de cada uno de estos campos quedar claro en cuanto describamos las funciones de nuestro interfaz... esto es, ya mismo :)

ABRIENDO EL DISPOSITIVO
La funcin open_v4l es la que se encarga de la inicializacin del dispositivo de captura de vdeo, y es la ms larga de todas, por esa razn la iremos comentando por partes, para que sea ms fcil seguirla. Lo primero que nos encontramos es esto:
s tr u ct v i d e o _ c a p a b i l i t y d e v _ i n f o ; s tr u ct v i d e o _ c h a n n e l channel_info ; s tr u ct v i d e o _ p i c t u r e picture_info ; / Abrimos e l d i s p o s i t i v o de v i d e o / i f ( ( d >f d = open ( d e v i c e , O_RDWR) ) < 0 ) { f p r i n t f ( s t d e r r , "No puedo a b r i r " " dispositivo % s \n" , device ) ; return ( 1 ) ; }

Como adelantamos ms arriba, la forma de hablar con el driver es a travs de la llamada al sistema ioctl. Para la conguracin del canal, utilizamos tres mensajes. VIDIOCGCAP, algo as como "VIDeo Input Output Chanel Get Capabilities"... vamos digo yo :), La funcin comienza declarando tres variables locales con lo que obtenemos las caractersticas del dispositique utilizaremos durante la inicializacin del disposi- vo, la informacin sobre sus canales. En nuestro ejemtivo, para, a continuacin, abrir el dispositivo. plo, estamos utilizando este mensaje para obtener el Dos comentarios aqu. El primero es que hemos eli- ancho y alto mximo de las imgenes que pueden ser minado todas las comprobaciones de error con la ex- capturadas utilizando este canal y almacenndolas en cepcin de esta primera. Si el dispositivo se abre, muy nuestra estructura para su uso posterior. 21| OCCAMs Razor

M RPIDO

Estos valores los retornamos a la aplicacin principal, ya que los necesitaremos para la visualizacin de las imgenes. El siguiente mensaje es VIDIOCGCHAN, con el que obtenemos informacin sobre el canal de inters. El canal de inters se indica utilizando el campo channel de la estructura de datos video_channel (variable channel_info). La informacin sobre el canal se retorna sobre esa misma estructura de datos.

Los dispositivos de captura de imgenes pueden proporcionar varios canales


Finalmente, utilizamos el mensaje VIDIOCSCHAN (la s es de SET), para congurar el canal. Lo que estamos haciendo es coger la conguracin del canal (VIDIOCGCHAN), modicando solamente la norma de video a PAL y recongurando el canal de nuevo (VIDICSCHAN). Puede que dependiendo de vuestro hardware tengis que modicar algn campo ms para congurar apropiadamente el canal, o que no necesitis modicar la norma de vdeo para vuestro dispositivo. Ah tendris que investigar un poco por vuestra cuenta. Hemos intentado reducir al mnimo el cdigo de inicializacin saltndonos varias comprobaciones que seran necesarias en una aplicacin profesional. Si algo falla, coged el cdigo de alguno de los programas incluido en vuestra distribucin que funcione correctamente, y empezad a aadir las partes que faltan... eso es lo que nosotros hemos hecho :).

y palette). Estos campos nos permiten congurar la profundidad de color y el formato de la imagen que vamos a obtener. Nosotros estamos utilizando 24 bits por pixel (True Color) y un formato RGB de 24 bits, ya que esto va a hacer nuestro cdigo de visualizacin mucho ms sencillo. Estos parmetros dependen del hardware de captura e idealmente, el programa, debe utilizar las ioctl apropiadas para preguntar al driver que formatos soporta y congurarlo apropiadamente. La conguracin que estamos utilizando es bastante estndar y debera funcionar en la mayora de los casos, pero quizs tengis que modicar estos valores para que funcionen en vuestro hardware. Obviamente el mensaje VIDIOCSPICT es el que nos permite pasar estos datos al driver (ya sabis Set PICTure).

CONFIGURANDO LA TRANSFERENCIA DE DATOS


El ltimo paso que nos falta para completar el proceso de inicializacin es la conguracin de transferencia de datos. Como adelantbamos un poco ms arriba, hay dos formas de transferir las imgenes a nuestro programa. Una es utilizando la llamada al sistema read y otra es utilizando mapeado de memoria con la llamada al sistema mmap. Nosotros utilizamos el mapeado de memoria, porque mola ms y adems podemos utilizar doble buer para la captura. El cdigo es el siguiente:
/ Obtenemos mapa de meoria / i o c t l ( d >f d , VIDIOCGMBUF, &d >mbuf_info ) ; / Vamos a t r a b a j a r con d o b l e b u f f e r / i f ( d >mbuf_info . f r a m e s < 2 ) exit (1);

PARMETROS DE IMAGEN
Ahora que hemos seleccionado y congurado nuestro canal, tenemos que proporcionar al driver una serie de parmetros, para decirle como queremos las imgenes. Aqu podis ver como hacerlo.
/ Ahora l o s parmetros picture_info . brightness p i c t u r e _ i n f o . hue picture_info . colour picture_info . contrast picture_info . whiteness p i c t u r e _ i n f o . depth picture_info . palette ioctl

de imagen / = ( i n t ) ( 6 5 5 3 5 d >b r i l l o ) ; = 0; = ( i n t ) ( 6 5 5 3 5 d >c o l o r ) ; = ( i n t ) ( 6 5 5 3 5 d >c o n t r a s t e ) ; = 0; = 24; = VIDEO_PALETTE_RGB24 ;

Lo primero que hacemos es preguntarle al driver los detalles para el mapeado de memoria, utilizando , una vez ms, la llamada al sistema ioctl. En la estructura video_mbuf (uno de los campos de nuestra estructura DISP), obtendremos el resultado.

( d >f d , VIDIOCSPICT , &p i c t u r e _ i n f o ) ;

Nuestra aplicacin captura las imgenes utilizando mapeado de memoria

La estructura video_picture (variable picture_info), Y cuales son los detalles para el mapeado de memonos permite congurar el brillo, contraste y color de ria? Os preguntaris. Bsicamente son los siguientes: la imagen, entre otros parmetros. Dependiendo si la El nmero de cuadros que el dispositivo es capaz de captura es en color o escala de grises ciertos parme- capturar, el tamao de la zona de memoria en la que tros no tienen efecto. el driver va a poder los datos de la imagen y los desTodos estos valores se codican como un entero entre plazamientos, dentro de ese bloque de memoria, donde 0 y 65535, y nosotros los proporcionamos como valores se almacenarn los distintos cuadros. reales entre 0 y 1 representando un porcentaje. Todo esto tomar sentido muy pronto, en cuanto os Pero los datos importantes son los dos ltimos (depth mostremos una sencilla gura :).

OCCAMs Razor | 22

M RPIDO

d->mbuf_info.size

Applicacion

Leemos imagen previamente capturada

Buffer Canal 1

Buffer Canal 2

Alamcena nueva Imagen d->mm d->mbuf_info.offsets[0] d->mbuf_info.offsets[1] Driver

En nuestro ejemplo, utilizamos doble buer. Esta tcnica consiste en utilizar dos bloques de memoria para adquirir los datos, de tal forma que cuando el driver est capturando un cuadro, lo est almacenando en uno de esos buers y as, nosotros podemos acceder al otro (el cuadro anterior) sin que nadie nos moleste.

d >b u f f e r = m a l l o c ( d >mbuf_info . s i z e ) ; / E s t r u c t u r a para d >mmap_info . f r a m e d >mmap_info . wi d t h d >mmap_info . h e i g h t d >mmap_info . f o r m a t el = = = = mapeo de memoria / 0; d >w ; d >h ; picture_info . palette ;

Utilizando doble buer podemos capturar una imagen, mientras procesamos otra
Cuando el cuadro actual haya sido capturado, los buffers se intercambian y nuestra aplicacin puede acceder al nuevo cuadro a la vez que el driver captura los datos del siguiente cuadro y los almacena en el otro buer. Por esa razn terminamos nuestra aplicacin si el driver no es capaz de proporcionarnos al menos dos buers. Si por alguna razn vuestro hardware/driver no soporta ms que un buer, podis eliminar esa comprobacin, pero tendris que hacer unos pequeos cambios al resto de las funciones de este mdulo. Una vez obtenida esta informacin, utilizamos la llamada al sistema mmap para mapear la memoria, es decir, para permitir a nuestra aplicacin acceder a los buers que el driver est utilizando y, por tanto, acceder a los datos de las imgenes capturadas.

En este punto, nuestro hardware de captura est listo para empezar a escupir imgenes... pero, cmo las obtenemos?... enseguida lo veremos.

INICIANDO LA CAPTURA
El proceso de captura lo hemos dividido en dos funciones, una que inicia el proceso y otra que obtiene los datos de la imagen. La primera pinta tal que as:
void s t a r t _ v 4 l ( DISP d ) { d >mmap_info . f r a m e = 0 ; i o c t l ( d >f d , VIDIOCMCAPTURE, &d >mmap_info ) ; d >mmap_info . f r a m e = 1 ; i o c t l ( d >f d , VIDIOCMCAPTURE, &d >mmap_info ) ; d >mmap_info . f r a m e = 0 ; }

Esta funcin utiliza el mensaje VIDIOCMCAPTURE y espera como parmetro una estructura del tipo video_mmap. El campo frame, le dice al driver qu cuadro capturar, o dicho de otra forma, que parte del buer utilizar. / Mapeamos memoria para a c c e d e r a l a s imagenes / Con lo que acabamos de comentar, debera estar clad > mm = ( char )mmap ( 0 , d >mbuf_info . s i z e , PROT_READ | PROT_WRITE, ro lo que hace la funcin. Inicia la captura de los dos MAP_SHARED, frames y nos devuelve el control mientras el hardware d >f d , 0 ) ; hace su trabajo. Finalmente, reservamos un buer adicional en el que A partir de ese momento, nuestra aplicacin principal almacenaremos una copia de la imagen capturada, e entrar en un bucle innito, en que llamar continuainicializamos el campo mmap_info con los datos que mente a la funcin capture_v4l que os mostramos a necesitaremos durante la captura real de las imgenes. continuacin: 23| OCCAMs Razor

M RPIDO

char c a p t u r e _ v 4 l ( DISP d ) { i o c t l ( d >f d , VIDIOCSYNC , &d >mmap_info . f r a m e ) ;

Aqu tenis el programa principal.


DISP d [ 2 ] ;

memcpy ( d >b u f f e r , d > mm + i n t main ( i n t a r g c , char a r g v [ ] ) d >mbuf_info . o f f s e t s [ d >mmap_info . f r a m e ] , { d >mbuf_info . s i z e / 2 ) ; / Creamos d i s p o s i t i v o s / d [ 0 ] = create_dev ( ) ; i o c t l ( d >f d , VIDIOCMCAPTURE, &d >mmap_info ) ; d [ 1 ] = create_dev ( ) ; d >mmap_info . f r a m e = 1 d >mmap_info . f r a m e ; return d >b u f f e r ; } / I n i c i a l i z a GLUT / g l u t I n i t (& a r g c , a r g v ) ; g l u t I n i t D i s p l a y M o d e (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) ; g l u t I n i t W i n d o w S i z e (WIN_WIDTH, WIN_HEIGHT) ; glutCreateWindow ( " S i s t e m a Video V i g i l a n c i a " "Occam s Razor " ) ; / I n i c i a l i z a OpenGL / gfx_init ( ) ; / I n i c i a l i z a d i s p o s i t i v o s de c a p t u r a . Terminamos a nt e c u a l q u i e r e r r o r / open_v4l ( d [ 0 ] , " / dev / v i d e o 1 " , &img_w , &img_h ) ; start_v4l (d [ 0 ] ) ; open_v4l ( d [ 1 ] , " / dev / v i d e o 2 " , &img_w , &img_h ) ; start_v4l (d [ 1 ] ) ; / Creamos l a s T e x t u r a s / i n i t _ t e x t u r e (img_w , img_h ) ; i m g _ si z e = img_w img_h img_bpp ; / C o nfig u r e GLUT c a l l b a c k h a n d l e r s glutDisplayFunc ( gfx_pinta ) ; g l u t K e y b o a r dFun c ( h a n d l e _ k ey boa r d ) ; glutIdleFunc ( handle_idle ) ; f o r e v e n t s /

Lo primero que hace la funcin es enviar el mensaje VIDIOCSYNC. Este mensaje hace que nuestro programa espere hasta que el cuadro que se pasa como parmetro est listo. Que signica que est listo?. Pues que la parte del buer asociada a ese cuadro, contenga una imagen completa.

Nuestro sencillo interfaz con V4L, nos permite capturar imgenes de forma m rpida
Una vez que tenemos una imagen disponible (cuando ioctl retorna), copiamos inmediatamente la imagen a nuestro buer temporal. En principio, esto no sera necesario, pero en las distintas pruebas que hemos hecho, cuando utilizamos ms de un dispositivo los buffers se corrompen, si bien, esto puede ser debido a que el programa es muy tonto, o simplemente que nuestro USB no da para ms :(. Aqu tenis algo interesante para investigar ;). Si solo estis utilizando un dispositivo, podis utilizar directamente el puntero de la zona de memoria mapeada. Esto sera:
d > mm + d >mbuf_info . o f f s e t s [ d >mmap_info . f r a m e ]

/ Now we e n t e r t h e main l o o p and p r o c e s s GLUT e v e n t s / glutMainLoop ( ) ; exit (0); }

Con lo que os ahorris la copia de los datos, pero es necesaria una pequea modicacin del resto del cdigo. Finalmente, se inicia de nuevo la captura del frame que acabamos de copiar con el mensaje VIDIOCMCAPTURE y se actualiza el campo, para que en la prxima llamada a la funcin trabajemos sobre el otro buer, que debera contener ya la siguiente imagen.

Si obviamos por un momento las llamadas a GLUT, el programa es muy sencillo. Hemos utilizado una funcin adicional (create_dev) que simplemente crea dinmicamente un objeto del tipo DISP (vamos, hace un malloc), y a continuacin llamamos a las funciones para inicializar los dispositivos y comenzar la captura. Lo que no vemos por ningn lado es la llamada a capture_v4l. Vale, para encontrar esa llamada tenemos que explicaros un poco como funciona GLUT.

LA APLICACIN GLUT
Como ya habris intuido, todas las funciones de GLUT, empiezan precisamente por glut :). Las primeras cuatro llamadas que nos encontramos son las encargadas de crear la ventana en la que mostraremos nuestro video.

EL PROGRAMA PRINCIPAL
Ahora que ya tenemos nuestro interfaz de captura de imgenes, estamos en condiciones de escribir nuestra aplicacin de captura de imgenes :). El programa principal, adems de utilizar nuestro amante interface para V4L, mostrar en una ventana las imgenes capturadas. Para ello vamos a utilizar OpenGL, pero para el interfaz entre OpenGL y el sistema de ventanas vamos a utilizar GLUT (GL Utility Toolkit), que va a hacer nuestra vida mucho ms fcil.... GLX y Xlib son un poco ms engorrosos. OCCAMs Razor | 24

GLUT nos va a permitir utilizar OpenGL m rpido


Una explicacin detallada de GLUT se sale un poco de nuestro objetivo, as que no vamos a dar muchos detalles. Simplemente, las dos primeras llamadas inicializan la librera, y normalmente van a ser siempre as. Las dos siguientes, como os podis imaginar, permiten denir el tamao de la ventana, y crearla especicando un ttulo.

M RPIDO

El siguiente bloque de llamadas a GLUT lo encontramos hacia el nal, y lo reproducimos de nuevo aqu por comodidad:
glutDisplayFunc ( gfx_pinta ) ; g l u t K e y b o a r dFu nc ( h a n d l e _ k ey boa r d ) ; glutIdleFunc ( handle_idle ) ;

void h a n d l e _ i d l e ( void ) { char fname [ 1 0 2 4 ] ; char im , im1 ; i n t w, h , s i z e , i , temp ; im = c a p t u r e _ v 4 l _ f u l l ( d [ 0 ] ) ; im1 = c a p t u r e _ v 4 l _ f u l l ( d [ 1 ] ) ; / Reordena componentes de c o l o r / f o r ( i = 0 ; i < i m g _ si z e ; i+= img_bpp ) { temp = ( im + i + 2 ) ; ( im + i + 2 ) = ( im + i + 0 ) ; ( im + i + 0 ) = temp ; } f o r ( i = 0 ; i < i m g _ si z e ; i+= img_bpp ) { temp = ( im1 + i + 2 ) ; ( im1 + i + 2 ) = ( im1 + i + 0 ) ; ( im1 + i + 0 ) = temp ; } / Ac t u a l iza m o s n u e s t r a s c h a n g e _ t e x t u r e ( 0 , im ) ; c h a n g e _ t e x t u r e ( 1 , im1 ) ; t e x t u r a s /

Estas tres funciones nos permiten denir call-backs. Concretamente, nos permiten decirle a GLUT qu funcin tiene que ejecutar cuando tenga que actualizar la ventana, cuando se pulse una tecla y cuando no tenga nada que hacer... s, en esta ltima es en la que vamos a capturar nuestras imgenes. Finalmente, la funcin glutMainLoop ejecuta un bucle innito en el que va llamando, segn convenga a cada una de los call-backs que hemos denido.

MANEJANDO EL TECLADO
Vamos a empezar por esta funcin, ya que es la ms sencilla. El cdigo es este:
void h a n d l e _ k ey boa r d ( unsigned char key , i n t x , i n t y ) { / P r o c e ss t h e i n p u t / switch ( key ) { case Q : case 2 7 : exit (0); break ; / C o nt r o l de l a r o t a c i n / case W : x a n g l e += 5 ; break ; case S : x a n g l e = 5 ; break ; case A : z a n g l e += 5 ; break ; case D : z a n g l e = 5 ; break ; d ef a u l t : break ; } / Now r e f r e s h t h e d i s p l a y / gfx_pinta ( ) ; } }

s n p r i n t f ( fname , 1 0 2 4 , " v i d e o 0 %05d . j p g " , c n t ) ; w r i t e _ j p e g _ f i l e ( fname , img ) ; / Redibujamos l a s nuevas imagenes / gfx_pinta ( ) ;

Lo primero que hacemos es obtener las ltimas imgenes capturadas por nuestros dispositivos. A continuacin tenemos que hacer un pequeo procesado. En nuestro caso, las componentes azul y roja (2 y 0) de cada pixel de la imagen estn intercambiadas. Por alguna razn nuestra cmara nos devuelve la imagen en formato BGR en lugar de RGB. Aunque podramos dejar que OpenGL se encargara de esto, hemos preferido hacerlo a mano a modo de un sencillo procesado de imagen. Pensad que en un sistema de vdeo vigilancia real, una de las funcionalidades que se suelen requerir es la deteccin de movimiento, de forma que el sistema solo graba la secuencia de video cuando est pasando algo. Un montn de gigas de vdeo de una imagen esttica no valen para nada :).

La captura de imgenes se realiza en el callback IDLE de GLUT

Ese tipo de procesado, o cualquier otra cosa que queramos hacer con las imgenes, implica manipular sus pixels... y eso es lo que hacen esos dos bucles tras las funciones de captura. Una vez que tenemos nuestras imgenes en el formato que queremos, utilizamos la funcin change_texture, con la que modicaremos las texturas OpenGL que CAPTURANDO utilizamos para visualizar el video. Muy pronto vereLa captura se realiza en la funcin handle_idle. Es- mos que hace esta funcin exactamente. ta funcin se ejecuta en cada ciclo del bucle principal Finalmente, llamamos a una funcin write_jpeg_file cuando no hay otra cosa que hacer, es decir, no hay que grabar las imgenes en el disco en formato JPEG. que actualizar el contenido de la ventana, no se ha La funcin termina ejecutando gfx_pinta que es la pulsado ninguna tecla ni se ha movido el ratn. encargada de mostrar las imgenes en la ventana. EsEsta funcin sera algo tal que as: ta es nuestra siguiente vctima! 25| OCCAMs Razor

Cada vez que el usuario pulsa una tecla, esta funcin se ejecuta, recibiendo como parmetro la tecla pulsada. Nuestro manejador, utiliza la tecla Q o ESC (ASCII 27) para terminar la aplicacin. Las teclas A, S, D y W se utilizan para actualizar las variables globales xangle e yangle, que utilizaremos para rotar nuestros vdeos en 3D.

M RPIDO

VISUALIZANDO LA ESCENA
La funcin gfx_pinta utiliza OpenGL para mostrar el vdeo en tiempo real en un espacio 3D (echadle un ojo a la gura). Si sabis algo de OpenGL, veris que la funcin es muy sencilla, sino, os comentaremos solamente un par de cosas para que podis hacer algunos cambios.
void g f x _ p i n t a ( void ) { g l C l e a r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ; / Ponemos l a p r e s p e c t i v a / glMatrixMode (GL_PROJECTION ) ; glLoadIdentity ( ) ; gluPerspective (45.0 , ( double )WIN_WIDTH / ( double )WIN_HEIGHT, 0.2 , 20); / Pasamos a l a m a t r i z View Model / glMatrixMode (GL_MODELVIEW ) ; glLoadIdentity ( ) ; / Posicionamos l a cmara / gluLookAt ( 0 , 4 , 0 , / P o s i c i n d e l Ojo / 0, 1, 0, / Punto a l que miramos / 0 , 0 , 1 ) ; / Ar r ib a / / Rotamos l a camara para e f e c t o guay / gl Rot at e f ( zangle , 0 , 0 , 1 ) ; gl Rot at e f ( xangle , 1 , 0 , 0 ) ; g l P u sh M a t r i x ( ) ; g l T r a n s l a t e f ( 2.1 , 0 . 0 , 0 . 0 ) ; g l S c a l e f ( s c a l e , s c a l e ASPECT, square_texture ( 0 ) ; glPopMatrix ( ) ; glTranslatef (0.1 , 0.0 , 0. 0) ; g l S c a l e f ( s c a l e , s c a l e ASPECT, square_texture ( 1 ) ; glutSwapBuffers ( ) ; }

scale );

scale );

Lo primero que hace la funcin es limpiar la pantalla (bueno, y el z-buer, pero eso ahora no nos interesa). A continuacin dene la matriz de proyeccin o, en lenguaje llano, la perspectiva de la escena, esto es, el campo de visin (que son 45 grados en nuestro ejemplo), el aspecto de la ventana, el resto de parmetros no nos interesan en este ejemplo. A continuacin se cambia a la matriz de modelo, que es la que tenemos que utilizar para pintar cosas en

3D, y la inicializamos (glLoadIdentity), para luego posicionar la cmara con gluLookAt. Los comentarios en el cdigo son sucientemente claros no?. En este punto est todo listo para que nuestros vdeos aparezcan en pantalla. Como queremos ese interfaz 3D sper gay de la muerte, lo primero que hacemos es rotar la escena tanto en el eje Z como en el X. Estos valores los podemos controlar con el teclado como ya hemos visto. Esta transformacin (la rotacin denida con el teclado) la vamos a aplicar a los dos vdeos que mostraremos en pantalla, as que, una vez calculada, nos la guardamos para usarla con la segunda imagen. Esto es lo que hace la funcin glPushMatrix, almacena en una pila la transformacin actual. Movemos el primer vdeo un poco hacia la izquierda y los escalamos segn el valor de la variable scale. Podis ampliar la funcin de control de teclado para modicar este valor y hacer vuestros vdeos ms grandes o pequeos en pantalla. Como podis ver, la componente Y se escala de forma diferente para mantener el aspecto de la imagen, esto es, la relacin entre el ancho y el alto, en funcin de las dimensiones de nuestra ventana. Esto es necesario debido a la forma en la que dibujamos los cuadros de nuestro vdeo. Lo veremos un poco ms adelante. Finalmente dibujamos la imagen utilizando la funcin square_texture. Observad que antes de dibujar la segunda imagen, hemos recuperado nuestra transformacin inicial (glPopMatrix), para, a continuacin, posicionar la segunda imagen un poco a la izquierda. Nosotros hemos colocado una imagen junto a la otra. Aunque visualmente no parece tan gay, es ms prctico. Si queris el estilo Aero, tendris que modicar la componente Z de las traslaciones y hacer que las imgenes se solapen modicando la componente X. La funcin termina con una llamada a glutSwapBuffers que enva los datos a la tarjeta. S, OpenGL tambin utiliza doble buer para la visualizacin. Realmente podis activarlo o desactivarlo al inicializar la librera (habis averiguado cual es el ag que hay que eliminar?).

Nuestra aplicacin. Izquierda: GUI normal. Derecha GUI 3D

OCCAMs Razor | 26

M RPIDO

Jugando un poco podemos conseguir efectos ms interesantes

GENERANDO LAS IMGENES

mucho ms sentido. En la seccin anterior hemos visto como componer la La funcin init_texture es la encargada de hacer esescena OpenGL, pero todava no os hemos contado to. La hemos intentado reducir a la mnima expresin, y el resultado es este: como visualizar realmente las imgenes. Esto se puede hacer manipulando el frame buer directamente, pero nosotros hemos elegido hacerlo utilizando texturas. El uso de texturas proporciona dos ventajas frente a escribir los datos directamente en el frame buer: La primera es que la tcnica es ms rpida, y la segunda es que si queremos cambiar el tamao de la imagen, OpenGL realizar la interpolacin por nosotros.
#d ef i n e MAX_TEXTURE 4 s t a t i c GLuint t e x i d [MAX_TEXTURE ] ; void i n i t _ t e x t u r e ( i n t w, i n t h ) { int i; / Almacenamos l a s d im e nsio ne s para ms t a r d e / tex_w = w ; tex_h = h ; / Genera "Nombres" OpenGL para l a s t e x t u r a s / g l Ge n Te x t u r e s (MAX_TEXTURE, &t e x i d ) ;

Utilizaremos texturas para la visualizacin del video en directo

f o r ( i = 0 ; i < MAX_TEXTURE ; i ++) { g l B i n d T e x t u r e (GL_TEXTURE_2D, t e x i d [ i ] ) ; / De fine e l t i p o de i n t e r p o l a c i n / / Para a m p l ia r l a t e x t u r a / g l T e x P a r a m e t e r i (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) ;

As, el mtodo consiste en lo siguiente. Primero generamos e inicializamos una textura por cada imagen que queremos mostrar. Utilizamos las imgenes cap/ Para d i s m i n u i r l a t e x t u r a / turadas para inicializar los datos de la textura y nalg l T e x P a r a m e t e r i (GL_TEXTURE_2D, mente, dibujamos un cuadro sobre el que mapeamos GL_TEXTURE_MIN_FILTER, GL_NEAREST) ; esta textura. / I n i c i a l i z a l o s d a t o s de l a t e x t u r a / Si habis seguido los comentarios del programa pringlTexImage2D (GL_TEXTURE_2D, 0 , GL_RGBA8, cipal, recordaris que se nos han quedado tres funw, h , 0 , GL_RGB, GL_UNSIGNED_BYTE, NULL ) ; ciones en el tintero. La primera se utiliza en la fun} cin main y se llama init_texture. La segunda se utiliza cuando capturamos nuestras imgenes y se } llama, change_texture. Y nalmente, la ltima la acabamos de ver en la seccin anterior y se llama Nuestro ms-que-bsico gestor de texturas es capaz de manejar un mximo de cuatro de ellas y almacena square_texture. sus identicadores en una variable global del mdulo llamada texid. INICIALIZANDO LAS TEXTURAS Lo primero que hacemos es decirle a OpenGL que La funcin init_texture se encarga de la inicializa- necesitamos cuatro texturas y que nos almacene los cin de las texturas. La inicializacin consiste en de- identicadores en la matriz texid. A continuacin, cirle a OpenGL que le de nombre a las texturas que tenemos que inicializar cada una de ellas. vamos a utilizar y que inicialice sus atributos. RecorAqu podemos congurar un montn de parmetros dad que aunque nosotros vamos a utilizar la textura de la textura, pero nosotros solo hemos dejado uno para visualizar una imagen, las texturas se utilizan de ellos. Obviamente la forma de congurar los pasobre modelos 3D para darles mayor realismo. Cuanrmetros de las texturas es utilizando la funcin do hacemos esto ltimo todos estos parmetros toman glTexParameteri... est claro no? :). 27| OCCAMs Razor

M RPIDO

Los dos parmetros que hemos usado le dicen a OpenGL que ltro utilizar cuando tiene que ampliar la textura o hacerla ms pequea. Nosotros hemos utilizado el ltro "del vecino ms cercano", que en principio es el ms rpido, pero podis utilizar interpolacin lineal, mejorando la calidad del zoom de vuestras aplicaciones, simplemente cambiando este parmetro de GL_NEAREST a GL_LINEAR. Finalmente, la funcin glTexImage2D es la que nos permite denir el formato de los datos de imagen que vamos a pasar a OpenGL. Como podis ver los datos se corresponden con los que hemos utilizado todo el tiempo, ancho, alto y formato (RGB 24bits). El ltimo parmetro es un puntero a los datos de imagen a almacenar en la textura. Nosotros haremos esto en otra funcin y por eso pasamos el valor NULL.

void c h a n g e _ t e x t u r e ( i n t i d , char in_data ) { g l B i n d T e x t u r e (GL_TEXTURE_2D, t e x i d [ i d ] ) ; glTexSubImage2D (GL_TEXTURE_2D, 0 , 0 , 0 , tex_w , tex_h , GL_RGB, GL_UNSIGNED_BYTE, in_data ) ; }

OpenGL nos permite suavizar las imgenes por Hardware con un simple parmetro
Algunos comentarios dependientes de la implementacin concreta de OpenGL que estis usando: El primero es que muchas implementaciones viejas necesitan que los dimensiones de las texturas (ancho y alto) sean potencias de dos. Si este es vuestro caso (obtendrais una imagen blanca en lugar de la imagen de la cmara), en la funcin de inicializacin tendris que aproximar las dimensiones de vuestras imgenes a los valores correctos. El otro comentario, es que algunas implementaciones de OpenGL soportan el formato de texturas GL_BGR. Si recordis, nuestro dispositivo V4L, nos devolva los valores en este formato, y tuvimos que aadir un pequeo bucle para ordenarlos antes de envirselos a OpenGL.... Pues quizs os lo podis ahorrar.

Esta es sencilla no?. La funcin glBindTexture le dice a OpenGL que textura queremos utilizar. S, es la misma que utilizamos para congurar la textura tras su creacin. El ndice que pasamos como primer parmetro nos permite obtener el identicador OpenGL de la textura que nos interesa. Una vez seleccionada la textura, utilizamos la funcin glTexSubImage2D, que es exactamente igual a la funcin glTexImage2D que utilizamos en la inicializacin, pero sta nos permite actualizar solo una parte de la textura. Esta funcin es en principio ms rpida, y adems funcionar si nuestra implementacin OpenGL tiene la limitacin de las potencias de 2, ya que nos permitir actualizar la parte de la textura que realmente utilizamos.

PINTANDO LAS IMGENES


Ya estamos en condiciones de pintar la imagen. Como comentamos, lo que vamos a hacer es pintar un cuadro sobre el que mapearemos una textura. Esta es la forma de hacerlo.
void s q u a r e _ t e x t u r e ( i n t i d ) { g l B i n d T e x t u r e (GL_TEXTURE_2D, g l B e g i n (GL_QUADS ) ; g l Te x Co o r d 2 f ( 0 . 0 , g l Te x Co o r d 2 f ( 0 . 0 , g l Te x Co o r d 2 f ( 1 . 0 , g l Te x Co o r d 2 f ( 1 . 0 , glEnd ( ) ; } 0.0); 1.0); 1.0); 0.0); texid [ id ] ) ; (0.0 (0.0 (1.0 (1.0 , , , , 1.0); 0.0); 0.0); 1.0);

glVertex2f glVertex2f glVertex2f glVertex2f

CAMBIANDO LOS DATOS DE LA TEX- Lo primero que hace la funcin, es seleccionar la textura que vamos a mapear, con la habitual llamada a TURA
Cada vez que capturamos una imagen, tenemos que actualizar nuestra textura. Esto lo hacemos con la funcin change_texture que podis ver a continuacin. glBindTexture. A continuacin, dibujaremos el cuadrado, para lo que tendremos que decirle a OpenGL cuales sern las coordenadas de sus vrtices, y que punto de la textura queremos asociar a cada uno de ellos.
(640/1024) 0.625 (640, 0) (1,0) (1024, 0)

(0,0) (0,0)

(1,0) (640, 0) (0,1) (1,1)

(0,0) (0,0)

IMAGEN ORIGINAL

QUAD

IMAGEN AJUSTADA A POTENCIAS DE 2

(0, 480) (0,1)

0.9375 (480/512) (640, 480) (1,1) (0, 512) (0,1) (1024, 512) (1,1) (0,0) (1,0) (640, 480)

Transformaciones de coordenadas para mapeado de texturas

OCCAMs Razor | 28

M RPIDO

La funcin glTexCoord2f, nos permite seleccionar un punto dentro de la textura. El 0,0 ser el punto inicial de nuestra imagen, y el 1,1 se corresponder con la esquina inferior derecha. Si os jis, las coordenadas de la textura y del vrtice del cuadro no se corresponden. Esto sucede porque el sistema de coordenadas OpenGL asigna el origen a la esquina inferior izquierda y la imagen que nos devuelve nuestro dispositivo de captura, est denida respecto a la esquina superior izquierda.

Para utilizar nuestra imagen como textura es necesario realizar algunas transformaciones
Observad que si habis modicado el programa para utilizar texturas con dimensiones mltiplos de potencias de 2, la parte de la textura que contiene la imagen no se corresponde con el tamao de la textura (hay una parte negra a la derecha). En ese caso, tendris que sustituir el valor 1.0 en glTexCoord2f, por el valor apropiado, que depender del tamao de vuestra imagen. Finalmente, recordis el escalado especial de la coordenada Y en la funcin que dibuja la escena?. Como podis ver aqu, lo que estamos dibujando es un cuadrado. Si en lugar de un cuadrado, dibujramos el rectngulo con el aspecto correcto, no sera necesario escalar la coordenada Y de forma especial... La mejor opcin depender de cada aplicacin.

vamos el z-buer, las imgenes se visualizarn en el orden en el que las pintemos en nuestro programa, independientemente de su posicin real en el espacio 3D. Si no queris hacer ligranas con las texturas y vuestras imgenes van a aparecer en una posicin ja en la pantalla (lo usual en un sistema de vdeo vigilancia), podis desactivar el z-buer, ahorrando memoria y trabajo a vuestra tarjeta grca. En este mismo caso, probablemente os interese ms utilizar una proyeccin ortogrca que la perspectiva que estamos utilizando... solo estamos dando pistas...

VOLCANDO IMGENES
El ltimo elemento que nos queda es la funcin para volcar las imgenes capturadas al disco. Desde el punto de vista del almacenaje nos interesa utilizar un formato comprimido, pero antes os vamos a comentar como utilizar el formato Netpbm, que es tremendamente sencillo y si lo utilizamos junto con zlib, nos puede solucionar el problema m rpido. Aqu tenis la funcin para grabar vuestras imgenes:

i n t wr i t e _ i m a g e ( char fname , char d a t a ) { FILE f ; f = f o p e n ( fname , "wb" ) ; f p r i n t f ( f , "P6\n#Occam s Razor " " Video V i g i l a n c i a \n" "% d % d\n % d\n" , img_w , img_h , 2 5 5 ) ; f w r i t e ( data , i m g _ si z e , 1 , f ) ; fclose ( f ); }

INICIALIZACIN DE OPENGL

Para terminar con todo lo relacionado con la visualizacin, tenemos que comentar una ltima funcin, gfx_init. Esta funcin se encarga de inicializar OpenGL, y en general contiene comandos OpenGL Ms rpido no se puede XD. El formato ppm, utiliza una sencilla cabecera ASCII, en la que se indican las que solamente es necesario ejecutar una vez. dimensiones de la imagen y su profundidad de color En nuestro caso la funcin es muy sencilla. (el valor 255 indica 8 bits por componente). A contivoid g f x _ i n i t ( void ) nuacin escribimos los datos y listo.
{ glClearColor (0 , 0 , 0 , 0) ; g l E n a b l e (GL_DEPTH_TEST) ; g l E n a b l e (GL_TEXTURE_2D ) ; }

El primer comando dene el color de fondo a utilizar cuando borremos los buers de color (la imagen en la ventana), utilizando la funcin glClear (la primera llamada en gfx_pinta). Las otras dos funciones permiten activar, respectivamente, el uso del z-buer y el de las texturas 2D. Tened en cuenta que antes de ejecutar ninguna de las funciones relacionadas con la manipulacin de las texturas que acabamos de ver, necesitamos ejecutar esta funcin para activar el uso de texturas 2D. Si no lo hacemos obtendremos una imagen vaca. El uso de z-buer es necesario si las imgenes se van a solapar de alguna manera en la escena. Si no acti-

El formato PPM es muy conveniente para volcar imgenes de forma sencilla


El problema de PPM es que los datos no se comprimen en absoluto. Cada imagen captura por nuestra aplicacin ocupa unos 900Kb. La misma imagen en formato jpg ocupa unos 19Kb, y por eso os vamos a contar como usar este formato. En la seccin Ratas de Biblioteca de el nmero 1 de Occams Razor, os contbamos como utilizar zlib para almacenar cheros. Alguien quiere modicar la funcin de arriba y ver cuanto puede comprimir nuestras imgenes zlib?. Esperamos vuestros resultados ;) 29| OCCAMs Razor

M RPIDO

USANDO JPEG
Al principio del artculo os decamos que bamos a utilizar libjpeg para almacenar las imagenes, y como lo prometido es deuda, aqu tenis la funcin para almacenar una imagen en formato JPEG en el disco:
#include < j p e g l i b . h> i n t c o l o r _ s p a c e = JCS_RGB ; / JCS_GRAYSCALE para n i v e l s de g r i s / int w r i t e _ j p e g _ f i l e ( char f i l e n a m e , char b u f f e r , i n t w, i n t h , i n t bpp ) { s tr u ct j p e g _ c o m p r e s s _ s t r u c t c i n f o ; s tr u ct jpeg_error_mgr j e r r ; JSAMPROW r o w_ p o i n t e r [ 1 ] ; FILE o u t f i l e = f o p e n ( f i l e n a m e , "wb" ) ; if { p r i n t f ( " Error opening output j p e g " "file% s \n ! " , f i l e n a m e ) ; return 1; } c i n f o . e r r = j p e g _ s t d _ e r r o r ( &j e r r j p e g _ c r e a t e _ c o m p r e s s(& c i n f o ) ; j p e g _ s t d i o _ d e s t (& c i n f o , o u t f i l e ) ; cinfo cinfo cinfo cinfo ); ( ! outfile )

El cdigo es autoexplicativo, y adems, as es como funciona la librera, no hay mucho que rascar.

libjpeg nos permite grabar imgenes en formato JPEG de forma sencilla


Con esta funcin podremos almacenar las imgenes capturadas en formato jpeg. Esto es ms o menos equivalente a almacenar la secuencia de video en formato MJPEG, lo que no est nada mal.

A JUGAR!
Bueno, este artculo ha sido un poco largo, pero hemos tratado un montn de cosas distintas que nos dan mucho juego. Aqu van algunas propuestas: Aadir soporte de red a la aplicacin. Con lo que os hemos contado en los nmeros anteriores de Occams Razor, en esta misma seccin, eso debera estar chupao! Captura de vdeos panormicos. Utilizando varias cmaras, podemos modicar nuestro programa para poder generar vdeos panormicos, utilizando un par de webcams :). Vigilando en estreo?. Tenis unas gafas de esas rojas y azules?. Sabis lo que es un anaglifo? (buscad Anaglifo en la wikipedia :)). Sabis que con el cdigo de este artculo, podis generar un anaglifo modicando una sola lnea del cdigo!!!! (bueno, y colocando las cmaras correctamente). Grabar la secuencia de vdeo en formato AVI, MPEG o lo que os apetezca (pista... mpeg).

. image_width = w ; . image_height = h ; . input_components = bpp ; . in_color_space = color_space ; );

j p e g _ s e t _ d e f a u l t s ( &c i n f o

j p e g _ s t a r t _ c o m p r e s s ( &c i n f o , TRUE ) ; while ( c i n f o . n e x t _ s c a n l i n e <c i n f o . i m a g e _ h e i g h t ) { r o w_ p o i n t e r [0]=& b u f f e r [ c i n f o . n e x t _ s c a n l i n e c i n f o . image_width c i n f o . input_components ] ; j p e g _ w r i t e _ s c a n l i n e s ( &c i n f o , r o w_ p o i n t e r , 1 ) ; } / s i m i l a r t o r e a d f i l e , c l e a n up a f t e r we r e done c o m p r e ssing / j p e g _ f i n i s h _ c o m p r e s s ( &c i n f o ) ; j p e g _ d e st r o y _ c o m p r e ss ( &c i n f o ) ; fclose ( outfile ); return 1 ; }

Bueno, esta funcin la podis encontrar en los ejemplos que se distribuyen con el cdigo fuente de libjpeg. Y cualquier otra cosa que se os ocurra. No os olvidis En el mismo chero podis encontrar la funcin para de enviarnos vuestros experimentos!!. Esta vez hay coleer un chero jpeg del disco. sas de sobra para jugar!. Hasta el prximo nmero.

RECURSOS
Driver GSPCA y Spcaview http://mxhaard.free.fr/download.html FAQ de motion con mucha informacin interesante http://www.lavrsen.dk/twiki/bin/view/Motion/FrequentlyAskedQuestions Tutoriales y ejemplos OpenGL http://www.opengl.org/code/ Formato PPM http://netpbm.sourceforge.net/doc/ppm.html Libjpeg a travs de la wikipedia http://en.wikipedia.org/wiki/Libjpeg Para los que quieran jugar Anaglifos http://es.wikipedia.org/wiki/Anaglifo Pgina web de FFMPEG http://en.wikipedia.org/wiki/Libjpeg

OCCAMs Razor | 30

uando la direccin de la revista me propuso escribir este artculo, me di cuenta de que sin pretenderlo me he convertido en una especie de historiador tecnolgico acionado. Aprovecho para recomendaros (si no los habis ledo ya) mis anteriores artculos Mi Historia de las Telecomunicaciones y El telgrafo de Gauss, ya sabis que nunca puedo resistirme a hacer un poco de autobombo. En n, ya que este nmero va dedicado a las tecnologas de seguridad resulta muy propio un artculo sobre la historia de la criptografa. La criptografa es la ciencia (o la tcnica) de poner en clave mensajes de forma que un espa que logre interceptarlos no pueda entenderlos pero aquellos que conozcan la clave (o claves) adecuada(s) logren fcilmente recuperar la informacin inicial. Como veremos, la criptografa existe desde tiempos muy antiguos, aunque ha sido la llegada de los ordenadores la que ha logrado crear sistemas realmente potentes y seguros. Si me permits repetirme un poco volveremos a la denicin. El trmino criptografa procede de la unin de dos palabras griegas: krypto (ocultar) y graphos (escribir). Se trata por tanto de escritura oculta... es decir: la criptografa es un conjunto de tcnicas que permiten poner un mensaje cualquiera en un formato ininteligible para todos, excepto para aquellos que poseen una informacin adicional (clave). Por supuesto, la clave es una informacin necesaria para realizar el proceso de cifrado (encriptado o puesta en clave) y tambin para el proceso de descifrado. Segn el algoritmo empleado, la clave puede ser un nmero, una letra, un conjunto de bits o, incluso, cosas ms raras como una tabla de smbolos. Una suposicin fundamental en todos los estudios criptogrcos es que la seguridad se debe basar en el secreto de la clave, nunca en el secreto del algoritmo. Los algoritmos de cifrado deben ser pblicos. Un sistema que se base en el secreto del algoritmo que-

dar comprometido si se descubre ste. Sin embargo, si se descubre una clave, podremos seguir operando el sistema cambindola. Para terminar la introduccin veremos un poco de terminologa sobre el cifrado, a saber: Mensaje llano: es el mensaje inicial, antes de ser cifrado, por tanto todava legible. Criptograma: mensaje una vez cifrado. Criptoanlisis: son las operaciones que realiza un espa para intentar averiguar el mensaje llano. Normalmente, se supone que el espa conoce el algoritmo pero no la clave. El criptoanlisis es diferente si el espa slo dispone de un criptograma, de varios o dispone de texto seleccionado (criptogramas para los que conoce el texto llano). Esta ltima es la situacin ms favorable para el ataque. Pensad que hay un criptoanlisis que nunca falla: probar todas las claves posibles (mtodo de la fuerza bruta). Un buen algoritmo de cifrado debe estar pensado para que el nico ataque posible sea la fuerza bruta y, adems, para que este ataque no sea viable. Para evitar la fuerza bruta, debe haber muchas claves posibles (longitud de clave de muchos bits) de forma que comprobar todas consuma una cantidad de tiempo excesiva (del orden de siglos).

Criptografa signica literalmente escritura oculta


Como sabris (creo que es una de las cosas que ensea esta revista), la mente humana es innita y hasta ha habido estudios matemticos sobre cmo crear un algoritmo matemticamente seguro ante la fuerza bruta. Como no, se debe al creador de la teora de la informacin (Claude E. Shannon). Cmo es posible esto? -os preguntaris. Si se puede descifrar sabiendo la clave, cualquiera puede ponerse a probar claves: CIERTO. 31| OCCAMs Razor

HISTORIA

El problema no resuelto es: Cmo hace el criptoanalista para saber qu clave es la buena, si no conoce el texto en llano? Nuestro malvado espa se tiene que basar en tomar una decisin binaria ante cada prueba: El mensaje descifrado tiene sentido o no? Si un algoritmo es atacado por fuerza bruta y obtenemos varios mensajes coherentes probando claves distintas, no sabremos cul de ellas es. Realmente, si el espa puede reducir la incgnita sobre la clave, en el prximo criptograma que analice tendr menos claves que probar. Por otra parte, la coherencia del mensaje es algo totalmente dependiente del tipo de mensaje. Si sabemos que son imgenes JPEG deben cumplir un formato y adems salir algo con sentido al representarlas. Algo con sentido? algunas imgenes microscpicas pueden no parecer con mucho sentido

equivalente al d+N. El nmero tan reducido de claves se debe a que estamos conservando el orden de las letras. Si consideramos sustituir el alfabeto latino por l mismo sin ninguna restriccin el nmero de claves posibles ser N!

El cryptoanlisis de la sustitucin es muy simple.


Ya es un tpico pero es este momento es inevitable recordar que en el nombre de la computadora de la pelcula 2001: HAL haba un mensaje cifrado. Alguien no lo saba? Pistas: el mtodo empleado ya lo hemos comentado en este artculo y el mensaje llano tiene algo que ver con la informtica. Otro tipo de cifrados de sustitucin son los que inventan nuevos alfabetos donde cada smbolo representa una letra. La clave pasa por conocer la correspondencia entre letras y smbolos. Realmente estos mtodos no son ms seguros que una sustitucin de las letras estndar por ellas mismas. Sigue habiendo N! ordenaciones. El criptoanlisis de la sustitucin es muy simple y la manera ms graticante de aprenderlo sera leer El Escarabajo de Oro. En este relato (nunca he sabido si es un cuento largo o una novela corta) los protagonistas descifran un mensaje pirata (con alfabeto de smbolos inventados mezclados con nmeros y signos de puntuacin). La tcnica que usan es probabilstica: ya que la E es la letra ms usada del ingls debe ser la que corresponde con el smbolo ms repetido. Conociendo la frecuencia de las letras en el idioma podemos hacer suposiciones de este tipo sobre dos o tres caracteres e intentar descubrir alguno ms. Para eso ayudan mucho las partculas de cada idioma, en el ejemplo del escarabajo de oro logran descifrar la T y la E y ven muchas veces la palabra T4E, con lo que 4 debe ser la H (recurdese que era un mensaje en ingls). Quin es el autor de este relato? Se trata de un novelista norteamericano genial aunque de vida algo atormentada: Edgar Allan Poe. Por supuesto que si sabemos que es un cifrado Csar la fuerza bruta nos puede ayudar (el nmero de claves es ridculamente bajo). Ojo... no hay constancia de que ningn enemigo lograra, en su poca, descifrar los mensajes cifrados por Csar por lo que conrmamos (por si no lo sabamos) que el valor de una tecnologa es siempre relativo a su poca (tambin hay que decir que la mayora de esos enemigos no saban leer).

CIFRADOS DE SUSTITUCIN
La tcnica de cifrado ms antigua es la de sustitucin. Como su nombre indica, consiste en sustituir cada smbolo (letra) del alfabeto con el que representamos nuestros mensajes por otro smbolo de otro alfabeto (o del mismo). El primer mtodo sistemtico de cifrado del que se tiene noticia fue utilizado por los militares romanos y se conoce todava hoy como Cifrado de Csar. Se le llama as porque se encontraron documentos cifrados con esta tcnica por Julio Csar y por su heredero Augusto; sin embargo, no est demostrado que Csar fuera el primero en emplearlo.

El cifrado de Csar fu el primer sistema de cifrado sistemtico que se conoce.


El cifrado de Csar se basa en una sustitucin de las letras del alfabeto latino (el nuestro) por ellas mismas segn una clave que no es ms que un desplazamiento. Esto es: si la clave es +1 cada letra se sustituye por la siguiente del alfabeto, en vez de CSAR (ignorando el acento) escribiramos DFTBS. Ntese que en aquella poca el cifrado se realizaba de memoria. Lgicamente, el desplazamiento es circular: despus de la Z viene la A. Tambin son posibles los desplazamientos negativos aunque -1 sera equivalente a 25 (si hay 26 letras). Ntese que para N letras en el alfabeto hay N-1 posibles claves y un desplazamiento d es

La criptografa como disciplina matemtica


Realmente la criptografa puede verse como una parte de las matemticas dedicada a crear funciones inestables. Un algoritmo criptogrco es una funcin que opera con dos variables: el mensaje llano y la clave para obtener un resultado: el criptograma. Esa funcin debe ser biyectiva, esto es inversible ya que debe existir una funcin inversa que a partir del criptograma y la clave permita obtener de nuevo el mensaje llano. Para que una funcin cifre debe ser inestable, esto es: al modicar muy poco el mensaje o la clave el criptograma debe variar mucho... eso asegura que es difcil de invertir sin conocer la clave ya que no podemos hacer aproximaciones sucesivas. OCCAMs Razor | 32

HISTORIA

Criptograma de El Escarabajo de Oro y su texto llano una vez descifrado. Ntese que se eliminan los espacios para lograr una mayor confusin del lector. .

ma. Lo ms probable es que sean debidas a que entre ellas el nmero de caracteres es mltiplo de M. Buscando todas las repeticiones podemos determinar M (como el mximo comn divisor de las distancias entre repeticiones). Hecho eso, hay que descifrar M cifrados Csar. El cifrado de Vigenre es un ejemplo de sustitucin polialfabtica. Esto es: se hace sustitucin con una secuencia de claves diferentes. El problema del criptoanlisis realmente estriba en predecir la secuencia. Hacia el 1920 se empezaron a fabricar mquinas capaces de realizar cifrados polialfabticos. Se trataba de mquinas electro mecnicas, donde se utilizaba el giro de una serie de discos que contenan contactos elctricos. Esas mquinas tenan el aspecto de mquinas de escribir en las que se tecleaba el texto llano y se obtena el criptograma. A veces, el resultado se obtena impreso, y en otras versiones se tena una bombilla por cada letra del alfabeto y un operador deba copiar al dictado. La mquina de cifrado electromecnico ms famosa de la historia es la alemana Enigma. Las primeras versiones datan de 1919 y, ya desde entonces, existan versiones comerciales que se compraban y vendan libremente. Algunas de esas primeras mquinas fueron Este mtodo se consider invulnerable hasta que el utilizadas por espaoles e italianos en la guerra civil militar prusiano Friedrich Kasiski public un mtodo espaola y sus mensajes fueron descifrados por cripde criptoanlisis vlido en 1.863. El mtodo de Kasiski toanalistas del ejrcito britnico. se basa en buscar palabras repetidas en el criptogra-

Otro mtodo de sustitucin muy utilizado hasta el siglo XIX (y muy seguro en aquella poca) es el mtodo de Vigenre. Realmente, se trata de una mejora del mtodo de Csar. La idea es muy simple... denamos M claves para el mtodo de Csar (M nmeros entre 1 y 25 para un alfabeto de 26 letras). Si aplicamos el cifrado de Csar con la primera clave a la primera letra, el mismo mtodo a la segunda letra con la segunda clave... tendremos un cifrado Csar con clave variable. A partir de M aplicaciones volvemos a la primera clave. El acierto de este mtodo es que una misma letra ser cifrada de forma diferente aunque aparezca muchas veces. Si cada clave Csar, se representa por una letra (donde la A es el desplazamiento 0 y la Z el 26) la clave completa (M letras) se podr escribir como una palabra. No hay longitud mnima ni mxima. De hecho, la longitud de la clave es el gran secreto del mtodo.

El cifrado de Vigenre realiza una sustitucin polialfabtica.

33| OCCAMs Razor

HISTORIA

En esa poca, el ejrcito alemn comenz a utilizar una versin militar de enigma muy superior a la comercial. Los primeros esfuerzos britnicos por romper el cifrado fueron intiles (en tiempo de paz, pero temiendo ya el inicio de un conicto). El primer avance en el criptoanlisis de enigma vino del matemtico polaco Marian Rejewski que descubri ciertas regularidades en el comportamiento de enigma debidas a la repeticin de palabras en el texto llano. Sin embargo, el nmero de clculos a realizar era excesivo para su capacidad de trabajo y no pudieron descifrar el cdigo. El descubrimiento de Rejewski se realiz antes de que el ejrcito nazi invadiera Polonia. Cuando la sospecha de invasin fue inminente, el gobierno polaco decidi traspasar a la inteligencia britnica todos sus conocimientos.

nczwvusxpnyminhzxmqxsfwxwlkjahshnmcoccakuqp mkcsmhkseinjusblkiosxckubhmllxcsjusrrdvkohulxwc cbgvliyxeoahxrhkkfvdrewezlxobafgyujqukgrtvukam eurbveksuhhvoyhabcjwmaklfklmyfvnrizrvvrtkofdan jmolbgeoprgtvrhowopbekvwmuqfmpwparmfhag kxiibg

Seal de radio 1132/19. Contenido: Forzados a sumergirnos durante ataque, cargas de profundidad. ltima localizacin enemiga: 8:30h, cuadrcula AJ 9863, 220 grados, 8 millas nuticas. [Estoy] siguiendo [al enemigo]. [El barmetro] cae 14 milibares. NNO 4, visibilidad 10.

CIFRADOS POR PERMUTACIN


Los mtodos de permutacin se basan en cambiar el orden de los smbolos en vez de sustituir estos. Si agrupamos los smbolos de M en M y los trasponemos, habr M! transposiciones posibles (M! claves). Fijaos que los mtodos de sustitucin son orientados a smbolos mientras que stos son orientados a bloques (hay que agrupar un bloque de smbolos que se cifra entero). Tambin hay que decidir qu se hace cuando al nal del mensaje tengamos un bloque incompleto (algo que ocurrir casi siempre). Las soluciones pasan por completar el bloque (con el alfabeto empezando en la A o, mejor, con texto aleatorio). Al descifrarlo (sabiendo la clave) tendremos algunos caracteres extra pero los descartaremos porque no tienen sentido. Criptoanlisis: si logramos averiguar el tamao del bloque (tal vez viendo que todos los mensajes tienen longitud mltiplo de M... que ser el mximo comn divisor de las longitudes), podremos dividir el criptograma en bloques permutados... Si para alguno de ellos, vemos una hiptesis con sentido (una permutacin que da lugar a una palabra o frase vlidas) la podemos probar para el resto. Las permutaciones nunca o casi nunca se usan como mtodo nico sino que se combinan con sustituciones u otras operaciones.

La mquina alemana Enigma, es el dispositivo cifrado electromecnico ms famosa de la historia.


El gobierno britnico mont un centro de criptoanlisis en Bletchley Park (80 Km al norte de Londres) cuyo principal objetivo era romper enigma. El equipo de Bletchley Park, dirigido por Alan Turing, consigui romper el cdigo de enigma construyendo la bomba: una mquina electromecnica de clculo que ya haba sido propuesta por el equipo de Rejewski y que se puede considerar uno de los primeros ordenadores de la historia.

PERMUTACIONES Y SUSTITUCIONES: DES


A mediados del siglo XX, el conocido investigador Claude Shannon lleg a armar que una combinacin de muchas permutaciones alternadas con sustituciones podra dar lugar a cifrados muy seguros... Esa idea fue aprovechada algunos aos despus cuando se dispuso de la tecnologa necesaria para automatizar ese tipo de procesos. El algoritmo DES (Data Encryption Standard) fue creado en los aos 70 y, como su nombre indica, pretenda ser la solucin denitiva al problema de cifrado. Por supuesto que las soluciones denitivas no existen pero DES fue una solucin vlida durante muchos aos y fue el primer cifrado que se aplic masivamente en aplicaciones informticas.

Mquina Enigma.

La existencia del centro de criptoanlisis de Bletchley Park y los trabajos realizados all fueron estrictamente secretos hasta la dcada de los 60. A pesar del gran trabajo de Turing y su equipo quedaron algunos mensajes sin descifrar. Los ltimos fueron traducidos en 2006!!! por el llamado proyecto-M4. Como ejemplo, tenemos el siguiente: OCCAMs Razor | 34

HISTORIA

DES naci por iniciativa del NBS (National Bureau of Standards) u ocina de estndares del ministerio de comercio americano (por tanto, hablamos de estndares civiles). Ahora el NBS se llama NIST (National Institute of Standards and Technology, www.nist.gov). Para decidir un estndar de cifrado se convoc un concurso en el que fue elegida la solucin presentada por IBM (que provena de mejorar un algoritmo anterior denominado Lucifer). Desde entonces existe una polmica no resuelta porque se dice que el gobierno (concretamente la agencia de seguridad nacional, NSA) oblig a modicar el algoritmo para que fuese menos seguro. De todas formas, hasta el ao 1992 no se public una forma de hacer un ataque ms eciente que la fuerza bruta y requiere tener el criptograma correspondiente a 247!!! textos planos determinados... ALGO TOTALMENTE IRREAL. En 1998 se cre un ordenador especial (conocido como Deep Crack) para romper el DES. Fue capaz de romper el cifrado por fuerza bruta en 56 horas.

DES ya no se utiliza en la prctica, aunque lo que s podemos encontrar todava es una variante llamada triple DES. Triple DES (TDES o 3DES) consiste en aplicar DES tres veces consecutivas a los 64 bits de entrada, si tenemos tres claves diferentes la longitud de la clave global ser de 168 bits. Se han publicado ataques que consiguen reducir el nmero de claves a probar, de forma que se demostr que triple DES ofrece la seguridad de una clave ms corta (aunque haya 2.168 claves llega con probar 2.112). Por eso, podis or o leer que en el triple DES la tercera clave suele ser igual a la primera (2 claves diferentes pero DES se aplica tres veces). TDES es un algoritmo que va desapareciendo porque es lento frente a otros ms modernos (DES ya era lento y aqu hay que ejecutarlo 3 veces) pero, en su momento, sirvi para que DES volviera a ser seguro y se pudieran reutilizar los sistemas software (y hardware) que implementaban DES.

El DES es un algoritmo de cifrado por bloques.


El DES es un cifrado por bloques. Divide el texto llano en bloques de 64 bits a los que aplica una clave de 56 bits y obtiene un criptograma de 64 bits. Para lograrlo, realiza una complicada combinacin de permutaciones y sustituciones. En la edicin antigua del excelente libro de A. S. Tanembaum: Redes de Ordenadores (o en su edicin inglesa, Computer Networks), se describa detalladamente la operacin del algoritmo e incluso se inclua el cdigo (en pascal) necesario para programarlo. Hablo de la edicin antigua porque fue la que le... imagino que la edicin actual seguir teniendo esa informacin. Mientras dudaba en ir o no a la biblioteca a comprobarlo, busqu en la mayor biblioteca de la historia y encontr esto: Free Encription/Cryptographic Libraries. Si la pgina no miente, ah tenis cdigo libre C++ para DES y para muchos algoritmos ms (muchos de ellos mencionados en este artculo). La debilidad de DES fue siempre la longitud de la clave. Aunque se cre en un momento en el que era inabordable un ataque por fuerza bruta, los grandes avances en potencia de clculo llegaron a hacerlo posible en algunos aos (aproximadamente 30). Probablemente, ese sea un problema de todos los algoritmos... la viabilidad o no de la fuerza bruta cambia con el tiempo. Decamos que en un buen algoritmo las modicaciones pequeas de la clave o del llano deben afectar mucho al criptograma. DES cumple esa condicin a la perfeccin. Se ha comprobado que la modicacin de 1 bit en el llano o en la clave provoca que los bits del criptograma cambien con probabilidad 1 2 , esto es: en media cambiarn la mitad... que es el cambio ms impredecible que puede haber.

Diagrama de bloques de triple DES.

DES apenas se utiliza en la actualidad. Sin embargo, su variante triple DES todava se puede encontrar por ah.
Todos los algoritmos que comentamos hasta ahora son simtricos. Esto es: la clave de cifrado es la misma que la de descifrado. Eso crea un problema para la seguridad en redes: Cmo se distribuyen las claves? Si se hace de forma oine (un seor con un diskette o algo) ser poco prctico. Eso era lo que se haca hasta los aos 90 y el boom de Internet. Si se distribuye la clave llana el intruso slo tendr que interceptar ESE mensaje. A partir de ese momento, ya podemos usar el mejor mtodo jams inventado que estaremos haciendo el tonto. Para evitar esos problemas naci el cifrado asimtrico, tambin llamado muchas veces cifrado de clave pblica. 35| OCCAMs Razor

HISTORIA

CRIPTOGRAFA ASIMTRICA. RSA


En qu consiste eso? Supongamos que se logra crear un mtodo donde la clave K1 sirve para cifrar y la K2 para descifrar. Por supuesto K1 y K2 estarn relacionadas pero debera ser muy difcil obtener K1 a partir de K2 o al revs... eso debera ser tan difcil como descifrar los criptogramas. Si yo quiero que me enven mensajes cifrados puedo publicar K1 sin ms!!!. Si slo yo conozco K2, slo yo podr descifrarlos, NO? La cosa se puede complicar ms... Imaginemos que creo otras dos claves F1 y F2 y ahora hago pblica F2. Para qu puede servir? Pongamos que tomo un texto llano que quiero enviar y le aado algn cdigo de redundancia (CRC 16 32). Si lo cifro con F1 y lo envo todos podrn leerlo (F2 es pblica) y, adems, todos podrn comprobar el CRC. Eso qu demuestra? Demuestra que quin lo gener conoca F1. Como slo yo conozco F1 acaba de nacer la rma digital (slo yo puedo generar esos mensajes, aunque todos pueden verlos y comprobar la rma).

K1 no debe compartir factores primos con M y K2 tampoco... de hecho existe un algoritmo para calcular K1 y K2 (algoritmo extendido de Euclides). De dnde viene la seguridad? De que los nmeros primos son una de las grandes cuestiones no resueltas por las matemticas. El nico algoritmo able para saber si un nmero es primo o no es ponerse a dividir, existen tests de primalidad pero no son 100 % ables. Lo que es peor, la nica forma de descomponer un nmero en factores es ponerse a dividir... Dicho en una frase: con los primos slo conocemos un mtodo, la fuerza bruta. Basta que los primos sean grandes para ponerlo muy difcil. La seguridad del mtodo RSA se basa en que si p y q son dos primos muy grandes, M = (p 1) (q 1) es una operacin muy fcil de realizar pero muy difcil de invertir (hay que factorizar M y eso slo se puede hacer por fuerza bruta). Si se conocen p y q, se puede calcular K1 a partir de K2 o al revs, esto es: el cifrado habr cado. El algoritmo RSA es lento ya que tiene que operar con precisin sobre nmeros enormes. Eso hace que el cifrado asimtrico casi nunca sea el nico mtodo utilizado en una comunicacin segura. Ms bien es un mtodo de distribucin de claves para utilizar despus algoritmos simtricos (protocolo Die-Hellman).

El algoritmo ms conocido para criptografa asimtrica es el RSA.


El algoritmo ms conocido para criptografa asimtrica es el RSA (inventado por Rivest, Shamir y Addleman). El algoritmo se basa en los llamados cuerpos y anillos nitos. Si denimos el conjunto de nmeros enteros de 0 a M-1, y hacemos sumas y productos mdulo M, tendremos: Un cuerpo si M es primo. Un anillo si no lo es. Si K1 y K2 son nmeros del conjunto (enteros entre 0 y M-1) y adems K1*K2 = 1 (mod M), tendremos: Para un nmero LL (texto llano), el nmero C = LLK 1 es muy diferente a LL. Podramos llamar a C texto cifrado. Adems: C K 2 = (LLK 1 )K 2 = LL(K 1K 2) = LL1 = LL (todo mdulo M , claro). Esto es: ciframos conociendo K 1 y desciframos conociendo K 2. Repasemos, para que esto realmente sea cifrado de clave pblica, todos deben conocer M y K1 pero K2 debe permanecer secreto. Adems jaos que si publicamos K2 y guardamos K1 el efecto ser el mismo... pero los criptogramas se obtendrn como C = LLK 2 . Puede parecer un poco raro que esto realmente sea un cifrado seguro... para que lo sea deberamos cumplir: M = (p 1) (q 1) donde p y q son nmeros primos grandes (como de 100 cifras) y distintos. OCCAMs Razor | 36

Buscando informacin para el artculo me encontr con el nmero primo de Mersenne. Ese nmero es el primo ms grande conocido (por lo menos el ms grande publicado hasta la fecha de edicin de ese artculo). Vale: 213466917 1 Os imaginis que se publique el mayor nmero par o el mayor mltiplo de 5? Y que encima le pongan el nombre del matemtico que lo encontr? Yo siempre he pensado que los nmeros primos son una especie de error de la naturaleza...

En 1984 fue publicado un sistema de prestaciones equivalentes al RSA y libre de patentes. Lo dise el matemtico egipcio Taher Elgamal trabajando en Stanford. El cifrado de Elgamal (a veces, llamado El Gamal) se basa en otro problema de la matemtica discreta: el logaritmo discreto. El problema es el siguiente: en un espacio discreto mdulo M, dados los nmeros x y a (enteros entre 0 y M-1), se trata de calcular otro entero y tal que x = ay (mod M). Se dice que y es el logaritmo discreto de x en base a (mdulo M). Dada la naturaleza discreta del problema, no existe otra solucin que probar con todos los enteros entre 0 y M-1. Basta que M sea un nmero primo grande para que el problema del logaritmo discreto sea imposible de resolver en tiempo razonable.

HISTORIA

En el mtodo de Elgamal la clave privada es K1 y la pblica K 2 = g K 1 (mod M). Si furamos capaces de resolver el logaritmo discreto podramos calcular K1 a partir de K2 y romper el cifrado. El parmetro g recibe el nombre de generador y es un nmero elegido aleatoriamente entre 0 y M-1. Las frmulas de cifrado y descifrado son: 1. Cifrado: Elegir b aleatorio entre 2 y M-2. C 1 = gb (mod M). C 2 = (K 2)b LL (mod M). C = (C 1, C 2) (mod M). 2. Descifrado:

AES: el Advanced Encryption Standard es el nuevo estndar criptogrco del NIST (desde el 26 de mayo de 2002 ha sustituido al DES). Se espera que sea el ms utilizado en un futuro prximo. El tamao de bloque es de 128 bits y la clave puede ser de 128, 192 256 bits. De nuevo, se trata de la aplicacin repetida de sustituciones, permutaciones y operaciones XOR. Ntese que estas operaciones deben estar muy estudiadas para dar lugar a un algoritmo seguro. Si intentamos crear un algoritmo de este tipo de cualquier manera, seguramente crearemos un cifrador predecible (y por tanto atacable).

FUNCIONES HASH: MD5, SHA

Haciendo C 1(M 1K 2) C 2 (mod M), se ob- He dejado los algoritmos HASH justo para el nal porque realmente no son algoritmos de cifrado sino tiene de nuevo LL. de reduccin criptogrca. Estos mtodos convierten cualquier texto en un nmero de N bits. Adems, funcionan como una funcin de un nico sentido, esto es: no se conoce ninguna forma de recuperar el texto a partir del texto reducido de N bits. Por ltimo, y de ah viene su nombre, actan como funciones hash, esto es: la probabilidad de que dos textos diferentes produzcan los mismos N bits es despreciable. Y esto MTODOS MS ACTUALES: IDEA, para qu puede servir? Pues, por ejemplo, para almacenar textos que no se pueden guardar en llano pero BLOWFISH, AES... que tampoco hay que descifrar. Se usan, por ejemplo, Una vez recorridos los que creo que son los hitos prinpara guardar passwords. El sistema aplica obligatoriacipales del cifrado deseara presentar brevemente los mente la funcin hash cuando se introduce una clave mtodos actuales: y compara las reducciones. Aunque un espa lea las IDEA: su nombre viene de International Data reducciones nunca podr obtener las claves originales. Encryption Algorithm. Es un algoritmo publi- Hay dos algoritmos hash importantes hoy da: cado en 1991 que se propuso como estndar euMD5: MD viene de Message Digest o resumen ropeo (una iniciativa similar al DES norteamedel mensaje. El 5, evidentemente, es el nmero ricano). Igual que DES cifra por bloques de 64 de versin. MD5 convierte cualquier texto en un bits pero la clave es de 128. El algoritmo IDEA nmero de 128 bits. Este mtodo MD5 fue dise basa en realizar repetidas veces una serie de seado en 1991 por el profesor del MIT Ronald operaciones binarias: O-exclusiva (XOR) bit a Rivest (la R del RSA). MD5 es el mtodo utibit, Suma mdulo 216, multiplicacin mdulo lizado en Linux para almacenar las passwords 216+1. La losofa es similar al DES (reiterade usuarios. Tambin se usa para calcular recin de operaciones simples) pero es mucho ms smenes a modo de CRCs de archivos complemoderno y la clave es mucho ms larga con lo tos para asegurar su autenticidad. Por ltimo, que es mucho ms seguro. IDEA se utiliza en comentar que el seor Rivest tambin es autor PGPv2.0 y hasta la fecha no se ha publicado de varios mtodos de cifrado simtrico llamados ningn ataque vlido. RC2, RC4, RC5 y RC6 (RC1 y RC3 resultaron ser inseguros y nunca llegaron a ser publicados). Blowsh: este mtodo fue diseado por Bruce Schneier en 1993. De nuevo es un cifrador de bloSHA: Secure Hash Algorithm (SHA) es un conques de 64 bits. La longitud de la clave es variajunto de funciones HASH criptogrcas publicable y va desde 0 a 448 bits. De nuevo, la losofa das por el NIST norteamericano y cuya autora es muy similar al DES ya que se basa en varias se atribuye a la agencia NSA (National Securondas de operaciones XOR y sustituciones rearity Agency). La primera (SHA-0) se public en lizadas por tablas de entradas/salidas llamadas 1993 y despus surgieron cinco versiones ms. cajas-S (S-boxes, un concepto que ya exista en SHA-0 y SHA-1 producen una salida resumen el DES, se sabe que de su diseo depende enorde 160 bits. Las versiones SHA-224, SHA-256, memente la seguridad del algoritmo). Hoy da se SHA-384, y SHA-512 producen salidas de la lonusan ms otros mtodos que trabajan con blogitud que indica su nombre, aunque a todos esques mayores como AES y TwoFish (basado en tos mtodos se les llama conjuntamente SHA-2. Blowsh). No se conocen ataques efectivos.

El mtodo de Elgamal est libre de patentes.

37| OCCAMs Razor

HISTORIA

ESTEGANOGRAFA, WATERMARKING
Quera hablar un poco de esteganografa... que no es cifrado sino que se traducira como el arte de escribir oculto. Otra forma de lograr el secreto es meter un mensaje donde nadie lo puede ver... para eso hay muchas tcnicas sencillas pero ingeniosas: Suponiendo que en ingls which y that son equivalentes, pongamos que which es un 1 y that un cero, podemos intercambiar un texto que realmente contiene un mensaje... Necesitamos una fuente de texto casi inagotable para sustituir las palabras clave hasta conseguir meter todos los bits. Las hay: la Biblia, las obras completas de Shakespeare... Un mtodo similar al anterior pero vlido en todas las lenguas es usar el espaciado entre palabras: dos espacios es un uno y un espacio es un cero. El ms divertido (aunque igual de simple y de atacable que los anteriores) es meter el mensaje en los bits de menor peso de un chero multimedia (audio o imagen). Imaginad una imagen en escala de grises donde cada punto es un nmero de 8 bits. Modicar el de menor peso (para que sea un bit del mensaje que queremos transmitir) no debera notarse. Para el que no se lo crea, copio abajo dos funciones de matlab. La primera funcin introduce el mensaje en la imagen sin que se note mientras que la segunda lo recupera. Cuntos Kbytes caben en una imagen 512x512?
function ImOut = M e n s a j e S e c r e t o ( im0 , m e n sa j e ) % Ojo : no f u n c i o n a s i l a imagen no e s formato u i n t 8 im00 = i m 2 u i n t 8 ( im0 ) ; % Pasar a u i n t 8 % Pasar e l mensaje a b i n a r i o ( a s c i i ) msgbin = u i n t 8 ( m e n sa j e ) ; % 255 = c a r a c t e r f i n de mensaje msgbin = [ msgbin 2 5 5 ] ; % I n t r o d u c i r e l mensaje en l a imagen % usando l o s b i t s de menor p e so c o n t = 1 ; % P i x e l a c t u a l de l a imagen f o r i =1: length ( msgbin ) aux = msgbin ( i ) ; % Valor a i n t r o d u c i r for j =0:7 , b i t = ( b i t a n d ( aux , 2 ^ j ) > 0 ) ; % B i t j esimo if ( bit ) % Encender e l b i t de menor p e so % ( s i no l o e s t a b a ya ) im00 ( c o n t ) = b i t o r ( im00 ( c o n t ) , 1 ) ; else % Apagar e l b i t de menor p e so % ( s i no l o e s t a b a ya ) im00 ( c o n t ) = b i t a n d ( im00 ( c o n t ) , 2 5 4 ) ; end c o n t = c o n t +1; % Pasar a l s i g u i e n t e end end % Dar s a l i d a y a c a b a r . ImOut = im00 ; function m e n sa j e = L e e r M e n sa j e ( im0 ) % Ojo : no f u n c i o n a s i l a imagen no e s formato u i n t 8 im00 = i m 2 u i n t 8 ( im0 ) ; % Pasar a u i n t 8 msgbin = [ ] ; % Mensaje i n i c i a l m e n t e en b l a n c o % I r l e y e n d o e l mensaje c o n t = 1 ; % P i x e l a c t u a l de l a imagen aux = 1; % C a r a c t e r a n t e r i o r while ( aux~=255) i f ( aux~=1)

% Anhadir e l c a r a c t e r a n t e r i o r % ( s i procede ) msgbin = [ msgbin aux ] ;

a l mensaje

end aux = 0 ; for j =0:7 , % B i t de menor p e so de e s t e p i x e l b i t = ( b i t a n d ( im00 ( c o n t ) , 1 ) > 0 ) ; if ( bit ) % Encender e l b i t j esimo aux = b i t o r ( aux , 2 ^ j ) ; end c o n t = c o n t +1; % Pasar a l s i g u i e n t e end end % Pasar a t e x t o y a c a b a r . m e n sa j e = c h a r ( msgbin ) ;

pixel

Este ltimo ejemplo nos introduce en un tema relacionado con la esteganografa y el cifrado: el watermarking o marcado al agua. La marca al agua de los billetes es un dibujo que se puede ver al trasluz que sirve para autenticar al billete. Podemos aadir a las imgenes y/o al audio una marca imperceptible al ojo (o al odo) que marque quin produjo la imagen y cuando. Eso servira para saber que esta o aquella pelcula ha sido pirateada... si la marca indica a quin se le prest el original alguien puede tener problemas : ). Las buenas marcas al agua resisten los ataques... el pirata puede que se dedique a hacer operaciones al chero para intentar hacer desaparecer la marca. Deberamos asegurar que mientras la imagen/audio no sean estropeados excesivamente, la marca sigue ah. Qu puede hacer un pirata? Filtrar paso-bajo sin que se note mucho, pasar a analgico y digitalizar, con las imgenes hay muchas ms posibilidades: reescalar, girar 30o grados a la derecha y 30.1o a la izquierda, aplicar distorsiones no lineales... (si usamos slo el bit de menor peso, el pirata los pondr todos a cero y se quedar tan ancho). El watermarking robusto es un problema muy complejo y slo puede resolverse si se considera como un problema de transmisin digital en un canal especial (una imagen o un chero de audio). Con las tcnicas adecuadas se crean mensajes que se adaptan a la imagen ya que en algunas partes se puede sumar un mensaje mayor que 1 bit sin que se note y en otras no. No puedo dejar de mencionar que sobre watermarking se han hecho trabajos muy importantes en nuestro centro, por ejemplo: Statistical Analysis of Watermarking Schemes for Copyright Protection of Images , autores: Juan Ramn, Hernndez y Fernando Prez-Gonzlez . Se public en 1999 en los proceedings del IEEE. Ahora tocara hablar de criptografa cuntica... un mtodo que se supone totalmente inviolable. Lo siento pero... ya me ha salido muy largo y no s si va a caber en la revista. Lo de arriba es una excusa... ese tema me parece extra-terrestre y no me atrevo a hablar de l. Si queris saber cosas sobre eso ya sabis... en Internet est todo (bueno, tambin hay libros). Y, de nuevo, gracias a la Wikipedia por la gran cantidad de informacin que nos regala.

OCCAMs Razor | 38

REVERSO TENEBROSO

Descubre como trabajan las herramientas de los hackers


por Huakin Paquete

Sockets RAW

Los socket RAW nos permiten enviar y recibir datos en bruto a travs de la red
HERRAMIENTAS ICMP

Como siempre, lo primero que necesitamos son algunos cheros de cabecera. Aqu tenis la lista de los que La mayora de las herramientas de red a nivel de siste- necesitamos. ma necesitan poder acceder al hardware de red a muy #include <s t d i o . h> bajo nivel. #include < s t d l i b . h> No es necesario llegar a manejar el chip de la tarjeta #include <s y s / s o c k e t . h> de red directamente (eso es cosa de los drivers en el #include <n e t i n e t / i n . h> kernel), pero prcticamente todas ellas requieren poder construir paquetes especiales y capturarlos tal y #include <l i n u x / i p . h> #include <l i n u x / icmp . h> como llegan, sin que nadie los haya manipulado. El kernel Linux proporciona distintas posibilidades para ello, siendo los sockets RAW una de las ms uti- Hemos agrupado los cheros de cabecera en tres grulizadas y veteranas. Los sockets RAW, como su propio pos. En el primero encontramos los de siempre, cabenombre indican son sockets (iguales que los otros), cu- ceras estndar para utilizar funciones como printf o ya nica diferencia es que cuando recibimos o envia- exit. El segundo bloque es el que contiene las demos datos a travs de ellos, esos datos se proporcionan niciones que necesitaremos para crear nuestro socket RAW. Finalmente, el ltimo grupo contiene la denio se obtienen en bruto (raw en ingls). cin de las cabeceras de los paquetes para los protocolos IP e ICMP. Enseguida veremos como utilizarlos. Con estas deniciones ya estamos en condiciones de escribir una funcin para poder crear nuestro socket RAW.
int crea_socket ( int proto ) { int s ; i f ( ( s = s o c k e t (AF_INET, SOCK_RAW, p r o t o )) <0) { perror ( " socket : " ) ; exit (1); } return s ; }

lguna vez os habis preguntado como funcionan esas herramientas de red que usis a diario?. No, no hablamos del explorador o el Filezilla, sino de las herramientas del sistema como ping, traceroute o nmap?... ah, que no las usis a diario?. En ese caso, este artculo probablemente no sea para vosotros.

necesitamos realizar dos operaciones. La primera es poder enviar paquetes ICMP, y la segunda, obviamente, es poder recibir paquetes ICMP. Comenzaremos por la segunda parte, ya que es ms sencilla y nos permitir introducir los nuevos conceptos de una forma progresiva.

CREANDO NUESTRO SOCKET

Vamos a comenzar con una de las herramientas ms sencillas y ms tiles que nos podemos encontrar en el sistema: ping. Esta herramienta nos permite saber si una determinada mquina conectada a la red est funcionando o no. La herramienta ping simplemente enva paquetes ICMP ECHO, y espera recibir una respuesta ICMP ECHOREPLY. Los paquetes ICMP ECHO permiten enviar algunos datos extra, y son estos datos los que ping utiliza para estimar el tiempo de respuesta de la mquina remota. El valor time de la salida del programa. Para implementar nuestra versin reducida de ping,

Hemos decidido pasar como parmetro el protocolo, de forma que podamos reutilizar esta funcin en el resto de los ejemplos de este artculo. Cuando lleguemos a la funcin main de nuestro programa veremos para que sirve ese parmetro. Como podis observar, hemos seleccionado la familia de direcciones de internet (AF_INET) e indicado que el socket sea de tipo SOCK_RAW. Sin grandes sorpresas hasta aqu. 39| OCCAMs Razor

REVERSO TENEBROSO

Hemos mantenido la comprobacin de errores para la llamada al sistema socket ya que los socket RAW necesitan permisos especiales. Si no ejecutamos nuestro programa como root, o utilizando sudo, la llamada al sistema fallar y los resultados del programa sern errneos.

a nuestra llamada (vuestro modem ADSL, vuestro DNS, google o ping.com :). Esto es lo que obtendremos:
occams@razor $ sudo ./icmplog Code: 0.0 (192.168.100.1) Code: 0.0 (192.168.100.1) ...

LEYENDO PAQUETES
Lo siguiente que necesitamos es una estructura de datos para poder acceder cmodamente a los distintos campos de los paquetes que capturemos. Esta es la que nosotros hemos elegido.
typedef struct { struct i p h d r ip ; struct icmphdr icmp ; char b u f f e r [ 1 0 2 4 ] ; / Datos / } PKT;

Los mensajes de tipo 0 y cdigo 0 son efectivamente mensajes ECHOREPLY, que el sistema remoto responde a nuestro ping (el que estamos ejecutando en la otra consola). Obviamente 192.168.100.1 es la mquina contra la que lanzamos el ping. P ENTRETENERSE Si miris la salida del programa ping, veris que proporciona ms datos que nuestra pequea aplicacin. Algunos de los datos que muestra se encuentran en la cabecera ICMP, otros en la seccin de datos -tendris que ver el cdigo fuente de ping- y otros requieren conocer qu paquete se envi en primer lugar. Los que andis aburridos podis extender este ejemplo para que se parezca ms a ping

Esta estructura representa un paquete de datos ICMP, tal y como lo leeremos desde nuestro socket RAW. Lo primero que encontraremos ser la cabecera IP del paquete. A continuacin, la cabecera del mensaje ICMP, seguida de un bloque de datos que variar en funcin del tipo de mensaje ICMP recibido. En principio, el tamao de buer debera reservarse dinmicamente segn la informacin en los campos de tamao de las cabeceras del paquete. Para mantener los ejemplos de cdigo sencillos vamos a utilizar un buer de 1Kb que ser ms que suciente para nuestras pruebas.

DETECTANDO ESCANEOS SIGILOSOS


Antes de continuar con la versin completa de nuestro sencillo ping vamos a hacer un corto inciso, para, convertir nuestro pequeo programa en un detector de escaneos sigilosos como los que realiza nmap.

CAPTURANDO PAQUETES ICMP


Con nuestras deniciones previas, estamos en condiciones de escribir nuestro primer capturador de paquetes ICMP. Podis ver la funcin main a continuacin:
i n t main ( i n t a rg c , char a rg v [ ] ) { int s; PKT pkt ; s = crea_socket (IPPROTO_ICMP) ;

Capturar paquetes IP con un socket RAW es muy sencillo


Partiendo de nuestro ejemplo anterior, vamos a realizar unas sencillas modicaciones para transformar nuestro programa en un rudimentario detector de escaneos de tipo FIN. Estos escaneos se caracterizan por que el ag FIN de la cabecera TCP est puesto a 1. Nosotros vamos a informar de todos los paquetes de este tipo que recibamos, si bien puede que algunos sean paquete legtimos. Lo primero que tenemos que hacer es aadir un nuevo chero de cabecera a nuestro programa #include <linux/tcp.h> Tambin tenemos que hacer una pequea modicacin a nuestra estructura de datos. Ahora vamos a capturar paquete TCP y, en este caso, lo que nos encontramos a continuacin de la cabecera IP, es una cabecera TCP, no una cabecera ICMP. Teniendo esto en cuenta, nuestra estructura de datos sera algo como esto:
typedef struct { struct i p h d r ip ; struct tc p h d r tc p ; char b u f f e r [ 1 0 2 4 ] ; / Datos / } PKT_TCP;

while ( 1 ) { re a d ( s , &pkt , s i z e o f (PKT ) ) ; p r i n t f ( " Code : % d. %d " , pkt . icmp . type , pkt . icmp . code ) ; p r i n t f ( "( %s )\ n" , i n e t_ n to a ( pkt . i p . s a d d r ) ) ; } return 0 ; }

Sencillo no?. Simplemente creamos nuestro socket RAW, indicando que queremos utilizar el protocolo ICMP, leemos datos del socket en nuestra estructura especial, y accedemos a la informacin del paquete utilizando esta estructura. Para probar nuestro ejemplo, lanzamos como usuario root (o utilizando sudo, lo que ms rabia os de), nuestro capturador de paquetes (que hemos llamado icmplog. Desde otro terminal, hacemos un ping a cualquier mquina que sepamos que responder OCCAMs Razor | 40

REVERSO TENEBROSO

Con estos cambios, nuestra funcin main para detectar Abrid dos consolas y en una de ellas ejecutad Netcat posibles escaneos FIN quedara de la siguiente forma: en modo servidor escuchando en el puerto 2000. En la otra ejecutad Netcat en modo cliente conectndose a i n t main ( i n t a r g c , char a r g v [ ] ) { localhost y al puerto 2000. int s;
PKT_TCP pkt ; s = crea_socket (IPPROTO_TCP) ;

while ( 1 ) { r e a d ( s , &pkt , s i z e o f (PKT_TCP ) ) ; i f ( pkt . t c p . f i n ) p r i n t f ( " P o s i b l e FIN s c a n a l p u e r t o % d " " d e s d e ( %s ) \ n" , n t o h s ( pkt . t c p . d e s t ) , i n e t _ n t o a ( pkt . i p . s a d d r ) ) ; } return 0 ; }

CONSOLA Servidor: nc -l -p 2000 CONSOLA Cliente : nc localhost 2000

Ahora, pulsad CTRL+C en la parte cliente y comprobad que obtenis en el detector de escaneos. Repetid el proceso, pero ahora pulsando CTRL+C en la consola donde se ejecuta el servidor. Lo que nuestro detector mostrar ser algo como esto:
Posible FIN scan al puerto 60784 desde (127.0.0.1) Posible FIN scan al puerto 2000 desde (127.0.0.1)

Como podis observar, cuando creamos nuestro nuevo socket RAW estamos indicando que queremos capturar paquetes TCP, en lugar de ICMP como hicimos en nuestro ejemplo anterior. Una vez hecho esto, nuestra nueva estructura de datos nos permite acceder directamente a la informacin en la cabecera TCP. Por una parte comprobamos el valor del ag FIN, y por otra obtenemos la informacin relativa al puerto al que va dirigido el paquete.

Podemos detectar un escaneo FIN en unas pocas lneas de cdigo


Observad que tenemos que utilizar la funcin ntohs para convertir del formato de red al formato de mquina (ntohs signica Network TO Host Short). S, los datos de las cabeceras se transforman a un formato especial para ser transmitidos por la red, de forma que cualquier mquina pueda acceder a ellos independientemente de su arquitectura (little o big endian).

Efectivamente, el ag FIN se utiliza para cerrar las conexiones, de forma que, para detectar si se trata de un escaneo real, tendramos que saber si el paquete FIN que hemos capturado no se corresponde con el cierre legtimo de una conexin activa. Es decir, necesitamos saber que conexiones estn abiertas... o quizs podamos averiguarlo a partir de los otros campos de las cabeceras IP y TCP?... algo ms para entretenerse :).

ENVIANDO PAQUETES ICMP


Despus de este no tan corto parntesis, volvamos a nuestra pequea utilidad ping. Como os decamos en una seccin anterior, para poder implementar algo parecido a ping, necesitamos poder enviar paquetes ICMP. No existe una manera directa de hacer esto, de forma similar a como se transmiten datos utilizando TCP o UDP. Necesitamos un socket RAW para poder enviar estos paquetes. Para este ejemplo necesitamos los mismos cheros de cabecera que para el primer ejemplo que introdujimos (icmplog). Tambin reutilizaremos nuestra funcin crea_socket, pero para poder transmitir nuestro paquete ICMP necesitaremos algo ms de cdigo. Lo primero que necesitamos es una estructura de datos adicional. Si bien, podramos utilizar nuestra estructura PKT, ya que un paquete es un paquete, por cuestiones prcticas nos interesa denir una estructura como esta:
typedef s tr u ct { s tr u ct icmphdr icmp ; char b u f f e r [ 1 0 2 4 ] ; / Data / } PKT_TX;

COMPROBANDO EL DETECTOR
Vamos a comprobar que tal funciona nuestro nuevo detector de escaneos FIN. Para ello, iniciamos nuestra aplicacin en una consola, y desde otro terminal ejecutamos el siguiente comando:
# nmap -sF localhost -p 2000

Nuestro amante detector nos informar diligentemente del intento de ataque:


occams@razor:~$ sudo ./finscan [sudo] password for occams: Posible FIN scan al puerto 2000 desde (127.0.0.1)

Como podis observar, hemos eliminado la cabecera IP de nuestra estructura de transmisin. La razn: Pero si recordis, os comentamos que el hecho de reci- Vamos a dejar que la pila TCP/IP de nuestro sistebir un paquete FIN no signica que se est llevando a ma rellene los campos de la cabecera IP. Ms adelante cabo un escaneo de puertos. Para comprobar como se veremos como rellenarlos nosotros mismos, pero para generan estos paquetes vamos a realizar un pequeo implementar nuestro ping, es mucho ms conveniente experimento. dejar al sistema hacerlo. 41| OCCAMs Razor

REVERSO TENEBROSO

Adems de esta estructura de datos, vamos a aadir una funcin para construir paquetes ICMP ECHO, con un determinado bloque de datos. Podis ver esta funcin a continuacin.
int h e l l o _ p k t 2 ( char pkt_icmp , char s t r ) { s tr u ct icmphdr icmp =( s tr u ct icmphdr ) pkt_icmp ; PKT_TX pkt = (PKT_TX ) pkt_icmp ; int len ; l e n = s p r i n t f ( pkt >b u f f e r , " % s" , str ); l e n += s i z e o f ( s tr u ct icmphdr ) ; / Construye c a b e c e r a ICMP / icmp >t y p e = ICMP_ECHO; icmp >c o d e = 0 ; icmp >un . e c h o . i d = h t o n s ( 1 2 3 ) ; icmp >un . e c h o . s e q u e n c e = h t o n s ( 5 ) ; icmp >checksum = 0 ; icmp >checksum = cksum ( ( char ) icmp , return l e n ; }

sum += ( sum >> 1 6 ) ; / t r u n c a t e t o 16 b i t s / a n swe r = ~sum ; return a n swe r ; }

Bsicamente lo que hace la funcin es sumar todos los bytes que componen el paquete (de ah lo de suma de comprobacin), y nalmente reducirlo a un valor de 16 bits que es el espacio disponible en la cabecera. Con estas funciones de soporte ya podemos escribir nuestra versin super-simplicada de ping.

EL PING MS TONTO DEL MUNDO


len );

Nuestro programa principal es ahora un poco ms complicado... pero no mucho ms.


int main ( i n t a r g c , char a r g v [ ] ) { int s , data_size ; PKT pkt ; PKT_TX e c h o ; char tmp [ 1 0 2 4 ] ; s tr u ct so c k a d d r _ i n d e s t ; s = crea_socket (IPPROTO_ICMP ) ;

Esta funcin recibe como parmetro, un puntero a nuestra estructura de paquete en memoria, y una cadena de caracteres que se enviar en el bloque de datos.

Construir un paquete ICMP ECHO es tan sencillo como rellenar una estructura de datos
Con esta informacin, la funcin construye un paquete ICMP ECHO con identicador 123 y nmero de secuencia 5. Estos valores sern los que utilicemos para saber si el paquete que capturamos es el que nos interesa.

/ Construimos p a q u e t e / d e s t . s i n _ f a m i l y = AF_INET ; i n e t _ a t o n ( a r g v [ 1 ] , &d e s t . si n _ a d d r ) ; d a t a _ s i z e = h e l l o _ p k t 2 ( ( char ) &echo , " H e l l o World ! ! " ) ; / Enviamos e l p a q u e t e / s e n d t o ( s , &echo , d a t a _ s i z e , 0 , ( s tr u ct s o c k a d d r ) &d e s t , s i z e o f ( s tr u ct so c k a d d r _ i n ) ) ; / Empezamos l a c a p t u r a / while ( 1 ) { r e a d ( s , &pkt , s i z e o f (PKT) ) ; p r i n t f ( " Code : % d. %d( %d ) " , pkt . icmp . type , pkt . icmp . code , n t o h s ( pkt . icmp . un . e c h o . i d ) ) ; p r i n t f ( "( %s ) " , i n e t _ n t o a ( pkt . i p . s a d d r ) ) ; i f ( ( pkt . icmp . t y p e == ICMP_ECHOREPLY) && ( n t o h s ( pkt . icmp . un . e c h o . i d ) == 1 2 3 ) ) { p r i n t f ( " \ n E st e e s e l n u e s t r o : ) ! ! \ n" ) ; break ; } p r i n t f ( " \n" ) ; } close ( s );

CALCULANDO EL CHECKSUM

El ltimo elemento que necesitamos para construir un paquete ICMP vlido es el clculo de la suma de comprobacin de los datos. El protocolo ICMP especica que este valor se debe calcular utilizando todo el paquete (cabecera + datos), siendo el valor del campo checksum de la cabecera igual a 0, para este clculo. Nosotros hemos tomado prestada la rutina de checkreturn 0 ; sum de la implementacin de ping que podis encon- } trar en cualquier distribucin linux. Esta funcin tiene la siguiente pinta. Al igual que en nuestro anterior ejemplo, comenzamos creando nuestro socket RAW, pero en este caso, antes / C a l c u l o de checksum / u_short de ponernos a capturar paquetes, tenemos que enviar cksum ( u_char addr , i n t l e n ) nuestro paquete ECHO. { r e g i s t e r i n t sum = 0 ; Para ello utilizamos la llamada al sistema sendto, que u_short a n swe r = 0 ; u_short wp ; nos permite especicar la direccin de destino del paquete. Recordad que, si no se especica lo contrario, f o r (wp =( u_short ) addr ; l e n >1; wp++, l e n =2) sum += wp ; la pila TCP/IP de nuestro ordenador rellenar las cabeceras IP. Sin embargo, lo que la pila es capaz de / Take i n an odd b y t e i f p r e s e n t / i f ( l e n == 1 ) rellenar tienen un lmite. Hasta que los ordenadores { sean capaces de leer nuestras mentes, pues tendremos ( u_char )& a n swe r = ( u_char )wp ; sum += a n swe r ; que decirle a donde queremos enviar el paquete :). } La llamada al sistema sendto espera esta informacin / add h i g h 16 t o low 16 / en su tercer parmetro como un puntero a una variasum = ( sum >> 1 6 ) + ( sum & 0 x f f f f ) ; ble de tipo struct sockaddr. / add c a r r y / OCCAMs Razor | 42

REVERSO TENEBROSO

Ahora que ya tenemos dominado ICMP, vamos con TCP. Para ilustrar este ejemplo vamos a implementar el clsico escaneo de media conexin, en el que el tradicional saludo a tres bandas de TCP se queda en slo dos. Una conexin TCP, se inicia con el envo de un paquete SYN (en seguida veremos que es esto). El sistema remoto responde con un paquete SYN ACK, o paquete de asentimiento de conexin. Para que la conexin se considere establecida el sistema que inicia la comunicacin debe enviar un paquete ACK de vuelta. Bsicamente esto es lo que hace la llamada al sistePROBANDO NUESTRO PING ma connect... nosotros vamos a implementar nuestro Ha llegado el momento de probar nuestro ping. Para propio connect. ello, como en nuestros ejemplos anteriores, escogemos En este ir y venir de paquetes, ambos sistemas interuna mquina que responda a los pings y ejecutamos cambian nmeros de serie que sern utilizados durante nuestro programa. la comunicacin. Estos nmeros de serie son los que hacen que el spoong de una conexin TCP no sea occams@razor$ sudo ./pingc1 192.168.100.1 prctico, al menos lo que se conoce como blind spoo[sudo] password for occams: ng.
Code: 0.0 (123)(192.168.100.1) Este es el nuestro :)!!

As que lo primero que hace el programa es rellenar una estructura de ese tipo. A continuacin creamos el paquete ECHO con la funcin que ya tenamos lista, y lo enviamos con la anteriormente mencionada funcin sendto Lo que sigue ya os tendra que resultar familiar. Es el mismo bucle que escribimos para nuestro capturador de paquetes ICMP, pero en este caso, mostramos un mensaje especial cuando recibimos una respuesta ECHO_REPLY al paquete que acabamos de enviar. Adems comprobamos que el paquete contiene el identicador de paquete que habamos introducido.

ESCANEO DE MEDIA CONEXIN

Si enviamos nuestros paquetes contra una mquina que no existe (o no responde a los paquetes ECHO), nuestro programa quedar esperando indenidamente. S, obviamente tenemos que utilizar un temporizador para determinar si un paquete se ha perdido... eso os lo dejamos como ejercicio :). Pero, qu ha pasado con nuestro Hola Mundo!?... Ejecutemos de nuevo nuestro programa, pero esta vez vamos a lanzar tcpdump en un terminal. Esto es lo que obtendramos:
occams@razor$ sudo tcpdump -A icmp (...) 15:28:12.219162 IP occams.local > target: ICMP echo request, id 123, seq 5, length 21 E..)..@.@......o.........{..Hello World!! 15:28:12.219604 IP target > occmas.local: ICMP echo reply, id 123, seq 5, length 21 E..)....@..........o.....{..Hello World!!.3hV. (...)

Los socket RAW nos permiten control absoluto sobre los ags TCP
En un escaneo de media conexin no se enva el ltimo paquete ACK, con lo cual la conexin no se puede considerar completa y, dependiendo del sistema de deteccin de intrusos instalado, puede que el escaneo no se detecte. Esto no es muy probable que pase hoy en da, pero desde un punto de vista didctico nos va a permitir introducir un montn de conceptos.

MODIFICANDO NUESTRO EJEMPLO


Para poder implementar nuestro escner de media conexin tendremos que hacer algunas modicaciones a nuestro programa. Lo primero que necesitamos es un nuevo chero de cabecera, y una mnima modicacin de nuestras estructuras de datos.
#include <l i n u x / t c p . h> typedef s tr u ct { s tr u ct t c p h d r tcp ; } PKT; typedef s tr u ct { s tr u ct i p h d r ip ; s tr u ct t c p h d r tcp ; } PKT_RX;

S, ah est. Ha ido hasta la mquina destino y a vuelto. As que podemos utilizar paquetes ICMP tambin para transmitir datos. Un ejemplo de este uso es el programa ICMP shell, que permite acceso shell remoto a una mquina a travs de ICMP. En concreto esta aplicacin permite utilizar otros mensajes ICMP, no solo los mensajes ECHO, para este intercambio de datos. EL PING DE LA MUERTE El sistema operativo Windows 95, tena un bug en su pila TCP/IP que haca que el sistema se estrellase si reciba un paquete ICMP ECHO con un bloque de datos de ms de 64Kb. Este paquete, as como la aplicacin que lo mandaba -que ahora ya sabis hacer- se conoca como el Ping de la Muerte (PoD Ping of Death) Ms informacin...

Como podis comprobar, simplemente hemos substituido la cabecera ICMP de nuestro ejemplo anterior por la nueva cabecera TCP (para eso necesitamos el chero .h adicional). Tambin hemos eliminado el bloque de datos que no vamos a necesitar para nuestro escner. Volveremos sobre estas estructuras un poco ms tarde. 43| OCCAMs Razor

REVERSO TENEBROSO

La siguiente parte que tenemos que modicar es el programa principal, que quedara de esta guisa.
int main ( i n t a r g c , char a r g v [ ] ) { int s , data_size ; PKT_RX pkt ; PKT syn ; char tmp [ 1 0 2 4 ] ; s tr u ct so c k a d d r _ i n d e s t ; s = crea_socket (IPPROTO_TCP) ;

dejamos a vosotros para que os entretengis y as el listado nos queda ms corto y centrado en el tema que nos ocupa.

CONSTRUYENDO UN PAQUETE TCP


Para que nuestro escner est completo, nos falta la funcin que construye el paquete TCP. Como dijimos, necesitamos enviar un paquete SYN, es decir, un paquete con el ag SYN activado en la cabecera TCP. Tranquilos, esto es muchsimo ms fcil de lo que parece. Aqu tenis la funcin tcp_pkt.

/ Construimos p a q u e t e / d e s t . s i n _ f a m i l y = AF_INET ; i n e t _ a t o n ( a r g v [ 1 ] , &d e s t . si n _ a d d r ) ; d e s t . sin_port = htons ( a t o i ( argv [ 2 ] ) ) ;

int tcp_pkt (PKT p , char d i r _ d e s t , i n t p u e r t o d , memset (&syn , 0 , s i z e o f (PKT) ) ; char d i r _ o r i g , i n t p u e r t o o ) d a t a _ s i z e = tcp_pkt (&syn , a r g v [ 1 ] , a t o i ( a r g v [ 2 ] ) , argv [ 3 ] , a t o i ( argv [ 4 ] ) ) ; { p >t c p . s o u r c e = h t o n s ( p u e r t o o ) ; / Enviamos e l p a q u e t e / p >t c p . d e s t = h t o n s ( p u e r t o d ) ; p >t c p . d o f f = s i z e o f ( s tr u ct t c p h d r ) / 4; s e n d t o ( s , &syn , d a t a _ s i z e , 0 , ( s tr u ct s o c k a d d r ) &d e s t , p >t c p . syn = 1 ; s i z e o f ( s tr u ct so c k a d d r _ i n ) ) ; / Empezamos l a c a p t u r a / while ( 1 ) { r e a d ( s , &pkt , s i z e o f (PKT_RX ) ) ; p r i n t f ( " Paquete d e s d e % s: %dACK: %dSYN: %d\n" , i n e t _ n t o a ( ( ( s tr u ct in_addr )& pkt . i p . s a d d r ) ) , n t o h s ( pkt . t c p . s o u r c e ) , pkt . t c p . ack , pkt . t c p . syn ) ; if ( ! memcmp (& pkt . i p . sa d d r , &d e s t . sin_addr , s i z e o f ( s tr u ct in_addr ) ) ) break ; p >t c p . c h e c k = cksum ( ( unsigned char ) &p >tcp , s i z e o f ( s tr u ct t c p h d r ) ) ; return ( s i z e o f ( s tr u ct t c p h d r ) ) ; }

} close ( s ); return 0 ; }

El primer cambio que observamos es que ahora nuestro socket RAW va a utilizar un protocolo diferente. En lugar del anterior IPPROTO_ICMP, ahora nos encontramos un interesante IPPRPTO_TCP, que enviamos como parmetro a nuestra funcin de creacin del socket. El segundo cambio importante que nos encontramos es que, ahora, nuestro programa va a recibir cuatro pa- PROBANDO NUESTRO FLAMANTE rmetros. Los dos primeros identicarn la direccin ESCNER ip y puerto de la mquina remota, y los dos segundos Compilamos nuestro programa que hemos llamado identicarn la direccin ip y puerto de la mquina syn-scan-bogus y lo ejecutamos. local... Esto ltimo debera pareceros interesante ;). occams@razor$ sudo ./synscan-bogus 192.168.100.1 443 \ En tercer lugar, obviamente, tenemos que utilizar una > 192.168.100.100 5000 funcin distinta para crear nuestro paquete. En esta ocasin le hemos dado el original nombre de tcp_pkt. Nada... Mi gozo en un pozo. Veamos que nos dice tcpdump

La funcin simplemente rellena la cabecera TCP con la mnima informacin necesaria para poder enviar el paquete. El puerto origen y destino, el ag SYN (ya os dije que era fcil), el checksum, que calculamos con la misma funcin que utilizamos para nuestro ping, y el campo doff que indica el desplazamiento dentro del paquete desde la cabecera tcp a la zona de datos en palabras de 32 bits (de ah lo de dividir por 4). Dicho de otra forma, contiene el nmero de palabras de 32bits que ocupa la cabecera TCP. S, ya, pero como el nombre del campo es do (Data Oset)... Podis probar que sucede si no inicializis correctamente este campo.

No hay grandes diferencias entre la construccin de un paquete ICMP y de un paquete TCP.

occams@razor:~$ sudo tcpdump -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 20:04:07.617606 IP 192.168.100.100.5000 > 192.168.1.100.443: S 0:0(0) win 0

Para terminar, hemos mejorado un poco nuestro bu- Bueno, el paquete sale, con las direcciones IP y puercle principal. Ahora mostramos informacin especca tos correctos y el ag SYN activo. Seguiremos el consejo del protocolo TCP (como por ejemplo los valores de de tcpdump, y activamos el modo verbose. los ags SYN y ACK) y hemos aadido un test sencillo occams@razor:~$ sudo tcpdump -nv 20:07:08.439772 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], para terminar la aplicacin. proto TCP (6), length 40) 192.168.100.100.5000 > 192.168.1.1.443: S, cksum 0x9ac4 Como enseguida comprobaris, el test para terminar (incorrect (-> 0x16e9), 0:0(0) win 0 la aplicacin no es completo. El test completo os lo OCCAMs Razor | 44

REVERSO TENEBROSO

Aj, nuestro checksum es incorrecto y el sistema remo- SEGUNDO INTENTO to simplemente tira el paquete, por eso no recibimos Con esta ltima modicacin del programa, repetimos ninguna respuesta. nuestra prueba. Ni cortos ni perezosos comprobamos el RFC 793, el que dene TCP. Una bsqueda rpida de la cadena occams@razor$ sudo ./synscan-tcp 192.168.100.1 443 \ 192.168.100.100 5000 checksum en el documento nos lleva a una detallada > [sudo] password for occams: Paquete desde 192.168.100.1:443 ACK:1 SYN:1 seccin que describe como calcularlo.

CALCULANDO EL CHECKSUM TCP


Leyendo detenidamente el RFC, podemos comprobar que nuestra funcin para calcular la suma de comprobacin del paquete es correcta, pero tenemos que aadir lo que el RFC llama una pseudo-cabecera. Vale, modiquemos nuestro escner. Lo primero que tenemos que hacer es modicar nuestras estructuras de datos. Aadimos una estructura para trabajar cmodamente con esta pseudo-cabecera, y modicamos PKT para que la incluya. Notad que no estamos enviando datos en nuestro paquete, as que simplemente podemos aadir la pseudo-cabecera a continuacin del la cabecera TCP. Las estructuras quedaran de esta forma.
typedef s tr u ct pseudo_header { unsigned long s r c ; unsigned long d s t ; unsigned char z e r o ; unsigned char p r o t o ; unsigned short l e n g t h ; } TCP_PHDR;

occams@razor$

Mucho mejor esta vez. Bueno, ya lo sabamos por eso le cambiamos el nombre al programa :). Simplemente para comprobar veamos que dice esta vez tcpdump
occams@razor:~$ sudo tcpdump -nv 20:40:36.509596 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40) 192.168.100.100.5000 > 192.168.100.1.443: S, cksum 0x16df (correct), 0:0(0) win 0 20:40:36.510083 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 44) 192.168.100.1.443 > 192.168.100.100.5000: S, cksum 0xb8ea (correct), 2921431349:2921431349(0) ack 1 win 5840 <mss 1460>

Ahora nuestros checksums son correctos, y recibimos la respuesta esperada desde la mquina remota, un paquete con los ags SYN y ACK activados.

CONTROL ABSOLUTO

Si observamos con detenimiento la informacin que nos proporciona tcpdump, veremos que hay un montn de datos en los paquetes que enviamos que a priori typedef s tr u ct { no podemos modicar. Datos como las direcciones IP s tr u ct t c p h d r tcp ; TCP_PHDR tcp_phdr ; o el TTL, se encuentran en la cabecera IP, la cual, } PKT; hasta el momento, hemos dejado que la manejara el sistema operativo. Ahora tenemos que actualizar nuestra funcin Pero eso se acab. Vamos a modicar nuestro escner tcp_pkt para que tenga en cuenta la pseudo-cabecera para poder controlar absolutamente toda la informaa la hora de calcular la suma de comprobacin. As es cin que nos muestra tcpdump. Para ello, tenemos que hacer algunas modicaciones adicionales en nuestro como quedara. pequeo programa.
int tcp_pkt (PKT p , char d i r _ d e s t , i n t p u e r t o d , char d i r _ o r i g , i n t p u e r t o o ) { p >t c p . s o u r c e = h t o n s ( p u e r t o o ) ; p >t c p . d e s t = h t o n s ( p u e r t o d ) ; p >t c p . d o f f = s i z e o f ( s tr u ct t c p h d r ) / 4; p >t c p . syn = 1 ; p >tcp_phdr . p >tcp_phdr . p >tcp_phdr . p >tcp_phdr . p >tcp_phdr . s r c = inet_addr ( d i r _ o r i g ) ; d s t = inet_addr ( dir_dest ) ; zero = 0; proto = 6; l e n g t h=h t o n s ( s i z e o f ( s tr u ct t c p h d r ) ) ;

Utilizando la syscall setsockopts podremos acceder a la cabecera IP


El primer cambio es que ya no necesitamos dos estructuras de datos para enviar y para recibir los paquetes. Ahora vamos a manejar la cabecera IP tanto en transmisin como en recepcin, as que solo necesitaremos la siguiente denicin.
typedef s tr u ct { s tr u ct i p h d r ip ; s tr u ct t c p h d r tcp ; TCP_PHDR tcp_phdr ; } PKT;

p >t c p . c h e c k = cksum ( ( unsigned char )&p >tcp , s i z e o f ( s tr u ct t c p h d r ) + s i z e o f (TCP_PHDR) ) ; return ( s i z e o f ( s tr u ct t c p h d r ) ) ; }

Observad que la pseudo-cabecera solo se utiliza para calcular la suma de comprobacin y no se enviar junto con el paquete, de ah que el valor que retorna la funcin es simplemente el tamao de la cabecera TCP, como en nuestro primer ejemplo.

Esta nueva estructura substituye a las anteriores PKT y PKT_RX. Mantenemos el nombre de la primera, porque mola y para tener que hacer menos cambios al programa. 45| OCCAMs Razor

REVERSO TENEBROSO

Adems, necesitamos decirle al kernel que no maneje las cabeceras por nosotros. Esto lo conseguimos activando la opcin IP_HDRINCL (IP Header Included... obviamente) de nuestro socket RAW. Esto lo hacemos en una nueva funcin que os mostramos a continuacin.
int cfg_socket ( int s ) { int val = 1; if ( s e t s o c k o p t ( s , IPPROTO_IP , IP_HDRINCL , &v a l , s i z e o f ( v a l ) ) < 0 ) p e r r o r ( " s e t s o c k o p t (IPHDRINCL ) : " ) ;

constantes para la mayora de los campos para mantener el programa pequeo. Vosotros podis modicar la funcin o aadir funciones adicionales para congurar esos valores. Aqu est la funcin.

return s ; }

Como hicimos en el ejemplo anterior, antes de meternos en los detalles de la generacin de los paquetes, vamos a ver como quedara nuestra funcin main. Solamente vamos a reproducir la primera parte de la funcin, en la que se enva el paquete, ya que el resto no necesita ningn cambio. De hecho, en esta primera parte solo vamos a modicar dos lneas.
i n t main int PKT PKT char s tr u ct ( i n t a r g c , char a r g v [ ] ) { s , data_size ; pkt ; syn ; tmp [ 1 0 2 4 ] ; so c k a d d r _ i n d e s t ;

int ip_pkt (PKT p , char d i r _ d e s t , i n t p u e r t o d , char d i r _ o r i g , i n t p u e r t o o ) { p >i p . i h l = 5 ; p >i p . v e r s i o n = 4 ; p >i p . t o s = 0 ; p >i p . t o t _ l e n = s i z e o f ( s tr u ct i p h d r ) + s i z e o f ( s tr u ct t c p h d r ) ; p >i p . i d = h t o n s ( 1 2 3 4 ) ; p >i p . f r a g _ o f f = 0 ; p >i p . t t l = 2 5 5 ; p >i p . p r o t o c o l = 6 ; p >i p . c h e c k = 0 ; p >i p . s a d d r = i n e t _ a d d r ( d i r _ o r i g ) ; p >i p . daddr = i n e t _ a d d r ( d i r _ d e s t ) ; }

Ms fcil no se puede. No vamos a explicar en detalle cada uno de los campos de la cabecera, para ellos os remitimos al RFC 791. Pero un par de ellos si merecen algn comentario. El campo TTL Time To Live indica el nmero de saltos mximo que el paquete puede dar a travs de s = crea_socket (IPPROTO_RAW) ; internet, antes de que algn router lo descarte. Este cfg_socket ( s ) ; campo es interesante por dos cosas. A saber. / Construimos p a q u e t e / d e s t . s i n _ f a m i l y = AF_INET ; La primera es que la utilidad traceroute utiliza este i n e t _ a t o n ( a r g v [ 1 ] , &d e s t . si n _ a d d r ) ; campo y la captura de mensajes ICMP para determid e s t . sin_port = htons ( a t o i ( argv [ 2 ] ) ) ; nar la ruta de un paquete. La utilidad va incremenmemset (&syn , 0 , s i z e o f (PKT) ) ; tando el campo de uno en uno, de forma que cada vez ip_pkt (&syn , a r g v [ 1 ] , argv [ 3 ] ) ; tcp_pkt (&syn , a r g v [ 1 ] , a t o i ( a r g v [ 2 ] ) , el paquete es descartado por un nodo ms lejano en argv [ 3 ] , a t o i ( argv [ 4 ] ) ) ; la ruta. Cuando esto sucede, el nodo que lo descarta ... enva un mensaje ICMP para comunicar la situacin. Estos mensajes son procesados por traceroute para Lo primero que podemos ver es que ahora estamos utimostrarnos la ruta nal del paquete. lizando como protocolo IPPROTO_RAW y a continuacin estamos llamando a nuestra nueva funcin para decir- La segunda es que el campo TTL es uno de los utilizale al kernel que nosotros proporcionamos las cabeceras dos por los sistemas de identicacin pasiva de sistema operativo, de tal forma que modicndolo el IDS IP (cfg_socket). se puede confundir un poco. En este caso concreto, podramos haber mantenido el PASSIVE FINGERPRINTING protocolo IPPROTO_TCP, pero IPPROTO_RAW es formalLos sistemas pasivos de extraccin de huellas dactilares mente ms correcto. (s, en ingls es mucho ms corto), analizan los paEl segundo cambio que observamos es la llamada a la quetes que una determinada mquina recibe e intentan funcin ip_pkt. S, efectivamente, esa es la funcin determinar el tipo de sistema que lo envi. Para ellos que rellena la cabecera IP. Como en la capa IP no utilizan campos como TTL, que por ejemplo, en los existen los puertos, no es necesario que se los enviesistemas Linux suele tener un valor de 64, y en los sismos. temas Windows 255, aunque eso depende de la versin. Sin grandes sorpresas hasta aqu. Le decimos al kernel Es muy fcil modicar este comportamiento, por lo que que nosotros manejamos las cabeceras IP, y aadimos los sistemas pasivos no son muy ables. Quizs el ms una funcin para manejarlas. conocido de estos sistemas es p0f .

GENERANDO CABECERAS IP
Como acabamos de contaros, la funcin ip_pkt es la encargada de rellenar la cabecera IP de nuestro paquete. Nosotros hemos incluido en el cdigo valores OCCAMs Razor | 46

El sistema de deteccin remota que proporciona nmap, por el contrario, es un sistema activo, puesto que enva paquetes especiales al sistema remoto con el n de extraer informacin adicional sobre l. Por supuesto, estos sistemas son mucho ms escandalosos..

REVERSO TENEBROSO

IP SPOOFING Y OTRAS MALDADES


Los otros dos campos que nos interesan son, por supuesto, las direcciones IP de origen y destino. Y s, nalmente ah estamos, esta es la forma de hacer IP spoong. Podemos poner cualquier valor en el campo de la direccin origen y eso es lo que saldr por el cable. Con el programa que hemos escrito, solo tenis que cambiar el tercer parmetro para enviar un paquete SYN con una direccin falsa. El problema de hacer esto es que la respuesta del sistema remoto se enviar a esa direccin y por lo tanto no la podris ver.

de red de la mquina que pretende suplantar, ya sea con un ataque DoS o utilizando un exploit.

Aplicar tcnicas de Blind IP Spoong hoy en da es prcticamente imposible

En estas circunstancias, es posible el secuestro de una conexin activa. El resumen es que es necesario conocer los nmeros de serie que van en cada paquete TCP y esto solo se puede hacer de dos formas. O vindolos directamente o adivinndolos, y esta ltima opcin hace muchos aos que dejo de ser viable. S, hace aos, los generadores de nmeros pseudoaleatorios utilizados para generar esos nmeros de serie no eran muy buenos (probablemente por cuestiones de eciencia), y haba formas de llegar a predecir esos nmeros de una manera relativamente sencilla. Sabemos que no hemos hablado sobre estos nmeros de serie, pero en los RFCs que hemos comentado a lo largo del texto podris encontrar una descripcin detallada de como se utilizan. Finalmente comentar que el IP spoong se suele utiliHay dos formas de sacar partido a esto del spoong. zar en ataques DoS no solo para ocultar el origen del La primera, es la que proporciona nmap con el ag - ataque, sino para, como en el caso de SMURF, proD (del ingls Decoy, seuelo). Esta opcin le indica a ducir efectos de ooding... Pero eso ya es tema para nmap que enve varios paquetes al sistema remoto que otro artculo. desea escanear. Todos ellos excepto uno tienen direcciones falsas, de forma que el sistema remoto tiene A PARTIR DE AQU... que comprobar todas las direcciones de los paquetes que recibe y, en general, va a ser bastante complicado En este artculo hemos explorado los fundamentos de determinar desde cual se est produciendo el ataque. los socket RAW y como utilizarlos para capturar trLa otra forma de sacarle partido al spoong es en el co o generar paquetes especiales. Con lo que os hemos secuestro de conexiones, que no deja de ser un caso contado tenis las herramientas para construir la maparticular de un ataque MIM (Man in the Middle. yora de las utilidades del sistema relacionadas con la Hoy en da es muy difcil hacer esto, a no ser que se red y jugar con la pila TCP/IP casi al ms bajo den una serie de condiciones, tan especcas, que la nivel. Qu podis hacer ahora?... Bueno, echadle un ojo al tcnica no resulta prctica. Estas condiciones son: chero /etc/protocols, donde encontraris una lisEl atacante tiene que poder capturar el trco ta completa de protocolos con los que podis jugar. de la comunicacin que desea interceptar. Eso Tambin deberais comprobar la pgina del manual reduce la tcnica a las redes de rea local, o al man 7 raw y si queris ir ms all man 7 packet... control de un router que no es algo sencillo. Como siempre, esperamos saber de vuestros experiEl atacante tiene que poder bloquear la conexin mentos!!

47| OCCAMs Razor

LA CACHARRERA

Tu propia webcam IR
Explorando el Infrarrojo cercano
por Chinao

uscando cosas gays por internet, nos encontramos una interesante pgina en la que cuentan como tunear tu webcam para convertirla en una cmara de infrarrojos (los recursos al nal del artculo). Nos pareci interesante, as que ni cortos ni perezosos nos pusimos a ello. Antes de que comencis a, quizs, destruir vuestra webcam, tenemos que decir dos cosas. La primera es que no nos hacemos responsables de cualquier dao ocasionado por seguir los pasos que se describen en este artculo. Es decir, si os cargis la cmara (la verdad que es difcil, pero podra llegar a pasar) es vuestro problema. La segunda es que antes de destrozarla, comprobis que realmente va a servir de algo. Para ello no tenis ms que conectar la cmara al ordenador, lanzar vuestro programa preferido para utilizarla, y coger cualquier mando a distancia que tengis por casa y que funcione con infrarrojos. Estos mandos suelen tener lo que parece un LED (y que efectivamente lo es :), en el extremo con el que intentis intimidar a vuestro equipo electrnico domstico. Normalmente, cuando pulsis cualquier botn, el LED parece no hacer nada, pero si apuntis a vuestra webcam y al pulsar el botn veis un punto brillante donde debera estar el LED... entonces s, es hora de cacharrear.

conocemos es la luz visible. Lo bueno de sta es que la podemos ver, como su propio nombre indica :). Esta radiacin se propaga, es decir, se mueve y llega hasta nuestros ojos como una onda (una onda electromagntica concretamente). Dependiendo de la frecuencia de esa onda (lo rpido o lento) que vare, veremos un color u otro. As, las ondas que tienen menor longitud de onda, es decir, que necesitan menos espacio para pasar de una cresta a la siguiente, son las que tienen mayor frecuencia (cambian ms rpido, o en menos espacio si lo prefers). Cuanto menor sea lo longitud de onda, ms azulado ser el color que percibimos, hasta que llega un punto, en el que nuestro ojo ya no es capaz de percibirlo. Los fotones de esa frecuencia que llegan a nuestra retina no pueden excitar las clulas que en ella se encuentra y por lo tanto ninguna seal llega al cerebro... estamos ciegos para esa longitud de onda!.

La radiacin infrarroja tiene una longitud de onda se encuentra entre 750nm y 1mm.
Como os decamos segn disminuimos la longitud de onda, los colores se hacen ms azulados, y en el punto en el que dejamos de percibirlo, lo que estaremos recibiendo es radiacin ultravioleta. Si por el contrario, aumentamos la longitud de onda (y por tanto disminuimos la frecuencia), los colores se hacen ms rojizos, hasta que llega un punto en el que ya no los podemos percibir. Estamos hablando de radiacin infrarroja. Por qu lo del infra y el ultra... muchos ya lo habris imaginado, estos nombres hacen referencia a la frecuencia y no a la longitud de onda. As que lo que est por debajo del rojo visible (menor frecuencia) se denomina infrarrojo, mientras que lo que est por encima del violeta visible se denomina ultravioleta :)

RADIACIN ELECTROMAGNTICA

La mayora de los sensores utilizados por las cmaras digitales (CCD o CMOS), por sus propias caractersticas, son sensibles a lo que se conoce como infrarrojo cercano. Y que es eso del infrarrojo?... mejor an, qu es eso del infrarrojo cercano?. Vale, pues, si hablamos con propiedad, de lo que tenemos que hablar es de radiacin infrarroja. La radiacin infrarroja, es una radiacin electromagntica, cuya longitud de onda se encuentra entre 750nm y 1mm. EL INFRARROJO CERCANO S, ya, o no os he contado nada nuevo, o os habis S, las radiaciones infrarrojas tienen frecuencias infequedado como estbais. Bien, vamos a explicarlo un riores a las del rojo visible, pero no todas las frecuenpoco ms. La radiacin electromagntica que todos cias inferiores a esta son radiacin infrarroja.

OCCAMs Razor | 48

LA CACHARRERA

Espectro Electromagntico (fuente Wikipedia)

Si seguimos bajando la frecuencia nos encontramos las microondas y ms abajo las frecuencias utilizadas por la radio y la televisin. S amigos, tenis dispositivos de alta frecuencia en vuestras cabezas XD. Bien, la cuestin es que la regin del espectro (esto es, todas las frecuencias posibles) que se considera radiacin infrarroja, est dividida en tres grandes grupos, que se llaman, respectivamente, IR-A, IR-B e IR-C. Con lo que nosotros vamos a jugar es con el IR-A, tambin conocido como infrarrojo cercano... os imaginis por qu no?. Efectivamente, porque es el que est ms cerca del espectro visible. S, los ms interesantes son los otros, los que se usan para guiar misiles y para obtener esas imgenes trmicas tan chulas que salen en las pelculas... pero efectivamente, hace falta algo ms caro que una webcam de 25 euros para jugar con esas cosas. As que ahora que tenemos una idea general de que es lo qu estamos haciendo... pues vamos a ponernos manos a la obra.

Accediendo al tornillo.

Por otra parte, con mucho cuidado, retiramos la carcasa gris azulada, de la parte frontal, ayudndonos de un destornillador o cualquier cosa que nos permita hacer palanca.

DESMONTANDO LA CMARA
Nuestra webcam es una Logitech Messenger. S, aprovechamos todo aqu en Occams... Que!, todava no os habis ledo el artculo sobre video vigilancia?... a qu estis esperando? Primer consejo, perded un poco de tiempo intentando descubrir que tenis que desmontar. Los tornillos suelen estar ocultos, porque son antiestticos y, por la ley de Murphy, nosotros empezamos quitando justo los que no necesitbamos quitar XD. Para poder desmontar esta webcam, tenemos que retirar una pequea tapa de goma que se encuentra en uno de los laterales de la esfera que contiene la lente. En el agujero que cubre encontraremos un pequeo tornillo que debemos retirar para poder acceder al interior de la cmara.

Quitando parte frontal.

Ahora ya podemos acceder a la cmara propiamente dicha, presionando el clip que une las dos mitades de la esfera. 49| OCCAMs Razor

LA CACHARRERA

Retiramos una de las mitades, la gua de luz para po- FILTRANDO LA LUZ der ver el LED de actividad desde fuera (un pedazo de Ooops!, no habamos dicho nada sobre esto. Bueno, lo plstico transparente), y ya tenemos nuestra cmara decimos ahora. Puesto que los sensores son sensibles al desnudo :). al IR cercano, las cmaras digitales traen incorporado un ltro IR, ya que de lo contrario... bueno, eso lo podris comprobar vosotros mismos ;). El objetivo de todo esto es sustituir ese ltro IR, por un ltro de luz visible, de tal forma que la cmara solo capte el IR cercano y no la luz normal. Como podis ver en la imagen, el ltro IR se encuentra (siempre para nuestro modelo), en la parte de la lente, sujeto a ella con una especie de pasta negra. Con un cutter eliminamos parte de esta pasta y quitamos el ltro.

Ya casi estamos.

El siguiente paso es desmontar la lente. En esta cmara (y al parecer en la mayora de las webcams), la lente se enrosca directamente sobre el sensor que captura la imagen. As que la giramos hasta que se separe del circuito. Ahora tenemos, por una parte, la placa de circuito impreso, con el sensor de imagen y la rosca para la lente, y la lente por la otra.

Filtro IR separado de la lente.

Efectivamente, ese cristalito rosado es el ltro IR. Que os esperabais, los ltros de luz son as. Tiene que ser transparente, para que pase la luz visible, y, pues eso, se llama infraRROJO por algo :).

Sensor de la webcam.

El ltro IR es un cristal rosado entre la lente y el sensor.


La gran cuestin ahora es como hacer un ltro de luz visible. La respuesta la sacamos de Internet, yo no tena ni idea la verdad, lo nico que tena claro, era que tena que ser algo oscuro. Pues nuestro ltro lo haremos con un negativo fotogrco velado... s, quin dira que algn da eso no sera tan fcil de conseguir eh?. Ojo, el negativo tiene que estar revelado y tendris que escoger una de esas partes oscuras que normalmente quedan al principio o nal del rollo. Para nuestro modelo de cmara, utilizamos un perforador de hojas que tiene aproximadamente el mismo dimetro que el oricio de la lente. Acoplamos la lente de nuevo y a ver que pasa.

La lente que acabamos de desenrroscar.

OCCAMs Razor | 50

LA CACHARRERA

Las pantallas TFT no se ven... pero la televisin es otra historia. De la TV no tenemos imgenes, pero las podis obtener vosotros mismos muy fcilmente.

Nuestro ltro de luz visible.

Nosotros probamos la cmara antes de volver a monSi buscis ms informacin sobre todo esto de las ctarla, pero vosotros haced lo que queris :). maras IR, os encontraris entradas sobre milagrosos ingenios para mirar a travs de las cosas. S, es que A JUGAR suenan as de raros. Bien, pues despus de todo este lo, vamos a ver que Lo que si es cierto es que al poder capturar la radianos permite ver nuestra nueva cmara IR. En las p- cin infrarroja, y eliminar las componentes del especginas web de los recursos podis ver varios ejemplos. tro visible, ciertos detalles de las imgenes se hacen Nosotros pondremos algunos ms aqu. ms evidentes. Lo primero que vamos a comprobar es que nuestro l- Por ejemplo, si miramos a este lpiz USB que utiliza tro de color funciona. Para ello, simplemente vamos una carcasa azul transparente, apenas podemos ver su a capturar una imagen multicolor y lo que esperara- interior, pero si ltramos el color (el azul en este caso), mos obtener sera la misma imagen pero sin colores... la supercie se vuelva prcticamente transparente, y que no en blanco y negro. Como podis apreciar en la podemos ver los chips en su interior. imagen, hay una sutil diferencia.

VISIN DE RAYOS X?

Parece funcionar bastante bien pero, normalmente, donde los ltros suelen tener problemas es en las denominadas frecuencias de corte. Para nuestro caso especco, esa frecuencia de corte se encuentra entre el rojo visible y el infrarrojo cercano. En la siguiente imagen utilizamos un puntero lser de esos de color rojo para comprobar que lo que acabamos de decir tiene un cierto sentido :P.

Lo mismo sucede con estas gafas de sol. Para ser sincero, las gafas que aparecen en la imagen son un poco cutres de estas de plstico, as que no podemos conrmar como funcionara con unas gafas de las buenas :). Observad el ojo de Don... no nos la volver a jugar en las partidas de pker.

Como podis ver en la imagen de la derecha, an cuando el color ha sido eliminado de la escena, la luz roja proveniente del puntero lser no es eliminada por nuestro ltro hecho con negativos fotogrcos usados... bueno, nadie esperara que fuera perfecto.

La razn de la popularidad de estas pginas es que supuestamente permiten ver la ropa interior. Lamentablemente nadie se ha ofrecido voluntario para ensear sus vergenzas en aras de la ciencia. 51| OCCAMs Razor

LA CACHARRERA

COSAS RARAS
Como os adelantbamos hace un momento, cuando eliminamos la radiacin visible de nuestras imgenes, los distintos materiales de nuestras ropas de muestran de diferentes formas. En general, el color desaparece, ya que normalmente se consigue utilizando un tinte que la nica propiedad del material que modica es precisamente el color. Finalmente, aqu podis ver mi cartera que esta un Aqu podis ver como convertimos una moderna e in- poco para ser retirada. Parece que las zonas mas desformal chaqueta de rayas, en un elegante traje blanco gastadas se resaltan en nuestra camara IR. :).

Lo mismo sucede con las plantas que en general se vern de color blanco, como podis observar en la si- LUZ INVISIBLE EN LA OSCURIDAD guiente imagen. Nuestro ltro de color elimina el ca- Y por supuesto, nuestro mando a distancia de la tele se racterstico color verde. convierte en una linterna que no da luz XDDDDD. Y es precisamente esta caracterstica la que resulta ms interesante desde el punto de vista de las aplicaciones de nuestra webcam IR.

Lo curioso de esto es que podemos hacer bonitas estampas invernales en pleno agosto :). Otra de las caractersticas de nuestra nueva cmara es que nos permite observar algunas de las medidas de seguridad incluidas en los billetes. En la siguiente imagen podis observar un billete de 5 euros y otros de 10.

Como en la mayora de los ejemplos anteriores, gran parte del color desaparece, pero la zona entorno al holograma, est impresa con una tinta especial (algo ms que simplemente color). En el caso particular de los billetes, resulta ms efectivo e interesante utilizar luz ultravioleta o luz negra como suele ser ms conocida. En la siguiente imagen podemos ver un billete de 50 y otro de 100 por ambos lados. Ntese como el nmero de serie y la cantidad se imprimen con una tinta especial. OCCAMs Razor | 52

Unas imgenes curiosas eh?... Pero muchos os preguntaris, y para qu sirve esto?. Bueno, adems de para quedarte con los colegas. La pregunta exacta que probablemente se os est viniendo a la cabeza es: Qu hace una gente tan discreta como los tos de Occams, con algo que solo sirve para chulear? Buena pregunta. Efectivamente, disponer de una cmara IR nos permite abordar algunos proyectos muy interesantes, sobre todo desde el punto de vista de los denominado MMI (Man Machine Interface o Interface Hombre Mquina). La primera y la ms obvia de estas aplicaciones es lo que los ingleses denominan tracking y que nosotros podemos llamar seguimiento.

LA CACHARRERA

TRACKING

Con un puado de LEDs infrarrojos, algunas resistencias y nuestra webcam IR podemos explorar este tipo Como os decamos, las aplicaciones ms interesantes de sistemas. y directas de este tipo de cmaras es el de los interfaces MMI. La ventaja ms importante... pues que la PANTALLAS TCTILES radiacin infrarroja es invisible para el ojo humano. Esto se traduce en que nuestra cmara va a capturar Otra aplicacin en la que podemos utilizar nuestra aunas imgenes totalmente oscuras con un pedazo de mante webcam IR es la construccin de una pantalla punto blanco all donde haya una fuente de luz infra- tctil multi-toque :)... si, como la Microsoft Surface y rroja. Como podis imaginar, esto hace prcticamente similares. trivial el localizar esas fuentes de luz IR en la imagen. Este tipo de pantallas se pueden construir de distinPara utilizar estas tcnicas, tenemos dos opciones fun- tas formas, pero una de ellas, bastante asequible padamentales. Hacer que la cosa que queremos seguir ra el acionado al cacharreo es la denominada FTIR que son las siglas de Frustrated Total Internal Reecemita luz IR, o que la reeje. En general si tenemos que seguir muchos puntos es tion. Podramos traducirlo por Reexin Interna Total mejor utilizar elementos que reejen la luz IR, de lo Frustrada, y enseguida veremos que el nombre tiene contrario habra que llenar el objeto a seguir (pensad cierto sentido. por ejemplo en un sistema de captura de movimiento Estas pantallas utilizan una supercie acrlica (un plstico), en cuyo interior se inserta luz infrarroja, de de personas para un juego) de cables y bateras. Si por el contrario, solo necesitamos un par de puntos forma que no es visible por el ojo humano. La luz inde referencia, por ejemplo para un dispositivo apunta- sertada rebota en el interior del material pasando de dor en un sistema de realidad virtual, un par de LEDs un extremo al otro. Si presionamos la supercie con, por ejemplo, nuestros y unas pilas harn el trabajo. dedos, la deformacin que producimos en la supercie, interrumpe el rebote de la luz IR en su interior y produce un efecto de dispersin... es decir, que se produce un puntazo IR... Ahora lo de reexin interna frustrada tiene ms sentido no? Todo este proceso es completamente transparente al ojo humano ya que la luz utilizada es IR. Pero paEste tipo de soluciones son utilizadas, por ejemplo, ra una cmara IR, esos puntazos que se forman al por el mando de la consola Wii (el denominado wii- presionar la supercie se pueden capturar y procesar mote), como parte de su sistema de posicionamiento. muy fcilmente. El mando incluye un acelermetro y una cmara infra- Otra tcnica bastante utilizada en la denominada Ilurroja los cuales, junto con una barra sensora permiten minacin Difusa (Diuse Ilummination). Existen dos calcular la posicin y orientacin del jugador. formas de utilizar esta tcnica, pero la que nos interesa a nosotros es la denominada Rear Diuse Illumination. El sistema se basa en colocar un difusor sobre la supercie tctil e iluminarlo con luz infrarroja. Cuan el usuario pulsa sobre la supercie su dedo reejara ms luz IR que la que reeja el difusor, de tal suerte que la cmara pueda detectar el punto correcto. El principal problema de esta tcnica es el conseguir una iluminacin uniforme en toda la supercie. El hecho de que sea multi-toque o no, va a depender del software que procese las imgenes y lo que ese La barra sensora est compuesta de dos grupos de software haga con los datos que obtenga. LEDs infrarrojos, separados una distancia conocida. Esto es todo. Esperamos que os haya gustado esta La cmara en el mando detecta estos dos grupos y el nueva seccin. procesador interno hace las matemticas :).

El wiimote utiliza una barra sensora con luz IR para calcular la posicin del jugador

RECURSOS
How to make a webcam work in infra red http://www.hoagieshouse.com/IR/ Pantallas Multitouch FTIR http://en.wikipedia.org/wiki/Total_internal_reflection#Frustrated_total_internal_reflection http://en.wikipedia.org/wiki/Multi-touch NUI Group Community Book - Multi-Touch Technologies http://nuigroup.com/log/nuigroup_book_1/

53| OCCAMs Razor

TECNOLOGA

Reconocimiento Biomtrico a Travs de la Cara


por Fernando Martn Rodrguez (fmartin@tsc.uvigo.es)

iendo ste un nmero dedicado a las tecnologas de seguridad no poda faltar un artculo de la serie biomtrica. Advertido queda que seguramente ser el ltimo... Ante lo que seguramente estar pensando la direccin de la revista digo que no, no me siento capaz de escribir sobre el reconocimiento a travs de voz. Hoy toca el reconocimiento a travs de imgenes de la cara.

cumplir... aparte de gemelos idnticos tambin hay pares de personas parecidas (ms probables en gente con parentesco pero no necesariamente). Permanencia: debe ser invariantes con el tiempo. La cagamos!! No hay rasgo biomtrico ms variable que la cara: barba, gafas, pelo largo o corto... Aparte de las diferencias (notables) que puede llegar a haber en la captura de imagen debidas a la postura frente a la cmara (pose), el gesto (sonrisa, enfado, bostezo ...). Pensad que en caso de usuarios malintencionados podremos tener casos de disfraz. Todo lo anterior, unido a que el nmero de imgenes que podemos tener almacenadas de la cara de alguien es limitado hace que ste sea uno de los rasgos biomtricos menos ables que se conocen. Cuanticacin: admiten medidas cuantitativas. S que las admiten... si no, no sera posible ni intentarlo y no estaramos escribiendo esto.

Fijaos que este es el mtodo que ms empleamos los humanos para reconocer personas. En el 99 % de los casos reconocemos a alguien al ver su cara, tambin reconocemos personas por la voz pero casi siempre vemos las caras antes de or nada. Ya puestos, comentar que el reconocimiento humano es muy able porque utiliza mltiples datos, esto es: vemos la cara pero tambin la silueta (la estatura, complexin...), omos la voz y tambin nos jamos en cosas muy difciles de medir para una mquina: los gestos, la forma de andar.... La suma de todos esos factores (una suma ponderada que hace el cerebro sin que lo notemos) da un reconocimiento muy able. Realmente ese mtodo (la redundancia) es el que usa el cerebro humano para casi todas sus tareas de reconocimiento.

El reconocimiento de caras es el mtodo ms utilizado por los humanos para reconocer personas

INTRODUCCIN
Para mantener la tradicin, empezaremos recordando las caractersticas que un rasgo debe cumplir para dar lugar a un buen sistema biomtrico y, ya de paso, veremos cmo se cumplen para las imgenes faciales. A saber: Aun a riesgo de repetirme, voy a copiar otra vez el cuadro comparativo de los diferentes sistemas biomtricos. Recordad que TFA signica Tasa de Falsa Aceptacin y es el porcentaje de veces que el sistema declara como iguales a dos individuos que no lo son, mientras que TFR es Tasa de Falso Rechazo y Universalidad: todas las personas deben poseer es el porcentaje de veces que dos individuos iguales el rasgo. Bueno, eso es cierto... por lo menos pa- son errneamente considerados diferentes. Fijaos que aunque dichas tasas pueden llegar a ser bajas (en exra personas vivas. perimentos muy controlados), la memoria y el tiempo Unicidad: no debe haber dos personas con el ras- requeridos son altos y la facilidad de engaar al sistego seleccionado igual. Aqu ya empezamos a no ma tambin.

OCCAMs Razor | 54

TECNOLOGA

Indicador biomtrico Huellas Retina Iris Cara Voz

TFR 3% Bajas Bajas Bajas Bajas

TFA 1 : 16 aprox. 0% aprox. 0% Bajas Bajas

Memoria (bytes) 100-1000 Poca 1024 bits >10,000 >1000

Tiempo respuesta Depende del sistema Bastante bajo Medio-bajo Alto(1:N) Bajo (1:1) Alto (1:N) Bajo (1:1)

Variabilidad intra-clase Media Muy baja Muy baja Muy alta Alta

Variabilidad inter-clase Alta Muy alta Muy alta Alta Media-alta

Implantacin en mercado 52 % <1 % 7,3 % 11,4 % 4,1 %

Facilidad de engao Media Baja Baja Muy alta Muy alta

Tabla 1: Principales caractersticas de algunos indicadores biomtricos. El conocido gur de la seguridad Bruce Schneier (inventor del algoritmo de cifrado Blowsh) escribi que era inviable el uso de un sistema de reconocimiento de caras en una aplicacin masiva como, por ejemplo, detectar sospechosos en un aeropuerto. Con una TFA tpica del 1 % signicara parar a una de cada 100 personas que pasen por delante de una cmara (y obligarles a identicarse utilizando un mtodo ms able, por ejemplo: colocando el ndice en un lector automtico de huellas). Si en Barajas (el aeropuerto de Madrid) hay casi 150.000 pasajeros al da (ese es el dato que encontr en Internet) tendramos que identicar a 1500 personas/da. Ojo!!! que no estamos contando a los que van a esperar a alguien... Adems, ser identicado por la polica para que resulte ser un error es algo bastante desagradable y que puede dar lugar a denuncias, quejas... Qu ocurrira en el aeropuerto de Chicago (ms de 250.000 pasajeros/da)? El reconocimiento de caras s es viable en grupos cerrados de pocos usuarios (control de acceso a un recinto o a un sistema informtico...) y es en esos casos cuando se obtienen buenos resultados en TFR y TFA. pudiendo haber sistemas que combinen ambas.

LOCALIZACIN POR COLOR


Una de las tcnicas ms empleadas para localizar caras es la deteccin de aquellos puntos de la imagen que tienen un color similar al de la piel humana. Este mtodo nos dar una serie de regiones con alta probabilidad de contener caras. Cada una de esas regiones (blobs) deber ser procesada posteriormente para determinar si realmente es una cara o no. Una aplicacin es, por ejemplo, buscar caras en una imagen compleja e impredecible (como las imgenes de una cmara de vigilancia). Para entender bien la localizacin por color debemos saber que la representacin habitual de los colores (R, G, B) no es la nica posible y se puede transformar a otras representaciones (espacios de color), todas ellas basadas en tres componentes. Una representacin muy interesante es la HSV que divide el color en tres nmeros: El tinte (Hue, H): es un ngulo y dene la posicin del color en un crculo que empieza en el rojo (ngulo 0) y que recorre todo el arco iris. El tinte es lo que coloquialmente llamamos color: rojo, naranja, verde . . . Otra cosa es que rojo sea intenso, brillante . . . La saturacin (Saturation, S): se mide entre 0 y 1 y es la pureza del color. Si compramos pintura roja debera ser rojo puro (saturacin 1 o rojo al 100 %). Si deseamos rebajar ese rojo, podemos mezclar la pintura roja con blanca e iremos logrando diferentes niveles de rojo, si tenemos 50 % de rojo y 50 % de blanco la saturacin ser 0.5. El brillo (llamado Value, V; a veces se le llama intensidad y se habla de sistema HIS): el brillo es la potencia del color o la iluminacin que proporciona. El color blanco es el ms brillante y el negro tiene brillo cero. Hace aos se usaban monitores verdes porque es un color que da gran sensacin de brillo para poco gasto en energa, las luces azules para estudiar usan la idea contraria (es un color que ilumina poco pero cansa menos la vista). 55| OCCAMs Razor

PREPROCESADO
Como en todo problema de reconocimiento de imgenes, primero debemos extraer la zona de inters. En el reconocimiento de caras se suele buscar una cara frente a la cmara, con los ojos en posicin conocida y de un tamao jo. Adems, deberamos normalizar el brillo de la imagen de forma que no haya variaciones grandes de iluminacin. Llegar a tener esa imagen a partir de lo que ha capturado la cmara es lo que llamamos preprocesado y es muy importante hacerlo bien para que el reconocimiento funcione. En imgenes capturadas de cualquier manera, esto es: las imgenes de una cmara de seguridad que apunta a un pasillo o a una cola de personas puede no ser posible hacer un preprocesado correcto.

Comenzaremos preprocesando las las imgenes


A continuacin describiremos dos tcnicas muy populares para localizar caras. Adems, no son excluyentes,

TECNOLOGA

Conde Pardo y yo mismo). S, s, lo he vuelto a hacer: me acabo de hacer autobombo. Lo podis descargar de http://webs.uvigo.es/gpi-rv/research-papers.html .

EL ALGORITMO DE VIOLA
Actualmente existe un mtodo capaz de detectar caras de cualquier tamao en una imagen blanco y negro. Fue diseado por Paul Viola y publicado en Rapid Object Detection using a Boosted Cascade of Simple Features, (autores P. Viola y M. J. Jones, publicado en 2001 en el congreso del IEEE sobre visin articial y reconocimiento de patrones: CVPR). Para este algoritmo disponemos de una implementacin de cdigo abierto (ver cuadro de recursos). Este cdigo es parte de la excelente biblioteca OpenCV (conjunto de algoritmos de visin articial donados por Intel al mundo): http://opencv.willowgarage.com/wiki/ . Uf, las multinacionales, a veces, tambin tienen su corazoncito :).

Crculo de Color. El ngulo polar determina el tinte, la distancia al centro la saturacin.

Para la piel humana. . . . El tinte es naranja!!! Qu ocurre si subimos mucho el color del televisor? No nos vemos naranjas porque la saturacin es baja.

El color vara mucho para los diferentes tipos de piel. La raza amarilla es la ms saturada. La raza negra tiene brillo muy bajo (y eso puede El algoritmo se basa en las llamadas Haar-like featuintroducir errores de redondeo en el clculo del res (caractersticas tipo Haar, que se llaman as porque se calculan de una forma parecida a una transtinte). formada llamada transformada Haar o wavelet de Para hacer un reconocedor serio debemos utili- Haar). Cada caracterstica es como un operador grazar reconocimiento de patrones. Esto es: tomar diente pensado para resaltar un patrn. Los patromuchas fotos de individuos con diferentes tipos nes son caractersticas como: contornos, lneas, crude piel y, de alguna manera, comparar la ima- ces. . . La imagen se recorre con una ventana a la que gen que tengamos a la entrada con las previas se le aplican varios clasicadores en serie, cada uno (conjunto de entrenamiento). ms complejo que el anterior, que usan las caractersEl sistema de color HSV es el ms intuitivo para ticas para conrmar o descartar la hiptesis de que estamos ante el objeto buscado (en este caso una cara este problema pero se utilizan otros. pero podra entrenarse para encontrar otros objetos). Para ampliar un poco estos conocimientos podis leer Si la hiptesis se rechaza en cualquier nivel, el proceso el sencillo artculo: Deteccin de Caras en Imge- no contina pero si se conrma tras todos los ltros nes Capturadas por Cmaras Web (autores: Patricia tendremos un objeto detectado.

El algoritmo de Viola se basa en la extraccin de caractersticas de tipo Haar

A: Imagen original. B: se ha aumentado la saturacin logrando resaltar la piel visualmente (y hacer evidente el tinte anaranjado). C: deteccin del valo facial utilizando colorimetra (se ha obtenido un blob del que se ha calculado un contorno poligonal: en verde, y una elipse de ajuste: en rojo).

OCCAMs Razor | 56

TECNOLOGA

Resultado de aplicar la funcin OpenCV. Ntese que hay un falso positivo.

Los patrones se consideran girados en varios posibles ngulos. Adems, el algoritmo puede ejecutarse a varias escalas para obtener objetos de diferentes tamaos o de tamao desconocido. Una vez que hemos localizado las caras en nuestra imagen, ha llegado el momento de reconocerlas. Se han probado muchas tcnicas para el reconocimiento facial. Aqu slo vamos a describir las dos ms extendidas.

ras tal que podamos representar cualquier cara como combinacin lineal de las caras de la base. Es ms: no nos vale cualquier base... queremos una base ordenada en importancia.

El PCA nos permite generar una base de vectores ordenada por importancia

ANLISIS DE COMPONENTES PRINCIPALES Quiero decir: el primer vector ser el ms importante,


el segundo ya ser menos importante pero ms que los siguientes... Una base con esas caractersticas concentra la informacin en los coecientes de los primeros vectores. Podremos llegar a decidir que, por ejemplo, los 50 primeros componentes son sucientes con lo que los otros (N-50, con N muy grande) los ignoramos. Si al representar una imagen con los 50 primeros coecientes obtenemos una distancia eucldea baja respecto de la imagen original: Esa imagen ser una cara. Si la distancia obtenida es grande, no ser una cara; ser otra cosa. Cmo se consigue lo anterior? Bueno. . . en cuatro palabras: utilizando lgebra de matrices (no me atrevo a decir que es lgebra avanzada pero puede desaar un poco los conocimientos olvidados del ingeniero medio). Suponiendo que nuestras caras son imge, tendremos un espacio total de dimensin El nombre de proyeccin en subespacios viene de la nes M xM 2 N = M . Tomando muchas caras podemos calcular teora matemtica que se utiliza: se trata de converuna matriz de autocorrelacin para esos vectores (que tir el conjunto de imgenes de caras en un subespacio resumir la estadstica de las caras). Ahora empieza vectorial (un subconjunto de un espacio mayor: el de lo fuerte: imgenes). Para realizar el anlisis debemos encontrar una base del subespacio, esto es: un conjunto de caEl anlisis de componentes principales (o PCA: Principal Component Analysis) se basa en representar las caras como combinacin lineal de ciertas caras bsicas (autocaras).Adems, conocemos cules son las autocaras ms importantes por lo que podemos quedarnos slo con ellas y descartar las dems. Los coecientes que permiten representar la cara de entrada sern utilizados como caractersticas para el reconocimiento. A esta tcnica tambin se le llama proyeccin en subespacios o tambin transformada de Karhunen-Love.

El proceso de reconocimiento hace uso de lgebra matricial

57| OCCAMs Razor

TECNOLOGA

La matriz de autocorrelacin ser denida positiva (esto es: todos sus autovalores son reales y positivos) lgebra) por lo que podremos construir una base ortonormal de autovectores (creroslo, es un teorema). Qu es una base ortonormal? Aqulla formada por vectores unitarios y perpendiculares entre s. Esa ser nuestra base. Los autovectores se les llama autocaras porque son eso: caras (que pueden combinarse para formar cualquier cara). La autocara ms importante es la asociada al mayor autovalor y as sucesivamente (ordenando los autovalores de mayor a menor tenemos ordenada la base).

de componentes debe ser vericado experimentalmente. Esto es: si implementis esto y no funciona tal vez haya que subir p. Otro mtodo es empezar con p muy grande e irlo bajando hasta que falle (funcionar/fallar signica que el conjunto de p autocaras representa bien las caras (pequeo error eucldeo).

Pensad que con todo esto hemos reducido la dimensin del espacio de caras de N = M 2 a p. Si M = 512 y p = 50 Cuando queremos reconocer una imagen lo primero es calcular sus coecientes para las autocaras seleccionadas. A eso se le llama proyectar sobre el subespacio de autocaras (de hecho, el coeciente para cada autocara es muy fcil de calcular, basta un producto escalar Una vez hecho esto habra que decidir cuntos entre la autocara y la cara de entrada). vectores retenemos y cuntos descartamos... un Despus podramos comprobar si la entrada es realindicativo puede ser el peso de los autovalores. mente una cara (calculando el error entre la cara reUna medida simple como: presentada por las autocaras y la cara misma). Si esa p N comprobacin es positiva (error bajo), ahora toca sai ) i )/( =( ber de quin es la cara... para eso, hay que comparar i=1 i=1 el vector de caractersticas de la cara de entrada (coeestima el peso de los p primeros autovalores res- cientes de la cara respecto a las autocaras) con los pecto del total: si es cercano a 1 el peso es vectores almacenados (procedentes de caras que quegrande. De todas formas, el nmero suciente remos reconocer).

PCA fcil
Para intentar hacer ms comprensible esto de los subespacios, permitidme un ejemplo muy simplicado. Supongamos que nuestras imgenes son de tamao 2x1 (eso s que es simplicar). Entonces las imgenes sern puntos del plano (gura de la izquierda).

El quiz de la cuestin es que no nos interesan todas las imgenes, slo queremos procesar caras. Siguiendo con nuestra simplicacin, si las imgenes de inters son puntos que aproximadamente estn situados sobre la misma recta (gura de la derecha); podremos hacer una simplicacin (creacin de una base de autovectores) que viene a ser un giro de ejes de forma que la primera componente quede en la direccin principal. Podemos despreciar la componente Y ? Yo dira que s. Adems, podemos saber fcilmente si un vector es del conjunto: si la representacin eliminando Y comete un error pequeo NO?

OCCAMs Razor | 58

TECNOLOGA

Ejemplo de un conjunto de autocaras. La autocorrelacin se hace restando la media a cada muestra por lo que debemos tenerla tambin.

Aqu se pueden usar muchas tcnicas pero la ms simple (y una de las ms efectivas) es la del vecino ms prximo. Esta tcnica consiste en calcular distancias entre los vectores de caractersticas (eucldea o norma 2, norma 1...) y considerar como resultado reconocido, el patrn almacenado ms prximo al de entrada. Ojo!!! puede haber varias muestras por individuo a reconocer.

cas del entorno del punto, adems los ltros Gabor tienen una orientacin que hace que sean sensibles a las variaciones con determinado ngulo. Aplicando los ltros en mltiples direcciones podemos calcular una especie de vector gradiente que nos permita mover el nodo en la direccin deseada.

la localizacin de los puntos duciales de la cara es ms compleja de lo que parece en la TV


Una vez ajustadas las mallas, los sujetos se comparan mediante una medida de similitud que tiene dos trminos: la similitud entre los vectores de textura de cada nodo y la similitud por deformacin de cada malla.

Proyeccin en subespacio de caras.

TCNICAS DE REPRESENTACIN CON MALLAS DEFORMABLES


La idea de este mtodo es colocar una mscara deformable sobre la cara (con forma de red o malla) y ajustarla para que los nodos de la malla coincidan con puntos importantes como los ojos, nariz. . . (puntos duciales). Este mtodo es la versin informtica del mtodo que hemos visto muchos en televisin: encontrar caractersticas como la distancia entre los ojos, la posicin de la punta de la nariz. . . La base matemtica del mtodo es aplicar ltros de Gabor en cada nodo y utilizar las respuestas obtenidas para ir ajustando la malla hasta que est colocada sobre los puntos deseados. Como vimos en el captulo de las huellas el ltro de Gabor extrae caractersti-

Representacin con mallas deformables (mtodo EBGM: Elastic Bunch Graph Matching.

TRABAJOS DE LA ETSET VIGO


En nuestro centro, el profesor Jos Luis Alba (jalba@gts.tsc.uvigo.es) y varios colaboradores llevan algn tiempo trabajando en el reconocimiento a travs de caras. Dichos trabajos forman parte de una lnea ms amplia dedicada al reconocimiento biomtrico en general. 59| OCCAMs Razor

TECNOLOGA

Originalmente slo se trabaj con reconocimiento por voz (reconocimiento de locutores) y posteriormente se aadieron los reconocimientos de caras, iris y huellas. Actualmente, se est desarrollando un sistema de vericacin multimodal (voz y cara) para acceso a servicios a travs de Internet. Esta lnea de investigacin se sigue en cooperacin con otros grupos de trabajo europeos en el seno de la accin

COST275: Biometrics-Based Recognition of people over the Internet. Adems, estos estudios reciben nanciacin a travs de proyectos del Ministerio de Educacin y de la Xunta de Galicia y parten de un sistema ya desarrollado previamente con fondos pblicos en el que se utilizaba reconocimiento de voz para acceder a un buzn de correo por lnea telefnica (http://www.gts.tsc.uvigo.es/telcorreo/).

RECURSOS
Aalgoritmo de Viola
http://en.wikipedia.org/wiki/Robust_real-time_object_detection http://www.cmucam.org/wiki/viola-jones

Librera OpenCV
http://opencv.willowgarage.com/wiki/ http://sourceforge.net/projects/opencvlibrary/

Recursos en ETSET Vigo


http://www.gts.tsc.uvigo.es/telcorreo/

OCCAMs Razor | 60

TRUCOS

Con un par... de lneas


Chuletillas para hacer cosas m rpido
por Tamariz el de la Perdz

GDB CON INTERFAZ MAS AMIGABLE


El depurador de GNU gdb, proporciona un interfaz ms amigable, si es que eso es posible. Para echarle un ojo, solo tenis que utilizar la opcin -tui (algo as como Text User Interface). Lo que obtendris es algo como esto:

HELPDESK CON SCREEN


Seguro que alguna vez habis estado al telfono un montn de tiempo dictando comandos a alguien en el otro lado. Al mismo tiempo, vuestro interlocutor os va diciendo que es esa cosa que hace que no le funciona (porque falta un espacio, porque no ha pulsado ENTER, ...). La utilidad screen puede hacernos la vida ms fcil en estas situaciones. El modo multiusuario nos permite conectar dos instancias de screen, de forma que podremos ver lo que el otro usuario escribe y nuestro cliente podr ver que es lo que nosotros escribimos. Para conectarnos a una sesin screen en modo usuario, slo tenemos que utilizar el ag -x, al invocarlo.

VARIAS IPs
La forma ms sencilla de congurar varias IPs es disponiendo de varios interfaces de red. Si no tenemos Os adelantamos que, este interfaz se suele ir a paseo varias tarjetas podemos utilizar alias. Esta es la foren cuanto nuestro programa empieza a escribir cosas ma de denirlos. en la consola. Si necesitis algo todava ms amigable # ifconfig eth0:1 192.168.100.1 netmask 255.255.255.0 podis probar cgdb. El comando anterior crea un alias de nuestro interfaz eth0, llamado eth0:1 con la nueva conguracin de red. Notad que esto es solo un alias y no podis utilizarlo, por ejemplo, en las reglas de vuestro rewall. Para conguraciones ms complejas disponis de otras alternativas como las VLAN (ya hablaremos de ellas en otra ocasin).

PRODUCE VIDEOS DESDE TU WEBCAM


Solo tenemos que escribir esta lnea:

DEPURANDO CON GDB Y LIBTOOL


Si utilizis la autotools de GNU para compilar una aplicacin que incluye libreras dinmicas, habris ob- Y tener instalados los paquetes apropiados (mplayer, servado que el supuesto ejecutable que generan las he- mencoder, mpeg, libavcodec). rramientas, es realmente un script. Si intentis utiliEnva tus trucos zar gdb con ese script, obviamente, solo conseguiris Puedes enviarnos esos trucos que usas a diario para un bonito mensaje de error. compartirlos con el resto de lectores a la direccin: Para poder depurar nuestro programa, tenemos que utilizar libtool de la siguiente manera. occams-razor@uvigo.es
$ libtool --mode=execute gdb ./mi_ejecutable $ mencoder -tv driver=v4l -ovc lavc -o movie.avi tv://

61| OCCAMs Razor

DESAFO

Un Desafo Criptogrco
por Fernando Martn Rodrguez (fmartin@tsc.uvigo.es) Despus de escribir el artculo sobre criptografa me entraron unas ganas irresistibles de ponerme a inventar mtodos. Hablando con el director de la revista se nos ocurri esta idea: publicar un desafo. Esto es, lo que sigue es un algoritmo de criptografa de nuestra invencin. Tan pblico va a ser que os vamos a dar el cdigo fuente. Despus va un criptograma y se trata de descifrarlo... sin saber la clave claro. En el prximo nmero se publicar la solucin y los nombres de todos aqullos que hayan enviado soluciones vlidas. Para enviar una solucin, enviad un correo a occams-razor@uvigo.es con: Nombre completo. Criptograma descifrado. Valor de la clave. Una explicacin breve de lo que hace el mtodo y de cmo lo habis atacado. nimo, con las pistas dadas, no es difcil. El cifrador son dos funciones de matlab... ah van (sin comentarios): Funcin principal:
function c r i p t o g r a m a = C i f r a r T e x t o ( l l a n o , c l a v e ) r a i z = f l o o r ( sqrt ( c l a v e ) ) ; r e s t o = c l a v e r a i z ^ 2 ; N = length ( l l a n o ) ; f o r i =1:N, [ r a i z , r e s t o , d i g i t o ] = D i g i to D e c i m a l R a i z C u a d ra d a ( r a i z , r e s t o ) ; c f r = l l a n o ( i )+ d i g i t o ; i f c f r >90 c f r = ( c f r 91)+65; end criptograma ( i ) = char ( c f r ) ; end

Funcin auxiliar:
function [ r a i z , r e s t o , d i g i t o ] = D i g i to D e c i m a l R a i z C u a d ra d a ( r a i z 0 , r e s t o 0 ) % Obtener e l s i g u i e n t e de c i m al de una r a i z cuadrada resto1 = resto0 10; resto2 = resto1 10; aux1 = 2 r a i z 0 ; d i g i t o 0 = f l o o r ( r e s t o 1 / aux1 ) ; for cont = d i g i t o 0 : 1:0 , aux2 = aux1 10+ c o n t ; aux3 = aux2 c o n t ; r e s t o = r e s t o 2 aux3 ; i f ( r e s t o >=0) d i g i t o = cont ; break ; end end r a i z = r a i z 0 10+ d i g i t o ;

Aviso!!! No he encriptado los nombres de las funciones ni de las variables. No os doy el programa que hace el descifrado. Podrais crearlo? Y ahora el criptograma: DWSGNGGJBVVPIWYXXKJSGHVLLPXVHQYWYAJBTLEDNLAROLXTBGINPFZYJRPXUMUFCVCJTMXRDKXIFUXRW Por ltimo, para comprender totalmente el mtodo estara bien leer esto: http://platea.pntic.mec.es/anunezca/ayudas/algoritmo_raiz/algoritmo_raiz.htm OCCAMs Razor | 62

También podría gustarte