15 enero 2013

Saber romper medidas de seguridad no hacen que seas hacker, al igual que saber hacer un puente en un coche no te convierte en un ingeniero de automoción

Eric S. Raymond

Y finalmente, después de esta larga pausa tras el penúltimo artículo de la saga y gracias a los pedacitos de tiempo que he podido reunir entre jálogüins, fines de semana, navidades y festividades varias, por fin, el cierre de estos seis artículos sobre infección.

No sería honesto decir que no me lo he pasado mejor escribiendo los códigos que aprovechaban estas vulnerabilidades que pensando en cómo cerrarlos. El hecho de tener que escribir algo que se escapa a la idea general de programa, en la que tienes un conjunto de instrucciones que deben satisfacer el aburrido fin de contentar al usuario, es siempre atractiva. Sin embargo, la meta ha estado clara desde el principio: más allá del divertimento individual hay un interés general que prima sobre todo lo demás por protegernos de una amenaza que es clara. Y terminaré esta saga desmontando (o al menos, enseñando a desmontar) todos los trucos que he utilizado para introducirme dentro de un binario, tomar el control y pasar desapercibido.

Este artículo se centrará principalmente en dos puntos: qué debemos hacer para protegernos de estos ataques por un lado y, por el otro, cómo detectar si hemos sido realmente atacados. Comenzaré por la primera, pues como todos sabemos -y todavía más en este mundo de jefes poco comprensivos con graves problemas a la hora de asimilar explicaciones- más vale prevenir que curar.

Medidas preventivas
Un día, cierto usuario despreocupado (y orgulloso, a la par que seguro de sí mismo usuario de una flamante Ubuntu versión algo punto diez) se encuentra desayunando tranquilamente, pensando en lo que mola Linux porque no hay virus. Pero, pobre de él, ahora hasta el vecino usa Ubuntu. Y desgraciadamente, un día, en algún espacio dedicado a noticias sobre tecnología en la tele, anuncian que ¡oh, imposible! un virus llamado Linux.RimmedGlasses.B (no, no existe realmente) amenaza la delicada sensación de dominio intelectual de nuestro querido usuario sobre los pobres no-conversos Windowsers expuestos a los peligros de la red.

Es el momento de bajar al mundo real.

Linux ha sido históricamente más seguro que Windows, pero esto es realmente una consecuencia de, entre otras, cómo se estructura el sistema y de que ciertas prácticas que en Windows favorecen mucho la infección, en Linux sencillamente no se da(ba)n. Además de que, cómo no, un sistema operativo que se usaba tan poco no era un blanco tan popular como el sistema de Microsoft.

Sin embargo, los tiempos cambian. En otros tiempos, la usual seguridad de Unix residía en que si no eres root, no eres nadie. Los usuarios que compilaban software para instalarlo en el sistema eran muy contados (en gran medida, sólo root, detrás del cual solía haber un administrador de sistemas responsable y medianamente preparado). Hoy por hoy, quien piensa en Unix piensa en Linux. Y quien piensa en Linux piensa en esa abrumadora masa de usuarios de una distribución de escritorio, susceptibles de caer en la tentación de añadir repositorios extrañísimos a las fuentes del apt, a bajarse código de todas partes, compilarlo ellos mismos y ejecutar un buen sudo make install para dejarlo a la vista de todos los usuarios (que en la práctica se reducen a un usuario con su nombre de pila en minúsculas y a root). Incluso, fíjense en lo que les digo, meter un peligrosísimo NOPASSWD en el sudoers. Dicha seguridad histórica de Linux queda en entredicho cuando introducimos al usuario corriente en la ecuación.

Esto ha abierto un montón de vías de ataque que antes, simplemente, no existían. Por eso, antes de continuar, me gustaría resumir algunas ideas que son de perogrullo, pero está bien tener en una lista aunque sea sólo por si nos olvidamos de alguna.

  1. root no es un usuario de andar por casa. Es más, no se debería poder iniciar sesión como root jamás (debería dejarse bloqueada con un asterisco en el campo contraseña de /etc/shadow) ya que esa no es la función de la cuenta de administrador. 
  2. sudo es muy cómodo, pero también es un tremendo agujero de seguridad si no se configura adecuadamente. Los tres puntos de los que nos advierte esta herramienta cuando no la tenemos configurada deberían tomarse más en serio. En resumidas cuentas, nunca configurar para que sudo no pida contraseña.
  3. Los repositorios de software (sean los del apt, yum, o los que correspondan), siempre de fuentes de confianza y firmados.
  4. El mejor binario es el que te compilas tú mismo. Eso sí, lo dicho, ojo con qué compilamos y de dónde lo sacamos. Desconfiar de cualquier enlace (web) que apunta directamente a un ejecutable. Lo mismo con los scripts.
  5. Ciertos directorios deberían poder leerse (o escribirse) sólo por root. Nunca relajar los permisos de directorios del sistema sólo porque nos sea más cómodo de administrar desde el usuario corriente.
  6. Continuando con el tema de los permisos, el permiso de ejecución (modo +x de los archivos) sólo debería estar activo para directorios y ejecutables que vengan con el sistema o hayamos compilado nosotros mismos. Tener particiones de Windows con este permiso de ejecución activado por defecto no es buena idea, debemos montar siempre con noexec.
  7. La variable de entorno PATH nunca debe tener el directorio de trabajo (.) en la lista. Nunca jamás. Los ataques companion han sembrado muerte y destrucción durante los ochenta y los noventa en los sistemas tipo DOS precisamente porque los programas se buscaban primero en el directorio de trabajo, y después en la ruta de búsqueda. Dejemos el pasado pasar.
  8. La variable de entorno LD_PRELOAD debería tener sólo aquello que sabemos para qué sirve. 

Teniendo todo esto en cuenta, y sabiendo que aquello que queremos proteger son nuestros binarios de una modificación no deseada (bonito eufemismo), hablaré un poco de las herramientas más populares destinadas a este fin, ventajas e inconvenientes. Algunas de ellas son IDS pensados sólamente en detectar qué ficheros son modificados (he obviado los diplodocus de la detección de intrusiones como OSSEC), no vamos a matar moscas a cañonazos.

bsign
bsign es una herramienta de firmado y verificación de ejecutables (ELF) mediante en espacio de usuario que funciona sobre GPG (esto quiere decir que, técnicamente, podríamos utilizar cualquier tipo de clave soportada por GPG), por lo cual vamos a necesitar una clave privada lista para este fin. Esta herramienta puede encontrarse en las principales distribuciones de GNU/Linux, es verdaderamente fácil de usar y para lo que nos interesa sólo se reduce principalmente a dos casos de uso, a saber: firmar y verificar.

Para firmar:

% bsign --sign ejecutable

Acto seguido nos pedirá la contraseña de nuestra clave privada (si la tenemos configurada, cosa que yo recomiendo), y listo, el binario está firmado con un chorro de bytes al final del mismo conteniendo la suma de comprobación cifrada de lo que acabamos de firmar.

Para verificar la integridad, bastará con llamar a :

% bsign --verify ejecutable

Yo recomiendo firmar con claves RSA en lugar de con DSA, básicamente porque es más rápido.De hecho, GPG computa firmas RSA como diez veces más rápido que DSA.

bsign devolverá un mensaje indicando el estado de comprobación, así como un valor de retorno (que podríamos examinar mediante la variable del shell $?) que será 0 si la comprobación ha ido bien, o distinto de cero -en realidad, un código de error- si ha fallado. Podemos leer la página de manual de bsig para poder darle un significado a estos códigos de error si nos interesa integrar esta utilidad en algún programa más grande.

Como ya dije, la gran ventaja de bsign es que es muy fácil de usar, su principio de funcionamiento es igualmente fácil de comprender y fácil de integrar. Los únicos fallos, si es que merece la pena mencionarlos como tales, son que sólo soporta ELF (cosa que hoy por hoy no es problemático, ya que la práctica totalidad de binarios nativos de GNU/Linux son ELF) y que es una herramienta de espacio de usuario. Es decir, no podemos proteger nuestro sistema globalmente con bsign de una forma directa, habría que llamar a bsign antes de cada ejecución.

Este último problema estuvo (que ya no está) solucionado gracias al proyecto del que hablaré a continuación. En sí no tiene gran utilidad, pero quién sabe, quizá anime a alguien a retomarlo ;)

DigSig
DigSig fue un proyecto que pretendía llevar a nivel de núcleo las comprobaciones de integridad de binarios firmados con bsig, pero que desgraciadamente dejó de mantenerse en 2009. La idea era un módulo del núcleo que a cada ejecución buscaba una firma de tipo bsig, la validaba y decidía si debía ser ejecutado o no.

He intentado compilar DigSig bajo un kernel 3.3, pero las cosas han cambiado mucho en el kernel de Linux desde 2009 (en realidad sólo lo suficiente para estropearme la compilación). De todas formas, se echa de menos algo como DigSig para este sistema operativo. Algún avispado programador debería darse cuenta de esta necesidad y retomarlo.

Tripwire
El problema de bsign es que se trata de una herramienta de firmado y verificación de ejecutables ELF que debemos ejecutar sea manualmente, sea formando parte de un proyecto más grande. Tripwire viene a proporcionar todo un sistema de control de integridad orientado a la detección en lugar de la prevención. Según su página de manual, Tripwire compara los archivos y directorios del sistema contra una base de datos previamente construida (por lo tanto, lo hace completamente inútil ante un sistema ya atacado) mediante la cual puede encontrar modificaciones, borrados, cambios en los atributos, etcétera.

El problema de Tripwire es que es un producto comercial. Sin embargo, si nuestra intención es vigilar una sola máquina (o conjunto reducido de ellas), sin control ni generación de informes centralizados, podemos descargarnos la versión libre (en código fuente y GPL) directamente de SourceForge.

Asumiendo que la compilación ha ido bien, durante la instalación nos pedirá las contraseñas con las que se protegen las claves de sus bases de datos, y llegará esa divertida fase de configuración y puesta en marcha :P

Tripwire se basa en un fichero de políticas binario y cifrado que se genera a partir de una plantilla en texto plano (que en mi sistema se encuentra en /usr/local/etc/twpol.txt), el cual contiene una lista de todos los ficheros (y directorios) que están bajo control y las propiedades (permisos, hash, fechas de modificación, etc) que no deberían modificarse. Por defecto este archivo es amplísimo, y posiblemente nos interese suprimir la mayoría de las reglas para hacer un control más centralizado. Una vez modificado este archivo, bastaría con ejecutar:

% sudo twadmin -m P /usr/local/etc/twpol.txt

Para generar de nuevo las políticas a partir de la plantilla, y:

% sudo tripwire -m i 

Para regenerar la base de datos. Nótese que twpol.txt es sólo una plantilla, no es algo que Tripwire utilice directamente, por lo que podríamos borrarlo (o moverlo a otra ubicación) una vez generadas las políticas.

Podríamos obtener un informe detallado de las violaciones de acceso sobre los archivos vigilados con:

% sudo tripwire -m c

Comando que podríamos introducir en el crontab para enviar estos informes periódicamente por correo a la cuenta de administrador, por ejemplo.

El problema de esto es que necesitamos conocer todos los ejecutables (o directorios donde se encuentran) para que Tripwire sea algo verdaderamente efectivo. Sin embargo, el hecho de poder contar con un fichero de texto en el que podamos especificar una lista de ficheros a estudiar sin tener que modificar los binarios y además poder generar informes más o menos comprensibles lo hace ya superior a bsign.

AIDE
El Advanced Intrusion Detection Environment (AIDE) se presenta como otra herramienta de tipo IDS dedicada a vigilar archivos del sistema de una manera muy similar a como lo hace Tripwire: existe un fichero con reglas para los ficheros vigilados, y una serie de herramientas para manipular y visualizar la base de datos.

La gran desventaja de AIDE respecto de Tripwire es que a diferencia de este último, AIDE no encripta la base de datos (aunque puede comprimirla). Sin embargo, ganamos a cambio mayor facilidad a la hora de instalarlo y ponerlo en marcha, ya que, por ejemplo, no hace falta compilar el equivalente del fichero de políticas.

De nuevo, tenemos dos casos de uso principales, inicializar la base de datos:

% sudo aide -c ruta/al/fichero/de/configuracion.conf --init

Y generar un informe:

% sudo aide -c ruta/al/fichero/de/configuracion.conf --check

El cual podríamos generar periódicamente y enviar por correo de la misma manera que haríamos con Tripwire.

Hay más comandos, como comparar dos bases de datos, actualizar la existente, etc. Un aspecto interesante de AIDE es que puede trabajar (y de hecho, espera trabajar) por separado con dos bases de datos diferentes. Esto nos podría permitir tener una base de datos de referencia en un sistema de ficheros de sólo lectura mientras podríamos generar una base de datos con la situación real del sistema en otra ubicación, pudiendo comparar ambas fuera de la máquina, etcétera.

Mi humilde opinión
Yo soy, personalmente, partidario de soluciones a nivel de kernel tipo DigSig. AIDE, Tripwire y bsig sólo nos van a avisar si los archivos bajo vigilancia han sido comprometidos. Y puesto que no podemos hacer un chequeo completo de todo el sistema cada dos por tres, habrá una ventana de tiempo entre la infección y la verificación en la que nuestro atacante podría haberse hecho con información valiosísima. Por ejemplo, supongamos que el código infectado busca tocar ssh o las propias bibliotecas pam y monitorizar el teclado. El daño ya estaría hecho si durante ese tiempo consiguió hacerse con alguna clave importante y enviársela al atacante. ¡Sería incluso peor si hablamos de un sistema con varios usuarios!

Ya que DigSig está en coma, y lo demás me deja el miedo en el cuerpo, yo ofrezco la siguiente idea: que el binario se autoverifique al principio. Si las cosas no encajan, el binario rechaza ejecutarse, lanza un aviso y fin de la amenaza. En función del binario, esto podría tener un efecto más o menos catastrófico en el sistema, pero al menos sabríamos que hay un problema antes de la propia explotación del mismo.

La prueba de concepto se llama spintop: un archivo fuente en C que compilado con el resto de un proyecto (esperablemente mayor) se encargará, antes de ejecutarse el main, de comprobar que hay una firma válida tipo bsign en el binario desde el que se ejecuta. A la hora de incluir esto en un proyecto, debemos tener en cuenta que:

a) Hay que definir una macro SPINTOP_TRUSTABLE_FINGERPRINT con una cadena conteniendo el fingerprint en mayúsculas de la clave con la que firmamos y
b) Que hay que que compilar contra GPGME, preferiblemente contra la versión estática de la biblioteca.

He intentado escribir esta prueba de concepto con la menor cantidad de llamadas a funciones externas posible (aunque me ha quedado malloc en el tintero) y definiendo todas las funciones como static. Con todo esto, consigo que la cosa funcione incluso para binarios que no dependan de la biblioteca estándar de C (cosa rara, pero nunca se sabe) y sobre todo, para complico a un posible atacante el asunto de hookear las llamadas que spintop podría necesitar para alterar su funcionamiento. Siendo un código más o menos "autónomo", el manipular spintop se hace más difícil. Evidentemente, esto requiere un estudio mucho más serio.

Cuando se compila un binario con spintop y no hacemos nada más, recibiríamos un mensaje como el siguiente:


% ./myprogram 
spintop warning: binary is not signed (yet). Use bsign(1) to generate a signature before running it.
%

Es normal, ya que no lo hemos firmado. Suponiendo que tenemos bsign configurado, sólo nos quedaría firmarlo:


% bsign --sign ./myprogram

Enter pass phrase: ***
%

Y al ejecutar todo iría sobre ruedas. Aunque bueno, eso ya dependería del binario en cuestión :P


% ./myprogram             
LOOK MOM, I'M A PROGRAM AND I'M DOING THINGS LIKE ASKING
THE USER FOR STRINGS WITH gets() HURRR DURRR AM I COOL YET?
GIMME YOUR NAME: fulanito
LOL K, YOUR NAME IS fulanito
%

Si nos atrevemos a modificar un byte, sólo un byte, incluso añadiendo algo al final sin tocar el resto:

% echo -n a >> myprogram 
% ./myprogram        
spintop error: MODIFIED BINARY DETECTED (Bad signature)
spintop error: SOMEBODY CALL DE COPS
%

Y habremos prevenido la ejecución de algo potencialmente peligroso. Eso sí, si nuestro código malicioso de ha enganchado al punto de entrada, no habremos podido evitar la ejecución del mismo, pero al menos habremos impedido que manipule el resto del programa en tiempo de ejecución.


Y para terminar, hablemos de estadística
En los artículos anteriores hemos revisado diversas técnicas de infección. Hemos visto que, como todo en esta vida, tiene sus putos fuertes y sus puntos débiles. En general, nuestros métodos de infección tocaban partes del ejecutable que, si bien no son críticas o al menos su modificación se hacía de forma que pasase desapercibida, hacía del ejecutable infectado algo particularmente especial. Por ejemplo, la información de PT_NOTE suele ser prescindible, pero es muy raro encontrar un binario que no la defina.

Nuestra meta en este punto es evaluar hasta qué punto estos binarios "especiales" se dan realmente en un sistema Unix, y justificar la existencia de una heurística que permita aventurarnos a alertar de la posibilidad de una infección. La idea es revisar todos los métodos de infección y activación que hemos visto hasta ahora, y averiguar si realmente dichas modificaciones pueden pasar desapercibidas, ignorando por completo el código que hayamos inyectado.

Para esto, revisaremos la estructura de algunos miles de binarios ELF ya no de una sola arquitectura (como llevamos haciendo con las pruebas de concepto hasta ahora), si no de unas cuantas más para situarnos en un escenario un poco más realista, y de paso, gozar de más y más variados ficheros. Los sistemas donde se ha realizado este estudio han sido:

- Ubuntu 12.04, i386 (9160 binarios)
- Ubuntu 12.04, x86_64 (2045 binarios)
- Debian Squeeze, x86_64 (941 binarios)
- Solaris 10, UltraSparc IIe (12163 binarios)
- Debian testing, x86_64 (1825 binarios)
- Debian Sequeeze, i386 (3152 binarios)
- Ubuntu 10.04, i386 (2442 binarios)

El análisis ha sido automatizado gracias a una pequeña herramienta (elfprobe) que escribí expresamente para la tarea, las fuentes se pueden descargar aquí.

La sobreescritura PT_NOTE: algunos datos
Los ejecutables infectados mediante esta técnica se caracterizan por compartir las siguientes características:
  1. Perdieron su segmento PT_NOTE
  2. Tienen (normalmente) tres (o más) segmentos PT_LOAD
  3. Tienen segmentos ocultos

Y digo "normalmente", porque si el binario original tiene un solo segmento, esto deja de ser verdad. En los sistemas analizados, se ha contabilizado un total de 79 binarios con un único segmento PT_LOAD. No es una situación común, pero se podría utilizar para ocultar una infección.

Los binarios que no tienen PT_NOTE son mucho más numerosos: en Solaris la práctica totalidad de ellos carecen de esta característica (12110) mientras que en el resto de sistemas suman 4452, encontrándose la mayoría en las Ubuntu de 32 bits. Estas cifras no son nada despreciables.

Por otro lado, la cifra de binarios que tienen más de dos PT_LOAD asciende a 388, encontrándose, una vez más, la mayoría en Solaris. Los que tienen más de dos PT_LOAD y ningún PT_NOTE son algunos menos, 378, pero la cifra anda muy a la par. En el caso particular de los sistemas Linux, sólo se encontró un fichero (en la Ubuntu de 32 bits) que además pertenecía a otra arquitectura.

El problema de los segmentos ocultos, si es que de verdad es un problema como tal, es una constante de todas nuestras técnicas de inyección: el código infectado no aparece dentro de ninguna sección y eso puede ser bueno y malo a la vez. Es bueno, porque herramientas como objdump no desensamblan lo que no está dentro de una sección. Y es malo, porque un binario no suele tener segmentos no cubiertos por ninguna sección. Puesto que este problema es compartido por la técnica de desplazamiento de cabeceras, analizaremos este fenómeno más adelante.


Desplazamiento de cabeceras

En esta técnica la detección adquiere un nuevo orden de complejidad. Lo único que caracteriza a estos binarios es:
  1. La tabla de cabeceras de programa ha sido desplazada.
  2. Hay segmentos ocultos.
Desde el punto de vista de la detección, la dificultado reside en que no hay una forma de afirmar con total seguridad que la tabla de cabeceras de programa ha sido desplazada. En Linux, esta tabla de cabeceras suele estar antes del contenido de la primera sección (empezando desde el principio del fichero), pero podría estar en cualquier otra ubicación. En todos los sistemas analizados no he encontrado ningún binario (salvo los que yo he infectado deliberadamente) que tenga la cabecera de programas después del comienzo de la primera sección, por lo que esto podría ser una buena heurística.

El gran problema de la inyección: los segmentos ocultos
Como hemos visto antes, los segmentos inyectados no suelen aparecer como secciones del programa. Por supuesto que se podría modificar el binario para que esto no fuese así, pero añadiríamos una dosis de complejidad extra que a la larga nos sería contraproducente. Sin embargo, esta decisión tiene sus consecuencias, y es que estos datos "no cubiertos" son bastante fáciles de localizar.

De todos los binarios analizados, sólo se encontró un binario no infectado y con segmentos ocultos, por lo que esto podría ser una heurística bastante buena.

Inyección segmentada: virtualmente imposible de detectar
Tal cual. La inyección segmentada se basa en aprovecharse de unos huecos de alineamiento entre funciones que bien pueden no existir. Y escribir una heurística sobre qué binarios tienen o dejan de tener estos espacios es muy similar al código que escribí varias entregas antes sobre la viabilidad de esta técnica. La única forma de detectar un binario infectado por esta técnica (sin ejecutarlo, claro) es, o bien buscando partes del segmento de código que no estén cubiertas por la sección .text (algo que es posible que nunca encontremos ya que, a pesar de que en nuestras técnicas no lo hemos modificado nunca, tocar esa información es trivial), o por alguna vulnerabilidad del mecanismo de activación. Y esto nos lleva al siguiente punto:

Modificando el punto de entrada: no tan malo al fin y al cabo
Cuando vimos esta técnica de activación hemos asumido que es la más simple y que suele ser la más vigilada. Sin embargo, una vez infectados, ¿hasta qué punto podemos sospechar?

Pues resulta que el método depende de la robustez de la técnica de infección que haya detrás. Una forma sería buscar si el punto de entrada cae en una dirección que no esté cubierta por ninguna sección. Esto en el caso de la infección segmentada bien hecha, modificando .text para cubrir la rutina de reensamblado, puede llevarnos a un callejón sin salida. Sin embargo, en el caso de las otras dos técnicas, es más fácil debido al problema de los segmentos ocultos.

De todos los sistemas analizados, se han encontrado 4544 binarios donde el punto de entrada caía en una dirección no cubierta por ninguna sección, todos ellos en Solaris. En el resto de sistemas Linux, sólo se encontró un sistema Linux con esta peculiaridad.

Conclusión: para la plataforma que nos atañe en este post, modificación del punto de entrada + infección segmentada => potencialmente indetectable. Para todo lo demás, basta con comprobar dónde cae el EP.


.got.plt: complicado de comprobar, pero no tanto

La única complicación real aquí es técnica: se trata de encontrar una sección que se llame ".got.plt" y analizar su contenido. Tal análisis se resumirá en comprobar que los punteros caigan en siempre en la .plt, que es donde le corresponde. Nótese que de momento sólo puedo asegurar que este truco funciona en GNU/Linux para x86 de 32 y 64 bits con binarios construidos por GCC, en Solaris (al menos en mi Sparc) la sección ".got.plt" simplemente no existe (los punteros son modificados directamente dentro de la .plt, y sí, la .plt está en un segmento con todos los permisos de acceso encendidos).

Para el resto de sistemas, sólo se encontraron dos binarios (y en la Ubuntu de 32 bits) que tenían una .got.plt con entradas fuera de la .plt: uno era busybox (el formato interno de este binario es una auténtica rareza, al menos en mi sistema, no me preguntéis por qué), y el otro era la propia libc, con cuatro entradas fuera. En el resto de sistemas Linux, todo estaba en orden. La heurística que podríamos derivar de aquí no es perfecta, pero algo es algo.

.plt: confiando en que el compilador haga las cosas bien
Este caso es verdaderamente complicado de detectar, ya no sólo por el simple hecho de que puede haber muchísimos compiladores diferentes que generen .plts con formatos cualesquiera, si no por la propia variedad de .plts que nos podemos encontrar dentro del conjunto de binarios generados por el mismo compilador. Superadas estas complicaciones, el algoritmo es siempre el mismo: comprobar que las direcciones e índices de los símbolos colocados por los wrappers de la .plt siguen un orden creciente con el mismo salto.

Este truco sólo ha funcionado parcialmente en x86 (32 y 64 bits). En Solaris las entradas de la .plt los saltos no tienen un orden claro. En el resto de los sistemas de estudio he encontrado varios binarios cuyas .plts son bastante extrañas (busybox una vez más, el binario de skype e incluso ld), sin embargo siguen siendo la minoría. De las .plts soportadas, ninguna tenía entradas fuera de orden.

Conclusión: hacer una heurística sobre esto es posible, pero hacerla perfecta es bastante complicado. Si algún software quiere aprovecharse de esta técnica de activación, será difícil hacer una detección temprana de la infección.

.ctors: además de peligroso, evidente
Y por último, le toca el turno a .ctors. Hemos visto que esta técnica de infección es muy arriesgada, y en la práctica será todavía peor: además de funcionar sólo con los binarios generados por GCC, estamos cargándonos el marcador inicial (-1) que caracteriza esta sección. Esto hace la detección algo trivial.

Como era de esperar, ningún binario en todos los sistemas analizados tenía una sola sección .ctors que no empezase por -1. Por tanto, podemos hablar igualmente de buena heurística. De todas formas, estaría bien completar esta heurística comprobando si este entero que reemplaza al marcador es verdaderamente una dirección y estudiando dónde cae.

Conclusión de conclusiones
Este pequeño estudio ha arrojado algunos resultados interesantes: al final, las técnicas más simples acaban siendo las más robustas para esconderse de la mirada inquisitiva de la heurística de un antivirus. Las mejores, evidentemente, siguen siendo las más complicadas. ¿Se pueden escribir virus para Unix? Sí. ¿Se puede hablar de una amenaza? Potencialmente. ¿Nos podemos proteger? Afortunadamente sí. Sin embargo, la estadística cantará y cuando llegue ese futuro en el que escribir virus para Linux se vuelva algo divertido algún administrador se llevará un buen disgusto tarde o temprano.

Esta extensa saga ha obviado técnicas menos directas para acercanos a los detalles de infección directa de binarios, pero existen formas más simples (e incluso más efectivas) con las que se podrían conseguir resultados mucho más dañinos. Una forma sería, por ejemplo, modificando los Makefiles: encontrando la sección install y añadiendo la ruta de nuestro código malicioso podríamos ser ejecutados con permisos de root en el futuro, o incluso añadiendo alias a sudo en el .bashrc y cosas similares.

La picaresca está ahí, sólo esperemos que no la exploten demasiado.

No suelo añadir sección de agradecimientos a los artículos, pero después de la paciencia que tuvo Yago con esta interminable saga, de los ánimos de knx y NighterMan, y de la colaboración de n0p y también de la hermana de Pales al dejarme probar cositas en sus sistemas, toda esta gente bien se merecía una línea. Y por supuesto, a todos aquellos que tuvieron el estómago de llegar hasta aquí. Gracias.


Update: A fecha del 16 de enero de 2013, día más tarde de publicar este artículo, alguien sacó un parche para realizar verificación de firma digital a nivel Kernel. Información: https://twitter.com/2gg/status/291483726410559488



Artículo cortesía de BatchDrake
Leer más...

Evento T3chFest


Unos cuantos tags de resumen: CUDA, Arduino, RoRGPGPU, iOS, jQuery, HTML5Kinect, Big Data, Metasploit, Open Data. ¿Te hace falta algo más? Si: FebreroMadrid (Leganes), Gratis, Registrarse.

T3chfest es un evento para nosotros, los amantes de la informática. En su página web se lee uno de los credos que muchos de nuestros lectores comparten con nosotros: "No hace falta irse a Stanford o al MIT para crear e innovar. En España somos tan buenos o más y lo vamos a demostrar." Este tipo de lemas y que universitarios ayuden a organizar esta "fiesta", nos demuestran una vez más que el hambre de aprender y superarse no tiene fin. ¿generación Ni-Ni? ¡Y una mierda!

En la Universidad Carlos III de Madrid se celebrarán estas jornadas los días 14 y 15 de Febrero con un programa muy completo con seguridad, robótica, inteligencia artificial, programación... Parece que han incluido de todo, ¿no es el sueño de cualquier hacker? Incluso tienen una plataforma para concursar desarrollando soluciones a problemas, vamos, lo que viene siendo un wargame de toda la vida orientado a la programación y soportado por Codility, en el que también puede participar todo aquel que quiera, sea o no alumno.

La web es muy completa y tiene todo tipo de información, localización, horarios, preguntas frecuentes, etc, etc. Además ya hay hashtag: #t3chFest y cuenta de twitter por si tenéis cualquier otra consulta.

¡¡No os olvidéis inscribiros antes del 7 de Febrero!!
Leer más...

14 enero 2013

Cómo ganar siempre a Mezcladitos



Disclaimer: Desde Security By Default, no nos hacemos responsables de los malos usos que se puedan extraer de la información explicada en el presente artículo.

Tras el éxito que tuvo Apalabrados, la empresa argentina Etermax, nos sorprendió este verano con una nueva creación: Mezcladitos. Si en el primero de los juegos, teníamos que ir buscando palabras una a una y contrastando su validez contra un servidor, pasando el turno a nuestro contrincante, en el caso de Mezcladitos, el tiempo sí que juega en nuestra contra, de manera que tenemos que buscar palabras válidas en un tablero de 4x4 letras en dos minutos.

Así como meses atrás, ya me senté a destripar el funcionamiento interno de Apalabrados, en el caso de Mezcladitos he tenido que postergarlo hasta las vacaciones navideñas puesto que mi aventura en Securízame, no me ha dejado apenas tiempo para "mi ocio".

Después de unos días jugando de forma legal y sin trampas a Mezcladitos, me he aburrido de perder algunas partidas, así que me he sentado con ello y aquí os presento mi investigación al respecto.

Para ello, he utilizado las mismas herramientas que en el caso de Apalabrados: Mi iphone, una red wireless y un proxy web intermedio que me permita analizar y modificar las peticiones salientes y las respuestas del servidor a mi voluntad.




if (Apalabrados == Mezcladitos) {
#A nivel de programación ¿en qué se parecen ambos juegos? Pues, desgraciadamente, en varios puntos, veamos:
  • En ambos, el usuario que autentica puede ser nativo de Etermax, o usar Twitter o Facebook para autenticarse. Esto, como ya vimos, permite identificar personas que no tenemos por qué conocer (si elegimos un oponente aleatorio).
  • La autenticación se realiza sin CAPTCHA, por lo que podría realizarse los mismos ataques de fuerza bruta que en el caso de apalabrados.
  • La comunicación se realiza en claro, por lo que la única cookie de sesión disponible, podrá ser robada y reusada por otro usuario, en caso de ser interceptada.

  • Si se juega en un entorno MiTM (utilizando wireless por parte de nuestra víctima), las mismas vulnerabilidades que comentamos en el caso de Apalabrados, aplican a Mezcladitos. Modificar las letras que le llegan a la víctima (haciendo que ninguna palabra sea válida, al no coincidir con las que el servidor envía), resignar partida, perder turno, etc,… son ataques totalmente factibles en mezcladitos utilizando la cookie de sesión que robemos a nuestro pobre adversario. 

Aquí podéis ver cómo hacer que las letras que llegan sean las que queramos (y con los puntos extra que queramos, TL, DL, TP o DP,... aunque luego no valgan)





Esto mismo sucede con la comunicación de chat por parte de los usuarios, por lo que procurad no enviar datos sensibles a través del mismo si jugáis (vosotros o vuestro contrincante) vía wireless.

Aquí tenéis una muestra de chat real,… y otra con unos mensajitos "de más" que mi contrincante nunca escribió…







}

else {
# ¿En qué se diferencian?

  • La propia naturaleza del juego es diferente "per se". Es decir, en el caso de Apalabrados, las comprobaciones de las palabras se hacen una a una en el servidor, siendo bastante poco dinámico esas paradas constantes para ver cuántos puntos le metemos al contrario o si hay suerte y la palabra que probamos, cuela. Las formas de trampear ese juego se reducían a estar en un entorno controlado MiTM, siendo capaz de controlar las partidas, hacerle vivir un universo paralelo a nuestro contrincante y enviar al servidor lo que nos de la gana (palabras de mínimo valor, acciones de "resignar partida" o de "pasar turno" ), pero no se podía hacer nada en caso de que nuestro adversario estuviese jugando vía 3G a no ser que fueses un taddong.
  • Sin embargo, en el caso de Mezcladitos, las palabras válidas son recibidas directamente por el cliente al principio del todo, así el programa comprueba en local si la palabra que hemos encontrado es válida o no, por lo que, si queremos asegurarnos que ganaremos la partida, podremos interceptar la recepción de estas palabras y conocer cuáles serán aquellas que nos vayan a aportar mayor puntaje.


He realizado un script sencillo que coge las palabras desde un fichero (primero las intercepto, las copio/pego en el fichero) les asigna un puntaje en base a lo que "pesa" cada letra teniendo en cuenta la progresión de encontrar palabras de más de 4 letras (va sumando 2 puntos si tiene 4 ó 5 letras, 4 puntos en las letras 6 y 7, 6 puntos en la 8 y 9,… y asi sucesivamente….) y las muestra ordenadas de mayor a menor.



Me ha dado pereza ponerme a implementar un "resuelve-mezcladitos" teniendo en cuenta las letras con "bonus" (que valgan triple/doble letra/palabra). Podría haberlo hecho, pero como pude comprobar que, simplemente con la ayuda del script anterior, ya ganaba todas las partidas,… no me era necesario, aunque ahí dejo el testigo a quien se quiera sentar a programarlo :)

Asimismo, como al final de cada turno, ambos contrincantes tienen acceso a las palabras encontradas por uno mismo y por el contrario, conviene hacer alguna palabra de puntaje medio o bajo para evitar que cante demasiado la aplastante victoria.

  • Otros paquetes que envía el servidor a los clientes, contienen mensajes como la puntuación conseguida por ambos jugadores en los turnos jugados hasta el momento. Se supone que, para que no sepas cuántos puntos ha hecho tu contrincante en el mismo turno que te toca a tí, el cliente te dice que está oculto,… así no sabes cuántos puntos tienes que hacer para ganar y te devanas los sesos buscando palabras como loco…. 
       

Bueno, esto… si eres completamente íntegro. En mi caso, me dí cuenta que en la comunicación cliente-servidor había mensajes como este (que aunque pertenece a otro juego, es totalmente válido), en el que se ven las puntuaciones de los diferentes turnos de ambos jugadores. Teóricamente, el valor 371, aparecería como Oculto para nosotros en este momento.



Es decir, que podemos saber cuántas palabras (o puntos) necesitaremos para vencer al contrario. No comprendo por qué los desarrolladores han hecho esto así, siendo que podían haberse ahorrado enviar el puntaje del contrario. Ya que las palabras encontradas han de enviarse al servidor (como veremos más adelante) para ser validadas allí, y determinar si un jugador ha ganado o perdido, no es necesario disponer en el cliente del puntaje previamente.

  • La utilización de trucos (o "Power Ups"): En el caso de mezcladitos, cuentas con una serie de monedas iniciales que puedes canjear por diversos trucos, que te permiten congelar el tiempo disponible, pedir pista de sabiduría, etc,… Lógicamente según haces uso de estos trucos, tu número de monedas va decreciendo. Para ganar nuevas monedas, hay dos opciones: o ir ganando partidas o directamente pasar por la tienda de Mezcladitos y pagar por ellas.

       

       Analizando cómo se descuentan las monedas, pude ver que es al final del turno, cuando se envía al servidor, además de las palabras encontradas, los trucos que se han utilizado "power_ups" y el número de monedas gastadas para conseguirlos.

       

Es decir, que todo se hace en local y luego se envía el resultado al servidor, ¿verdad? Estupendo. Con modificar el mensaje de envío al servidor diciendo que no has consumido ningún power-up y que Coins=0, podemos haber usado todos los trucos disponibles para encontrar las palabras y enviar que nos ha costado 0 monedas. Evidentemente, ganaremos todas las partidas (es decir que incrementaremos nuestro saldo de monedas) y tendremos trucos de forma gratuita. ¿Se podrán canjear estas monedas por dinero real o bitcoins en alguna parte? ;)

  • No he podido fuzzear la parte de compra de monedas puesto que cuando llego a ello, me indica que mi dispositivo no soporta la operación.


  • De todas maneras, aunque seamos derrochadores y nos quedemos sin monedas, el número disponible de las mismas viene en un mensaje desde el servidor, por lo que tranquilamente podremos modificar ese valor para tener cuantas queramos para el uso de los trucos que necesitemos para el desbloqueo (en local) de los mismos, aun no teniendo dinero



Con cambiar el 77 y poner lo que queramos, por ejemplo 9999, el cliente se lo cree y nos deja comprar cuantos powerups queramos


  • El formato de las palabras encontradas. Cuando se completa un turno, el cliente envía al servidor un mensaje como el que hemos visto en imágenes anteriores. Como se puede ver, se manda la sucesión de posiciones de las letras correspondientes a cada palabra en modo \u0005 (para la posición de la letra número 5) \u0006 (para la 6), etc,… y la puntuación total de cada palabra. Así por cada palabra, los power_ups y monedas consumidas (a partir de descubrir esto, siempre 0), así como los puntos totales de ese turno. Entendemos que si desarrollamos un resuelve-mezcladitos, sería muy sencillo incluir que nos generase un mensaje con las posiciones utilizadas para cada palabra, sumas parciales y sumas totales ¿verdad? Es decir, que no tendríamos siquiera que buscar las palabras de mayor puntaje, directamente, ya lo haría nuestro script por nosotros.


}


Conclusiones:
  • A nivel de seguridad en la programación, el juego 'mezcladitos' está igual de mal desarrollado que 'Apalabrados'
  • A diferencia del primero, en el que todo se comprueba en el servidor, en el segundo, las palabras válidas se envían al cliente, pudiendo obtenerse una lista previa y jugar "con ventaja"
  • En Apalabrados, aparte de la incesante y molesta publicidad por cada jugada, no existía otra forma de ganar dinero por parte de Etermax (incluídas las miles de llamadas que hace a diferentes Ads). En Mezcladitos, la empresa desarrolladora ha ideado un juego mucho más adictivo y dinámico, que incluso permite interactuar con una tienda de compra de monedas canjeables por trucos, por lo que no me hago responsable del uso que no tenga fines académicos de la información publicada en este artículo.
  • De hecho, siguiendo una política Responsible-Disclosure, al conllevar posibles pérdidas de ventas de monedas por parte de Etermax, me puse en contacto con ellos vía Twitter. Como después de unos 15 días, ni siquiera me han respondido, pues directamente lo publico y ya está.

Leer más...

13 enero 2013

Enlaces de la SECmana - 157



Leer más...

11 enero 2013

¿Qué pueden tener en común los siguientes sitios web?: 
  • http://www.scotiabank.com 
  • http://www.rbs.co.uk 
  • http://www.natwest.com 
  • http://www.coverity.com 
  • http://www.websense.com 
  • http://www.safenet-inc.es 
  • http://www.eeye.com 
  • http://www.avaya.com 
  • http://www.ey.com 
  • http://www.mckinsey.com 
  • http://www.acciona.es 
  • http://www.enagas.es 
  • http://www.endesaonline.com 
  • http://www.telefonica.es 
  • http://www.bancopopular.es
Dichos sitios web corresponden a banca, grandes empresas tecnológicas y compañías del Ibex35. Pero lo que tienen en común todos ellos es el título de este post, o lo que es lo mismo; la presumiblemente poca concienciación en seguridad de los administradores de dichos sitios web. Antes de continuar, aclarar que esta poca concienciación está relacionada con la seguridad por oscuridad (un concepto siempre polémico), pero sobre todo, con el uso de versiones antiguas de software y ningún signo de securización adicional.

En ninguno de los anteriores sitios web hay preocupación en mostrar las versiones antiguas de su software; IIS/5.0, 6.0 y Sun-ONE-Web-Server/6.1 entre otros, que, aunque bien podría tratarse de cabeceras HTTP fake como el caso de algunas compañías, en estas dudo que tengan tanto sentido del humor. Tampoco muestran visos de una securización adicional como podría ser:
  • La cabecera X-FRAME-OPTIONS para mitigar ataques clickjacking en navegadores nuevos 
  • X-XSS-Protection para mitigar vulnerabilidades XSS. 
  • HTTPOnly para evitar el robo de cookies a través de scripts en la parte cliente. 
  • Atributo Secure para evitar la transmisión de cookies en texto claro. 
  • O el uso de cualquier WAF o CDN. 
Todos recordamos que le ocurrió a la empresa de Seguridad HBGary, y de como empezó todo; por una simple vulnerabilidad en el CMS de su sitio web. Por eso es importante proteger los sitios web adecuadamente. La excusa de "simplemente se trata de una web" no es válida, hay que aprender de los errores, como en el caso anterior, y más aún, tratándose de grandes empresas e incluso tecnológicas, que se suponen que venden eso; Seguridad.

No importa que hayas subcontratado el servicio de diseño y hosting de tu compañía, es la imagen de tu marca, y como tal, si tienes presencia en la web, deberías preocuparte de que tu marca este en buenas manos, es decir, en una infraestructura adecuada. Grandes empresas como las anteriores no tienen excusas, ya que pueden invertir recursos y dinero en realizar auditorías de Seguridad y actualizar sus infraestructuras. Uno de los mayores riesgos de Seguridad al descuidar los sitios web ya hemos visto cual puede ser, pero también hay otros como; pérdida de datos confidenciales y daño a la imagen y reputación, ¿cuáles más se os ocurren?

Para autónomos, pequeñas y medianas empresas también existe un riesgo si descuidan sus sitios web, y es que estos sean objeto de esquemas de ataques drive-by, y al acceder a dichos sitios aparezca ese mensaje de: "Este sitio puede dañar tu ordenador". Problemas en el SEO conseguido a base de tanto esfuerzo, pérdida de confianza, clientes... De hecho, los sitios web pequeños son los más golosos para los cibercriminales. Luego hay sucesos como el caso de la web de un ayuntamiento de España que desapareció, en el cual luego sale la alcaldesa diciendo que se investigará hasta el final para sancionar al culpable (aunque esté en Indonesia), gastando fondos y recursos públicos inutilmente, cuando lo más sensato y barato hubiera sido tener una versión actualizada de la web, o espera no...

En un intento de concienciar a los propietarios de cualquier sitio web, sin que estos tengan que tener conocimientos de seguridad, he creado una pequeña prueba de concepto (PoC) en forma de servicio web. Dicho servicio muestra un mensaje informativo en base a un análisis 'básico' del sitio web. No hace falta tener ningún tipo de conocimiento, simplemente, introducir la dirección del sitio web y comprobar el resultado. Insisto, el mensaje informativo es para intentar concienciar a gente que no tiene porque saber que es una cabecera HTTP, un WAF o la última versión disponible de nginx

Los detalles del informe son las cabeceras HTTP del servidor y algún metadato más del HTML del sitio.

Ejemplo de mensaje informativo para todos los públicos

Ejemplo de informe más detallado con las causas del mensaje anterior

El objetivo de desenmascara.me es que cualquiera pueda conocer la infraestructura y arquitectura de su sitio web y comprobar así si se mantiene debidamente actualizado antes de que se entere por algún aviso de SafeBrowsing o por ver referers de visitantes desde zone-h. Los sitios web del principio de este artículo, parece que no se mantienen debidamente muy actualizados, por lo que podríamos decir que sus administradores, no parecen estar muy concienciados con la seguridad web. No se puede decir lo mismo de el sitio web de la casa blanca, con drupal.

Artículo cortesía de Emilio Casbas
Leer más...

10 enero 2013

Hacking Roomba! Reloaded


En todos los congresos y eventos a los que voy, siempre me preguntáis por la famosa Roomba, que si la he dejado limpiando en casa y que para cuando le voy a hacer alguna otra perrería.

La verdad es que con esto de que las garantías de los productos nuevos duran dos años en este país, no he querido "arriesgarme" en exceso (¿quién lo diría eh?) a hacer cosas que pudieran invalidar la garantía. Los que me vendieron mi mascota robotizada, supongo que como me tienen más que controlado por twitter y les salta una alerta cada vez que cojo un destornillador, tampoco me iban a dar mucha credibilidad si algo raro le pasaba. 

Así que como en estas navidades expiraba la garantía de mi Roomba, he osado a quitar todos los tornillos y centrarme en dos hacks que llevaba tiempo pendiente de ejecución, y que espero que sean útiles a aquellos lectores que los Reyes magos o Papá Noel les hayan traido un "atrapapolvo con batería".  


Hack 1: Las alfombras negras

Si de algo se queja la gente en Internet, de estos bichos, es el problema que tienen cuando pasan por una superficie oscura, quedándose paradas o evitando pasar por este tipo de superficies. Os explico qué sucede. Estos robots, por cumplir con la tercera ley de la robótica, llevan delante 4 sensores que detectan si existe peligro de caída o escalón, y dan marcha atrás o se detienen para mantener a salvo su integridad. Estos sensores, llamados "Cliff Sensors" constan de dos leds IR que van insertados en una pieza que los separa con un tabique de plástico. El led IR emisor manda una señal que, en el caso de un suelo normal, reflejará dicha señal y será captada por el led receptor, cerrando un circuito que indica que "todo va bien". En caso de encontrarse con un escalón, al haber una distancia mayor de la esperada, la onda emitida no es reflejada y, al no recibir señal el led receptor, la Roomba interpreta que se va a caer.

En el caso de suelos o alfombras oscuras, el resultado es el mismo, dando lugar a un falso positivo. Como solución, en algunos foros encontré que la gente ponía papel de plata (comúnmente conocido por papel Albal),  pegado con cinta adhesiva bajo los sensores para que se refleje siempre el haz enviado y el receptor no se queje. Sin embargo, y a partir de determinados modelos, en mi caso y a otros foreros, no funcionaba correctamente.

Así que me acordé de un truco con el que perdí en la Universidad un concurso de sumo de robots. Se trataba de diseñar un robot que competía contra otros en una superficie negra delimitada por un círculo de pintura blanca. Para saber si tu robot estaba tocando los límites de salirse del sector, disponías de unos sensores parecidos que detectaban el color blanco (o el negro, definible en una variable de programa). Total que los que me ganaron tuvieron la sencilla idea de blindar con folios en sentido horizontal, en los bajos, rodeando su robot. De esta manera, cuando el mío les iba a embestir detectaba blanco y se paraba, así, hasta que llegó un momento en que se quedó acorralado y el otro lo sacó del ruedo.

¿Solución para la roomba? Trozos de papel blanco bajo el sensor. Durante dos años he estado renovando estos folios con cinta adhesiva porque se rompían, se llenaban de polvo y directamente la roomba se paraba, etc,… Así que ahora, ya sin riesgo de quedarme sin garantía de un cacharro de 400 euros, con un juego de destornilladores como armas, forré de periódicos (sin darme cuenta que quedó como primera plana la sección de Contactos, cosa que alguno en Twitter si percibió :D) la mesa de la cocina de casa de mis padres y me propuse hacer un hack que ya ví documentado en zackyfiles.




Aquí tenéis los contenedores de los sensores IR



La idea es, por cada sensor, juntar ambos leds IR (emisor y receptor), derribando el tabique plástico que los separa, de manera que lo que uno emite, lo reciba el otro sin problemas, sin tener que reflejarlo el suelo. 



Después de esta foto, los junté con celo y los metí en cada uno de los compartimentos donde iban antes.

OJO: haciendo esto la Roomba queda totalmente desprotegida ante escalones, por lo que si tenéis escaleras o posibles caídas en casa, NO HAGÁIS ESTO!!!!! o seréis cómplices de suicidio de Roomba! 

Aquí tenéis las piezas que sobraron, después de operarle la miopía a mi roomba :D



Hack 2: La chimenea

Como sabéis, una de las cosas que hice desde los primeros días con mi Roomba fue conectarle un interfaz bluetooth al puerto minidin que trae. De esta forma, y después de muchos intentos, logro interactuar con el robot-aspiradora, de manera que pueda leer su estado (si está cargándose o andando), temperatura y carga de batería (porcentaje de vida), y puedo darle órdenes como ponerse a limpiar o mandarlo a su dock. Todo esto por línea de comandos, de manera que puede que lo mande yo de forma manual o skynet de forma automática.

Como el objetivo principal de la Roomba es limpiar, meterse por debajo de los muebles y dejar todo impecable, los ingenieros de iRobot colocan unos bumpers que permiten a la aspiradora detectar si chocan con un obstáculo. Obviamente, esos bumpers están a la misma altura que el resto de la Roomba, evitando que se quede atascada o que intente entrar en un sitio que no cabe. Sin embargo, al conectarle el minidin con el bluetooth de Sparkfun que compré, nuestra amiga tiene un implante, con el que su cerebro no cuenta. Si da la casualidad que tiene que pasar por debajo de un mueble con una altura, que normalmente cabría si fuese "de serie", pero NO cabe con el conector, tenemos un problema: el conector choca y se destroza. Para evitar esto, y por temas de garantía, tuve que montar hace tiempo un sistema de parachoques en mi amiga, cortados a la altura del conector minidin, de manera que si chocaba contra algún obstáculo a esa altura, protegiese el minidin. 

De esta guisa podéis ver cómo iba de protegida mi roomba




Igualmente, y con tiempo libre, me decidí en estas navidades a eliminar las "chimeneas", dejando la Roomba de serie, pero sin perder la funcionalidad bluetooth. La idea es conectar los cables que portan las señales del circuito BT al conector mini-din 8 pin. 

Para los que queráis hacerlo, os dejo los pasos necesarios.

Bajo estas líneas veréis el circuito que lleva el bluetooth y los 5 cables que necesitan enviar y recibir señales (los dedos los tenía sucios después de desmontar un cacharro cuya misión es aspirar el polvo del suelo...)



Según el manual del libro Hacking Roomba! el circuito sería tal que así:




A partir de aquí, y aunque podría haber seguido el manual, quise asegurarme con los colores, así que con ayuda de un tester, comprobé la conectividad entre los diferentes cables y su correspondencia de los pines en el mini-din macho.

Con eso, me hice un dibujo, con el código de colores de los cables, y al tener que conectarlos a un conector hembra, invertí de forma especular los cables, quedando los cables de colores a insertar, en el conector hembra de la placa base, como muestro bajo estas líneas:


Y aquí unas fotos de la posición correcta para que no os de problemas encajar el resto del circuito (va todo muy ajustado dentro y el mejor sitio que encontré para que las tapas cerrasen bien fue el que se ve bajo estas líneas)






Sé que lo mejor habría sido soldar los cables a las conexiones en el circuito impreso, en vez de insertarlos en cada uno de los orificios de los pines, y pegarlos con cinta aislante, pero para pasarlos para atrás era aún más complicado. Además en caso que deje de funcionar, o que alguien pase revista, se pueden quitar los cables y todo volverá a quedar "de fábrica" (si no se miran mucho los tornillos, claro está…). De hecho, aquí la tenéis hasta con su tapa incluída, como el primer día...




Hack 3: La cumparsita (de propina)

Aunque esto no lo hice en Navidades, ya que estamos, quiero compartir con vosotros un material inédito aún. Siempre me decís que a la Roomba, sólo me falta hacer que cante, puesto que todo lo demás, incluso que baile, ya lo hace.

Como los que nos seguís sabéis, fui speaker en la última edición del congreso de seguridad Ekoparty 2012, en Buenos Aires. No era plan de andar acarreando la roomba en la maleta en viajes transoceánicos, en los que te pueden poner mil problemas en las aduanas, así que quise transmitir, al público argentino asistente a ekoparty, el mensaje sorpresa que mi Roomba les enviaba.

Os dejo aquí el video que les puse:




Fueron unas cuantas horas de programación de la API de la Roomba para hacer que memorizase la canción completa (gracias @secanella) por tus conocimientos de notas musicales para poder hacer posible este video.

He de decir que la Roomba, hasta ahora ha tenido un comportamiento excelente, y tras las barbaridades que le he hecho, ahí ha seguido funcionando, y aspirando, que es para lo que le pago!
Leer más...