miércoles, 8 de abril de 2015

Python A Lo Macarra.- ¡Magic Numbers or File!

Hace unos días que estoy enganchado a leer write-ups de CTFs y una regla habitual de muchos participantes cuando reciben un archivo es pasarle el comando file para saber de que tipo de archivo se trataba o para verificar que no les estaban tomando el pelo con la extensión. Ademas de ser una idea genial para la realización de un peritaje, por aquellas cosas de que al copiar el disco algún archivo misteriosamente no lleva la extensión correspondiente. 

Así que, file me pareció un comando genial pero, como no podía ser de otra manera, todos los comandos chulos no están disponibles para Windows. Lo cual me ha hecho tener ganas de programarlo en Python ya que es una cosa que no existía y que siempre que encontraba una librería esta tiraba de algún port de file para Windows. De esta manera es como me he decidido aprender, un poco por encima, que son los Magic Numbers y como podía buscarlos. 


Para los que estabais igual que yo, los Números Mágicos son un conjunto de caracteres alfanuméricos que identifican un archivo que, en un principio, se registran en  2-bytes al principio del archivo. Ademas de haber gente genial que los ha ido recopilando en tablas separando el valores hexadecimal del ASCII y catalogados por productos y extensiones. 

Ejemplos de tablas: 
Sabiendo que tenemos los valores en hexadecimal de un montón de extensiones y que python puede leer e imprimir el código binario de cualquier archivo en 4 lineas de codigo solo necesitaba la maner a de convertirlo a hexadecimal y compararlo con el Magic Number que yo quisiera. 

Buscando buscando, recordé que hace tiempo estaba jugando con binascii, una librería que contiene una serie de métodos para convertir representaciones binarias en varias codificaciones ASCII y que gracias a ella ahora tenia el metodo para poder realizar mi script. 
  • binascii.hexlify(data):
    • Return the hexadecimal representation of the binary data. Every byte of data is converted into the corresponding 2-digit hex representation. The returned bytes object is therefore twice as long as the length of data.
Aquí os dejo el Script/PoC super-esbozado ya que solo busca por el numero mágico de un pdf: 

import binascii
import re 
archivo = 'aaaa.pdf'
with open(archivo, 'rb') as m:
    contenido = m.read()

d= str(binascii.hexlify(contenido))
print (d)
o1 = re.search("25504446",d)
if o1:
    print ("Es un pdf como una casa Adobe Portable Document Format and Forms Document file")
else:
    print (" Pues, será otra cosa")

Lo he probado con y sin extensión y pasandole un archivo que no sea un pdf. Funciona y nunca me he alegrado tanto de ver código hexadecimal imprimiéndose en mi pantalla. 


Ahora solo hace falta introducir mas Magic Numbers y hacer que el mismo programa analice y encuentre los archivos sin extensión de cualquier directorio. Ya os he dicho que para temas Forenses esta idea tenia futuro. 

Espero que os haya gustado. 

Sed Buenos ;) 

No hay comentarios:

Publicar un comentario