feat: Semaine 12, jour 4
@@ -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
|
||||
|
||||

|
||||
|
||||
Ensuite, il faut juste se connecter au conteneur `forensic-lab` pour avoir la stack installée tantôt par le `Dockerfile` :
|
||||
|
||||

|
||||
|
||||
## 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 :
|
||||
|
||||

|
||||
|
||||
Je vois ce qu'il est en train de faire :
|
||||
|
||||

|
||||
|
||||
L'opération dure pas mal de temps (une vingtaine de minutes) :
|
||||
|
||||

|
||||
|
||||
#### Rapport généré
|
||||
|
||||
Le rapport peut bien être lancé avec `index.html` généré dans le dossier `/data/output/`
|
||||
|
||||

|
||||
|
||||
##### [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.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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 :
|
||||
|
||||

|
||||
|
||||

|
||||
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 177 KiB |
|
After Width: | Height: | Size: 176 KiB |
|
After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 56 KiB |
@@ -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"]
|
||||