feat: Semaine 12, jour 4

This commit is contained in:
gauvainboiche
2026-08-06 13:04:09 +02:00
parent 7da969cb2a
commit 2a6fddc6c0
18 changed files with 216 additions and 18 deletions
+2 -7
View File
@@ -1,10 +1,5 @@
L04-ALEAPP_Reports_2026-07-02_Thursday_162524.zip
# Folder of AEAPP
# /mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/_HTML
# /mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/_KML Exports
# /mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/_Timeline
# /mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/_TSV Exports
# /mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/data
# /mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/media
/mobile_lab/data/ALEAPP_Reports_2026-07-02_Thursday_162524/*
/mobile_lab/data/*
/mobile_lab/data/*/*
@@ -0,0 +1,200 @@
# Lab 04 - Cybersecurity 3
Analyse Forensic Android
## 1. Mise en place
Le `docker-compose.yml` a été modifié pour répondre aux exigences du Lab04. Le fait qu'un APK soit mentionné mais non fourni indique un usage désiré de MobSF. On va déployer un lab complet des fois qu'on veuille creuser l'aspect "analyse statique d'un APK".
Le `Dockerfile` a été retravaillé également pour répondre aux besoins des étapes 3 (mentionnant sqlite3, et exiftool notamment). L'installation est légèrement plus lourde mais totalement complète.
## 2. Démarrage de la stack
![alt text](image.png)
Ensuite, il faut juste se connecter au conteneur `forensic-lab` pour avoir la stack installée tantôt par le `Dockerfile` :
![alt text](image-1.png)
## 3. Investigations
### A. ALEAPP
Deux options s'offraient à moi : l'analyse du fichier ZIP ou du dossier inclus dedans. Le ZIP aurait été plus propre, mais le dossier plus rapide pour éviter une étape de décompression à la volée. Voici les commandes pour les deux, après que mon premier `Dockerfile` ait été amélioré pour que `aleapp` soit appelée comme une VRAIE application plutôt que comme un paquet Python secondaire :
```bash
# Analyse du dossier décompressé
aleapp -t fs -i /data -o /data/output
# Ou analyse directe du fichier ZIP
aleapp -t zip -i /data/L04-ALEAPP_Reports_2026-07-02_Thursday_162524.zip -o /data/output
```
Maintenant, on laisse mouliner :
![alt text](image-2.png)
Je vois ce qu'il est en train de faire :
![alt text](image-3.png)
L'opération dure pas mal de temps (une vingtaine de minutes) :
![alt text](image-4.png)
#### Rapport généré
Le rapport peut bien être lancé avec `index.html` généré dans le dossier `/data/output/`
![alt text](image-5.png)
##### [EXEMPLES] Comptes "ce"
| Account Type | Account Name | Password |
| ----------------------------------- | -------------------- | ---------------------------------------------- |
| com.enflick.android.TextNow.account | TextNow | |
| com.facebook.messenger | Messenger | |
| com.garmin.di | GARMIN | 1601603418327 |
| com.google | thisisdfir@gmail.com | aas_et/AKppINbL_eEHMUv6Ghv5Jho1d35KM4nphq[...] |
| com.google.android.apps.tachyon | Duo | |
| com.imo.android.imous | imo HD | |
| com.opera.browser.ping | com.opera.browser | |
| com.reddit.account | Reddit for Android | |
| com.reddit.account | This_Is_DFIR | |
| com.silentcircle.account | thisisdfir | dummyPassword |
| com.skype.raider | Skype | |
| com.twitter.android.auth.login | TDfir | |
| com.viber.voip | +19195794674 | 143dc6b3879c80c88454776db7e2b33608c4634f |
| com.whatsapp | WhatsApp | |
| com.zhiliaoapp.musically | TikTok | |
| org.telegram.messenger | 858233690 | |
| org.thoughtcrime.securesms | Signal | |
Egalement, des "Comptes de", des jetons d'authentification, des statistiques d'appels, de connexion Bluetooth, de roles, de navigateurs, etc.
![alt text](image-6.png)
![alt text](image-7.png)
![alt text](image-8.png)
### B. MANUEL avec SQLite3
Je lance une investigation avec SQLite3, en retrouvant la bonne archive `.db` selon le contenu de `_lava_data.lava` qui donne bien le détail.
```bash
cd output/ALEAPP_Output_2026-08-06_Thursday_090704/data/
sqlite3 ALEAPP_Reports_2026-07-02_Thursday_162524/com.whatsappbases/msgstore.db
```
![alt text](image-9.png)
Je demande un formatage préalable :
```sql
.headers on
.mode column
```
Et je commence les extractions :
#### Les messages
```sql
sqlite> SELECT
_id,
from_me,
text_data AS message,
datetime(timestamp / 1000, 'unixepoch') AS date_heure
FROM available_message_view
WHERE text_data IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20;
_id from_me message date_heure
--- ------- ------- -------------------
11 0 2020-10-03 22:48:37
10 1 2020-10-03 22:45:17
9 1 2020-10-03 22:44:32
8 1 2020-10-03 22:43:57
7 0 2020-10-03 22:42:40
6 0 2020-09-23 14:18:17
5 1 2020-09-23 14:17:11
4 0 2020-09-23 14:10:04
2 1 2020-09-23 14:09:03
3 1 2020-09-23 14:09:03
```
#### Les appels
```sql
sqlite> SELECT
cl._id,
j.raw_string AS contact,
cl.from_me AS appel_emission,
cl.video_call AS appel_video,
cl.duration AS duree_secondes,
datetime(cl.timestamp / 1000, 'unixepoch') AS date_heure
FROM call_log cl
LEFT JOIN jid j ON cl.jid_row_id = j._id
ORDER BY cl.timestamp DESC;
_id contact appel_emission appel_video duree_secondes date_heure
--- -------------------------- -------------- ----------- -------------- -------------------
4 19198887386@s.whatsapp.net 0 1 122 2020-09-23 14:27:02
3 19198887386@s.whatsapp.net 1 1 92 2020-09-23 14:24:11
2 19198887386@s.whatsapp.net 0 0 91 2020-09-23 14:22:10
1 19198887386@s.whatsapp.net 1 0 107 2020-09-23 14:19:29
```
#### Les géolocalisations
```sql
sqlite> SELECT
ml.message_row_id,
j.raw_string AS contact,
ml.latitude,
ml.longitude,
datetime(m.timestamp / 1000, 'unixepoch') AS date_heure
FROM message_location ml
JOIN message m ON ml.message_row_id = m._id
JOIN chat c ON m.chat_row_id = c._id
JOIN jid j ON c.jid_row_id = j._id;
```
#### Les contacts
```sql
sqlite> SELECT
_id,
user,
server,
raw_string
FROM jid
WHERE server = 's.whatsapp.net' OR server = 'g.us'
LIMIT 30;
_id user server raw_string
--- ----------- -------------- ------------------------------
2 19198887386 s.whatsapp.net 19198887386@s.whatsapp.net
3 19198887386 s.whatsapp.net 19198887386.0:0@s.whatsapp.net
```
### C. MANUEL avec Exiftool
Je me mets dans le dossier racine `output/` pour itérer un exiftool, qui contient déjà une option pour le GPS. Pour aller "plus vite" et surtout faire quelque chose de récursif avec une sortie exploitable proprement, je travaille un peu ma commande :
```bash
# Pour une extraction générale
exiftool -r -ext jpg -csv /data > /data/output/exif_resultats.csv
# Pour répondre à des critères Forensics un peu plus avancés, en inscrivant
# les données GPS en degrés à 6 décimales, ce qui est requis en Forensic
# à la place des traditionnels Degrés-Minutes-Secondes
exiftool -r -ext jpg -csv -c "%.6f" \
-FileName -Directory -CreateDate -ModifyDate -Make -Model -GPSLatitude -GPSLongitude -GPSAltitude \
/data > /data/output/exif_gps_filtre.csv
```
Le rapport généré est... grand.
![alt text](image-10.png)
Je peux user de la CLI, mais je décide de charger le CSV dans un tableur classique et d'afficher uniquement des lignes non-vides :
![alt text](image-11.png)
![alt text](image-12.png)
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

+14 -11
View File
@@ -1,22 +1,25 @@
FROM python:3.10-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
sqlite3 \
libimage-exiftool-perl \
unzip \
p7zip-full \
& rm -rf /var/lib/apt-get/lists/*
git \
python3-tk \
&& rm -rf /var/lib/apt-get/lists/*
RUN pip install --no-cache-dir \
aleapp \
pillow \
jupyterlab \
pandas \
matplotlib
WORKDIR /app
VOLUME /data
RUN git clone https://github.com/abrignoni/ALEAPP.git /app/ALEAPP
RUN pip install --no-cache-dir -r /app/ALEAPP/requirements.txt && \
pip install --no-cache-dir pillow jupyterlab pandas matplotlib
RUN echo '#!/bin/bash\npython3 /app/ALEAPP/aleapp.py "$@"' > /usr/local/bin/aleapp && \
chmod +x /usr/local/bin/aleapp
VOLUME /data
EXPOSE 8888
CMD ["bash"]