Montando un disco de virtualbox (.vdi) en GNU/Linux

Objetivo

Ser capaces de montar de montar un disco virtualbox (fichero con extensión vdi) en nuestro GNU/Linux de manera que podamos copiar a y desde el disco duro de una máquina virtual a la máquina donde lo montemos.

Requisitos para montar un disco .dvi

Para montar el disco virtual necesitamos de una herramienta de QEMU. En las distros Debian-like el paquete que necesitamos es qemu-kvm, pero necesitamos, explícitamente, el paquete que contenga el binario qemu-nbd.

Tras instalar el paquete, cargaremos el driver en el kernel:

sudo modprobe nbd

Y, seguidamente, podemos ejecutar qemu-nbd para montar el dispositivos de bloques soportado por qemu-disk-images. Aunque ‘nbd’ es network block device, es el módulo que utilizaremos para poder acceder a la imagen.

modprobe nbd

A continuación enlazamos la imagen del disco con el dispositivo recién creado al cargar el módulo:

qemu-nbd -c /dev/nbd0 <vdi-file>

Ahora que ya tenemos el disco como dispositivo, podríamos particionarlo, formatearlo, o montar cualquier partición que tenga, en éste caso la partición 1:

mount /dev/nbd0p1 /mnt

Y con ésto ya puedes copiar archivos desde y al disco virtual sin necesidad de arrancar instancias de máquinas virtuales. Incluso, podrías hacer chroot dentro del disco virtual:

chroot /mnt /bin/bash

 

Generando initrd.img para RedHat y sucedáneos

Esta es una receta muy rápida para poder desempaquetar y empaquetar un initrd.img para un pendrive de arranque/instalación de una distro sabor redhat.

Desempaquetar

~ #  mkdir initrd; cd initrd ; xz -dc ../initrd.img | cpio -id

Tras ello nos genera un árbol de directorios en el directorio donde nos hallemos así que, lo mejor, será que previamente crees un directorio donde desempaquetar ésto.

Volver a empaquetar

Tras realizar los cambios que deseemos, hay que situarse en la raíz del árbol que desempaquetamos con el comando anterior y ejecutar el comando siguiente:

~/initrd/etc # cd ..

~/initrd # find . | cpio -c -o | xz -9 –format=lzma > ../initrd.img
Ya sólo tenemos que copiar initrd.img sobreescribiendo el que teníamos en origen.

‘Fast & Easy’ httpd en python para compartir ficheros

Intro

Muchas veces quiero compartir algo con algún desaprensivo que utiliza un sistema propietario y, lo más rápido, sería por http. Para ello, y no tener un demonio pesado como Apache corriendo (o teniendo que levantarlo cada vez que se vaya a usar), lo mejor sería utilizar algo que, simplemente, sirva los ficheros por http.

El script

No, no hace falta ningun script. Tan solo situarse en un directorio donde esten los ficheros que se quieren compartir y ejecutar desde la linea de comandos:

[~/tmp]>python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 …

Y ya podemos acceder a los ficheros en el puerto 8000 de la máquina en cuestion.

 

Crackeando el cifrado de tu propio disco duro

Escenario

A quién no le ha ocurrido que, en algún momento, se ha vuelto paranoico y ha cifrado cualquier disco duro y/o pendrive que ha caido en sus manos. A quién no le ha ocurrido que no lo ha usado durante meses y no recuerdas la contraseña. A quién no le ha ocurrido que utilizas una lista de contraseñas y combinaciones de ellas.

A mí sí.

En este escenario es donde se nos ocurre: hagamos un crackeador para que pruebe todas las contraseñas que tenemos en nuestra lista mental. Así que, escribimos todas las contraseñas en un fichero de texto.

Seguidamente las combinamos. Esto con un simple script que las recorra en dos bucles anidados, está hecho:

#!/usr/bin/env python

f = open('lista.txt')
g = open('passwords.txt','w')
words = []

for i in f:
    words.append(i.rstrip('\n'))

for primera in words:
    for segunda in words:
        g.write( primera + segunda + '\n' )

f.close()
g.close()

El ataque de fuerza bruta

Una vez tenemos el fichero con las contraseñas, haremos un comprobador de contraseñas en una única línea de BASH (que aquí divido en varias por comodidad visual en el blog):

while read p; do 
   echo -n $p \
| sudo cryptsetup --test-passphrase -d - luksOpen /dev/sdb1 plainname \
   && echo $p && break
done < passwords.txt

A grosso modo, ésto lee cada línea del fichero passwords.txt que le pasamos por la entrada estándar y se lo pasa a cryptsetup por el pipe quien únicamente comprueba la contraseña en /dev/sdb1 (cambiar según las necesidades) y cuando no devuelva error imprime la contraseña y termina el bucle.

Y así es como crackeé un disco cifrado con un par de contraseñas de una lista y pue acceder al contenido de mi disco de 160GB que tenía olvidado por ahí.

Si conoces alguna otra forma de hacerlo o te ha ocurrido algo parecido, compártelo a través de los comentarios, por favor.

Acortando URLs desde Python y ganando dinero

Adf.ly, servicio de acortamiento de URLs

Adf.lyAdf.ly, es un servicio que permite acortar URLs de manera que si quieres ofrecer algún tipo de contenido, presentas un enlace acortado y se les mostrará una publicidad a los visitantes antes de redirigirles al contenido deseado. De esa manera, por cada visita, tu recibes unos céntimos.

Así que aquí aporto cómo usarlo para acortar URLs en tus scripts de Python. Tendrás que modificar la variable key con la línea de ejemplo que encontrarás cuando te des de alta en Adf.ly, en el menú API, eliminando la URL final (la URL a acortar). He formateado así la clave para que sea más visual en el blog, pero puedes ponerla toda seguida en una misma línea en tu script para mayor comodidad.

El Código

import pycurl
from StringIO import StringIO
key = 'http://api.adf.ly/api.php?key=' + \
      '2f8f4a2a1fc713ec49e2f74ce186250b&' + \
      'uid=10843579&advert_type=int&domain=adf.ly&url='
def adfly( url ):
 ''' str -> str
 recibe el string url con la URL a acortar y retorna un string con la
 URL acortada'''
 buffer = StringIO()
 c = pycurl.Curl()
 c.setopt(c.URL, key + url.strip())
 c.setopt(c.WRITEDATA, buffer)
 c.perform()
 c.close()
 return buffer.getvalue()

El comando del día: ‘stty’

Etiquetas

, , , , , ,

El comando stty mapea una tecla a una función. ¿Nunca te ha ocurrido que has accedido a un sistema donde no funcionaba la tecla BACKSPACE para eliminar el caracter previo al cursor y has tenido que pulsar Ctrl+H? ¿Nunca has sentido la malvada curiosidad de mapear el 1 y que al pulsarlo elimine un caracter para gastar una broma a alguien? Eso es lo que hace stty.

stty el bromista

Tenemos un amigo o compañero de trabajo que se deja una terminal abierta y se aleja de su ordenador. Es nuestro momento. Nos deslizamos con sigilo y nos ponemos delante de su teclado. Tecleamos:

$ stty erase ^M
ctrl+L

A partir de ese momento, cada vez que teclee ENTER, lo que hará será borrar el carácter a la izquierda del cursor. También, si se le odia mucho, se le puede poner en el fichero .bash_profile para que le ocurra cada vez que inicie una sesión desde ese momento.

NOTA: Ctrl+L limpia la pantalla.

stty al rescate

Si te conectas a diversos y diferentes sistemas UN*X, en algunos momentos te puedes encontrar que la tecla RETROCESO o BACKSPACE no elimina el caracter previo. En su lugar muestra ^? y tienes que utilizar Ctrl+H para borrar. Para mapear RETROCESO a borrar caracter anterior utilizaremos stty:

$ stty erase ^?

stty y las combinaciones de teclado

Para poder ver qué combinaciones de teclas hacen qué en nuestro terminal, utilizamos el parámetro -a:

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

Pequeño resumen:

erase: Borra el caracter a la izquierda del cursor

kill: Borra toda la línea

werase: Borra la palabra a la izquierda del cursor

intr: Interrumpe el comando en ejecución

quit: Interrumpe el comando en ejecución y crea un fichero core (ésto no lo he conseguido)

susp: Para el comando actual de manera que lo podemos pasar a background o continuar en primer plano

rprnt: Realiza una búsqueda de la cadena de caracteres que vas tecleando en el historial de comandos

ultimos comentarios

Lamentablemente no todas las funciones que aparecen relacionadas por el stty -a funcionan en todos los terminales ni en todas las SHELLs, por tanto, tendremos que hacer nuestras prueba/error para averiguar cuáles son válidas en los sistemas a los que accedamos.

Por otro lado, hacer notar que al ejecutar el comando en una terminal, sólo afecta a dicha terminal, de manera que si abrimos otra, dicho mapeo no va a mantenerse a no ser que lo hayamos incluido en uno de los ficheros de configuración de la misma.

La historia del comando “ping”

En diciembre de 1983, Mike Muuss escribía un comando que cualquier administrador de red ha ejecutado (al menos) una vez por semana. Su historia la relata en http://ftp.arl.mil/mike/ping.html

Yes, it’s true! I’m the author of ping for UNIX. Ping is a little thousand-line hack that I wrote in an evening which practically everyone seems to know about. 🙂

I named it after the sound that a sonar makes, inspired by the whole principle of echo-location. In college I’d done a lot of modeling of sonar and radar systems, so the “Cyberspace” analogy seemed very apt. It’s exactly the same paradigm applied to a new problem domain: ping uses timed IP/ICMP ECHO_REQUEST and ECHO_REPLY packets to probe the “distance” to the target machine.

My original impetus for writing PING for 4.2a BSD UNIX came from an offhand remark in July 1983 by Dr. Dave Mills while we were attending a DARPA meeting in Norway, in which he described some work that he had done on his “Fuzzball” LSI-11 systems to measure path latency using timed ICMP Echo packets.

In December of 1983 I encountered some odd behavior of the IP network at BRL. Recalling Dr. Mills’ comments, I quickly coded up the PING program, which revolved around opening an ICMP style SOCK_RAW AF_INET Berkeley-style socket(). The code compiled just fine, but it didn’t work — there was no kernel support for raw ICMP sockets! Incensed, I coded up the kernel support and had everything working well before sunrise. Not surprisingly, Chuck Kennedy (aka “Kermit”) had found and fixed the network hardware before I was able to launch my very first “ping” packet. But I’ve used it a few times since then. *grin* If I’d known then that it would be my most famous accomplishment in life, I might have worked on it another day or two and added some more options.

The folks at Berkeley eagerly took back my kernel modifications and the PING source code, and it’s been a standard part of Berkeley UNIX ever since. Since it’s free, it has been ported to many systems since then, including Microsoft Windows95 and WindowsNT. You can identify it by the distinctive messages that it prints, which look like this:

PING vapor.arl.army.mil (128.63.240.80): 56 data bytes
64 bytes from 128.63.240.80: icmp_seq=0 time=16 ms
64 bytes from 128.63.240.80: icmp_seq=1 time=9 ms
64 bytes from 128.63.240.80: icmp_seq=2 time=9 ms
64 bytes from 128.63.240.80: icmp_seq=3 time=8 ms
64 bytes from 128.63.240.80: icmp_seq=4 time=8 ms
^C
----vapor.arl.army.mil PING Statistics----
5 packets transmitted, 5 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 8/10/16

In 1993, ten years after I wrote PING, the USENIX association presented me with a handsome scroll, pronouncing me a Joint recipient of The USENIX Association 1993 Lifetime Achievement Award presented to the Computer Systems Research Group, University of California at Berkeley 1979-1993. “Presented to honor profound intellectual achievement and unparalleled service to our Community. At the behest of CSRG principals we hereby recognize the following individuals and organizations as CSRG participants, contributors and supporters.” Wow!

Want to see the source code ? (40k)

From my point of view PING is not an acronym standing for Packet InterNet Grouper, it’s a sonar analogy. However, I’ve heard second-hand that Dave Mills offered this expansion of the name, so perhaps we’re both right. Sheesh, and I thought the government was bad about expanding acronyms! 🙂

Phil Dykstra added ICMP Record Route support to PING, but in those early days few routers processed them, making this feature almost useless. The limitation on the number of hops that could be recorded in the IP header precluded this from measuring very long paths.

I was insanely jealous when Van Jacobson of LBL used my kernel ICMP support to write TRACEROUTE, by realizing that he could get ICMP Time-to-Live Exceeded messages when pinging by modulating the IP time to life (TTL) field. I wish I had thought of that! 🙂 Of course, the real traceroute uses UDP datagrams because routers aren’t supposed to generate ICMP error messages for ICMP messages.

The best ping story I’ve ever heard was told to me at a USENIX conference, where a network administrator with an intermittent Ethernet had linked the ping program to his vocoder program, in essence writing:

ping goodhost | sed -e 's/.*/ping/' | vocoder

He wired the vocoder’s output into his office stereo and turned up the volume as loud as he could stand. The computer sat there shouting “Ping, ping, ping…” once a second, and he wandered through the building wiggling Ethernet connectors until the sound stopped. And that’s how he found the intermittent failure.

BASH III: 5 casos de autoterminación en línea de comandos

Etiquetas

, , , , ,

La BASH nos ofrece muchas formas de simplificarnos la vida. Una de ella es la “autoterminación” o “completion“. Nos mostrará varias opciones cuando no sabemos o recordamos cómo seguía una ruta, una variable u otros casos. Vamos a verlos.

Para acceder a este efecto presionaremos 2 veces la tecla tabulador o TAB que se encuentra, en los teclados QWERTY, inmediatamente a la izquierda de la tecla Q.

tab

1. Autoterminación de ficheros y directorios.

Empezamos por el caso más conocido. Estamos en un directorio y queremos ejecutar un comando sobre un fichero o directorio contenido en éste mismo directorio. Dos presiones de tabulador seguidas hacen la magia:

testuser@~$ ls [TAB][TAB]
.bash_history .bashrc  Mail/  sent  .sudo_as_admin_successful
.bash_logout  .cache/  .profile  .ssh/  .viminfo

En caso de que haya muchos ficheros o directorios a mostrar, previamente nos avisa ya que será bastante engorroso mostrar por pantalla demasiadas opciones y podemos preferir afinar más la autoterminación añadiendo uno o más caracteres.

testuser@/$ ls /usr/lib/[TAB][TAB]
Display all 176 possibilities? (y or n)

Hay que tener en cuenta que con algunos comandos, y a partir de determinadas versiones de la autoterminación, los resultados son contextuales de manera que si intentas hacer cd, sólo te mostrará los directorios:

testuser@/$ cd /etc/[TAB][TAB]
acpi/  cloud/  fonts/  kernel/  opt/  rc3.d/  sysctl.d/
alternatives/  console-setup/  fstab.d/  landscape/  pam.d/  rc4.d/
systemd/  apache2/  cron.d/  groff/  ldap/  perl/  rc5.d/  terminfo/

2. Búsqueda de ejecutables.

Partiendo de que tenemos dos maneras de indicar a la shell qué comando queremos ejecutar (que esté incluido en $PATH o utilizando una ruta completa o relativa), el tabulador nos mostrará los ejecutables que estén en el $PATH si no ponemos ruta previa, o los que haya en la ruta que le hemos indicado.

testuser@/$ [TAB][TAB]
Display all 1192 possibilities? (y or n)
testuser@/$ ca
cal  caller  case  catchsegv  cautious-launcher  
calendar  captoinfo  cat  catman         
testuser@/$ /bin/c[TAB][TAB]
cat    chgrp  chmod  chown  chvt   cp     cpio   
testuser@/$ /bin/cp[TAB][TAB]
cp    cpio

3. Rutas.

Tanto si estamos siguiendo una ruta y no sabemos cómo continúa o, simplemente, queremos ahorrarnos teclear más aún teniendo en cuenta que si sólo hay una opción sólo es necesaria una presión de tabulador.

testuser@~$ ls -l /etc/python2.7/
total 4
-rw-r--r-- 1 root root 155 Apr 20  2012 sitecustomize.py
testuser@~$ cat /etc/p[TAB][TAB]
pam.conf  passwd-  pm/  ppp/  protocols
pam.d/  perl/  popularity-contest.conf  profile  python/
passwd  php5/  postfix/  profile.d/  python2.7/
testuser@~$ cat /etc/py[TAB]thon[TAB][TAB]
python/    python2.7/ 
testuser@~$ cat /etc/python2[TAB].7/[TAB]sitecustomize.py

4. Nombres de equipos.

Podemos utilizarlo también para completar nombres de equipos, por ejemplo, al ir a hacer ssh:

testuser@~$ cat /etc/hosts
127.0.0.1 localhost
192.168.12.68 unamiradaentrebytes
testuser@~$ ssh root@[TAB][TAB]
root@localhost  
root@unamiradaentrebytes

Los equipos los saca del fichero /etc/hosts

5. Nombres de usuarios.

Si utilizamos ~ y presionamos tabulador, completará con los nombres de usuario de que dispone el sistema:

testuser@~$ ls ~
~backup/  ~dovecot/    ~gnats  ~landscape/  ~lp  ~messagebus/ ~nobody
~root/  ~sys/  ~uucp  ~bin/  ~dovenull  ~testuser/ ~libuuid/  ~mail/
~mysql  ~postfix/  ~sshd/  ~syslog  ~whoopsie  ~daemon/     ~games/
~irc  ~list  ~man/  ~news  ~proxy/  ~sync/  ~www-data/

Si el directorio home del usuario existe, termina con una barra (/). En caso de que no exista el directorio, termina sin la barra.

Mensajes de error detallados

Es habitual que nos traten como borregos. Al ser humano le gusta que le den las cosas hechas y, el pensar, no es una excepción. Me encuentro el siguiente error al intentar acceder a un video de youtube:

youtube_error

Así que amablemente pincho en el enlace de “Learn more” y, o sorpresa, de “learn more” no hace absolutamente nada.

Solución que ofrece (agárrate los machos o las hembras antes de seguir leyendo):
¡¡¡ESPERAR!!!

Así de simple. ¿Por qué? Pues porque puede que el autor esté editando el video o.. ¡¡¡POR CUALQUIER OTRA RAZÓN!!!

Y así nos va. He aquí el texto íntegro ( Puedes leerlo en la página original aquí):
“Si aparece un mensaje de error en el reproductor, lo más seguro es que puedas verlo sin problema después de media hora. A veces, este error se debe a que el usuario que ha subido el vídeo lo está editando, a un problema con la velocidad de tu conexión a Internet, a que se ha eliminado el vídeo o cualquier otro problema.”