06 abril 2016

Foremost, ese gran desconocido

Haciendo análisis forense en GNU/Linux son variadas las herramientas con las que podemos contar, y al no estar en una "caja negra", como con las de M$-Windows, sabemos que dificilmente no nos estan falseando la evidencia.

Foremost permite la recuperación de archivos borrados de un dispositivo/partición (no de forma totalmente segura), y es el elegido de hoy para hacer una breve intro a la recuperacion forense de datos.

Es una utileria muy sencilla, al punto que mucha "gente comun" lo termino conociendo para recuperar "esas fotos de las vacaciones que la SD de la camara no permitia" y cosas asi...

Instalación
Foremost esta para muchos sabores de Linux, en este caso muestro como instalarlo completamente en un Slackware, desde los venerables SlackBuilds, esto es, bajar los fuentes, compilarlos y generar el paquete de instalacion, e instalarlo, pero si usas RPM o DEB, el proceso incluso es mucho mas simple:

root@gostir:[~]# slapt-src --search foremost
foremost:1.5.7 - foremost (recover files based on their headers and footers)
root@gostir:~# slapt-src --install foremost
Los siguientes paquetes serán instalado:
 foremost 
¿Desea continuar? [y/N] y
Recuperando README...Hecho
Recuperando doinst.sh...Hecho
Recuperando foremost-broken-jpeg.patch...Hecho
Recuperando foremost.SlackBuild...Hecho
Recuperando foremost.info...Hecho
Recuperando slack-desc...Hecho
Recuperando http://foremost.sourceforge.net/pkg/foremost-1.5.7.tar.gz...Hecho
foremost-1.5.7/
foremost-1.5.7/engine.c
foremost-1.5.7/main.h
foremost-1.5.7/main.c
foremost-1.5.7/helpers.c
foremost-1.5.7/config.c
foremost-1.5.7/README
foremost-1.5.7/foremost.conf
foremost-1.5.7/foremost.8.gz
foremost-1.5.7/extract.c
foremost-1.5.7/ole.h
foremost-1.5.7/CHANGES
foremost-1.5.7/cli.c
foremost-1.5.7/dir.c
foremost-1.5.7/extract.h
foremost-1.5.7/api.c
foremost-1.5.7/state.c
foremost-1.5.7/Makefile
patching file extract.c
Hunk #1 succeeded at 1868 (offset 74 lines).
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c main.c
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c state.c
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c helpers.c
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c config.c
config.c: En la función ‘translate’:
config.c:27:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
config.c:32:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
config.c:37:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
config.c:42:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
config.c:47:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
config.c:52:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
config.c:57:6: aviso: no se usa el valor calculado [-Wunused-value]
      *rd++;
      ^
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c cli.c
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c engine.c
engine.c: En la función ‘search_chunk’:
engine.c:319:17: aviso: se define la variable ‘current_pos’ pero no se usa [-Wunused-but-set-variable]
  unsigned char *current_pos = NULL;
                 ^
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c dir.c
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c extract.c
extract.c: En la función ‘extract_htm’:
extract.c:556:17: aviso: se define la variable ‘currentpos’ pero no se usa [-Wunused-but-set-variable]
  unsigned char *currentpos = NULL;
                 ^
extract.c: En la función ‘extract_wmv’:
extract.c:1157:14: aviso: se define la variable ‘fileObjHeaderSize’ pero no se usa [-Wunused-but-set-variable]
  u_int64_t   fileObjHeaderSize = 0;
              ^
extract.c:1150:17: aviso: se define la variable ‘currentpos’ pero no se usa [-Wunused-but-set-variable]
  unsigned char *currentpos = NULL;
                 ^
extract.c: En la función ‘extract_gif’:
extract.c:1404:17: aviso: se define la variable ‘currentpos’ pero no se usa [-Wunused-but-set-variable]
  unsigned char *currentpos = foundat;
                 ^
extract.c: En la función ‘extract_jpeg’:
extract.c:1824:17: aviso: se define la variable ‘currentpos’ pero no se usa [-Wunused-but-set-variable]
  unsigned char *currentpos = NULL;
                 ^
extract.c: En la función ‘extract_exe’:
extract.c:2114:15: aviso: se define la variable ‘align’ pero no se usa [-Wunused-but-set-variable]
  unsigned int align = 0;
               ^
extract.c:2110:15: aviso: se define la variable ‘size_of_headers’ pero no se usa [-Wunused-but-set-variable]
  unsigned int size_of_headers = 0;
               ^
extract.c:2108:15: aviso: se define la variable ‘sizeofimage’ pero no se usa [-Wunused-but-set-variable]
  unsigned int sizeofimage = 0;
               ^
extract.c:2105:15: aviso: se define la variable ‘rva’ pero no se usa [-Wunused-but-set-variable]
  unsigned int rva = 0;
               ^
extract.c:2104:15: aviso: se define la variable ‘SizeOfUninitializedData’ pero no se usa [-Wunused-but-set-variable]
  unsigned int SizeOfUninitializedData = 0;
               ^
extract.c:2103:15: aviso: se define la variable ‘SizeOfInitializedData’ pero no se usa [-Wunused-but-set-variable]
  unsigned int SizeOfInitializedData = 0;
               ^
extract.c:2102:15: aviso: se define la variable ‘SizeOfCode’ pero no se usa [-Wunused-but-set-variable]
  unsigned int SizeOfCode = 0;
               ^
extract.c: En la función ‘extract_rar’:
extract.c:2277:13: aviso: se define la variable ‘file_size’ pero no se usa [-Wunused-but-set-variable]
  u_int64_t  file_size = 0;
             ^
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c api.c
api.c: En la función ‘dump_dirent’:
api.c:481:10: aviso: se define la variable ‘unknown’ pero no se usa [-Wunused-but-set-variable]
  short   unknown;
          ^
gcc -Wall -O2 -fPIC -DVERSION=\"1.5.7\" -D__UNIX -D__LINUX -DLARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 main.o state.o helpers.o config.o cli.o engine.o dir.o extract.o api.o -o foremost 
install -m 755 foremost /usr/src/slapt-src/system/foremost/package-foremost/usr/bin
install -m 444 foremost.8.gz /usr/src/slapt-src/system/foremost/package-foremost/usr/man/man8
install -m 444 foremost.conf /usr/src/slapt-src/system/foremost/package-foremost/etc

Slackware package maker, version 3.141593.

Searching for symbolic links:

No symbolic links were found, so we won't make an installation script.
You can make your own later in ./install/doinst.sh and rebuild the
package if you like.

This next step is optional - you can set the directories in your package
to some sane permissions. If any of the directories in your package have
special permissions, then DO NOT reset them here!

Would you like to reset all directory permissions to 755 (drwxr-xr-x) and
directory ownerships to root.root ([y]es, [n]o)? n

Creating Slackware package:  /usr/src/slapt-src/system/foremost/foremost-1.5.7-x86_64-1_SBo.txz

./
usr/
usr/bin/
usr/bin/foremost
usr/doc/
usr/doc/foremost-1.5.7/
usr/doc/foremost-1.5.7/README
usr/doc/foremost-1.5.7/CHANGES
usr/doc/foremost-1.5.7/foremost.SlackBuild
usr/man/
usr/man/man8/
usr/man/man8/foremost.8.gz
install/
install/doinst.sh
install/slack-desc
etc/
etc/foremost.conf.new

Slackware package /usr/src/slapt-src/system/foremost/foremost-1.5.7-x86_64-1_SBo.txz created.

Installing package foremost-1.5.7-x86_64-1_SBo...
| foremost (recover files based on their headers and footers)

| Foremost is a Linux program to recover files based on their headers
| and footers. Foremost can work on image files, such as those
| generated by dd, Safeback, Encase, etc, or directly on a drive. The
| headers and footers are specified by a configuration file, so you can
| pick and choose which headers you want to look for.

| Homepage: http://foremost.sourceforge.net/




root@gostir:[~]#

Ah, si, era una simple linea de comando, me olvide de aclararlo, Slackware esta diseñada para gente perezosa como yo, que queremos todo excelente pero sin tener que teclear mil lineas de comandos... Sonara extraño pero es asi, todo automagico, se bajan los fuentes, se verifican, se compilan OPTIMIZADOS para nuestro sistema en particular, se genera el paquete .TXZ y se instala solo, y en el caso de necesitar dependencias, por su puesto que se resuelven de la misma manera...

Ahora si, como el movimiento se demuestra andando...
Recuperar todos los archivos JPG y copiarlos en /tmp/recovery (o donde dispongamos):

root@gostir:[~]# foremost -t jpg -i /dev/sde1 -o /tmp/recovery

Pero siendo forenses, generalmente trabajamos sobre imagenes de dispositivos, asi que vamos a tomar una imagen RAW realizada con el poderoso comando DD y recuperar todo lo que podamos de ahi:

root@gostir:[~]# foremost -t all -i imagen.dd -o /tmp/recovery

Va a demorar dependiendo del equipo que tengamos, y del tamaño de la imagen. Y como una mañana de Navidad, todos los archivos van a estar ahi...


Que te diviertas!