Buffer overflow, un asesino en serie
El problema del buffer overflow (bof) data de tiempos inmemorables... diría que desde que se inventaron las computadoras, aunque recién fueron entendidos años más tarde, en la década de los 70s. Esta vulnerabilidad es tan simple como suena, pero tan peligrosa como para corromper programas y lograr que las máquinas hagan lo que el atacante quiera.
Buffer overflow trata sobre incluir en un buffer más datos de los que éste está destinado a almacenar, ocasionando que los bytes sobrantes sobreescriban otras posiciones de memoria, donde hay otros datos. Si los datos "extra" son creados y posicionados correctamente en la sobre escritura, un atacante puede lograr que el programa ejecute el código que desea.
Este problema está presente siempre que el programa lea datos de alguna fuente y los asigne a un buffer interno, ya sea una entrada de usuario por línea de comandos, por ventana a lo windows, leyendo un archivo, leyendo un socket, etc, etc.
Si bien uno creería que al ser un problema conocido hace taaaaantos años, actualmente debería ser menos frecuente y menos peligroso, la realidad demuestra totalmente lo contrario. Los buffer overflows "caminan" entre nosotros y son tan peligrosos como hace 20 años. Basta buscar un poco en internet para encontrar exploits de este tipo a montones. El bof es de las vulnerabilidades más peligrosas, permitiendo a un atacante ejecutar código localmente, remotamente, escalar privilegios, atacar otras máquinas, cualquier cosa que se les ocurra.


Secciones de un programa en memoria
Para poder entender los buffer overflows, es necesario conocer cómo se dividen los programas en la memoria. Estos se dividen en varias secciones, y las 6 más importantes son las siguientes:

- .text: contiene las instrucciones del programa, es decir, la parte ejecutable. El tamaño de esta sección es fijada en tiempo de ejecución, cuando se carga el proceso.

- .data: se utiliza para almacenar variables globales inicializadas (por ejemplo: int enData = 0;). Esta sección también es fija en tiempo de ejecución.

- .bss (below stack section): contiene las variables globales no inicializadas, como por ejemplo: int enbss;. El tamaño es fijado en tiempo de ejecución.

- Heap: esta sección se usa para almacenar variables alocadas dinámicamente y crece desde las direcciones de memoria más bajas hacia las más altas. La alocación se controla mediante las funciones malloc() y free(). Un ejemplo de variable alocada en tiempo de ejecución sería una declarada así: int dinamica = malloc(sizeof(int));

- stack: esta es la conocida pila. La sección de la pila permite guardar datos entre llamadas a funciones y crece desde las direcciones altas de memoria hacia las direcciones bajas. Esta forma de crecimiento es la que permite buffer overflows.

- entorno/argumentos: se usa para almacenar una copia de las variables a nivel sistema que pueden ser requeridas por el proceso durante su ejecución. Como ejemplo, alguna de estas variables son el path, nombre del shell, hostname, etc. Esta sección es escribible, permitiendo exploits del tipo format string y buffer overflows.

En la figura pueden observar mejor que lugar ocupa cada sección dentro de la memoria:



Tipos de buffer overflow

Básicamente los buffer overflow pueden ser de dos tipos, stack based o heap based.
Para entender los ataques stack based overflow, necesito explicar un poco de lo que sucede cuando llamamos a una función en un programa. En una llamada a función, sucede lo siguiente:
- se colocan los parámetros pasados a la función dentro de la pila, en orden inverso.
- se salva el registro que indica la dirección de la próxima instrucción (eip) dentro de la pila. Esta será la dirección de retorno.
- se ejecuta el comando call y la dirección de la función llamada se coloca dentro de eip.
La función recién llamada debe encargarse de lo siguiente:
- salvar el valor del registro que indica la base de la pila de la función anterior (ebp).
- colocar el valor de esp (registro que apunta al tope de la pila) en ebp. Con esto se setea la base de la pila de la función llamada.
- decrementar esp para hacer espacio para las variables locales de la función llamada. Cabe destacar que la pila crece en dirección contraria a las direcciones de memoria, por eso se decrementa en lugar de aumentar.
- se ejecuta la función
Una vez que la ejecución de la función se completa, sucede lo siguiente:
- se coloca el valor de ebp en esp (limpiamos la pila actual).
- se saca el valor de la pila actual y se coloca en ebp (restauramos la pila de la función llamadora).
- se saca de la pila el valor de retorno y se coloca en eip. Con esto (si todo sale bien) volvemos a donde se quedó la función anterior antes de llamar a la actual.

Los exploits stack-based utilizan las variables almacenadas en la pila para explotar un programa, sobreescribiendo la dirección de retorno de una función (almacenada en la pila), ya sea para llamar a un código insertado por el atacante o bien para llamar alguna función de librería que realice una función particular (el llamado return to libc attack).

Teniendo en mente la explicación de lo que sucede al llamar una función, paso a explicar el ataque utilizando un siempre más entendible ejemplo. Supongamos que tenemos la siguiente función:

void explotable()
{
char explotame[4];
strcpy(explotame, "AAAAAAAAAAAA");
}

La pila en este caso tendrá el siguiente formato:

Dado que sólo se reservaron 4 bytes para "explotame" y se colocaron 12 As, osea, 12 bytes, en dicha variable, estos sobre-escribirán tanto el valor del ebp anterior como el de la dirección de retorno, la cual ahora será 0x41414141, osea AAAA. Como se imaginarán, cuando la función intente retornar, intentará ir a la dirección 0x41414141, ocasionando un segmentation fault. Con esto ya se pueden imaginar que un atacante metódico, en lugar de colocar puras As, insertará los bytes justos para que la dirección de retorno apunte a código insertado por él (ataque conocido como arbitrary code execution), el cual probablemente haya ingresado en la misma pila al sobre escribir otras variables. También puede colocar la dirección de una función de librería (conocido como return to libc attack), la cual es conocida. Una función interesante para llamar es system().


Para el caso de los ataques heap-based, hay que pensar de forma distinta. La memoria heap es la memoria donde se almacenan las variables que son alocadas en tiempo de ejecución, comúnmente utilizando la función malloc. En el heap no hay direcciones de retorno ni algún otro registro salvado, así que los atacantes tendrán que utilizar una estrategia distinta. El heap crece en la dirección que crecen las direcciones de memoria, esto es, contrario a la dirección que crece la pila.
Algunos ataques interesantes consisten en:
- inyectar valores arbitrarios en variables para sobre-escribir variables adyacentes y cambiar la funcionalidad de un procedimiento.
- sobre escribir direcciones de punteros a funciones. En el caso que una variable en el heap almacene un puntero a una función, podríamos cambiar esta dirección y hacer que apunte a una función de sistema u otra que nos interese.
- sobre escribir variables para lograr algún beneficio. Pueden imaginarse si una función bancaria pensaba aumentar la cuenta de un atacante en u$s10 y despues de sobre escribir dicha variable ahora la incrementa en u$s10.000???

Si bien estos ataques no ser tan redituables como los stack-based, si han captado buena atención y han vulnerado multitud de aplicaciones.


Return to libc attack

Este ataque surge para lograr explotar un buffer overflow en un sistema que cuenta con pilas no-ejecutables (osea, el SO no ejecuta código que se encuentre en la pila). Esta técnica utiliza el eip (dirección de retorno) almacenado en la pila para apuntar a funciones de la librería libc. Las funciones de libc son usadas por todos los programas, así que estarán siempre presentes para ser llamadas. Una función interesante es system() que permite ejecutar programas en el sistema. En este caso, un atacante podría sobreescribir datos en la pila para que la función system() ejecute algún programa de nuestra elección, como por ejemplo /bin/bash.
Por supuesto que este ataque no se limita a libc, sino que puede utilizar cualquier librería que sepamos se encuentra en el programa.


Exploits encadenados

Si bien el código de un programa puede estar libre, o relativamente libre, de vulnerabilidades buffer overflow, puede que las librerías que utiliza no lo estén, ocasionando que el resultado final sea un programa explotable. De esto tratan los exploits encadenados, de heredar exploits presentes en librerías y haciendo al programa resultante vulnerable.
Cabe destacar que esta definición se aplica a cualquier vulnerabilidad, no sólo a los buffer overflows.
Es interesante el reciente caso de net/tun, donde el programa presentaba un bug que no estaba escrito en net/tun, sino que aparecía luego de utilizar el compilador para optimizar, el cual removía una sentencia if-then que creía innecesaria, introduciendo un exploit del kernel. Pueden leer un poco más sobre este caso en infoworld.com.


Conclusión

Buffer overflow sigue asesinando aplicaciones, pasan los años y sigue omnipresente, a la cabeza de los problemas más graves que debe enfrentar un usuario/administrador al utilizar sus programas. En los últimos 6 meses he recibido 1480 mensajes en la lista de distribución bugtrack, de los cuales 220 trataron sobre buffer overflows, representando un 6,73% del total... un número gigante, teniendo en cuenta que se codea con los exploits más recurrentes XSS y SQL injection.
A diferencia de XSS y SQL injection, lograr explotar un buffer overflow es muchisimo más complejo, no solo por los mecanismos de defensa actuales, sino porque requiere de experiencia, conocimientos de bajo nivel, tiempo y mucha paciencia. Realmente admiro los hackers que logran explotar buffer overflows, no es un trabajo que podría hacer cualquiera, como en XSS y SQL injection.

La idea original de este artículo era hacer un review de los mecanismos de detección más importantes, pero me parecía bastante descolgado explicar eso sin dar una explicación sobre los buffer overflows... el artículo se terminó extendiendo tanto que decidí partirlo en dos. En los próximos días estaré publicando los mecanismos de defensa contra los buffer overflows... stay on-line!


Referencias

Gray Hat Hacking - The Ethical Hacker's Handbook
Buffer Overflow wiki
Prevention and Detection of Buffer Overflow Attacks
Celulares en riesgo: herramienta pentesting para bluetooth + SMS worm
Disculpen por estar desaparecido en acción durante una semana, pero la verdad que al llegar del trabajo con la cabeza explotando (no por el trabajo, sino por acumulación de hs en la PC), traté de mantenerme un poco alejado de las máquinas =D

Para compensar, hoy les traigo un par de noticias interesantes. Por un lado, hoy leo en CRYPTEX sobre una herramienta para realizar tests de penetración en dispositivos que utilizan bluetooth. La citada herramienta se llama pwntooth, la cual, según la página del proyecto, escanea en busca de dispositivos y luego ejecuta las herramientas especificadas en pwntooth.conf, incluidas blueper, bluesnarfer, Bluetooth Stack Smasher (BSS), carwhisperer, psm_scan, rfcomm_scan, y vcardblaster.
Sin dudas esto habla a favor de lo que dije en mi informe Hacking Bluetooth, de a poco van surgiendo más cosas para intentar irrumpir en dispositivos utilizando este protocolo.


Por otro lado, en Darknet.org.uk encuentro una noticia sobre el desarrollo de lo que los chinos llaman "el primer worm SMS". Esta misma noticia la había leído hace un par de semanas en F-Secure, donde ofrecieron un ping-pong de preguntas y respuestas sobre el worm. Al parecer tres compañías chinas crearon el ‘Sexy Space’ worm o Yxe Worm (Worm:SymbOS/Yxe.D) y lo inyectaron en celulares basados en el sistema operativo Symbian a través del procedimiento express signing.
El susodicho worm funciona colocando un link web que apunta a la página del worm en un mensaje de texto, e invita al usuario a descargarlo (no lo hagas!!!). Si el usuario cae en la trampa y activa el worm, éste se instalará en el dispositivo y enviará un mensaje de texto similar a todos los contactos en la libreta de direcciones (si que te salió caro clickear).
Esta noticia sigue demostrando vulnerabilidades en el sistema operativo Symbian, ya en el pasado había leído sobre problemas con bluetooth (usando la herramienta BT Info) y algunas otras cosas.
Si los encargados de desarrollar SOs para celulares no toman muy en serio la seguridad, van a empezar a saltar muchos problemas...
Links: construyendo tu propio Sistema Operativo
Si te gusta meterte con cosas difíciles (como a mi), tenes una insaciable sed por hurgar hasta las entrañas del sistema, te gusta tener absoluto control sobre como funcionan las cosas, queres aprender a ser un PROGRAMADOR y no un simple desarrollador de soft de alto nivel, o simplemente tenes curiosidad, entonces los sistemas operativos son para vos, y estos links serán tu punto de partida.

Luego de la temeraria (?!) introducción, les explico un poco de qué va el tema. Hace algunos años era joven (lo sigo siendo =P ) y tenía tiempo, y como siempre amé la tecnología de los sistemas operativos, por su complejidad y porque manejan desde lo más básico que puede correr una máquina, comencé a hurgar en la programación de estos, y por suerte me encontré con bastante información y gente con el mismo sentimiento, así que recopilé una buena lista de links con tutoriales, artículos y libros de programación de estos sistemas y me pareció interesante compartirlo con aquellos que se acerquen a este humilde blog.

Si no tenes ni idea de como funciona un sistema operativo, te recomiendo comenzar leyendo excelentes libros como "Operating Systems: Design and Implementation" por Adrew "escribo de todo" S. Tanenbaum y Albert Woodhull, "Operating Systems Concepts" por Abraham Silverschatz, Peter Bael Galvin y Greg Gagne, y "Operating Systems: Internals and Design Principles" por William Stallings.

A continuación, los links:

The Operating Systems Resource Center. Completísima recopilación de datos sobre programación de OSs, agrupados en secciones relacionadas y en orden ascendente, en concordancia con los avances mientras se desarrolla. No solo cuenta con explicación sobre el software, sino que también incluye una gran lista de especificaciones de hardware. Como diría el sensei, un lujo.

Bona Fide OS Development. Otra excelente recopilación de tutoriales, documentos, libros, links, etc, con información específica sobre programación de OSs. Junto con OSRC, son las fuentes de información más completa que encontré.

El Universo Digital del IBM PC, AT y PS/2. Con información algo vieja pero todavía útil, esta página nos permite conocer un poco más de las arquitecturas, assembler, gestion de memoria, de proceso y demás cosas necesarias para programar un OS.

Construyendo un Bootstra. Porque todo se inicia con el bootstrap, les dejo el link al artículo que postié hace algún tiempo en este mismo blog.

Bootstrap Examples. Algunos ejemplos de código para la creación de bootstraps.

Linux Kernel 2.4 Internals. Explicación con bastante detalle sobre las funciones del kernel 2.4 de linux, explicando qué parte del código realiza cada tarea. Está dividido en 5 capítulos que explican el proceso de booteo, Manejo de procesos e Interrupciones, FileSystems Virtual, Linux Page Cache y Mecanismos IPC. Excelente guía para aprender cómo funciona el querido kernel.

Free BSD and Linux Kernel Cross Reference. Esta página nos permite navegar a través de los archivos de varios sistemas como FreeBSD, Linux, OpenSolaris, Minix, NetBSD y OpenBSD, entre otros. Si vas a programar algo, siempre es bueno tener ejemplos.

LinuxMM. Wiki sobre el manejo de memoria en Linux, una de las partes más complejas de un kernel.

Using Assembly Language in Linux
. Artículo algo corto pero muy útil para aprender sobre el uso de código assembler dentro de C, esto es, inline assembler, algo indispensable si queremos crear el sistema operativo en C (hacerlo completamente en asm sería una locura).

MINIX. El sistema operativo creado por Tanenbaum para enseñarle a sus alumnos en Amsterdam. Es posiblemente el mejor ejemplo para los iniciados dado que se creó con ese fin, aunque el estado de desarrollo actual ha introducido tantas cosas que ya es bastante complejo. Igualmente se pueden conseguir versiones antiguas para mejor comprensión.

Tu primer módulo cargable para el Linux Kernel pt1 y pt2. Para emezar con algo más simple que un sistema complejo, éste link nos enseña como crear módulos para el kernel de Linux y así aprender un poco de como éste funciona.

Intel Architecture Software Developer's Manual vol 1,2 y 3. No tengo el link a estos manuales, pero son algo realmente útil si vamos a programar el sistema en una arquitectura intel.

Para terminar, también me gustaría citar un libro que tiene buenas recomendaciones, pero que nunca me aventuré a leer. Este es "Understanding the Linux Kernel" por Daniel P. Bovet y Marco Cesati, y como su nombre lo indica, nos lleva a través del Kernel de Linux, explicandonos cómo funciona.
shortcuts: accesos rápidos en Windows
Y si, aunque me resista, a veces me toca administrar algún sistema windows, y como sé que ustedes seguramente también lo deben hacer (por elección propia o por trabajo/favor) les dejo algunos accesos rápidos a programas de administración del sistema.
Simplemente hagan "Inicio -> ejecutar" y peguen el comando.
La lista por supuesto que no la recopilé yo (justo yo), sino que la obtuve del foro de computación de mi universidad, y el que lo posteó, a su vez, lo debe haber obtenido de otro lado.
Al lado de cada comando les dejo la utilidad, tanto en inglés como en español por si alguno no sabe ingles. La traducción si corre por mi cuenta (para q no digan q es todo copiado =P ).
Espero les sirva!


Run Commands
-----------------------------------------------------------
compmgmt.msc - Computer management (Administración de equipos)
devmgmt.msc - Device manager (Administración de dispositivos)
diskmgmt.msc - Disk management (Administración de discos)
dfrg.msc - Disk defrag (Defragmentador de disco)
eventvwr.msc - Event viewer (Visor de eventos - alias, visor de logs)
fsmgmt.msc - Shared folders (Archivos compartidos)
gpedit.msc - Group policies (Políticas de grupo)
lusrmgr.msc - Local users and groups (Usuarios locales y grupos)
perfmon.msc - Performance monitor (Monitor de rendimiento)
rsop.msc - Resultant set of policies (Conjunto resultante de directivas (políticas))
secpol.msc - Local security settings (Configuración de seguridad local)
services.msc - Various Services (Servicios varios)
msconfig - System Configuration Utility (Utilidad de configuración de sistema)
regedit - Registry Editor (Editor del registro)
msinfo32 - System Information (Información de sistema)
sysedit - System Edit (Editor de sistema)
win.ini - windows loading information(also system.ini) (Información de carga de Windows)
winver - Shows current version of windows (Muestra la versión actual de windows)
mailto: - Opens default email client (abre el cliente de email default)
command - Opens command prompt (Abre el command prompt)


Run Commands para acceder al panel de control
-------------------------------------------------------------------
appwiz.cpl - Add/Remove Programs control (Agregar o quitar programas)
timedate.cpl - Date/Time Properties control (Propiedades de Día/Hora)
desk.cpl - Display Properties control (Propiedades de pantalla)
findfast.cpl - FindFast control (Búsqueda rápida)
fonts - Fonts Folder control (Carpeta de fuentes)
inetcpl.cpl - Internet Properties control
main.cpl keyboard - Keyboard Properties control (Propiedades del teclado)
main.cpl - Mouse Properties control (Propiedades del mouse)
mmsys.cpl - Multimedia Properties control (Propiedades multimedia)
netcpl.cpl - Network Properties control (Propiedades de red)
password.cpl - Password Properties control (Propiedades de contraseña)
printers - Printers Folder control (Carpeta de impresoras)
mmsys.cpl sounds - Sound Properties control (Propiedades de sonido)
sysdm.cpl - System Properties control (Propiedades de sistema)
Apollo Guidance Computer
Para conmemorar el 40 aniversario del primer alunizaje (aquella archiconocida misión apollo 11 tripulada por el famoso Neil Armstrong y los no tan famosos Buzz Aldrin y Michael Collins), les dejo un post visto del lado IT, osea, sobre la computadora que los acompañó y les permitió realizar la hazaña, la Apollo Guidance Computer (AGC).
La AGC fue desarrollada por el MIT Instrumentation Laboratory exclusivamente para el proyecto Apollo (obvio, sino para que el nombre no?) y era lo que hoy en día consideraríamos un pedazo de chatarra, pero que en su momento tuvo su gloria como una de las más potentes.
Esta fue la primera en utilizar circuitos integrados (ICs) y corría el sistema operativo EXEC que soportaba multitasking, capaz de ejecutar hasta 8 jobs al mismo tiempo. Entre las especificaciones podemos citar que esta porquer... digo computadora corría a 1MHz, tenía 4 registros de 16-bits, 4K words de RAM, y 32K words de ROM, no poseía disco y la interfaz de usuario era display/teclado, llamada como DSKY ("disky" entre los amigos).
Cada misión Apollo contaba con dos computadoras AGCs, una en el módulo de comando ("CM", la parte de la nave q orbitaba la luna) y una en el Modulo Lunar ("LM", el cacho que aterrizó en la luna).

Todo esto deja a uno pensando, éste pedazo de... máquina llevó al hombre a la luna y ahora necesitamos un core 2 duo con 4GB de RAM y más de 40GB de disco para correr una calculadora en Windows Vista... ffff, parece que la tecnología va para atrás en vez de avanzar...

Para finalizar, les dejo algo bien de Freek (Freak a lo ITFreek). Un señor llamado John Pultorak (muy nostálgico) se dedicó a construir una réplica de la AGC y armó un manual detallado con 1000 páginas sobre cómo hacerlo. El proyecto le llevó 4 años, trabajando 10hs a la semana e invirtió u$s 3000 en ella.
Por si alguno está interesado en ver este increíble manual, o si está tan quemado como para gastarse u$s 3000 en una computadora que no le correrá ni el tetris, les dejo el link a continuación: http://www.galaxiki.org/web/main/_blog/all/build-your-own-nasa-apollo-landing-computer-no-kidding.shtml

Por cierto, muy feliz día a todos los amigos que me bancan hace años, realmente los aprecio mucho. Este post va dedicado a ustedes.
Programas en GNU/Linux
En el post de hoy les dejo una buena lista de los programas que pueden encontrar en linux, ordenados por función, para que aquellos que recién están empezando puedan encontrar qué programa realiza la función que desean. También incluí algunos ejemplos sobre programas que realizan la misma tarea en Windows, así pueden darse una mejor idea de qué soft cumple la función del que usaban en Windows (si es que usaban Windows).
-------------------------------------------------

Administradores de Archivos

Navegadores de Archivos (en windows: explorador de windows, total commander)

* No confundir con la distribución Gentoo, este es un manejador de archivos.

Compresores de Archivos (en windows: winzip, winrar, 7zip)

* Interfaces gráficas de compresores. Estos programas no comprimen o descomprimen por si solos, sólo son una interfaz gráfica para los compresores más conocidos como zip, gzip, bzip2, 7zip, etc.


CD Mastering

ejemplos en windows: Nero, Easy cd Creator, Alcohol 120%.

* NO libre!


Editores

Editores de Texto (en windows: notepad, notepad++, crimson editor)

Editores para Graficos en Mapas de Bits (en windows: photoshop)

  • The Gimp
  • Gimpshop

Editores para Graficos Vectoriales

  • Inkscape
  • Karbon 14
  • OpenOffice.org Draw
  • Skencil

Editores de Paginas Web (en windows: dreamweaber)

  • Amaya
  • Bluefish
  • Quanta

Internet

Internet

Navegadores Web (en windows: Mozilla Firefox, internet explorer, opera)

Clientes de Mail (en windows: Mozilla Thunderbird, Outlook Expres)
  • Mozilla Thunderbird
  • Kmail
  • Evolution
  • mutt
Gestores de Descargas (en windows: download acelerator, get right, file zilla)
  • KGet
  • wget
Clientes P2P (en windows: emule, utorrent, soulseek)
  • aMule (Emule)
  • giFT
  • mldonkey (emule)
  • nicotine (Soulseek)
  • pySoulseek (Soulseek)
  • KTorrent (torrent)
  • deluge (torrent)
  • transmission (torrent)
  • bittorrent (torrent)
  • Azureus (torrent)
  • bittornado (torrent)
  • bitCommet (torrent)
Mensajeria Instantanea (en windows: msn, icq, yahoo messenger, AIM)
  • aMSN
  • emesene
  • pidgin
  • Gaim
  • Jabber
  • Kopete
VoIP (en windows: skype, Gizmo Project, OpenWengo)
  • skype*
  • Gizmo Project*
  • OpenWengo
* No libres.

Manejadores de Paquetes

en windows: ... install ... i agree... next... next... next

  • Aptitude (deb)
  • dselect (deb)
  • Kpackage (deb, rpm)
  • Kynaptic (deb)
  • Synaptic (deb)
  • Yast (rpm)

Maquinas Virtuales

Programas útiles para la virtualización de sistemas. Estos programitas nos permiten correr múltiples sistemas operativos en una sola máquina, emulando distintas arquitecturas.
Una definición en wikipedia: http://es.wikipedia.org/wiki/M%C3%A1quina_virtual

Entre los programas más conocidos en windows están: VirtualBox, VMWare

* Wine, CXOffice y Cedega no son realmente máquinas virtuales, sino que reimplementan las instrucciones de las APIs Win16, Win32 y DirectX para sistemas Unix.

** Programas NO libres.


Multimedia

Reproductores de Audio (en windows: winamp, windows media player)
Reproductores de Video (en windows: BSPlayer, crystal Player, winamp)
Editores de Audio
Editores de Video

Oficina

Procesadores de Texto (en windows: Microsoft Office Word)

  • Abiword
  • KOffice KWord
  • OpenOffice.org Writer

Gestores de Planillas de Calculo (en windows: Microsoft Office Exel)

  • Gnumeric
  • KOffice KSpread
  • OpenOffice.org Calc

Gestores de Presentaciones (en windows: Microsoft Office Power Point)

  • KOffices KPresenter
  • OpenOffice.org Impress

Manipulacion de PDFs (en windows: adobe acrobat)

  • cups-pdf
  • Gpdf/Kpdf/Xpdf
  • KghostView
  • OpenOffice.org
  • PDFCreator

Sistema

Particionadores de Disco (en windows: partition magic)

  • Gparted
  • QTParted
  • DiskDrake
  • Parted
Sistema de passwords incrackeables!
El otro día se me ocurrió una idea genial, y como nunca había oído hablar de algo así, ya me ilusionaba con que era el primero. Pero como suele suceder, después de buscar un poco, encontré que ya se le había ocurrido a otro... (f#@!04%&|#@#).
Igualmente como no es algo muy difundido, me pareció buena idea contarlo aca, para ver si se empieza a utilizar un poco más, debido a que creo que es una excelente forma de combatir crackers y ayudar a usuarios al mismo tiempo.

Como seguramente todo administrador entenderá, es complicado enseñar a los usuarios a utilizar passwords fuertes y luego recordarlos. El usuario suele utilizar passwords simples y adivinables, ya sea con diccionarios, ataques por fuerza bruta, rainbow tables o incluso un poco de ingeniería social. El problema es que si los forzamos por software a utilizar paswords complejos (que contengan mayúsculas, minúsculas, caracteres locos, un mínimo de 10 caracteres) y encima los forzamos a cambiarlos cada un cierto período de tiempo (digamos 30 días), lo que sucede es que un password que ponen a las 8 de la mañana, el administrador debe resetearlo a las 10 (con suerte), porque el usuario lo olvidó. Por otro lado, está el clásico password pegado en un post-it en el monitor, visible por todo el mundo.

Por todo esto, la idea que se me ocurrió (y a unos cuantos antes que yo ¬ ¬) es una que permita al usuario utilizar passwords recordables y a su vez hacer que los ataques por fuerza bruta, diccinario o rainbow tables sea imposible. Debido a que todos los ataques citados requieren del factor máquina, calculando passwors y probando hasta acertar, la idea es inutilizar este sistema. Y qué sistema venimos usando para que una máquina (sin interacción humana) haga trabajos automatizados en internet? el querido CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart). Siii esas clásicas letritas torcidas dentro de una imagen, encontrables en la mayoría de los blogs y foros para evitar que spammers dejen comentarios con propagandas por todos lados.
Los CAPTCHA van cambiando en cada intento de ingreso, e imposibles de adivinar por un programa (creo que una versión lograron romper algunos crackers, pero las nuevas no), así que nos brindan la herramienta necesaria para evitar la parte automatizable de un cracker.
El otro elemento que necesitamos es una clave secreta conocida solamente por el usuario. Lo bueno es que esta clave no necesita ser extremadamente fuerte y podría usarse un largo mínimo de 5 o 6 caracteres, algo fácilmente recordable.

El mecanismo sería el siguiente. La pantalla de log-in debe contar con el clásico formulario para que el usuario ingrese su nombre de usuario y clave secreta, pero además tendrá un CAPTCHA generado por el servidor, siempre distinto para cada intento de log-in. El usuario deberá ingresar sus credenciales y además lo escrito en el CAPTCHA. El password enviado puede ser la concatenación de la clave del usuario más el CAPTCHA o bien la clave y el CAPTCHA entrelazados de alguna forma, o incluso un xor entre ambos, el sistema lo elige el programador. Una vez que los datos llegan al servidor, éste conoce la clave y también sabe lo que dice el CAPTCHA (fue el que lo generó), así que necesita hacer el mismo cálculo que el cliente para corroborar si las credenciales son correctas.

Ahora, por qué esto es irrompible de forma automatizada?
El CAPTCHA siempre varía, si usáramos un cracker, éste debería acertar al primer intento, es decir, tiene una sola chance de averiguar el password porque al próximo intento, el password será distinto. Recuerden que el password es una concatenación del secreto conocido por el usuario más el CAPTCHA, por esto, aunque el secreto del usuario no cambie, el password real cambiará en cada intento, es decir, tenemos un sistema One-Time Password (OTP).
La única alternativa que queda a un hacker es averiguar la clave del usuario de forma manual, intentando combinaciones de claves de usuario más CAPTCHA, algo que, si la clave no es adivinable por ingeniería social, es muy difícil de averiguar.

Es importante que presten atención a la diferencia entre clave de usuario y password. El password será la concatenación de la clave de usuario más el CAPTCHA y es lo que se envía al servidor, y por eso es lo que tendrá que averiguar un sistema automatizado. El sistema automatizado no lee CAPTCHAs, así que no sabe cómo armar las combinaciones para hacer las pruebas.

Si bien el método de CAPTCHA por imagen sólo es útil en logins gráficos, también existen proyectos de CAPTCHAs en ascii como asciicaptcha que nos permite utilizar CAPTCHAs en sistemas no gráficos.

Algo que se me ocurre, para agregar seguridad al transmitir las claves para que no viajen de forma plana (si no contamos con una capa segura por debajo como TLS/SSL), es utilizar algún algoritmo de hashing, que calcule el hash del password (osea clave+CAPTCHA) antes de enviarlo. Entonces lo que obtenga un sniffer va a ser siempre algo distinto. Si bien el CAPTCHA es visible por un sniffer, éste no podrá averiguar la clave porque el hash varía completamente con solo modificar algún bit.


Espero que mi explicación los haya convencido, para que si desarrollan algún sistema de autenticación (como para alguna página web), utilicen este sistema para facilitarle la vida a los usuarios (no deberán recordar complejos passwords) y agregar una seguridad extrema a las cuentas de usuario.

Para que no crean que es una idea tan loca, simplemente busquen en google "CAPTCHA authentication" (sin las comillas) y van a encontrar varios ejemplos.
Survey servers más confiables
Ayer leí sobre un survey analizado en infoworld.com donde se comparan los tiempos "fuera de servicio" (downtime) de las distintas combinaciones de servidores.
Para el análisis se eligieron 15 de las combinaciones más populares de hardware y sistema operativo y se consultó a ejecutivos con conocimientos y administradores IT de 400 organizaciones apostadas en 20 países sobre tiempo fuera de servicio no planeado, parcheo (patching), y otros indicadores de confiabilidad.
Si bien no se que tan influenciado puede estar el survey (léase $$$), los resultados obtenidos dan como vencedor a IBM y su SO AIX Unix que en promedio sufre de tan solo 15 minutos de downtime por año. El segundo puesto como servidor más confiable se lo lleva la versión de Novell Suse Linux customizada corriendo en hardware x86 estándar, con un promedio de 17.4 minutos de downtime por año. Sin embargo la version de Suse no customizada promedia los 54mins.
Otras distribuciones de Linux como TurboLinux y Mandriva sobre hard x86 estándar promediaron 31.8 minutos de downtime/año, mientras que Sun Solaris sobre servidores Sparc sufrieron de 35.4 mins.
Por otro lado, servidores HP 9000 corriendo el SO HP Unix aparece en 5to lugar con 36mins/año. En sexto aparecen los servidores Apple G4 Mac corriendo Mac OS X con 37.8 mins/año.
Por supuesto los servidores Windows corriendo sobre hard intel están bien abajo, donde Windows 2003 server tuvo 3 horas y media por año y Windows 2008 server cerca de 2 horas y media por año.
Muy a mi pesar, distribuciones libres como debian aparecen etre los peores casos con más de 4horas de downtime por año.
Por su parte, servidores basados en Ubuntu la safaron bastante bien con 1 hora 40 mins de downtime por año, aunque empeoró bastante su rendimiento en comparación del año pasado donde sólo promedió 1 hora de downtime.

Para resumir, y porque me encantan los rankings, les dejo la lista armada amablemente por su servidor según los datos leídos.
1. IBM AIX Unix - 15 mins/año
2. Novell Suse Linux sobre x86 - 17.4 mins/año
3. TurboLinux, Madriva (posiblemente otras) sobre x86 - 31.8 mins/año
4. Sun Solaris sobre Sparc - 35.4 mins/año
5. HP's Unix sobre HP 9000 - 36 mins/año
6. MacOS X sobre Apple G4 Mac - 37.8 mins/año
más abajo. Ubuntu - 1.30 hs/año
lejos 1. Windows 2008 server sobre Intel - 2.3 hs/año
lejos 2. Windows 2003 server sobre Intel - 3 hs/año
lejos 3. distros libres (como debian) - más de 4 hs/año

Como nota final, cabe aclarar que en el survey sólo se incluyeron enterprise servers y no mainframes, los cuales seguramente estarían primeros. El motivo (según el analista) es que los mainframes son una clase propia, ellos no suelen tener downtime.
news: HTC smartphones Bluetooth vulnerables, Hacking cerebros, SPAM sigue rompiendo records
Justo unos días después de que publicara el artículo Hacking Bluetooth: ni tan fácil, ni tan imposible, hoy acabo de leer sobre una vulnerabilidad en los smartphones HTC que corren Windows Mobile 6 o Windows Mobile 6.1 que puede permitir que un atacante acceda a cualquier archivo en el teléfono o subir código malicioso usando Bluetooth. Dichos teléfonos son susceptibles a la vulnerabilidad directory transversal en el servicio Bluetooth OBEX FTP.
Para que el ataque funcione, el blanco debe tener Bluetooth habilitado (obvio) y la compartición de archivos sobre Bluetooth activado. Además la víctima tendrá que aceptar la conexión bluetooth del atacante, así que si no acepten conexiones de desconocidos!
Es interesante tener en mente que muchos dispositivos Bluetooth almacenan la lista de MACs de los dispositivos con los cuales ya ha compartido conexión, y aceptan cualquier conexión proveniente de una de estas MACs, así que son suceptibles a ataques Bluetooth MAC Spoofing. Por ello, borren las listas de MACs con las cuales el dispositivo se ha aparejado alguna vez.

----------------------------
Si se piensan que el hacking de cerebros es de ciencia ficción, piensen de nuevo, porque en wired.com publicaron un artículo sobre la preocupación de algunos científicos y expertos en seguridad sobre la evolución de dispositivos neuronales y las implicaciones en riesgos de seguridad que estos van a tener.
Entre los ejemplos planteados, uno puede imaginarse el problema de extremidades robóticas ajustables por los médicos a través de conexiones wireless. Al parecer ya se están haciendo muchas simulaciones cerebrales a través de wireless.
Si bien todavía no existen riesgos en los dispositivos utilizados actualmente, qué sucederá con los desarrollados dentro de los próximos 5 a 10 años? Justin Williams dice "nunca es demasiado temprano para empezar a preocuparnos en problemas de seguridad".
Recuerdo una película donde un chico tenía una mano embrujada que mataba a todos los que se cruzaba (bastante bizarra por cierto), en unos años podría hacerse realidad! =D
Más allá de todos los chistes que se les puedan ocurrir en este momento, es importante tomar en cuenta las palabras de estos científicos y prestar atención a la seguridad antes de que aparezcan los problemas.

----------------------------
Cambiando completamente de tema, luego de ofrecerles algunos números de spamming en nuevos números de spam y sex + viagra + porn + drugs = SPAM, hoy les traigo algunos más, de la mano de net-security.org donde presentan una nota sobre el reporte bi-anual de TRACElabs. En dicho reporte se observa un incremento del 60% en los valores de spam entre enero y junio de este año, con lo que ahora el spam representa el 90% de los e-mails recibidos!... simplemente una locura spamica.
En conjunto con el alza del volumen de spam, también se observa un gran aumento en la cantidad de sitios web legítimos que han sido comprometidos y utilizados para spamear a los visitantes. Aproximadamente el 70% de los sites web con contenido malicioso son sitios web legítimos que han sido hackeados... media pila! contraten administradores de seguridad! =D
Ranking popularidad distribuciones GNU/Linux
Para continuar con los ya clásicos (!?) post de rankings, qué mejor que hacerlo con la lista de distros de linux más populares?
En distrowatch se mantiene un ranking armado a partir del H.P.D (visitas diarias actualizado diariamente) de cada distribución. Es decir, la cantidad de visitas que tiene el link dedicado a cada distribución. Si bien el ranking no es la absoluta verdad (no todo el mundo visita distrowatch), es una buena referencia sobre lo que la gente busca.
El ranking con las 15 primeras posiciones para los últimos 12 meses es el siguiente:
Hace ya varios años que Ubuntu viene reinando en popularidad, teniendo una gran ventaja sobre las demás, es extraño seguir viendo openSUSE tan arriba, siendo que ya no la escucho nombrar tanto. Por su parte Mint viene ganando posiciones, y lo tiene merecido por ser muy sencilla y traer menos problemas que Ubuntu. Luego figuran las clásicas Fedora, Debian y Mandriva que no decaen gracias a la buena calidad que han brindado a lo largo de los años.

Por si todavía no la conoces, distrowatch es una página dónde se mantiene información sobre las distribuciones más importantes (y las no tanto), conteniendo una descripción de cada una, junto con actualizaciones del estado de éstas. Si usas linux o deseas usarlo y todavía no la visitaste, no esperes más!
Para ver el ranking completo, visiten la sección Linux Distributions - Facts an Figures.
Hacking Bluetooth: ni tan fácil, ni tan imposible
Después de varios años me modernicé y por fin tengo un celular que soporta la ultra conocida y usada tecnología bluetooth. Luego de jugar un rato con las opciones, la paranoia empezó a surgir y por supuesto, no pude dejar de pensar en "qué tan seguro es ésto?" (y si, siendo admin de seguridad uno se pone más y más paranoico). Así que hoy con un poco de tiempo libre, me puse a investigar el tema y encontré lo que sospechaba... hackear usando bluetooth no es extremadamente sencillo, pero no es imposible.
Lo que más me gusta de la idea es que hoy en día, prácticamente todo celular medianamente interesante, trae bluetooth incorporado, y celulares hay a montones, así que es fácil experimentar y descubrir cosas.


Definiciones

Hay varias definiciones "estándar" dando vueltas por la red sobre los distintos tipos de hacking:

bluejacking: el menos dañino de todos, yo lo consideraría algo así como un sistema para divertirnos un rato, aunque por supuesto, puede tener una funcionalidad que apeste a SPAM. Bluejacking trata sobre crear un contacto de teléfono o una tarjeta de trabajo y enviarlo a un celular a través de bluetooth. El contacto puede llamarse algo así como "te bluejackiaron" y el que lo reciba no va a entender nada. El dark side de esto, como bien dije, es el SPAM. Uno puede enviar contactos cuyo nombre sea una propaganda de algo, a todo el que pase cerca de un emisor bluetooth. Dado que se envía masivamente y nosotros no solicitamos el mensaje, es un clásico caso de SPAM.

bluesnarfing: en este caso nos encontramos con algo más peligroso. Bluesnarfing es el acto de acceder o robar información almacenada en el celular, como ser libreta de direcciones, calendarios, mensajes, imágenes, videos, lo que se imaginen. Por supuesto que nadie quiere que se metan con nuestra información >=(

bluebagging: simplemente, mi favorito. Bluebugging trata sobre controlar el dispositivo de la víctima remotamente, sin su autorización o conocimiento. De esta forma, un atacante puede potencialmente llamar al otro extremo del mundo, enviar mensajes, usar el celular como conexión "gratis" a internet, escuchar conversaciones... nuevamente, lo que se imaginen.

Algunas definiciones que no son tan comúnmente encontradas en la red, pero que son igualmente interesantes (con nombres inventados por su servidor) son:

blueDoS: ataque del tipo Dennial of Service, donde la interfaz bluetooth se torna inusable y nos gastan la batería. El ataque igualmente no es tan significativo porque se necesita estar cerca del dispositivo continuamente.

bluesniffing: utilizar un dispositivo para sniffear conexiones entre otros dispositivos. Hasta hace un tiempo esto se consideraba extremadamente complejo y que requería de hardware muy caro, pero ahora es posible.


No es tan fácil

Ahora, al leer el punto anterior, muchos se habrán asustado tanto como para no salir de sus casas llevando el celular (bueno, es entretenido pensar que se les ocurriría algo tan descabellado =D), así que para que no se vuelvan locos de paranoia (como sucede al hablar de virus), les dejo algunos datos interesantes de por qué no es tan fácil hackear dispositivos bluetooth.
Es importante destacar que las especificaciones Bluetooth son desarrolladas y licenciadas por el Bluetooth Special Interest Group (SIG), el cual se encarga de velar por la seguridad de la tecnología. Algunos de los miembros más activos en el SIG son Ericsson, Lenovo, Intel, Microsoft, Motorola, Nokia y Toshiba. Ericsson, Lenovo (antes como IBM) e Intel fueron los fundadores del SIG.

En primer lugar tenemos las limitaciones físicas:

- La limitación más importante es el corto alcance. Los dispositivos pequeños (como los celulares) tienen un alcance cercano a 10mts, y otros más grandes como las notebooks pueden llegar hasta 100mts. Como se imaginarán, 10mts es muy corta distancia, y el atacante deberá estar muy cerca de sus víctimas. Igualmente en lugares donde concurre mucha gente, como los shoppings, cafés, etc, sería relativamente fácil encontrar víctimas.

- El ancho de banda. Bluetooth cuenta con un ancho de banda de entre 723.2 Kbps y 2.1Mbps. Si bien éste ancho de banda alcanza para transmitir archivos pequeños, tardaría siglos en transmitir archivos grandes o muchos archivos. Además el ancho de banda limita el hacking por fuerza bruta.

- El usuario puede activar y desactivar la funcionalidad bluetooth. Claramente un usuario que no tiene bluetooth habilitado, no puede ser hackeado. Aunque por supuesto, muchas veces (me ha pasado), activamos la funcionalidad bluetooth para transferir hacia/desde otro dispositivo y luego olvidamos desactivarla.

Por otra parte tenemos la seguridad impuesta en los protocolos bluetooth:

- Bluetooth cuenta con cuatro modos de funcionalidad:
# Mode 1: non-secure. No se aplica ninguna medida de seguridad, los dispositivos no emplean ningún mecanismo para prevenir que otros establezcan conexiones.
# Mode 2: seguridad forzada a nivel de servicio. Se inician procedimientos de seguridad después de establecer el link LMP pero antes de que se establezca el canal L2CAP (L2CAP sería como el TCP y UDP de bluetooth).
# Mode 3: seguridad forzada a nivel de enlace. El dispositivo bluetooth debe iniciar procedimientos de seguridad antes de que se establezca el link físico.
# Modo 4: seguridad forzada a nivel de servicio, similar al modo 2, en el cual los procedimientos de seguridad se inician luego de establecer el linkeo. En este caso se utiliza Secure Simple Pairing (SSP) que simplifica el proceso de pareo y mejora la seguridad.

Son las compañías que desarrollan el dispositivo las encargadas de utilizar un modo u otro. Por supuesto, menos seguridad suele asegurar mayor facilidad de uso (un clásico). Por esto es recomendable no dejar de lado la seguridad e imponer aunque sea el modo 2 para que no nos rompan todo sin que nos enteremos.

- El usuario puede setear su dispositivo como oculto. Que un dispositivo esté oculto significa que no anda gritando contínuamente diciendo "aquí estoy! - soy BT Cell", algo que sí hace en modo visible. El modo visible facilita que otros dispositivos encuentren fácilmente al nuestro, dado que de otra forma deberían conocer la MAC con anterioridad.
Igualmente oculto no significa invisible, como acabo de decir, si alguien conoce la MAC, puede intentar acceder al dispositivo. La MAC es un identificador de 48bits de los cuales los 3 primeros bytes identifican al fabricante del dispositivo. Esto nos deja un total de 16.277.216 direcciones posibles para una marca dada. Son muchas direcciones para escanear, así que encontrar la dirección del dispositivo (debido a limitaciones de ancho de banda) podría llevar años. Si bien, algunos fabricantes suelen asignar las direcciones siguiendo alguna secuencia predecible, con lo cual se reduce el rango a escanear, siguen siendo muchas direcciones.

- Durante la comunicación entre dos dispositivos se utiliza una frecuencia de saltos de 1600 saltos/segundo, lo que permite de alguna forma evitar que un sniffer pesque una dirección MAC (las cuales, por cierto, no viajan encriptadas) y pueda seguir una conexión ajena. Cabe aclarar que los saltos son pseudo-random, así que no es imposible adivinar la secuencia.

- Si bien la comunicación entre dos dispositivos no suele contener autenticación, si hay autenticación cuando se intenta acceder a algún servicio o recurso. En algunos dispositivos suele utilizarse un PIN (passkeys) que acuerdan poner los usuarios involucrados en la comunicación. En otros casos, simplemente se le solicita al usuario autorizar la transacción.


No es imposible

Como fuí destacando en cada uno de los puntos citados en la sección anterior, todos tienen alguna falencia. Y como todo en el mundo informático, una cosa es la teoría y otra la implementación. Los fabricantes suelen cometer errores en las implementaciones dejando problemas explotables por atacantes.
Un caso interesante de falencias del fabricante es la vulnerabilidad encontrada en los modelos Nokia 6310, 6310i, 8910, 8910i, y Sony Ericsson T68, T68i, R520m, T610, Z600 (y posiblemente otros), donde robarse la libreta de direcciones es sólo cuestión de utilizar el comando obexftp, el cual es parte del estándar de bluetooth.

Por supuesto influye el factor "mi dispositivo es más fácil de usar que el tuyo", lo cual siempre acarrea que se omita algún control o se otorguen demasiadas facilidades que son aprovechables por los atacantes.
El problema más grave es que la mayoría de los celulares (hablando de celulares, NO smartphones) no traen facilidades para actualizar el firmware, por lo que una vulnerabilidad de fábrica queda impresa de por vida en miles de dispositivos.
Por otra parte, es un defecto interesante que el identificador de un dispositivo sea un nombre tipo string (cambiable fácilmente por el usuario), con lo cual un atacante que conozca el nombre de un Access Point, puede sustituirlo y engañar a quienes intenten conectarse pensando que se conectan al access point.

La mayoría de los hacks encontrados en internet requieren de ingeniería social. Es así como para lograr un bluebugging necesitaremos que el usuario acepte la recepción de un archivo. Aunque el tiempo ha dejado en claro que la gente es extremadamente susceptible a este tipo de ataques. Como lo demuestra Marek Bialoglowy en su genial artículo Bluetooth Security Review, 1 de cada 10 intentos de conexión a desconocidos fueron aceptadas! ¬ ¬

Entre las herramientas más conocidas para realizar ataques, se encuentra Super Bluetooth Hack (también conocida como BT Info) escrito en J2ME, del cual no pude encontrar mucha información sobre cómo funciona, pero algo es seguro, de hacking tiene poco dado que solo puede aprovechar vulnerabilidades en celulares viejos, y para el resto, necesita que el otro dispositivo establezca una conexión con el nuestro antes de poder hacer algo. Como cité en el párrafo anterior, la ingeniería social debe formar gran parte del ataque. En youtube pueden ver un video que muestra cómo funciona este programa.

Una herramienta más moderna es BTCrack, el cual nos permite crackear PINs y LINK-KEYs utilizando datos sniffeados en el aparejado de dos dispositivos. El PIN nos puede servir para autenticarnos ante un dispositivo que utilice un PIN hardcoded (osea, en el firmware). Por otra parte el Linkey es más útil, dado a que puede ser usado para acceder al dispositivo sin ninguna interacción del usuario. Además el Linkey nos permitirá desencriptar las tramas de datos enviadas entre los dispositivos.

Si bien, como comentaba al principio, hasta hace un tiempo sniffear una conexión bluetooth se consideraba complejo y requería hardware costoso gracias a la cantidad de saltos por segundo (1600/seg) pseudo-random entre distintas frecuencias, además de utilizar un PIN de seguridad, hace algunos meses se demostró lo contrario. Pueden leer algunos ejemplos en Construyendo tu propio sniffer bluetooth y en Sniffeando el emparejamiento bluetooth. Igualmente según comentarios que he leído, el proceso es todavía algo engorroso.

A pesar de que en la net se citan otras herramientas de hacking, la realidad es que la mayoría utilizan los protocolos estándar de bluetooth y no hacen realmente un hacking, sino que requieren nuevamente de ingeniería social para que el usuario acepte conexiones.


Acciones defensivas

Como menciona el artículo Symantec Warns Users Over Bluetooth Security, hay ciertas medidas que debemos aplicar para mantenernos relativamente seguros al utilizar esta tecnología. Las recomendaciones básicas son:

- Permanecer offline: si no estás usando bluetooth, desactivalo! Tener activada la conectividad bluetooth sin necesidad solamente implica correr riesgos innecesarios.

- Permanecer oculto: si estás usando bluetooth pero no necesitas enviar tu identificador para ser visible por otros, asegurate de que la visibilidad de tu dispositivo esté seteada a "oculto".

- Verificar transferencias entrantes: no aceptes o ejecutes archivos enviados por fuentes desconocidas a menos de que los estés esperando (como sucede con los adjuntos de los e-mails).

- Usar passwords: idealmente, utilizá un password de varios dígitos. Un PIN de 4 dígitos puede ser roto en menos de un segundo, uno de 6 llevaría cerca de 10 segundos, mientras que uno de 10 llevaría semanas.


Conclusiones

Como cualquier otra tecnología, Bluetooth tiene falencias que pueden llevar a que un atacante con experiencia y la motivación suficiente obtenga lo que desea, desde utilizar el celular de una persona para realizar llamadas de cualquier tipo, hasta robar información de contactos o mensajes de texto, lo cual puede significar un daño importante para el perjudicado. Pero como bien destaco, éste debe ser un hacker con conocimientos. La información que pude encontrar (o más bien la que NO pude encontrar) indica que más allá de herramientas simples como Super Bluetooth Hack que tiene varias limitaciones, no cualquier script kiddie puede hackear un teléfono moderno a través de bluetooth. Por supuesto que ésto no significa que debamos confiar ciegamente, dado que las falencias existen.

El ataque más factible por lejos es el bluejacking, dado que es fácilmente realizable por cualquier persona y no sería raro que en el futuro algunas empresas lo adopten como forma de SPAM.

Cabe destacar que la complejidad del protocolo (solo mirar el diagrama de capas de bluetooth hace que uno quiera pegarse un tiro) y las fallas en las implementaciones de cada fabricante son señales suficientes para pensar que todavía hay mucho por descubrir, que van a aparecer más vulnerabilidades y que los hackers estarán presentes para explotarlas. Tal es el caso de la citada herramienta BTCrack lanzada hace unos meses y que abre varias puertas, sobre todo para el sniffing.

El tiempo dirá que sucede, tal vez dentro de un tiempo salga una tecnología superior a bluetooth, todos los equipos comiencen a utilizarla y este post sirva menos que papel higiénico usado.


Algunas referencias

Guide to Bluetooth Security - Recommendations of the National Institute of Standards and Technology (Karen Scarfone, John Padgette).
Bluetooth Security Review
Type of Bluetooth Hacks and its Security Issues
Bluejacking Bluesnarfing Bluebugging Bluetoothing
Bluetomorrow - Bluetooth Security
review: Nine Ball + FFSearcher
No es secreto que la web se presta para todo tipo de hackeos, pero en estos últimos meses se dieron casos de inyección masiva que infecto miles de páginas y a través de ellas se infectó a miles de workstations de usuarios.
El caso que nos compete en esta entrega es Nine Ball y uno de los malwares que instala, el troyano FFSearcher. Nine Ball (según websense) infectó más de 40.000 sitios web legítimos en las dos semanas observadas, desde los cuales se infectaron miles de máquinas con FFSearcher a través del uso de múltiples exploits.

Los sitios web infectados (con un código ofuscado para no ser detectado) redirigen al usuario, de forma transparente, entre diversos sitios, terminando una serie de exploits que, si tienen éxito, instalan el troyano. Esto es, si un usuario visita un sitio web infectado, es redirigido a través de una serie de sitios web que son propiedad del atacante, terminando en la página final (ninetoraq.in, gracias al nombre de esta se nombró al malware Nine Ball) que contiene el código de los exploits. La última página visitada almacena la dirección IP del pobre e ignorante usuario (ignorante en el sentido que no se entera de todo lo que está pasando). Cuando el usuario visita una de las páginas infectadas por primera vez, éste es redirigido hasta llegar a la página con el exploit, pero si el usuario ya ha estado en alguna de las páginas, la redirección es hacia el sitio legítimo y no infectado ask.com.
Ustedes se preguntarán, y para qué hace esto???... bueno, es una genialidad del autor, de ésta forma le complica la vida a los analizadores del malware, porque sólo podrán observar el comportamiento una sola vez por IP, si visitan el sitio más de una vez con la misma IP, simplemente verán ask.com (me imagino la calentura de los pobres trabajadores de la seguridad =D). Por otra parte, la redirección hace que sea más complicado encontrar la fuente del mal. Pueden ver un dibujo abajo (créditos a websense) con este sistema de trabajo.
Ahora, también pueden estarse preguntando, y cómo es que llego hasta la página de ninetoraq sin enterarme??? Resulta que esto es especialmente fácil de hacer, sino recuerden mi anterior artículo Robando información del historial (sin usar JavaScript!). Todo es cuestión de encontrarle la vuelta, pueden usar JavaScript o el ya clásico sistema de hacking usando iframes que se oculta mucho mejor.
El código inyectado en los sites es de cierta forma random, pero la deofuscación es siempre igual. El algoritmo usa la función de JavaScript "String.fromCharCode" para convertir un grupo de valores decimales a string. El string obtenido tras la deofuscación es un iframe que eventualmente conduce a la página infectada.
El payload del código malicioso está altamente ofuscado (para que no lo pesque cualquier antivirus zapallon) e intenta explotar vulnerabilidades en Acrobat Reader, QuickTime, Microsoft Data Access Components (MDAC) y AOL SuperBuddy, entre otras posibles.

Como mencionaba al principio del post, Nine Ball es una de las inyecciones masivas que ocurrieron en el último tiempo, otras fueron Gumblar que infectó cerca de 60.000 páginas y Beladen que hizo lo propio con unas 40.000. Esto se va poniendo de moda...

Además de la citada websense, también pueden leer sobre Nine Ball en scmagazineus.com e infoworld.com.


Comentado el funcionamiento de Nine Ball, me meto de lleno con FFSearcher, tal vez el malware más interesante de los instalados por Nine Ball. FFSearcher debe su nombre a uno de los sitios utilizados en el engaño (ffsearcher.com) y es un sistema de Click fraud sobre Google Adsense for Search.
Una vez instalado en la máquina víctima, FFSearcher redirigirá de forma transparente todas las búsquedas que haga el usuario en google a través de los sitios amigos del malware, y de esta forma hacer ganar a dichos sitios grandes sumas de dinero.
Para entender mejor cómo ganan dinero, les detallo un poco mejor el mecanismo (picarones, ya los veo queriendo hacer lo mismo). Supongan que el sitio ganardinerosintrabajar.com incluye un widget Google Adsense for Search para que cuando un usuario realize una búsqueda a través de dicho textbox y clickee algún resultado, Google le pague a ganardinerosintrabajar.com una cierta suma de dinero. Ahora supongan que un usuario ignorante (nuevamente, ignorante en el sentido de que no sabe que sucede detrás) tiene instalado FFSearcher en su pc, éste abre en su browser (Firefox o Internet Explorer) la página google.com, realiza una búsqueda y clickea alguno de los resultados (hace un request sobre una página a google para entrar en ella). FFSearcher hará que ni la búsqueda en google ni el request de la página deseada vallan directamente a google.com, sino que vallan al widget de ganardinerosintrabajar.com y así darle una alegría al dueño de ganardinerosintrabajar.com, quien teniendo una página que capaz no visita ni su madre, se llena de dinero.

Lo "bueno" de FFSearcher es que logran hacer todo el fraude de forma transparente para el usuario. El usuario no ve ningún indicio de lo que está pasando dado que el browser envía y recibe los requerimientos de forma normal, y el troyano por debajo se encarga de reformarlos para desviarlos a donde desea y luego transformar lo retornado para que parezca provenir de google.com. Además los resultados no son alterados por el troyano, algo que seguramente avivaría al usuario de que algo va mal. Por otra parte, los atacantes no están desviando los pagos hacia/desde los publicistas como en el Click Fraud tradicional, simplemente fuerzan a google a pagarles por algo que de otra forma no les pagarían. Digamos, le sacan un poco de dinero a google y no perjudican a nadie, al final no son tan malos =P
Entre las páginas que se estuvieron beneficiando con el fraude, según SecureWorks, son la citada ffsearcher.com, i-web-search.com y my-web-way.com. Por supuesto que google ya les dio la baja al Adsense de dichas páginas, pero el atacante podría crear algunas nuevas.

Algunas fuentes de información son voices.washingtonpost.com y blog.trendmicro.com.
FAQ GNU/Linux
Porto al blog el FAQ que escribí hace poco más de un año para el foro linuxespanol. Cualquier duda o sugerencia, comenten!

---------------------------------------
FAQ Linux (creado 15/04/2008)

INICIANDOSE
Quiero usar linux, que debo hacer?
Pregunta que suele irritar bastante a la gente de los foros, porque demuestra que no se ha leido nada antes de preguntar =/
Linux es solo el kernel del sistema operativo, para poder instalar el sistema completo se debe instalar una distribución (hay otra forma, pero si estas leyendo este faq no creo q te interese conocerla =P). Lo cual nos lleva a la siguiente pregunta =P


Qué es una distribución?
Una distribución es un conjunto de programas recopilados por un grupo de personas. La idea de las distribuciones es hacer fácil la instalación de un sistema GNU/Linux, instalando un kernel ya compilado, junto con drivers y los programas más necesarios, configurando todo de forma que el sistema se pueda utilizar.
En la actualidad hay cientos de distribuciones, y muchos preguntan el por qué, a lo que yo responderia con otra pregunta, por qué no deberia haber muchas?, debido a que cualquiera puede manipular el software libre y hacer casi cualquier cosa con el, cualquiera puede crear su propia distribución, y de hecho se hace.
Casi todas las distribuciones fueron creadas a partir de las 3 distribuciones mas antiguas, que son debian, slackware y Red Hat.
El tema de las distribuciones en un principio confunde a los usuarios que solian utilizar windows, asi que la siguiente pregunta, es una de las mas comunes:


Qué distribución recomiendan que instale?
Recomendar una distribución es como recomendar intel o amd, o una marca de ropa, va en gustos, y las respuestas suelen ser dispares.
En la actualidad generalmente se llega a un consenso sobre cuales distribuciones son las mejores para un usuario novato, y estas son (según el orden de popularidad en www.distrowatch.com):
- Ubuntu derivada de debian
- PCLinuxOS derivada de mandriva (antes mandrake) - la cual a su vez deriva de Red Hat
- openSuse derivada de slackware
- Fedora derivada de Red Hat
- Mandriva derivada de Red Hat
Junto a cada distribución les agregue el link a su sitio oficial para que puedan descargar la que más les guste. Cada una tiene sus puntos a favor y sus puntos en contra, pero en general todas andan bien. Todas son fáciles de instalar, y detectan y configuran muchísimo hardware.
Para conocer más distribuciones y elegir dirijanse a http://distrowatch.com/


Tengo una maquina vieja con poca RAM, que distribución me recomiendan?
Las distribuciones que mejor se desempeñan en estas maquinas son:
- Damn Small Linux
- Puppy Linux
Ambas tienen entorno gráfico y son fáciles de usar. Realmente una joyita =)


Fui a la pagina de "tal" distribución, y descargue un archivo .iso, que es esto? que hago con el???
Esta no es una duda de linux, pero es una pregunta muy frecuente.
Un archivo .iso es una imagen de un cd o dvd, esto es, una copia exacta de un cd o un dvd. El sistema de archivos utilizado es iso9660, común en casi todos los cds.
Lo que deben hacer es grabar esta imagen en un cd o dvd. Para ello deben tener algún programa para quemar cds. Si utilizan windows probablemente tengan instalado nero. En el programa para quemar cds deben elegir la opción "grabar imagen de cd", seleccionar la imagen .iso y darle grabar.
ATENCION: no creen un nuevo cd de datos y le pongan adentro la imagen .iso!!!, esto no funciona!, deben grabar el cd eligiendo la opción grabar imagen de cd o dvd.


Cómo debo particionar el disco?
Cuando comiencen a instalar alguna distribución, estas les preguntaran cómo desean particionar el disco para instalar GNU/Linux.
Esencialmente Linux necesita dos particiones, la partición donde se instalara todo el sistema y una partición para memoria swap. La memoria swap se utiliza como memoria complementaria a la RAM (la definición es mas complicada, pero en principio la pueden ver así), por esto es que en textos viejos suele recomendarse que el tamaño de la partición swap debe ser del doble del tamaño de la memoria RAM instalada. Actualmente veo esto innecesario dado que las maquinas nuevas ya traen 2 o 4GB y asignar 8GB para swap me parece un desperdicio. Así que mi recomendación es:
- si tenes menos de 512MB de RAM asigna el doble del tamaño de tu RAM
- si tenes entre 512MB y 2GB asigna como máximo 512MB
- si tenes 2GB o más, no veo necesario dejar más que 256MB de swap, a menos que uses programas demasiado pesados que utilicen muchísima RAM.
En mi pc actualmente tengo 2GB de RAM y no utilizo nunca la memoria swap, o a lo sumo utilizo 10MB, como para que se den una idea.

Ahora, para la partición raiz (donde se instala todo el sistema) si no crean una partición para /home aparte, recomendaría que dejen unos 10 o 15GB si es que van a guardar todos sus documentos en el /home. En la carpeta home se encuentran las carpetas personales de cada uno de los usuarios del sistema, allí se guardan todas las configuraciones del usuario y (en principio) es el único lugar donde el usuario puede guardar documentos.
Mi recomendación es tener la partición /home aparte de la partición para el sistema principal (la partición /). Esto se debe a que si la partición / se corrompe, podemos formatearla sin perder ningún dato del usuario.
De esta forma, si creamos una partición aparte para /home, recomiendo dejar como máximo 10GB para la partición /. El tamaño de la partición /home es difícil de especificar, porque depende de que valla a guardar el usuario allí. Si tienen una partición aparte para guardar datos (películas, musica, juegos, etc), creo que con 2GB para el /home está bien.
Resumiendo, deberían crear 3 particiones, una para el sistema principal /, otra para la memoria swap y la ultima (opcional) para el /home.

Todos estos números los recomiendo por mi experiencia personal. Una vez que se van familiarizando con el sistema y como este opera, ustedes decidiran cuales son los tamaños apropiados para sus particiones, y cuantas particiones crear.


Cómo se instalan los programas en Linux?
Olvidense del setup.exe, instal.exe, instalar.exe, etc. En linux la instalación de programas se hace de una manera totalmente distinta. Al principio resulta chocante y hasta molesto, pero una vez que uno se acostumbra lo hace con naturalidad y hasta le gusta =)
Principalmente, hay 3 formas de instalar programas en linux:

- descargando un archivo comprimido que contiene todo lo necesario para hacer funcionar el programa. Muchos programas como firefox, ofrecen en sus páginas un archivo comprimido que tiene todo lo necesario para que el programa funcione. Lo único que deben hacer es descomprimir ese archivo y ejecutar el ejecutable principal.

- descargando y compilando el código fuente.
Debido a que en GNU/Linux la mayoría de los programas son libres, se puede tener sus códigos fuente, y por lo tanto, compilarlos e instalarlos uno mismo.
Lo que se hace es descargar un archivo comprimido que contiene todos los archivos fuente, descomprimirlo, y ejecutar lo siguiente:
./config
make
make install
Si bien en principio esto no parece difícil, si lo es. Lo difícil es que para poder instalar un programa de esta manera se deben tener instaladas todas las librerías necesarias, de las cuales el programa depende. Y creanme, estas suelen ser muchas, e instalar una por una a medida que el programa las va pidiendo es muuuuuuy molesto.
Así que recomiendo esta forma de instalación sólo a los usuarios que ya tienen contacto con linux hace un tiempo y quieren aprender un poco más.

- instalando programas desde paquetes con un manejador de paquetes.
Esta es la forma que utilizan casi todos los usuarios de GNU/Linux. Hay distintos formatos de paquetes y distintos manejadores de paquetes, habiendo gráficos y de consola. Los formatos de paquete más utilizados son los .rpm (Red Hat, mandriva, openSuse, PCLinuxOS, Fedora y un laaaargo etc), y los .deb (debian, ubuntu, knoppix, Mint, y otro laaaargo etc).
Un paquete contiene un programa junto con información sobre su versión, una lista de paquetes de los que depende, un checksum (para comprobar errores), una descripción de lo que hace el programa, una firma digital (para corroborar la autenticidad) y algunos datos mas.
Un paquete NO es un instalador, para instalar un paquete se debe utilizar algún manejador de paquetes. Los manejadores de paquetes de bajo nivel son dpkg para los .deb y rpm para los .rpm, pero se suelen utilizar herramientas de mas alto nivel (que utilizan a estas herramientas como base) para realizar más fácilmente la instalación de programas.
Entre las herramientas que se utilizan comúnmente están: apt-get, dselect y aptitude (consola), synaptic, kpackage, kynaptic, etc (modo grafico) para los .deb; y apt4rpm, up2date (Red Hat), urpmi (mandriva), YaST (suse), YUM (Fedora), etc para los .rpm
Para saber un poco más sobre los sistemas de gestión de paquetes, lean http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_paquetes


CONFIGURANDO
Donde esta mi disco C? y el D, E, F, G???
Esto es gracioso de leer, pero es una pregunta que todos se hacen cuando utilizan linux por primera vez (si eran usuarios de windows claro...).
En GNU/Linux y en los sistemas Unix en general hay un solo árbol de directorios y todos los medios de almacenamiento se montan en este árbol.
Como para hacer una comparación con windows, es como si todas sus particiones y dispositivos extraíbles se encontraran dentro del disco C.
La raíz del árbol en linux es el /. Todo pende de la raíz (si quieren imaginenla como si fuera el C, aunque no es el equivalente, sino otra forma de organizar los directorios). Dentro de la partición / se crean una serie de directorios comunes a todos las distribuciones (y a los Unix en general), como el directorio /bin, el /usr, /sbin, /home, /root, /etc. Cada uno tiene un uso específico.
Para que otros dispositivos de almacenamiento (otras particiones o discos extraíbles, etc) se monten al inicio del sistema, deben crear un directorio donde montar el dispositivo y modificar el archivo fstab que se encuentra dentro del directorio /etc.
Los dispositivos de almacenamiento suelen montarse dentro de directorios que se encuentran en /media o /mnt. Así por ejemplo podrían tener una partición que tiene instalado windows montada en el directorio /media/windows, o /mnt/windows. Pero primero deben crear la carpeta /media/windows.
Modificar el archivo /etc/fstab es bastante sencillo, pero requiere de algunos conocimientos, los cuales introduzco en la pregunta que sigue.


Cómo montar mi partición windows en linux?
Para saber esto, dirigite a la siguiente pregunta: Cómo agregar entradas al archivo /etc/fstab?


Cómo agregar entradas al archivo /etc/fstab? (alias, como montar particiones al inicio del sistema?)
Montar un medio de almacenamiento no es ninguna ciencia, pero requiere de ciertos conocimientos. Como por ejemplo, qué sistema de archivos tiene el medio de almacenamiento que quieren montar, que dispositivo en /dev tiene asignado en linux y con que opciones desean montar el dispositivo (como por ejemplo con que permisos).
Los dispositivos asignados para los medios de almacenamiento son hda1, hda2, ... hdb1, hdb2, .... sucesivamente para los dispositivos ata o ide. Y sda1, sda2, ....., sdb1, sdb2, ... para los dispositivos scsi, sata y otros. Casi todo lo que enchufen en los usb se mapean a un dispositivo sdX.
Para saber que dispositivo se utiliza para cada medio de alamcenamiento, ejecuten en una consola el comando: fdisk -l. En el resultado de este comando veran el dispositivo asignado a cada disco, cd-rom, etc.

El formato del archivo /etc/fstab es:
dispositivo punto-de-montaje tipo(sistema de archivos) opciones dump pass
En dispositivo, deben colocar el dispositivo asignado al medio de almacenamiento (el que obtuvieron con fdisk -l). En punto-de-montaje deben colocar el directorio donde desean que se monte el disco, cd-rom, etc (como por ejemplo /media/windows), en tipo deben colocar el sistema de archivos, como ntfs, ext3, reiserFS, etc.
ACLARACION: para cualquier sistema de archivo fat (fat16, fat32, etc), en fstab se debe colocar como tipo vfat.
En opciones deben colocar las opciones de montaje, como por ejemplo si se puede escribir, leer, y/o ejecutar en ella, si se debe montar automáticamente, etc. Hay muchas opciones por lo que recomendaría que lean el manual de mount.
dump es para saber si se necesita volcado y pass lo usa el programa fsck para determinar el orden en el cual se van a chequear los sistemas de archivos cuando el sistema arranca. Generalmente se pone 0 en ambos casos.

Dado que seguro esto les resulta un lío tremendo, dejo el ejemplo de como agregar una partición ntfs y una fat al archivo /etc/fstab. La partición ntfs asumiré que esta mapeada en /dev/sda1 y la fat en /dev/sda2. La ntfs la montare en /media/windows y la fat en /media/datos. Por ultimo, en las opciones colocare permiso de lectura y ejecución para la partición ntfs y permisos de lectura, escritura y ejecución para la fat, esto se logra con la opción umask (si quieren saber mas, ejecuten: man umask).
Las lineas para estas dos particiones quedarían del siguiente modo:
dispositivo punto-de-montaje tipo(sistema de archivos) opciones dump pass
entradas creadas automaticamente............
...
...
/dev/sda1 /media/windows ntfs umask=0222 0 0
/dev/sda2 /media/datos vfat umask=0000 0 0


Por qué no puedo reproducir mp3s o películas?
Esta es una pregunta que se hace mucho y es debido a que por problemas legales muchas distribuciones retiraron del cd de instalación los codecs de mp3 y otros formatos privados (entre estas se encuentran ubuntu y sus hermanos -kubuntu, edubuntu, etc-, Red Hat, fedora, CentOS).
Por suerte la solución es facil y es instalar estos codecs, desde alguno de nuestros repositorios.
Busquen cuales son los paquetes correspondientes en su distribución para cada codec que necesiten e instalenlo.



INSTALANDO HARDWARE
No me anda "tal" hardware!, cómo lo instalo?
Primero me gusta aclarar que el hecho de que muchos dispositivos no funcionen en GNU/Linux es culpa de los fabricantes de hardware que no crean drivers para GNU/Linux, no es culpa de GNU/Linux, en la comunidad se invierte muchísimo tiempo y esfuerzo creando los drivers que los fabricantes deberian proveer, así que si algun dispositivo no les funciona no maldigan a GNU/Linux, quejense con el fabricante.
Ahora, la mejor forma de saber que hacer para instalar cierto hardware es buscando en google la marca y modelo del hardware para saber si existe algun driver disponible para linux.
En las siguientes preguntas incluyo explicaciones que se dieron en el foro para instalar distintos dispositivos.


Cómo instalar los drivers de una placa ATI Radeon?
Antes de hacer algo, hagan backup del archivo /etc/X11/xorg.conf (si tienen xorg) o /etc/X11/XF86Config-4 (si tiene XFree).
- Instalamos los kernel-headers correspondientes a nuestro kernel (tambien pueden llamarse linux-headers en algunas distribuciones)
- Descargamos los drivers desde la pagina de ati (amd ahora posee ati): http://ati.amd.com/support/driver.html
- Le damos permisos de ejecucion (si es q no los tiene):
#chmod +x ati-driver-installer-*.**.**.run
- ejecutamos el binario
#./ati-driver-installer-*.**.**.run
y seguir los pasos que indica.
- Ahora debemos hacer uso del comando aticonfig (para los usuarios que tengan conocimiento ejecuten #aticonfig --help, para conocer la sintaxis de configuracion).
Los pasos básicos para que nuestra placa salga andando sin problemas son, ejecutar:
#aticonfig --initial --input=/etc/X11/xorg.conf (si tienen xorg)
#aticonfig --initial --input=/etc/X11/XF86Config-4 (si tienen XFree)
#aticonfig --resolution=0,1600x1200,1280x1024,1024x768 (aca deberán poner las resoluciones q quieran usar)
Con esto se modifica el archivo xorg.conf (o XF86Config-4) para usar el driver.
- Reiniciamos y ya disfrutamos de nuestra placa.

Para corroborar que los drivers están funcionando, hacemos:
$glxinfo | grep rendering
y debería devolver: direct rendering: Yes
y el comando:
$glxgears
deberia devolver valores aproximados a
33020 frames in 5.0 seconds = 6604.000 FPS
33174 frames in 5.0 seconds = 6634.800 FPS
33293 frames in 5.0 seconds = 6658.600 FPS
los valores dependen de la placa, pero deberian andar arriba de los 1000 FPS



VARIOS
Instale windows y ahora no puedo iniciar Linux! cómo recupero el grub???
La indignación que esto produce es muy grande, pero por suerte tiene una solución muy sencilla.
Lo que hace windows al instalarse es sobre-escribir el MBR (Master Boot Record) con su propio gestor de arranque sin siquiera preguntar al usuario para saber si lo debe hacer o no >=(
Hay varias formas de recuperar grub, siendo quizas la más sencilla usando SuperGrub
Otra forma bastante simple (suponiendo que la partición donde esta instalado grub esta mapeado a /dev/sda1) es la siguiente:
1 iniciar el sistema con algun live-cd (knoppix, ubuntu, etc)
2 crear un directorio para montar la partición donde se encuentra instalado grub
mkdir /media/linux
3 montar la partición donde se encuentra instalado grub
mount /dev/sda1 /media/linux
4 hacer un bind del /dev del live cd, al /dev de la particion recien montada
mount --bind /dev /media/linux/dev
5 cambiar el origne del directorio raíz
chroot /media/linux
6 instalar grub en el MBR del disco de arranque
grub-install /dev/sda