mar 032013
 

Quizás, mas que por SysRq (PetSis), la conozcas como Print Screen (Impr Pant). En sistemas Linux, esta tecla permite al usuario usuario ejecutar diversos comandos de bajo nivel que nos pueden servir como herramienta de último recurso para recuperar el control del sistema sin necesidad de interrumpir su alimentación y sin correr el riesgo de perder datos importantes.

Para ejecutar los comandos, tenemos que pulsar Alt + SysRq + <tecla comando>. La tecla de comando suele ser una letra del teclado, algunos de los comandos disponibles son:

  • R: Cambia el teclado del modo raw al modo XLATE.
  • K: Mata todos los programas en la consola virtual actual.
  • B: Reinicia inmediatamente el sistema sin sincronizar o desmontar los discos.
  • O: Apaga el sistema.
  • S: Sincroniza todos los sistemas de ficheros montados.
  • U: Desmonta todos los sistemas de ficheros y los vuelve a montar como de solo lectura.
  • P: Muestra los registros y banderas actuales en la consola.
  • T: Muestra una lista de las tareas en ejecución y su información en la consola.
  • M: Muestra la información actual de la memoria en la consola.
  • E: Envía la señal SIGTERM a todos los procesos, excepto a init.
  • I: Envía la señal SIGKILL a todos los procesos, excepto a init.
  • L: Envía la señal SIGKILL a todos los procesos, INCLUYENDO init.
  • 0-9: Establece el nivel de información en consola, controlando los mensajes del núcleo que se mandarán a la consola. (’0′, por ejemplo haría que sólo los mensajes de emergencia como PANIC u OOPS salgan en consola.)

Con tantos comandos disponibles, se hace difícil saber cuales usar o en que orden. Por eso vamos a ver algunas combinaciones básicas que podemos usar en determinados casos:

  • Reiniciar el servidor X: Alt + SysRq + K
  • Reiniciar de forma segura el equipo: Alt + SysRq + R | E | I | S | U | B

Nota 1: Es conveniente esperar un par de segundos entre tecla y tecla (entre comando y comando) para darle tiempo al sistema de terminar la ejecución de cada comando antes de empezar con el siguiente.

Nota 2: Si eres usuario de Fedora, no te funcionarán las combinaciones que hemos visto, pues vienen desactivadas por defecto. Para habilitarlas tan solo es necesario ejecutar este comando como super usuario:

[root@localhost ~]# echo "kernel.sysrq = 1" >> /etc/sysctl.conf

Share

ene 212013
 

Hace unos cuatro años que estoy usando como ordenador principal un portátil Acer Aspire 6935G, la verdad es que estoy muy satisfecho con este, pero los años no perdonan nadie y si al tiempo le añades uso intensivo y algunos incidentes menores, es lógico pensar que mi máquina está en los últimos momentos de su vida, que alargaré hasta tener presupuesto para comprar uno nuevo.

El otro día, mientras actualizaba mi Fedora 18 recién instalado, mi portátil decidió fallar en medio de la instalación y me vi obligado a forzar el apagado y cruzar los dedos. Al encenderlo de nuevo, el sistema se recuperó y arrancó, pero parece que la instalación de los paquetes quedó corrupta, lo que afectó a varios ficheros relativos a librerías del sistema que presuntamente se estaban instalando o actualizando cuando mi portátil ”estornudó”.

La única forma de garantizar que no quedan ficheros incompletos, es reinstalar los paquetes que se estaban “tocando” cuando el equipo falló. Por lo que necesitaba averiguar cuales eran esos paquetes. Por fortuna, YUM tiene una opción que permite obtener un historial de las últimas acciones.

YUM (Yellowdog Update Modified) es el gestor de paquetes RPM de Fedora, CentOS, Red Hat, OpenSuse, etc. Los comandos YUM history (list, info, summary, repeat, redo, undo, new) fueron añadidos en la versión 3.2.25. Por lo que este truco funcionará en cualquier distribución GNU/Linux que use YUM 3.2.25 o mayor.

La opción history es realmente útil en situaciones que requieran “volver al pasado”, como tras la eliminación o instalación no intencionada de algunos paquetes o, como en mi caso, poder repetir la última acción para asegurar que todo queda bien. Y este fue el resultado de la ejecución del comando:

[root@localhost ~]# yum history
Complementos cargados:fastestmirror, langpacks, presto, refresh-packagekit
ID | Linea de comandos        | Día y hora       | Acción(es) | Modific
-------------------------------------------------------------------------------
26 |                          | 2013-01-19 19:26 | I, U       | 12 **
25 | install ktorrent         | 2013-01-19 19:04 | Install    | 5
24 | install xournal          | 2013-01-19 17:12 | Install    | 1
23 | localinstall google-talk | 2013-01-19 15:55 | Install    | 1 EE
22 | install emesene          | 2013-01-19 15:17 | Install    | 14
21 | install crypt*per        | 2013-01-19 14:35 | Install    | 5
20 | localinstall skype-4.1.0 | 2013-01-19 13:58 | Install    | 43
19 |                          | 2013-01-18 16:11 | Update     | 1
18 | install yumex            | 2013-01-18 16:09 | Install    | 5
17 | install owncloud-client  | 2013-01-17 15:46 | Install    | 6
16 | install vim              | 2013-01-17 13:42 | Install    | 3

Como se puede ver, la última acción fue la que tiene el ID 26 e implica acciones de instalación (I) y actualización (U) de 12 paquetes. Para ver los detalles de dicha transacción ejecuté el siguiente comando:

[root@localhost ~]# yum history info 26
Complementos cargados:fastestmirror, langpacks, presto, refresh-packagekit
ID de transacción : 26
Hora inicial     : Sat Jan 19 19:26:49 2013
Rpmdb inicial    : 1675:17a75d61600c922651f9f3f97fae99324c2f3876
Usuario           : elias 
Codigo-obtenido    : ** Abortado **
Transacción realizada con:
    Instalado      rpm-4.10.2-1.fc18.x86_64                @updates
    Instalado      yum-3.4.3-47.fc18.noarch                @fedora
    Instalado      yum-metadata-parser-1.1.4-7.fc18.x86_64 @fedora
    Instalado      yum-presto-0.9.0-1.fc18.noarch          @fedora
    Instalado      yumex-3.0.10-1.fc18.noarch              @fedora
Paquetes modificados:
 ** Actualizado                 apper-0.8.0-0.11.20121126git.fc18.x86_64 @fedora
    Actualizar                        0.8.0-2.fc18.x86_64                @updates
    Actualizado                 firewall-config-0.2.11-2.fc18.noarch     @fedora
    Actualizar                                  0.2.12-1.fc18.noarch     @updates
    Actualizado                 firewalld-0.2.11-2.fc18.noarch           @fedora
    Actualizar                            0.2.12-1.fc18.noarch           @updates
    Actualizado                 git-1.8.0.2-1.fc18.x86_64                @updates
    Actualizar                      1.8.1-1.fc18.x86_64                  @updates
 ** Actualizado                 libcdr-0.0.8-2.fc18.x86_64               @fedora
    Actualizar                         0.0.9-2.fc18.x86_64               @updates
 ** Actualizado                 lsof-4.86-4.fc18.x86_64                  @fedora
    Actualizar                       4.87-1.fc18.x86_64                  @updates
 ** Actualizado                 nmap-ncat-2:6.01-8.fc18.x86_64           @fedora
    Actualizar                            2:6.01-9.fc18.x86_64           @updates
    Actualizado                 perl-Git-1.8.0.2-1.fc18.noarch           @updates
    Actualizar                           1.8.1-1.fc18.noarch             @updates
    Instalación de dependencias qtlockedfile-2.4-5.fc18.x86_64           @fedora
    Instalación de dependencias qtsingleapplication-2.6.1-7.fc18.x86_64  @fedora
    Instalación de dependencias quazip-0.5-1.fc18.x86_64                 @fedora
    Instalar                    smplayer-0.8.3-2.fc18.x86_64             @rpmfusion-free
history info

Tras esto, podía saber exactamente cuales fueron las acciones que realizaba el sistema cuando falló, y ejecutando un último comando pude reinstalar todos esos paquetes y garantizar en gran medida que mi sistema queda íntegro:

[root@localhost ~]# yum reinstall apper-0.8.0-2.fc18.x86_64 firewall-config-0.2.12-1.fc18.noarch firewalld-0.2.12-1.fc18.noarch git-1.8.1-1.fc18.x86_64 libcdr-0.0.9-2.fc18.x86_64 lsof-4.87-1.fc18.x86_64 nmap-ncat-2:6.01-9.fc18.x86_64 perl-Git-1.8.1-1.fc18.noarch qtlockedfile qtsingleapplication quazip smplayer

Como se puede ver, en la mayor parte de los paquetes especifiqué la versión y arquitectura exactas, esto es porque de otro modo, YUM podría no saber a que arquitectura o versión me refiero, sobretodo en sistemas x86_64, donde se pueden disponer de las versiones de 64 bits y 32 bits de un paquete instaladas al mismo tiempo, para mantener la retrocompatibilidad.

Yum history permite hacer muchas más cosas muy interesantes, pero no las comentaré ahora, es posible que más adelante haga un post mas completo acerca de esta funcionalidad y sus posibilidades. Por ahora, solo me queda esperar que mi experiencia le sirva a alguien que tenga un problema parecido.

Share

dic 012012
 

En general, un fichero es un recurso que nos da el sistema operativo para acceder de forma ordenada a un determinado conjunto de datos almacenados en el disco duro, por lo que se puede entender como un enlace a la zona del disco donde se encuentran los datos relacionados al mismo.

En Linux, cuando un programa abre un fichero, el sistema operativo crea otro enlace a ese archivo, llamado Descriptor de Fichero (FD), en un lugar temporal que será a través del cual dicho programa acceda a los datos relacionados con el mismo, si eliminamos el archivo, el sistema lo que hace en realidad es eliminar el enlace que lo representa, pero no toca los datos que continúan guardados en el disco duro y no solo no los toca, sino que mientras exista otro enlace a esos mismos datos, como el creado de forma temporal para el programa que lo tiene abierto, no permitirá a nadie escribir en esa misma zona del disco, garantizando el correcto funcionamiento de todos los programas, incluso si se han eliminado ficheros importantes. En el momento en que el programa deja de necesitar el fichero y lo cierra, el sistema elimina su enlace y si no hay mas enlaces (debido a que el fichero ha sido eliminado), la zona asociada al mismo, queda disponible para ser sobrescrita por otro fichero.

Después de esa pequeña introducción teórica pasemos a un caso hipotético. Imaginemos que teníamos un fichero llamado “Archivo.txt” y que, por error, lo hemos eliminamos. Antes de que cunda el pánico podemos intentarlo recuperar usando una herramienta de Linux llamada lsof, esta herramienta puede mostrar los archivos abiertos y conexiones de red. Si nuestro apreciado archivo continua abierto por algún programa podremos recuperarlo fácilmente con la información que ésta nos facilita.

Para averiguar si continua abierto lo ejecutamos de este modo:

lsof | grep "Archivo.txt"

Si tras ejecutarlo no se muestra nada, significa que no hemos tenido suerte y que no podremos recuperar el fichero usando esta técnica, pero si salen una o mas líneas similares a la siguiente, si podremos hacerlo:

less 4620 usuario 4r REG 8,7 0 21237397 /home/usuario/Archivo.txt (deleted)

Si nos fijamos bien podemos ver que en este caso el programa “less” con PID 4620 aún tiene nuestro fichero abierto y que este ha sido eliminado (deleted). Además he marcado en negrita otro dato que aparece tras el nombre de usuario, se trata de un número seguido de una o mas letras (en este caso “4r”). Ese número es el descriptor de fichero (FD). Conociendo el PID de la aplicación que tiene nuestro fichero abierto y su FD, podremos recuperarlo diciendo al sistema que lo copie, para evitar así que se pierda en cuanto la aplicación que lo tiene abierto lo cierre:

cp /proc/4620/fd/4 /home/usuario/Archivo.txt

Ahora podremos comprobar que nuestro fichero vuelve a existir y que su contenido es el mismo que antes de ser eliminado.

Esta técnica de recuperación no funciona siempre, pues necesita que el fichero eliminado continúe abierto por alguna aplicación y, además, muchas aplicaciones no mantienen los ficheros abiertos mientras los usan, sino que los abren, cargan sus datos en memoria y los cierran inmediatamente, pero nos puede salvar en más de una ocasión.

Share

may 092012
 

El ARP Spoofing o envenenamiento de tablas ARP, es una técnica de hacking usada para infiltrarse en una red, con el objetivo de que un atacante pueda husmear los paquetes de datos que pasan por la LAN (red de área local), modificar el tráfico, o incluso detenerlo.

Mediante este tipo de ataques, se puede obtener información sensible de una víctima que esté en la misma red que el atacante, como nombres de usuario, contraseñas, coockies, mensajes de correo y mensajería instantánea, conversaciones VoIP, etc.

Antes de nada es importante conocer algunos conceptos básicos.

A la hora de enviar un paquete de un host a otro hay que indicar en su cabecera cual es la dirección física (MAC), que es un identificador fijo y único asignado a cada tarjeta de red. Cuando una aplicación se quiere comunicar con otra a través de una red usará el protocolo IP para identificar la máquina de destino (la dirección IP asignada a una tarjeta de red puede variar), por lo que se hace imprescindible asociar las direcciones de red (direcciones IP) y las direcciones físicas (direcciones MAC). Para ello existe un protocolo llamado “Address Resolution Protocol” o Protocolo de Resolución de Direcciones (desde ahora ARP).

Cuando un paquete llega a una máquina, esta comprueba que en la cabecera se indique su MAC y si esta no coincide con la suya, ignorará el paquete.

Cada máquina tiene una tabla donde almacena las direcciones IP de las cuales conoce su MAC, por ejemplo:

IP MAC
192.168.1.1 d0:92:54:67:1d:ae
192.168.1.12 00:72:50:a4:b1:e3

De este modo, cuando necesita enviar un paquete a 192.168.1.1 añadirá a la cabecera que va dirigido a la MAC d0:92:54:67:1d:ae y así podrá ser aceptado en su destino.

El problema es que se puede dar el caso de que una aplicación quiera enviar un paquete a una IP que no se encuentra en dicha tabla (cada vez que se inicia el PC, esa tabla está vacía). En ese caso se hace necesario preguntar quien tiene la IP deseada, y para ello se usa el ARP. Para realizar dicha pregunta, la máquina enviará un paquete especial dirigido a la MAC ff:ff:ff:ff:ff:ff (broadcast), cuyo contenido será del estilo “¿quien tiene la ip x.x.x.x?”, cuando las máquinas de la red vean este paquete dirigido a esa dirección MAC especial, leeran el mensaje y únicamente la máquina que tenga la dirección IP por la que se pregunta responderá con otro paquete diciendo algo como “Yo, x:x:x:x:x:x, tengo la dirección IP x.x.x.x”. Ahora todas las máquinas de la red recibirán ese paquete, lo leerán y actualizarán sus tablas de IP y MAC con la nueva información, no solo la que hizo la pregunta.

El envenenamiento de las tablas ARP consiste básicamente en inundar la red con paquetes ARP indicando que la nuestra es la MAC asociada a la IP de nuestra víctima y que nuestra MAC está también asociada a la IP del router (puerta de enlace) de nuestra red. De este modo, todas las máquinas actualizaran sus tablas con esta nueva información maliciosa. Así cada vez que alguien quiera enviar un paquete a través del router, ese paquete no será recogido por el router, sino por nuestra máquina, pues se dirige a nuestra dirección MAC, y cada vez que el router u otra máquina envíe un paquete a nuestra víctima sucederá lo mismo. Como nuestra máquina sabe que “está haciendo trampas” no se auto envenenará y sí conocerá las MACs reales de todas sus víctimas, por lo que la podremos configurar para que reenvíe esos paquetes a su verdadero destinatario, así nadie notará que nos hemos metido en medio (Man-in-the-middle)

Ahora que todos los paquetes que nos interesan pasan por nuestra máquina podremos usar una aplicación analizadora de paquetes (sniffer) como Wireshark para ver su contenido y usarlo con buenos o malos propósitos.

Vamos a ver un ejemplo de como hacer esto en Linux mediante la herramienta arpspoof:

La aplicación arpspoof está diseñada para realizar envenenamientos de tablas ARP dirigidos a hosts concretos, por lo que no realiza un envenenamiento global, o por lo menos eso me ha parecido al examinar los paquetes, pero es muy fácil de manejar y funciona a la perfección.

Antes de nada, para poder hacer este ataque tendremos que tener instaladas algunas aplicaciones que podemos encontrar en el paquete dsniff, por lo que si no lo tenemos instalados procedemos a ello.

Supongamos las siguientes condiciones:

  • La IP de nuestro router es la 192.168.1.1
  • Nuestra IP es la 192.168.1.35
  • La IP de nuestra víctima es la 192.168.1.38

Configuraremos nuestro sistema para que reenvíe todos los paquetes a sus verdaderos destinatarios mediante el comando:

# echo 1 > /proc/sys/net/ipv4/ip_forward

Ahora procedemos a envenenar las tablas:

Ponemos cada uno de estos comandos en una consola diferente para indicar que nuestra MAC es la MAC asociada  a la IP del router y que también es la MAC asociada a la IP de nuestra víctima:

# arpspoof -i wlan0 -t 192.168.1.1 192.168.1.38

# arpspoof -i wlan0 -t 192.168.1.38 192.168.1.1

Nota: Yo he puesto wlan0 despues del -i porque esa es la interfaz con la que me conecto a mi red.

Por último ejecutaremos el Wireshark y ya podremos husmear en los paquetes de nuestra víctima sin que se de cuenta.

Mas adelante publicaré otro artículo explicando como detectar si alguien está envenenando nuestras tablas ARP.

Share

feb 142012
 

Streamtheworld es una plataforma de streaming on-line que da servicio a más de 2000 radios en más de 25 países, y entre ellos está España.

Radios como Cadena Ser, Cadena Dial, Los40, MaximaFM, M80RADIO, etc. usan este servicio para propagar sus ondas por internet.

El “problema” es que para escucharlas es necesario tener abierta la web de la radio con una aplicación flash que se encarga de reproducir el streaming. Eso significa un consumo de recursos significantes para una tarea tan “simple” como la reproducción de un streaming de audio.

Existe un modo de reproducir estas radios usando un reproductor tradicional, como el SMPlayer o el VLC, tan solo hay que seguir los siguientes pasos:

Encontrar el identificador de la radio.

  • Accede al enlace para escuchar on-line en la web de la radio.
  • Ve al código fuente de la ventana que aparece con el reproductor (click derecho, ver código fuente) y busca algo como esto:

<iframe src=”http://player.streamtheworld.com/players/unionradio/?callsign=MAXIMAFM” width=”1000″ height=”596″ scrolling=”no” frameborder=”0″ marginheight=”0″ marginwidth=”0″ style=”margin: 0; padding: 0;” allowtransparency=”true”></iframe>

  • El texto que se encuentra tras callsign= es el identificador de la radio (lo he marcado en azul arriba).

 

Una vez conozcas el identificador de la radio puedes usarlo para bajarte una lista de reproducción que se puede abrir con cualquier reproductor.

Descargar lista de reproducción.

  •  La ruta de descarga es la siguiente:

http://provisioning.streamtheworld.com/pls/ID_RADIO.pls

  • Por ejemplo, para escuchar Maxima FM podemos usar el identificador que encontramos antes del siguiente modo:

http://provisioning.streamtheworld.com/pls/MAXIMAFM.pls

 

Ya podrás escuchar todas las radios que retransmite Streamtheworld directamente en tu reproductor preferido.

Share