Forensique – Analyse de fichier – Cheatsheet

Analyse de fichiers

Glossaire

Magic Bytes = début du fichier
End Bytes = fin du fichier

Metadonnées

Type de fichier
file <file>

Rechercher dans des fichiers avec grep

grep <option> <motif/regex> <repertoire/fichier> | <filtre>
   
#    -e MOTIF , -E MOTIF
#    -i --ignore-case : ignore la casse
#    -R -r, --recursive : recherche récursive dans le répertoire 
#    -l --files-with-matches : afficher le nom du fichier, pas le texte qui a matché.
#    -v --invert-match : sélectionne les données qui correspondent à l'inverse du motif 
#    -n  --line-number : afficher le numéro de ligne
#    -o --only-matching : afficher seulement la partie qui match
#    -A : nombre de ligne à afficher après le match
#    -B : nombre de ligne à afficher avant le match
Recherche de liens
grep -Roni -E "[a-ZA-Z]{2,5}://[^]\"\<\>\^\`\{\|\}]*" ./folder/ | sort -u

Only http & https

grep -Roni -E "(http|https)://[^]\"\<\>\^\`\{\|\}]*" ./folder/ | sort -u
Recherche email
grep -Roni -E '[a-zA-Z0–9._%+-]+@[a-zA-Z0–9.-]+\.[a-zA-Z]{2,10}' ./folder/ | sort -u

extraction des domaines

grep -Roni -E "[a-zA-Z0–9._%+-]+@[a-zA-Z0–9.-]+\.[a-zA-Z]{2,10}" ./folder/ | sort -u | grep -oi -E "@[a-zA-Z0–9.-]+\.[a-zA-Z]{2,10}" | sort -u
Recherche d’adresses IP

IPv4

grep -Roni -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ./folder/ | sort -u
grep -Roni -E '192\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ./folder/ | sort -u
Recherche de secrets

AWS / Google / JWT / SSH keys / API key others secrets keys :

grep -Roni -E "AKIA|AIza|eyJ|PRIVATE\sKEY|API[\s\-]KEY|ghp_|gitlab_|bitbucket_|xox[baprs]|sk_live_|sk_test_|api_key|secret_key|access_token|auth_token|password|private_key|client_secret|jwt_token|db_password|api_secret|encryption_key|app_secret|oauth_token|ssh_key|master_key|session_token|auth_key|service_account_key|refresh_token|service_account|(postgres|mysql)://"
grep -Roni -E "()"
Recherche de texte
grep -Rnil "text-to-find-here" ./folder/
grep -Rnil "text-to-find-here" -A 3 -B 3 ./folder/
Recherche dans un fichier binaire
grep <...> ./binary.raw  --binary-files=text
Recherche regex dans des objets json

This python program returns object ids that match a wordlist of regex. The search is restricted to a predefined list of interesting fields within the object.

import sys
import os 

if len(sys.argv) < 4:
    print("Usage: python search_string.py '<json_file_path>' regex_wordlist.txt fields.txt")
    sys.exit(1)

files = sys.argv[1]
regex_wordlist = sys.argv[2]
interesting_fields = sys.argv[3]
with open(regex_wordlist, "r") as file: search_regex = [line.strip() for line in file]
with open(interesting_fields, "r") as file: search_fields = [line.strip() for line in file]

all_commands = []
print(search_fields, "\n\n")

for regex in  search_regex :
        #TODO: replace ".users[]" with you object array selector
        search = "echo '#regex:"+regex+"'; cat "+files+" | jq -C '[.users[] | select( "
        array = []
        regex = regex.replace('\\','\\\\')
        for s in search_fields:
                array.append('('+s+' and ('+s+' | test("'+regex+'";"i")))')
        search += ' or '.join(array)
        search += ")] | .[].id'"
        all_commands.append(search)
        print(search)
print("\n\n#results:>")
for cmd in all_commands  :
        os.system(cmd)
# regex_wordlist.txt
API_KEY
pass[a-ZA-Z0-9]+
ADMIN[0-9]{2,3}
# fields.txt
.id
.value
.info.comment
.options[0].details

Décodage de données

base64

<string> | base64 -d
cat <file> | grep -oE "[A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==" | base64 -d

hexadécimal

echo "<hexadecimal>" | xxd -r -p > output

Extraction de données

Fichiers de la suite Office

Les fichiers pris en charge par Microsoft Office utilisent le format OLE2. Les documents OOXML (.docx, .xlsm, etc.) pris en charge par MS Office utilisent la compression zip pour stocker le contenu. Les macros intégrées dans les fichiers OOXML sont stockées dans le fichier binaire OLE2 qui se trouve dans l’archive zip.

Objets OLE2

Un objet OLE (Object Linking and Embedding, liaison et incorporation d’objets) est un fichier externe (document, graphique ou vidéo) créé à l’aide d’une application externe et qui peut être inséré dans une autre application.

# lister les flux OLE2
oledump <file>
# Estraction du flux <s>
oledump -s <s> -v <file>
Objets RTF

Les documents RTF ne prennent pas en charge les macros, mais peuvent contenir d’autres fichiers intégrés en tant qu’objets OLE1.

rtfdump <file>
# lister les groupes dans le fichier 
rtfdump <file> -f O
# extraire l'objet du groupe <g>
rtfdump <file> -s 5 -H -d > out.bin

Fichiers PDF

Magic Bytes : 0x255044462D = %PDF-
End Bytes: 0x49454E44 = IEND
🗎 Structure

Comprendre les fichiers PDF Un fichier PDF est un ensemble d’objets liés entre eux par un dictionnaire.

Scan du dictionnaire d’objets
pdfid <file>
Recherche d’objets malformés
peepdf -fl <file>

Archives compressées

PKZIP / APK

Magic Bytes : 0x504B = PK
Magic Bytes (archive vide) : 0x504B0506
Tools : unzip, apktool

GZIP

Magic Bytes : 0x1F8B
Tools : unzip

TAR

Magic Bytes : 0x7573746172

Il est possible de lister les fichiers présents dans une archive ZIP même si celle-ci est chiffrée.

Fichiers Image

Extraction des propriétés d’une image
exiftool <image>

Les données se trouvant après les End Bytes sont sont ignorées par la plupart des visionneurs d’images.

JPEG , JPG

Magic Bytes : 0xFFD8FFE0
End Bytes: 0xFFD9

PNG

Magic Bytes : 0x89504E470D0A1A0A = .PNG.
End Bytes: 0x49454E44 = IEND
.
Vérification de l’intégrité du fichier png
pngcheck <img>
pngcheck -v -f <img>

Excutables

MS-DOS, OS/2 or MS Windows

Magic Bytes : 0x4D5A = MZ
Magic Bytes : 0x5A4D = MZ

ELF

Magic Bytes : 0x7F454C46 = .ELF

Récupération de fichier

sudo foremost -v -q -i <file/data> -o <output/directory> #quick mode
sudo foremost -v -i <file/data> -o <output/directory> 
sudo photorec <file/data> 

Sources

https://en.wikipedia.org/wiki/List_of_file_signatures