Solution de s-celles pour 103_spx

forensics disque

18 décembre 2024

Téléchargement de 103_spx.zip et décompression.

On obtient un fichier USB_a_analyser que l’on renomme USB_a_analyser.dd

Installation de OSForensics (PassMark Software) https://www.osforensics.com

Création d’une nouvelle affaire et ajout d’un dispositif à l’affaire (ici notre fichier USB_a_analyser.dd)

image

On peut naviguer dans l’image disque

image

On trouve message.txt

Si un jour je relis ce message, le mot de passe utilisé pour chiffrer mon plus grand secret était "vgrohhfyek0wkfi5fv13anexapy3sso6" et j'avais utilisé openssl.
En revanche, j'ai effacé par erreur le fichier contenant mon plus grand secret (voir s'il existe des techniques de la mort pour le retrouver mon fichier secret.xz sha256(0fb08681c2f8db4d3c127c4c721018416cc9f9b369d5f5f9cf420b89ee5dfe4e) de 136 octets) et de toute façon, impossible de me rappeler de l'algo utilisé -_- (donc si je le retrouve... il faudra aussi retrouver l'algo pour utiliser ce mot de passe).

Dans USB_a_analyser:\.Trash-1000\files il y a un fichier secret.xz

image

On l’exporte, on le décompresse (on obtient un fichier secret) et on utilise le script Python pour récupérer le flag.

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import subprocess

def get_openssl_ciphers():
    try:
        output = subprocess.check_output(['openssl', 'list-cipher-commands'], 
                                       stderr=subprocess.DEVNULL).decode()
        return output.strip().split('\n')
    except:
        # Liste de secours si la commande ne fonctionne pas
        return [
            'aes-128-cbc', 'aes-128-cfb', 'aes-128-cfb1', 'aes-128-cfb8',
            'aes-128-ctr', 'aes-128-ecb', 'aes-128-ofb',
            'aes-192-cbc', 'aes-192-cfb', 'aes-192-cfb1', 'aes-192-cfb8',
            'aes-192-ctr', 'aes-192-ecb', 'aes-192-ofb',
            'aes-256-cbc', 'aes-256-cfb', 'aes-256-cfb1', 'aes-256-cfb8',
            'aes-256-ctr', 'aes-256-ecb', 'aes-256-ofb',
            'bf', 'bf-cbc', 'bf-cfb', 'bf-ecb', 'bf-ofb',
            'cast', 'cast-cbc', 'cast5-cbc', 'cast5-cfb', 'cast5-ecb', 'cast5-ofb',
            'des', 'des-cbc', 'des-cfb', 'des-cfb1', 'des-cfb8',
            'des-ecb', 'des-ede', 'des-ede-cbc', 'des-ede-cfb',
            'des-ede-ofb', 'des-ede3', 'des-ede3-cbc', 'des-ede3-cfb',
            'des-ede3-ofb', 'des-ofb', 'des3',
            'desx', 'desx-cbc',
            'rc2', 'rc2-40-cbc', 'rc2-64-cbc', 'rc2-cbc', 'rc2-cfb', 'rc2-ecb', 'rc2-ofb',
            'rc4', 'rc4-40',
            'seed', 'seed-cbc', 'seed-cfb', 'seed-ecb', 'seed-ofb'
        ]

def try_decrypt(algo, input_file, key):
    try:
        cmd = f"openssl {algo} -d -in {input_file} -k {key}"
        output = subprocess.check_output(cmd, shell=True, stderr=subprocess.DEVNULL)
        if b'lh_' in output:
            return output
        return None
    except:
        return None

def main():
    input_file = "secret"
    key = "vgrohhfyek0wkfi5fv13anexapy3sso6"
    
    print("Récupération de la liste des algorithmes...")
    algos = get_openssl_ciphers()
    print(f"Test de {len(algos)} algorithmes...")
    
    for algo in algos:
        print(f"Test de {algo}...")
        result = try_decrypt(algo, input_file, key)
        if result:
            print(f"\nSUCCÈS avec {algo}!")
            print("Résultat:", result.decode(errors='ignore'))
            break

if __name__ == "__main__":
    main()

On exécute le script:

python decipher.py
Récupération de la liste des algorithmes...
Test de 64 algorithmes...
Test de aes-128-cbc...
Test de aes-128-cfb...
Test de aes-128-cfb1...
Test de aes-128-cfb8...
Test de aes-128-ctr...
Test de aes-128-ecb...
Test de aes-128-ofb...
Test de aes-192-cbc...
Test de aes-192-cfb...
Test de aes-192-cfb1...
Test de aes-192-cfb8...
Test de aes-192-ctr...
Test de aes-192-ecb...

SUCCÈS avec aes-192-ecb!
Résultat: flag : lh_6c31ba64e522b5f9326b7bee0abef6547f60d214