Garden of KnowledgeApplied Sciences › Computer Science › Software › Security › Defensive › SOC Analysis › DFIR
March 22, 2026

Linux Forensics

Ordre de volatilité et collecte initiale§

# 1. Mémoire vive — capturer avant tout
avml /tmp/memory.lime                     # AVML (Azure Volatile Memory Library)
# ou insmod lime-$(uname -r).ko "path=/tmp/mem.lime format=lime"

# 2. Processus et connexions réseau (avant extinction)
ps auxww > /tmp/processes.txt
ss -tulnp > /tmp/network.txt
netstat -anp > /tmp/netstat.txt
lsof -nP > /tmp/open_files.txt
lsof -nPi > /tmp/network_files.txt

# 3. Modules kernel chargés
lsmod > /tmp/modules.txt
cat /proc/modules > /tmp/proc_modules.txt

# 4. Tâches planifiées
crontab -l > /tmp/crontab_user.txt
cat /etc/crontab > /tmp/crontab_system.txt
ls -la /etc/cron.* >> /tmp/crontab_system.txt

# 5. Utilisateurs connectés / historique connexions
who > /tmp/who.txt
w > /tmp/w.txt
last > /tmp/last.txt
lastlog > /tmp/lastlog.txt

Acquisition disque§

# Créer une image bit-à-bit
dd if=/dev/sda of=/mnt/evidence/disk.dd bs=4096 conv=noerror,sync status=progress

# Avec dc3dd (log + hash intégré)
dc3dd if=/dev/sda of=/mnt/evidence/disk.dd hash=sha256 log=/mnt/evidence/disk.log

# Compressé
dd if=/dev/sda | gzip -c > /mnt/evidence/disk.dd.gz

# Vérification d'intégrité
sha256sum /dev/sda
sha256sum /mnt/evidence/disk.dd
# Les deux hashes doivent correspondre

# Montage en lecture seule pour l'analyse
mount -o ro,noatime /dev/sdb1 /mnt/analysis
# ou : mount -o ro,loop /mnt/evidence/disk.dd /mnt/analysis

Journaux système§

Fichiers de logs importants§

# Authentification
/var/log/auth.log        # Debian/Ubuntu
/var/log/secure          # RHEL/CentOS

# Syslog et kernel
/var/log/syslog          # Debian/Ubuntu
/var/log/messages        # RHEL/CentOS
/var/log/kern.log        # Messages kernel
dmesg                    # Buffer kernel en mémoire

# Journald (systemd)
journalctl                                # Tous les logs
journalctl -u sshd                        # Logs d'un service
journalctl --since "2026-01-01" --until "2026-01-02"
journalctl -p err                         # Niveau erreur et au-dessus

# Apache/Nginx
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/nginx/access.log

# Base de données
/var/log/mysql/mysql.log
/var/log/postgresql/postgresql-*.log

# Connexions SSH
grep "Accepted\|Failed\|Invalid" /var/log/auth.log
grep "sshd" /var/log/auth.log | grep -v "pam\|closed"

Analyse des connexions SSH§

# Connexions réussies
grep "Accepted password\|Accepted publickey" /var/log/auth.log |
    awk '{print $1, $2, $3, $9, $11}'

# Tentatives de brute-force
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head

# Clés SSH autorisées
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keys 2>/dev/null

# Clés SSH générées récemment
find / -name "id_rsa" -o -name "id_ed25519" 2>/dev/null -newer /tmp/reference_time

Persistance — artefacts courants§

Cron et tâches planifiées§

# Toutes les crons
for user in $(cat /etc/passwd | cut -d: -f1); do
    cron=$(crontab -u $user -l 2>/dev/null)
    if [ -n "$cron" ]; then
        echo "=== $user ==="; echo "$cron"
    fi
done

cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/
cat /etc/cron.d/*

# Timers systemd (alternative aux crons)
systemctl list-timers --all
find /etc/systemd/ /usr/lib/systemd/ -name "*.timer" | xargs cat

Services et démons§

# Services systemd
systemctl list-units --type=service --all
find /etc/systemd/system/ -name "*.service" | xargs grep -l "ExecStart" | head
# Inspecter les services suspects
systemctl cat nom-service-suspect

# Init.d (système SysV héritage)
ls -la /etc/init.d/
ls -la /etc/rc*.d/

# Modules kernel (rootkits potentiels)
lsmod | grep -v "$(lsmod | awk '{print $1}' | sort)" 2>/dev/null
# Comparer avec un système de référence sain

Fichiers de démarrage§

# Fichiers exécutés au démarrage de session
cat /etc/profile
cat /etc/environment
cat /etc/profile.d/*
cat ~/.bashrc ~/.bash_profile ~/.profile ~/.zshrc 2>/dev/null

# rc.local (exécuté au boot)
cat /etc/rc.local

# PAM (Pluggable Authentication Modules) — possibilité d'injecter un module malveillant
cat /etc/pam.d/sshd
ls -la /lib/security/*.so      # Modules PAM — vérifier les dates

Système de fichiers — artefacts§

Fichiers modifiés récemment§

# Fichiers modifiés dans les 24 dernières heures
find / -mtime -1 -type f 2>/dev/null | grep -v "/proc\|/sys\|/dev"

# Fichiers SUID/SGID récents (indicateur de backdoor)
find / -perm -u=s -type f -newer /bin/ls 2>/dev/null
find / -perm -g=s -type f -newer /bin/ls 2>/dev/null

# Fichiers cachés dans des répertoires inhabituels
find /tmp /var/tmp /dev/shm -name ".*" 2>/dev/null
find / -name ".*" -path "*/tmp/*" 2>/dev/null

# Fichiers sans propriétaire (UID/GID supprimé)
find / -nouser -o -nogroup 2>/dev/null

# Fichiers exécutables dans /tmp, /var/tmp, /dev/shm (suspects)
find /tmp /var/tmp /dev/shm -executable -type f 2>/dev/null

Analyse du système de fichiers ext4§

# Inode information — MAC times précis
stat /suspicious/file

# Fichiers supprimés récupérables
# Avec Autopsy ou The Sleuth Kit
fls -r -d /dev/sda1 | grep "^r/r \*"  # Fichiers supprimés
icat /dev/sda1 <numéro_inode> > recovered_file

# Journal du filesystem (ext4 journal — ext3grep, extundelete)
extundelete /dev/sda1 --restore-all

# Métadonnées de fichiers
debugfs /dev/sda1
debugfs> stat <file>      # Tous les timestamps
debugfs> lsdel            # Fichiers supprimés

Historique des commandes§

# Historique bash
cat /root/.bash_history
cat /home/*/.bash_history 2>/dev/null

# Historique zsh
cat /root/.zsh_history
cat /home/*/.zsh_history 2>/dev/null

# Attention : l'historique peut être désactivé (HISTFILE=/dev/null)
# ou effacé (history -c)

# Alternative — chercher des commandes dans les logs
grep "sudo" /var/log/auth.log
grep "CMD" /var/log/auth.log  # Commandes sudo

# .viminfo — fichiers ouverts avec vim
cat /root/.viminfo
cat /home/*/.viminfo 2>/dev/null

Analyse mémoire (Volatility 3)§

# Profil Linux — nécessite un profil correspondant à la version du kernel
vol -f memory.lime linux.pslist          # Processus
vol -f memory.lime linux.pstree         # Arbre de processus
vol -f memory.lime linux.bash           # Historique bash en mémoire
vol -f memory.lime linux.netstat        # Connexions réseau
vol -f memory.lime linux.lsof           # Fichiers ouverts
vol -f memory.lime linux.malfind        # Pages mémoire exécutables injectées
vol -f memory.lime linux.check_syscall  # Table des syscalls (rootkit détection)
vol -f memory.lime linux.check_modules  # Modules kernel (rootkit)

# Dump d'un processus suspect
vol -f memory.lime linux.proc.Maps --pid 1234
vol -f memory.lime linux.memmap --pid 1234 --dump

Rootkits§

# Chkrootkit — détection basique
chkrootkit

# Rkhunter
rkhunter --check --sk

# Comparaison avec des hashes connus (Tripwire, AIDE)
aide --check

# Vérifier les syscall hooks (processus cachés par rootkit)
ps aux > /tmp/ps_output.txt
# Comparer avec la liste /proc
ls /proc | grep -E "^[0-9]+$" > /tmp/proc_pids.txt
# Si des PIDs dans /proc n'apparaissent pas dans ps → rootkit probable

# Vérifier les fichiers cachés par un rootkit
# Les rootkits hookent getdents() → les fichiers sont invisibles pour ls
# Mais /proc/PID/exe et /proc/PID/maps révèlent le binaire
for pid in $(ls /proc | grep -E "^[0-9]+$"); do
    if ! ps -p $pid > /dev/null 2>&1; then
        echo "Processus caché: $pid"
        ls -la /proc/$pid/exe 2>/dev/null
    fi
done

Timeline et corrélation§

# Mactime (Sleuth Kit) — timeline à partir du système de fichiers
fls -r -m / /dev/sda1 > body_file.txt
mactime -b body_file.txt -d > timeline.csv

# Combiner avec les logs
# Importer dans un outil comme Timeline Explorer ou Kibana pour la corrélation

# log2timeline/plaso
log2timeline.py --parsers linux timeline.plaso /dev/sda1
psort.py -o l2tcsv timeline.plaso > supertimeline.csv
—The Gardener