Featured image of post FCSC 2024 - Silence

FCSC 2024 - Silence

# Introduction

Vous êtes Bob. Une vieille amie vous avait envoyé un flag pour un FCSC futur, il y a quelques années, avant que vous ne perdiez contact. Elle se rappelle à vous en indiquant qu’elle fait maintenant partie de l’organisation du FCSC. Elle a pu mettre en place ce flag et vous propose de le jouer.

Problème, le flag est resté dans une sauvegarde de SMS de votre application SMS de l’époque, Silence. Vous avez complètement oublié le code que vous utilisiez, vous savez seulement qu’il s’agissait d’un code à 5 chiffres décimaux. Saurez-vous retrouver ce flag et montrer à Alice que vous ne l’aviez pas oubliée ?

Toute ressemblance avec des faits et des personnages existants ou ayant existé serait purement fortuite et ne pourrait être que le fruit d’une pure coïncidence. Aucune IA n’a été maltraitée durant la réalisation de ce challenge.

Malheureusement, pas besoin d’aller reverse l’application Silence pour trouver des failles, quelqu’un a déjà pris le code Java de Silence et l’a utilisé en “blackbox” pour créer un outil de déchiffrement.

On suit les procédures d’installation de l’outil, et au moment du déchiffrement on nous demande un mot de passe.

On sait que le mot de passe ne fait que 5 chiffres, on peut donc tenter de le bruteforce.

J’ai modifié les scripts run-jar.sh et run-all.sh pour prendre un mot de passe depuis la command-line plutôt que stdin.

run-jar.sh

#!/bin/sh -e

cd "$(dirname "$0")"

if [ $# -ne 2 ]; then
        echo "usage: $0 SILENCE_EXPORT_DIR_PATH PASSWORD" >&2
        exit 64
fi

SILENCE_EXPORT_DIR_PATH=$1
PASSWORD=$2

if [ -z "$BCPROV_JAR" ]
then
	BCPROV_JAR=$(ls bcprov*.jar | sed 1q)
fi

echo "$PASSWORD" | java -cp "$BCPROV_JAR:build/breakthesilence.jar" re.indigo.breakthesilence.MasterSecretUtil "$SILENCE_EXPORT_DIR_PATH/shared_prefs/SecureSMS-Preferences.xml"

run-all.sh

#!/bin/sh -e

cd "$(dirname "$0")"

props=$(mktemp silence-props.XXXXXX)
trap "rm $props" EXIT

./run-jar.sh "$1" "$3" > "$props"
./breakthesilence_to_json.py "$1" "$2" < "$props"

On écrit ensuite un script bash qui utilise parallel pour paralleliser les essais.

break.sh

#!/bin/bash
RUN_ALL_SCRIPT="./run-all.sh"

SILENCEEXPORT_DIR_PATH="../SilenceExport"

OUTPUT_FILE="silence-backup.json"

try_password() {
    local password=$1
    echo "Trying password: $password"
    if $RUN_ALL_SCRIPT $SILENCEEXPORT_DIR_PATH $OUTPUT_FILE $password; then
        echo "Password found: $password"
        kill 0
    fi
}

export -f try_password
export RUN_ALL_SCRIPT
export SILENCEEXPORT_DIR_PATH
export OUTPUT_FILE

parallel -j24 try_password ::: {0..99999}

On le lance, et au bout de quelques dégrés de plus sur le CPU :

[...]
Password (leave empty if empty): Invalid passphrase!
Trying password: 56844
Password (leave empty if empty): Invalid passphrase!
Trying password: 56852
Password (leave empty if empty): Invalid passphrase!
Trying password: 56853
Password (leave empty if empty): Invalid passphrase!
Trying password: 56849
Enter output of run-jar.sh:
OK, successfully read properties.
Proceeding to conversion, this may take a while, please wait!
Done!
Password found: 56849
Password (leave empty if empty): Trying password: 56857
Password (leave empty if empty): Invalid passphrase!
Trying password: 56858
[...]

Suffit ensuite de lire le .json présent sur le répertoire courant pour lire les messages.

body": "Le code est FCSC{07d6313bfb88a72ca39e223a78477c45}. Ne l'oublie pas, il ne marchera peut-\u00eatre pas tout de suite.",
Built with coffee holding the wheels and nicotine working the pedals. And Hugo.
Theme Stack designed by Jimmy.