# 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.",