Description commune aux différentes étapes#
Lors d’un passage de douane, le douanier vous demande de lui remettre votre téléphone ainsi que son code de déverrouillage. Le téléphone vous est rendu quelques heures plus tard …
Suspicieux, vous envoyez votre téléphone pour analyse au CERT-FR de l’ANSSI. Les analystes du CERT-FR effectuent une collecte sur le téléphone, composée d’un sysdiagnose et d’un backup.
Note : à l’exception de iForensics - iBackdoor 2/2 qui dépend de la résolution de iForensics - iBackdoor 1/2, les épreuves sont indépendantes. Nous vous conseillons néanmoins de faire les épreuves par difficulté croissante, en terminant par iForensics - iCompromise.
iCrash#
Description#
Il semblerait qu’un flag se soit caché à l’endroit où sont stockés les crashes sur le téléphone …
Solution#
Nous avons une sauvegarde et un “sysdiagnose” à notre disposition.
Un flag serait caché dans les “crashes” du téléphone.
Nous commençons par extraire l’archive .
$ tar xf sysdiagnose_and_crashes.tar.xzUn dossier private est extrait.
$ cd private/var/mobile/Library/Logs/CrashReporter/
$ ls -1A
Assistant
awdd-2025-04-07-055752-11.consolidated.metriclog
awdd-2025-04-07-055752-12.consolidated.metriclog.anon
backboardd.wakeups_resource-2025-04-07-073310.ips
Baseband
Cloud
CoreCapture
.dasd-2025-04-07-095528.ips
DiagnosticLogs
fcsc_intro.txt
FilesystemMeta-2025-04-07-080524.fsmeta.tgz
mussel-2025-04-07-075357.ips
mussel-2025-04-07-075418.ips
Panics
powerlog_2025-04-07_08-09_86F8D636.PLSQL
Retired
Signal.hooked-2025-04-07-074158.ips
Signal.hooked-2025-04-07-074204.ips
Signal.hooked-2025-04-07-074252.ips
Signal.hooked-2025-04-07-074306.ips
Signal.hooked-2025-04-07-074320.ips
Signal.hooked-2025-04-07-074745.ips
SiriSearchFeedback-2025-04-07-060357.ips
SiriSearchFeedback-2025-04-07-064111.ips
SiriSearchFeedback-2025-04-07-064240.ips
SiriSearchFeedback-2025-04-07-064530.ips
SiriSearchFeedback-2025-04-07-073041.ips
SiriSearchFeedback-2025-04-07-073404.ips
SiriSearchFeedback-2025-04-07-080620.ips
SpringBoard-2025-04-07-064234.ips
stacks-2025-04-07-080617.ips
stacks-2025-04-07-080618.000.ips
stacks-2025-04-07-080618.ips
stacks-2025-04-07-080623.ips
WiFiLQMMetrics-2025-04-07-063152.ips
WiFiLQMMetrics-2025-04-07-064552.ipsIl y a un fichier nommé fcsc_intro.txt, nous l’affichons.
$ cat fcsc_intro.txt
FCSC{7a1ca2d4f17d4e1aa8936f2e906f0be8}Flag : FCSC{7a1ca2d4f17d4e1aa8936f2e906f0be8}
iDevice#
Description#
Pour commencer, trouvez quelques informations d’intérêt sur le téléphone : version d’iOS et identifiant du modèle de téléphone.
Le flag est au format FCSC{<identifiant du modèle>|<numéro de build>}. Par exemple, pour un iPhone 14 Pro Max en iOS 18.4 (22E240) : FCSC{iPhone15,3|22E240}.
Attention : pour cette épreuve, vous n’avez que 5 tentatives de flag.
Solution#
Pour la suite, nous allons utiliser iLEAPP, un outil qui permet de parser une sauvegarde iOS.
$ tar xf backup.tar.xz
$ ./ileapp -t itunes -i /tmp/fcsc/backup -o /tmp/fcsc/backup/outIl ne reste plus qu’à ouvrir le fichier index.html dans le dossier /tmp/fcsc/backup/out/iLEAPP_Reports....

Nous pouvons défiler sur le côté gauche pour accéder aux différentes informations.
Pour cette partie, il nous faut l’identifiant du modèle et le numéro de build, ces informations sont disponibles sur la première page Report Home dans l’onglet Device details.

Product Type: iPhone12,3
[...]
Build Version: 20A362Flag : FCSC{iPhone12,3|20A362}
iWifi#
Description#
Pour continuer, trouvez quelques informations d’intérêt sur le téléphone : SSID et BSSID du réseau WiFi sur lequel le téléphone est connecté ainsi que le compte iCloud associé au téléphone.
Le flag est au format FCSC{<SSID>|<BSSID>|<compte iCloud>}. Par exemple, si le téléphone est connecté sur le réseau WiFi example, qui a pour BSSID 00:11:22:33:44:55 et que le compte iCloud associé est example@example.com : FCSC{example|00:11:22:33:44:55|example@example.com}.
Solution#
Nous continuons avec le rapport ILEAPP, sur la page WiFi Known Networks Info.

SSID : FCSC
BSSID : 66:20:95:6c:9b:37
Sur la page SMS & iMessage - Messages (Threaded), il n’y a qu’une adresse email robertswigert@icloud.com.
Sachant que le nom de l’appareil est Robert's iPhone, j’en déduis que c’est l’adresse email liée à l’appareil.

Flag : FCSC{FCSC|66:20:95:6c:9b:37|robertswigert@icloud.com}
iTreasure#
Description#
Avant la remise du téléphone à la douane, le propriétaire du téléphone a eu le temps d’envoyer un trésor. Retrouvez ce trésor.
Solution#
Nous sommes donc à la recherche d’un trésor. La description n’étant pas très précise, nous pouvons toutefois creuser la piste de la photo vue lors de la résolution du challenge iWifi, mais iLEAPP ne l’affichait pas.

Sur la page SMS report, on obtient le chemin de l’image envoyée.

Nom du fichier : 679329D1-12E7-45F2-A082-1E58A6CB454F.HEICDans les sauvegardes iOS, il y a un artifact nommé Manifest.db. C’est un index de tous les fichiers contenus dans la sauvegarde, il stocke notamment un hash et l’emplacement initial du fichier.
Cette article détaille plusieurs artifacts dont Manifest.db.
En utilisant sqlitebrowser pour consulter le contenu de Manifest.db, on obtient l’emplacement de l’image dans la sauvegarde.

Le fichier 6f4e34098e00a80fde876c8638fb1d685be2318b
$ find . -name "6f4e34098e00a80fde876c8638fb1d685be2318b"
./6f/6f4e34098e00a80fde876c8638fb1d685be2318b
$ mv ./6f/6f4e34098e00a80fde876c8638fb1d685be2318b ./6f/6f4e34098e00a80fde876c8638fb1d685be2318b.heic
$ xviewer ./6f/6f4e34098e00a80fde876c8638fb1d685be2318b.heic
Flag : FCSC{511773550dca}
iNvisible#
Description#
Il semblerait qu’un message n’ait pas pu s’envoyer … Retrouvez le destinataire de ce message.
Le flag est au format FCSC{<destinataire>}. Par exemple, si le destinataire est example@example.com : FCSC{example@example.com}.
Solution#
Cette fois-ci, aucune information n’est disponible via iLEAPP. Sur internet, on recherche sms artifiacts ios, on trouve une documentation sur le forensique des messages sous iOS.
On récupère la base de données sms.db au chemin suivant /private/var/mobile/Library/SMS/sms.db avec l’aide de Manifest.db.

Le nom de la base de données dans la sauvegarde est 3d0d7e5fb2ce288813306e4d4636395e047a3d28.
$ sqlitebrowser ./3d/3d0d7e5fb2ce288813306e4d4636395e047a3d28Dans la table chat, il y a deux mails, dont un que je n’avais pas sur iLEAPP.

Flag : FCSC{kristy.friedman@outlook.com}
iBackdoor#
Description#
Vous continuez vos analyses afin de trouver la backdoor sur le téléphone. Vous finissez par vous rendre compte qu’une application est compromise et que le téléphone était infecté au moment de la collecte … Trouvez l’identifiant de l’application compromise ainsi que l’identifiant de processus (PID) du malware.
Le flag est au format FCSC{<identifiant application>|<PID>}. Par exemple, si l’application compromise est Example (com.example) et que le PID est 1337 : FCSC{com.example|1337}.
Solution#
Nous cherchons une application compromise. Après quelques recherches, j’ai lu un premier article qui aborde une manière de détecter des spywares en utilisant l’outil iShutdown.
$ python3 iShutdown_detect.py /tmp/fcsc/private/var/mobile/Library/Logs/CrashReporter/DiagnosticLogs/sysdiagnose/sysdiagnose_2025.04.07_08-06-18-0700_iPhone-OS_iPhone_20A362.tar.gz
+++ Detected 4 reboot(s). Good practice to follow.
*** Detected 1 reboot(s) with 3 or more delays before a reboot.
2025-04-07 14:46:53 UTC
+++ No suspicious processes detected in '/private/var/db/'. Last reboot was on: 2025-04-07 14:46:53 UTC
+++ No suspicious processes detected in '/private/var/tmp/'. Last reboot was on: 2025-04-07 14:46:53 UTCL’outil s’appuie sur le fichier shutdown.log. Les deux articles suivants abordent cette technique de détection :
- https://securityboulevard.com/2024/01/kaspersky-details-method-for-detecting-spyware-in-ios/
- https://securelist.com/shutdown-log-lightweight-ios-malware-detection-method/111734/
Je décide de consulter le fichier shutdown.log et je constate qu’une application revient plusieurs fois Signal.app.
J’analyse ensuite le fichier ps.txt à l’emplacement suivant private/var/mobile/Library/Logs/CrashReporter/DiagnosticLogs/sysdiagnose/sysdiagnose_2025.04.07_08-06-18-0700_iPhone-OS_iPhone_20A362/sysdiagnose_2025.04.07_08-06-18-0700_iPhone-OS_iPhone_20A362/ps.txt.
En se concentrant sur l’application Signal.app, nous regardons les différents processus jusqu’à temps de voir un processus contenant du base64.

$ echo "dGNwOi8vOTguNjYuMTU0LjIzNToyOTU1Mg==" | base64 -d
tcp://98.66.154.235:29552On peut considérer ce comportement comme suspect. En le décodant on obtient un protocole, une adresse IP et un port, ce qui est typique de la communication avec un serveur de commande et contrôle.
Dans le fichier ps.txt, il y a 3 processus mussel dans le dossier de Signal.app qui ont du base64 et 3 PID différents.
Les PIDs 279 et 330 ont été exécuté à 7:47 AM. Le PID 345 a quant à lui été exécuté à 7:56 AM et son processus parent est le 344.
Pour l’identifiant de l’application, il est possible de le retrouver en cherchant le mot signal au sein du dossier sysdiagnose et plusieurs fichiers vont nous remonter l’identifiant : org.whispersystems.signal. Il est aussi possible de consulter la page Application State report d’iLEAPP.

Pour ce challenge, nous avons cinq essais, il est possible de tester les 3 PID ou bien de prendre par déduction le processus le plus récent : 345.
Flag : FCSC{org.whispersystems.signal|345}
iC2#
Description#
Retrouvez le nom de l’outil malveillant déployé sur le téléphone, ainsi que le protocole, l’adresse IP et le port de communication vers le serveur C2.
Le flag est au format FCSC{<outil>|<protocole>|<adresse IP>|<port>}. Par exemple, si l’outil est Cobalt Strike, le protocole TCP, l’adresse IP 127.0.0.1 et le port 1337 : FCSC{Cobalt Strike|TCP|127.0.0.1|1337}.
Solution#
Avec les informations obtenues lors de la résolution de iBackdoor. Nous avons déjà l’IP, le port et le protocole utilisé.
Pour obtenir l’outil utilisé, on peut s’appuyer sur le mot clé mussel. J’ai trouvé l’outil avec la recherche suivante : "mussel" base64 iphone en trouvant cet article. L’outil est disponible sur GitHub et correspond bien à un outil de post-exploitation pour iOS et macOS.
Flag : FCSC{SeaShell|TCP|98.66.154.235|29552}
iBackdoor 2#
Description#
Maintenant que vous savez quelle application a été compromise, retrouvez comment est-ce que l’attaquant a récupéré l’application légitime, préalablement à l’infection.
Il vous faudra retrouver :
- L’identifiant de l’application utilisée pour récupérer l’application légitime;
- Le chemin utilisé pour stocker l’application légitime;
- La date de désinstallation de l’application légitime (en heure locale).
Le flag est au format FCSC{<identifiant application>|<chemin>|<date>}. Par exemple, si l’application utilisée est Example (com.example), que le chemin est /private/var/tmp/test.xyz et que la date de désinstallation est 2025-01-01 01:00:00 : FCSC{com.example|/private/var/tmp/test.xyz|2025-01-01 01:00:00}.
Solution#
L’application Signal a été compromise. Il faut trouver :
- L’application qui a permis de récupérer Signal ;
- Le chemin où a été stocké Signal ;
- La date à laquelle Signal a été désinstallé.
Je lis un document très détaillé qui indique différents artifacts.
En terme d’horaire, je me rappelle qu’une photo a été envoyée avant de donner le téléphone à la douane (13:29:31), cette information permet de limiter notre recherche à un espace temporel.
Il faut retenir que l’heure est attendue en heure locale et la timezone de l’appareil est US/Pacific, une information obtenue dans iLEAPP sur la page Timezone Information report.

Je commence par analyser mobile_installation.log.0 et les heures ne sont pas les mêmes car dans ce fichier de journalisation, l’heure est en heure locale, donc c’est une bonne piste par rapport à la description du challenge.
En analysant les applications installées, Signal n’y est pas, par contre nous obtenons des dates d’installation des autres applications, ce qui nous confirme que le fichier de journalisation des installations est en heure locale.

Avec mobile_installation.log.0 j’obtiens l’heure d’installation (06:13:34) et de désinstallation (07:40:47) de Signal.
Mon Apr 7 06:13:34 2025 [234] <notice> (0x16b48f000) -[MIClientConnection _doInstallationForURL:identity:domain:options:completion:]: Install of "/private/var/containers/Shared/SystemGroup/systemgroup.com.apple.installcoordinationd/Library/InstallCoordination/PromiseStaging/B6D2BE18-C74E-4BBE-A15F-C88A708E89A3/Signal.app" type Placeholder (LSInstallType = MIInstallationDomainDefault, Domain: 1) requested by installcoordinationd (pid 960 (501/501))
[...]
Mon Apr 7 07:40:47 2025 [446] <notice> (0x16fc9b000) -[MIClientConnection _uninstallIdentities:withOptions:completion:]: Uninstall requested by installcoordinationd (pid 123 (501/501)) for identity [org.whispersystems.signal/PersonalPersonaPlaceholderString] with options: {
WaitForStorageDeletion = 0;
}
[...]
Mon Apr 7 07:43:55 2025 [446] <notice> (0x16fd27000) -[MIClientConnection _uninstallIdentities:withOptions:completion:]: Uninstall requested by lsd (pid 107 (501/501)) for identity [com.fiore.trolldecrypt/PersonalPersonaPlaceholderString] with options: (null)Je vois que juste après la désinstallation de Signal, une application nommée com.fiore.trolldecrypt est désinstallée. Je lis sur le GitHub du projet que l’application permet de récupérer une application au format IPA.
L’utilisation de TrollDecrypt est suspecte et est intéressante car SeaShell attend un fichier au format IPA, afin de le patcher et d’introduire une backdoor au sein de celui-ci.
Après des heures de recherches du chemin, je ne trouve rien, j’ai analysé plusieurs artifacts au sein du sysdiagnose et de la sauvegarde mais je n’ai rien trouvé qui pouvait correspondre au chemin recherché.
Je décide de revenir à la base du sysdiagnose, et je vois un fichier nommé FilesystemMeta-2025-04-07-080524.fsmeta.tgz que je n’ai ni extrait ni analysé. En voyant le mot Filesystem, je me dis que cela peut être intéressant de le consulter. J’effectue un grep au sein du fichier extrait.
$ grep -ari "\.ipa"
private_var-dev_disk1s2.fslisting:66605056 66603101 - 0 1744033541 33188 501 501 /private/var/mobile/Library/TrollDecrypt/decrypted/Signal_7.53_decrypted.ipa
4143862369472490735.fslisting:4096 2112 c 0 1662169021 33188 0 0 /System/Library/DoNotDisturb/DB/PlaceholderModes.ipados.json
4143862369472490735.fslisting:16384 12399 - 0 1662169021 33204 0 80 /Applications/SharingViewService.app/com.apple.ipad-air_256x256.pngL’ipa de Signal est bien stocké dans le chemin de l’application TrollDecrypt, ce qui correspond à la description que j’avais sur le GitHub.
Flag : FCSC{com.fiore.trolldecrypt|/private/var/mobile/Library/TrollDecrypt/decrypted/Signal_7.53_decrypted.ipa|2025-04-07 07:40:47}
