Je prends quelques minutes pour vous raconter l'anecdote de la semaine et comme à l'habitude je vais aller à l'essentiel en vous passant certains détails. Le problème rencontré concernait un code hostile stocké arbitrairement dans un fichier au format RAR. J'ai donc re-créé un exemple inoffensif nommé mak.rar ( d4dbd148371d6012b2e83944f39187fda98eb931 ) afin que nous puissions étudier et manipuler sans danger.
unrar t mak.rar
"Enter password (will not be echoed) for mak.rar:"
L'option "t" permet de tester une archive. L'archive est protégée par un mot de passe.
N'étant pas en mesure de lister le contenu cela indique qu'elle est également cryptée.
Pour les utilisateurs Windows qui utilisent Winrar, le message est plus explicite:
"Entrer le mot de passe pour le fichier crypté:"
Le problème ? Personne ne connait le mot de passe.
Casser un mot de passe demande des ressources (temps, calculs, etc...)
Et le plus ahurissant, c'est que nous ne l'aurions jamais trouvé.
Sans certains éléments, nous n'aurions jamais compris comment reconstruire ce puzzle.
Il est temps de révéler le subterfuge: la structure du RAR n'est autre qu'un camouflage !
"L'entité" génère un faux entête de fichier RAR.
Les drapeaux suivants sont activés:
→ LOCKED
→ HEADERS_ENCRYPTED
D'où le message, archive verrouillée et cryptée.
Ensuite le "mystérieux contenu" est ajouté.
Puis les CRC sont recalculés.
L'exemple inoffensif mak.rar que j'ai fabriqué est extrêmement simple afin que ça soit à la portée du quidam moyen mais le fichier que nous avons observé était OMG... sophistiqué ^^
→ "lirar.py" est un bout de python rédigé à l'arrache qui permet de lire le contenu de l'exemple "mak.rar" ; J'utilise "seek" pour me positionner à l'offset 14h car le block MARKER + le block ARCHIVE du format de fichier RAR font 20 bytes.
Code : Tout sélectionner
#!/usr/bin/env python
import base64,zlib
rar=open('mak.rar','rb')
rar.seek(20)
print base64.b32decode(zlib.decompress(rar.read()))
rar.close()
Ou pour écouter directement...
./lirar.py | mplayer -
La morale de l'histoire c'est qu'avant de bourinner en force brute, on a le droit de se concerter entre "amis" et d'utiliser le cluster de neurones disponibles.