
I. Présentation
On se retrouve dans cet article pour une nouvelle solution de l’un des challenges d’investigation numérique/forensic nommés Sherlocks et mis à disposition par la plateforme Hack The Box. Dans cet article, nous allons détailler la démarche qui permet de résoudre le Sherlocks Jingle Bell, de difficulté “débutant”.
Notre objectif est ici de retracer les activités d’un utilisateur interne malveillant par l’intermédiaire du système de notifications Windows.
Lien du challenge : Hack The Box – Sherlocks – Jingle Bell
Cette solution est publiée en accord avec les règles d’HackThebox et ne sera diffusée que lorsque le Sherlocks en question sera indiqué comme “Retired”.
Technologies abordéesWindows, NotificationsOutils utiliséssqlite3, grep
Retrouvez tous nos articles Hack The Box via ce lien :
II. Découverte de l’archive et du contexte
Dans le cadre de l’investigation, un contexte et une archive sont mis à disposition :
Nous sommes donc face à une archive contenant certains fichiers provenant du poste d’un utilisateur interne que l’on suspecte de malveillance. Plus précisément, il est soupçonné d’avoir fait fuiter des informations sensibles par l’intermédiaire d’une application non identifiée. Nous devons donc récupérer le maximum d’informations afin de savoir quelles informations ont été divulguées et par quel moyen.
Si l’on s’intéresse à l’archive mise à disposition, voici son contenu :
Contenu de l’archive d’investigation Jingle Bell.
Nous obtenons trois fichiers situés dans le répertoire “C/Users/Appdata/Local/Microsoft/Windows/Notifications/”. Il s’agit, d’après leur extension, de fichiers de base de données (“.db”). Cela peut être confirmé grâce à la commande “file” :
# Utilisation de la commande file pour afficher le format/type de fichier
$ file *
wpndatabase.db: SQLite 3.x database, user version 7, last written using SQLite version 3029000, writer version 2, read version 2, file counter 19, database pages 103, 1st free page 103, free pages 5, cookie 0x13, schema 4, UTF-8, version-valid-for 19
wpndatabase.db-shm: SQLite Write-Ahead Log shared memory, counter 29, page size 4096, 366 frames, 256 pages, frame checksum 0x417d2405, salt 0x29ea098e4bde10de, header checksum 0xb256fda3, read-mark[1] 0x16e
wpndatabase.db-wal: SQLite Write-Ahead Log, version 3007000
wpnidm: directory
# Récupération de la taille de chaque fichier
$ ls -alh
total 1.1M
drwxrwxr-x 3 mickael mickael 4.0K Jun 8 21:36 .
drwxrwxr-x 3 mickael mickael 4.0K Apr 20 2023 ..
-rw-rw-r– 1 mickael mickael 1.0M Jun 8 21:36 wpndatabase.db
-rw-rw-r– 1 mickael mickael 32K Jun 8 21:36 wpndatabase.db-shm
-rw-rw-r– 1 mickael mickael 0 Jun 8 21:36 wpndatabase.db-wal
drwxrwxr-x 2 mickael mickael 4.0K Feb 1 2023 wpnidm
J’ignore ce que sont les “Ahead log” dans le contexte SQLite, mais le fichier principal semble être le fichier “wpndatabase.db” (1 Mo). Avant de m’intéresser à son contenu, j’effectue quelques recherches rapides afin de savoir à quoi l’on a affaire lorsque l’on parle du dossier “C/Users/Appdata/Local/Microsoft/Windows/Notifications/” et du fichier “wpndatabase.db”.
Je tombe notamment sur l’article suivant : inc0x0.com/2018/10/windows-10-notification-database/
Notifications are a feature added in Windows 8 and 10, displaying text and images either in the start menu tiles or on the right side of the screen. These notifications can hold interesting data such as popup messages or text snippets from applications.
Source : inc0x0.com
À première vue, il s’agit donc du système de notification Windows qui fait apparaitre des images en bas à droite de l’écran (vous savez, quand vous êtes en réunion Visio avec partage d’écran et qu’un pop-up montrant un aperçu du dernier e-mail reçu apparait).
Source : Microsoft
Il semble donc que cette fonctionnalité stocke des données dans le fichier identifié. Pour l’instant, il est difficile de voir à quoi cela peut nous servir. Il serait logique de penser concernant cette fonctionnalité qu’une fois l’évènement affiché, il serait simplement supprimé.
III. Analyse de la base de données SQLite3
A. Découverte rapide de la base wpndatabase.db
Intéressons-nous à présent au principal fichier que nous avons à disposition, la base de données SQLite3 “wpndatabase.db”. J’utilise l’outil en ligne de commande “sqlite3” :
# Ouverture et analyse du fichier SQLite3
$ sqlite3 wpndatabase.db
SQLite version 3.45.1 2024-01-30 16:01:20
Enter “.help” for usage hints.
sqlite> .databases
main: /home/mickael/Downloads/Torrincase/C/Users/Appdata/Local/Microsoft/Windows/Notifications/wpndatabase.db r/w
sqlite> .tables
HandlerAssets Notification TransientTable
HandlerSettings NotificationData WNSPushChannel
Metadata NotificationHandler
Ce fichier contient une seule base de données, elle-même contenant 9 tables. Pour me faire une première idée du volume de chaque table et des données à disposition, je compte le nombre d’entrées pour chacune :
sqlite> select count() from Notification;
23
sqlite>
select count() from NotificationData;
0
sqlite> select count() from HandlerAssets;
0
sqlite> select count() from HandlerSettings;
3582
sqlite> select count() from Metadata;
8
sqlite> select count() from NotificationHandler;
150
sqlite> select count() from TransientTable;
0
sqlite> select count() from WNSPushChannel;
0
Je m’intéresse à présent aux colonnes de chaque table afin de débuter par celle qui me semble les plus intéressantes :
sqlite> pragma table_info(Notification);
0|Order|INTEGER|1||1
1|Id|INTEGER|1||0
2|HandlerId|INTEGER|0||0
3|ActivityId|GUID|0||0
4|Type|TEXT|1||0
5|Payload|BLOB|0||0
6|Tag|TEXT|0||0
7|Group|TEXT|0||0
8|ExpiryTime|INT64|0||0
9|ArrivalTime|INT64|0||0
10|DataVersion|INT64|0|’0’|0
11|PayloadType|TEXT|1||0
12|BootId|INT64|0|’0’|0
13|ExpiresOnReboot|BOOLEAN|0|’FALSE’|0
La table “Notification” semble être la table principale.
B. Retracer l’historique d’activité via les Notifications Windows
Enoncé : Task 1 – Which software/application did Torrin use to leak Forela’s secrets?
Maintenant que nous avons ciblé une table en particulier, il est temps d’aller plus loin (et d’être prêt à faire marche arrière si rien d’intéressant n’apparait). En listant le contenu de chaque entrée de la table “Notification”, je commence à voir apparaitre des données XML assez volumineuses dans la colonne “Payload_Preview” :
sqlite> SELECT Id, SUBSTR(Payload, 1, 50) AS Payload_Preview FROM Notification;
Nous voyons notamment certaines entrées qui font apparaitre “slack://”, un plateforme de communication connue. L’outil en ligne de commande sqlite3 devient un peu limité pour afficher de gros blocs de texte, comme c’est le cas ici, je décide d’exporter les données qui m’intéressent dans un fichier CSV :
# Export des données requêtées dans un fichier CSV
sqlite> .headers on
sqlite> .mode csv
sqlite> .output /tmp/payloads.csv
sqlite> SELECT Id,Payload FROM Notification;
sqlite> .quit
# Vérification du format de fichier
$ file /tmp/payloads.csv
/tmp/payloads.csv: CSV Unicode text, UTF-8 text
Je peux alors utiliser des outils classiques de manipulation et de découpage de texte sur ces données :
# Filtre sur le mot “slack” et découpage en fonction du délimiteur “>”
$ cat /tmp/payloads.csv |grep “slack” | cut -d “>” -f 2
PrimeTech Innovations”” activationType=””protocol”” arguments=””slack://channel?team=T054518ADUJ””
PrimeTech Innovations”” activationType=””protocol”” arguments=””slack://channel?team=T054518ADUJ””
[…]
Nous venons donc a priori d’identifier le canal de communication : Slack.
Dans les faits et d’après ce que je comprends du système de Notification Windows. Un pop-up devait apparaitre à chaque fois que l’utilisateur recevait un message de la part de son interlocuteur (comme lors de la réception d’un nouvel e-mail). Cela faisait apparaitre tout ou partie du texte reçu. Ces données se sont alors retrouvées en “cache” dans le système de notifications Windows.
Enoncé – Task 2 : What’s the name of the rival company to which Torrin leaked the data?
Par la même occasion, nous pouvons remarquer dans les données obtenues précédemment la présence d’un titre : “PrimeTech Innovations”. Cela semble être l’entreprise rivale à laquelle l’employé a envoyé des informations (probablement le titre du Slack).
Enoncé – Task 3 : What is the username of the person from the competitor organization whom Torrin shared information with?
SI l’on regarde un peu plus loin dans chaque message, on peut voir directement le contenu du message reçu ! J’utilise pour cela à nouveau le délimiteur “>” pour avancer parmi les longs blocs de données (À noter que ce n’est pas la meilleure façon de parser du XML) :
# Filtre sur le mot “slack” et découpage en fonction du délimiteur “>”
$ cat /tmp/payloads.csv |grep “slack” | cut -d “>” -f 9
Voici le résultat obtenu :
Extraction des messages reçu parmis les notifications Windows.
Le nom utilisateur de l’interlocuteur est donc “Cyberjunkie-PrimeTechDev”.
Enoncé – Task 4 : What’s the channel name in which they conversed with each other?
$ cat /tmp/payloads.csv |grep “slack” | cut -d “>” -f 4-7
New message from Slackbot
New message from cyberjunkie
New message in #forela-secrets-leak
New message in #forela-secrets-leak
New message in #forela-secrets-leak
[…]
Le nom du canal Slack utilisé apparait également dans les données de la notification : “forela-secrets-leaks”.
Enoncé – Task 5 : What was the password for the archive server?
Cette information peut être retrouvée au sein de la conversation récupérée :
$ cat /tmp/payloads.csv |grep “slack” | cut -d “>” -f 9
What do you know, it works?Tobdaf8Qip$re@1″”
Enoncé – Task 6 : What was the URL provided to Torrin to upload stolen data to?
Également, cette information peut être récupérée au sein de la conversation : on y voit un lien Google Drive apparaitre.
$ cat /tmp/payloads.csv |grep “slack” | cut -d “>” -f 9
[…]
Cyberjunkie-PrimeTechDev: https://drive.google.com/drive/folders/1vW97VBmxDZUIEuEUG64g5DLZvFP-Pdll?usp=sharing , remember to upload the documents and pdfs too
Enoncé – Taks 7 : When was the above link shared with Torrin?
À l’intérieur de l’enregistrement en base de données sqlite3, chaque entrée possède un horodatage qui représente sa date de réception :
sqlite> pragma table_info(Notification);
0|Order|INTEGER|1||1
1|Id|INTEGER|1||0
2|HandlerId|INTEGER|0||0
3|ActivityId|GUID|0||0
4|Type|TEXT|1||0
5|Payload|BLOB|0||0
6|Tag|TEXT|0||0
7|Group|TEXT|0||0
8|ExpiryTime|INT64|0||0
9|ArrivalTime|INT64|0||0
10|DataVersion|INT64|0|’0’|0
11|PayloadType|TEXT|1||0
12|BootId|INT64|0|’0’|0
13|ExpiresOnReboot|BOOLEAN|0|’FALSE’|0
Cependant, ce n’est visiblement pas ici qu’il faut regarder. Le message lui-même possède un timestamp, qui lui semble être celui de la création du message sur le Slack, ce qui semble plus précis :
Contenu de la notification Windows lors de la réception d’un évènement Slack.
Ici, le format du timestamp ne me disait rien du tout, j’ai décidé d’utiliser les outils modernes pour résoudre cette partie, plutôt que de passer par une recherche Google “à l’ancienne” :
Utilisation de ChatGPT pour décoder le timestamp récupéré
Le message a donc été reçu à “2023-04-20 10:34:49”. Il s’agit en fait un timestamp standard, mais qui inclut les nanosecondes.
Dans le cadre d’une investigation réelle, soyez très vigilant à la manipulation des données. L’utilisation de ChatGPT, de la version en ligne de CyberChef ou même d’un traducteur peut ne pas convenir en fonction des données traitées (présence du nom d’un utilisateur, d’un client ou autre donnée confidentielle). Ici, un simple timestamp ne pose a priori pas de problème de confidentialité.
Enoncé – Taks 8 : For how much money did Torrin leak Forela’s secrets?
La dernière étape consiste à retrouver le montant du paiement reçu par le salarié ayant fait fuiter une information. J’effectue pour cela un filtre avec les principaux signes monétaires au sein de mon export CSV :
$ grep “\£\|€\|\*$” /tmp/payloads.csv
Sent 10,000 £ to the above account as promised, cheers
L’utilisateur a donc reçu 10 000 livres sterling en échange de données confidentielles de son entreprise.
V. Conclusion
Cette investigation était très intéressante à réaliser ! Une fois que le format des données et leur provenance sont comprises, elle ne présente pas de difficulté technique particulière. En revanche, j’ignorais jusqu’à présent qu’il était possible de retrouver autant d’informations à partir du système de notification Windows, de quoi réfléchir au paramétrage de cette dernière !
Co-fondateur d’IT-Connect.fr.
Auditeur/Pentester chez Orange Cyberdéfense.
