viernes, 9 de enero de 2015

Serie Forense: Copia local de dispositivo USB con Linux



Pura vida gente!

Este es el primer post sobre Computación Forense de una serie que tengo planeado compartirles. Ya que ocuparemos la siguiente información en posteriores posts, haremos este tema primero. 

Usando Kali Linux (luego veremos el ejemplo con Windows) y un USB pendrive realizaremos una copia bit-a-bit del contenido de este. Muy bien, una copia bit-a-bit (Bit-Stream copy) es la copia de un contenido digital donde cada bit de dicho contenido, es idéntico al bit correspondiente del original.

Lo anterior es uno de los pasos más comunes en ciertas investigaciones forenses. Por supuesto, hay muchísimos pasos previos, pero solo nos enfocaremos en este. Veamos:
  • Inserte el disco de arranque de Linux en el PC y haga boot del sistema. Podría también usar un PC que ya lo tenga instalado, pero lo ideal es que todo se ejecute en memoria volátil.
  • Conecte el dispositivo de almacenamiento USB, si no se monta automáticamente se requerirá montarlo manualmente. Supondremos que es /dev/sdb1 y se ha montado como /media/USB.
  • Busquen el contenido que desean copiar en el directorio /dev, en el ejemplo, el disco duro se llama sda con particiones sda1, sda2, etc.
  • Con el comando md5sum /dev/sda > /media/USB/ImagenMD5hash01.txt cree un hash MD5 de la unidad en el dispositivo USB montado, para verificar la integridad del medio original contra la copia al final del procedimiento. Este paso es uno de los más relevantes, ya que si hubo alguna alteración, no sería admisible como prueba legítima en un hipotético caso legal.
  • Ejecute el siguiente comando: 
    • dd if =/dev/sda of =/media/usb/Imagen01.img
  • Lo anterior copiará el contenido del USB como un archivo en el HDD como Imagen01.img, recuerde que para Linux todo es un archivo.
  • Cree otro hash MD5 de la copia. Servirá para compararla con la original para verificar la integridad de la copia.
  • Haga más de una copia y un hash por cada copia. Es mejor prevenir y tener varias muestras.

El resultado deberían ser varias copias y varios hashes. Nunca trabaje sobre los datos originales! Para eso son las copias. En forensia existe la adquisición de datos manual, física y lógica (eso lo explicaré en otro post).

Es importante recalcar que el método anterior no explica nada si se encuentran problemas de por medio. Por ejemplo, si el PC no puede leer algunos de los sectores de la unidad que va a copiar, o si el archivo se debe dividir para que quepan en el CD, o si la imagen necesita partirse para que quepa en un dispositivo FAT32 y requiere archivos más pequeños de 2 GB.

Cuando se generan imágenes de una unidad que empieza a tener algunos sectores dañados, el siguiente comando se puede utilizar:

dd if=/dev/hda of=/media/USB conv=noerror,sync

Esto permitirá a dd continuar en los errores de lectura, y en la pista del destino donde se encuentren ceros es donde se han producido errores en la unidad de origen (por lo que su tamaño y compensaciones coincidirán). Si lo hace, es posible que desee considerar redirigir los errores estándar a un archivo, por lo que tiene un registro de dónde se encuentran sus errores.

Es posible dividir las imágenes creadas. El método más fácil es mediante el programa de división. La sintaxis del comando si usted tiene una imagen de 4GB para encajar en un CD sería:

dd if=/dev/hda | split –b 600m – /USB/sda/

Esto dividirá la imagen de salida en secciones de 620MB (-b 620m) en el directorio /USB/sda/. El nombre que les da a los fichero suele ser a* (* puede ser cualquier letra). Estos archivos pueden ser reformados en un archivo de imagen con el comando cat (## es un consecutivo).

cat a* > LaImagen##.img

A continuación, cree un hash del archivo usando md5sum y lo compare con el valor hash inicial.

md5sum LaImagen##.img

Alternativamente, si la división no está disponible puede utilizar dd por sí mismo, pero utiliza el skip, bs (tamaño de bloque) y el recuento interruptores para evitar que la lectura comience desde el principio.

dd if=dev/hda of=/media/USB/image1.img bs=1M count=600
dd if=dev/hda of=/media/USB/image2.img bs=1M count=600 skip= 601
dd if=dev/hda of=/media/USB/image3.img bs=1M count=600 skip= 1201

... y así hasta el final del archivo de entrada. Una vez en el sistema de destino y en el mismo directorio se puede juntar todos en una sola imagen con el siguiente comando:

cat /home/imagen * > TodoJunto.img

md5sum se puede ejecutar en esta imagen y se compara con el hash md5 original para comprobar la integridad.

Para ayudar a reducir el tamaño se puede utilizar gzip y split juntos. A continuación se muestra la sintaxis utilizada para realizar esto:

dd if =/dev/hda | gzip -c | split -b 2000m – /media/USB/imagen.img.gz.

dd se utiliza para tomar una imagen del disco duro. Esto es pasado al gzip (-c es la salida estándar). La imagen comprimida se canaliza entonces a la herramienta de división split, y continuación crea los archivos imagen.img.gzaa, imagen.img.gzab, etc. Para restaurar la copia de seguridad de varios archivos, ejecute el comando siguiente:

cat /USB/image.img.gz * | gzip -dc | dd of =/dev/hda

cat muestra el contenido del zip y archivos de imágenes divididas en stdout en orden. Los resultados se canalizan a través de gzip y se descomprimen. Y por útimo se escriben en el disco duro con el comando dd.

Bueno hay más comandos y formas de utilizar dd, pero creo que esto es suficiente para que investiguen más.

Nos vemos.