| name | linux-macos-forensics |
| description | Guide complet de forensic Linux et macOS — artefact analysis (auth.log, journald, bash_history, crontab), MAC times, acquisition RAM/disk, HFS+/APFS, Unified Log, Keychain, FileVault, TCC, SIP, et analyse de persistence |
| tags | ["forensics","linux","macos","artifacts","journald","apfs","unified-log","keychain","persistence"] |
| version | 1 |
Forensic Linux et macOS — Guide Complet
Guide exhaustif d'investigation numérique sur systèmes Linux et macOS : artefacts, acquisition, analyse de logs, persistence, et chaîne de custody.
1. Linux Forensics — Artefacts Système
Structure des Logs Linux
/var/log/
├── auth.log* # Authentifications SSH, sudo, login
├── syslog* # Log système général
├── kern.log* # Noyau / Kernel
├── daemon.log* # Services démons
├── debug* # Debug messages
├── dpkg.log* # Paquets installés (Debian/Ubuntu)
├── alternatives.log* # Alternatives update
├── bootstrap.log # Boot messages
├── faillog* # Échecs login
├── lastlog* # Dernière connexion de chaque user
├── wtmp* # Historique des sessions
├── btmp* # Tentatives échouées
├── apt/ # Logs APT
│ ├── history.log # Historique des opérations APT
│ └── term.log # Sorties terminal APT
├── apache2/ # Apache HTTPD
│ ├── access.log # Requêtes HTTP (IP, URL, UA)
│ └── error.log # Erreurs Apache
├── nginx/ # Nginx (même pattern)
├── mysql/ # MySQL/MariaDB
│ ├── error.log
│ └── slow.log
├── postgresql/ # PostgreSQL
├── fail2ban.log # Fail2ban blocages
├── ufw.log # UFW firewall logs
├── cups/ # Impression
├── samba/ # Samba
├── cron.log* # Cron
├── mail.log* # Mail (postfix, sendmail)
├── unattended-upgrades/ # Mises à jour auto
└── audit/ # AuditD logs
└── audit.log # SELinux/apparmor messages
Acquisition des Logs
sudo tar czf /evidence/linux_logs.tar.gz /var/log/
ls /var/log/*.gz
zcat /var/log/auth.log.2.gz | grep "Accepted"
rsync -a /var/log/ /evidence/logs/
vol -f memory.raw linux.bash
vol -f memory.raw linux.dmesg
vol -f memory.raw linux.psaux
Authentification (auth.log)
grep "Accepted" /var/log/auth.log | awk '{print $1, $2, $3, $9, $11, $13}'
grep "Failed password" /var/log/auth.log | awk '{print $1, $2, $3, $9, $11, $13}'
grep "sudo:" /var/log/auth.log | grep "COMMAND"
grep "pam_unix" /var/log/auth.log | grep "authentication failure"
grep -E "useradd|userdel|groupadd|passwd" /var/log/auth.log
grep "login:" /var/log/auth.log
tail -f /var/log/auth.log
grep "Failed password" /var/log/auth.log | grep -oP 'from \K[0-9.]+' | sort | uniq -c | sort -rn | head -10
Systemd Journal (journalctl)
journalctl --no-pager > /evidence/journal.txt
journalctl -o json-pretty > /evidence/journal.json
sudo journalctl --flush
sudo cp -r /var/log/journal/ /evidence/journal_binary/
journalctl --since "2024-07-20 00:00:00" --until "2024-07-22 23:59:59"
journalctl --since "-7 days"
journalctl --since "-1h"
journalctl -u sshd.service
journalctl -u nginx.service
journalctl -u docker.service
journalctl -u systemd-networkd.service
journalctl _SYSTEMD_UNIT=cron.service
journalctl _PID=1234
journalctl _COMM=sshd
journalctl _UID=0
journalctl -p err
journalctl -p warning
journalctl -p crit
journalctl -u sshd.service | grep -E "Accepted|Failed"
journalctl -u sshd.service --output=json | grep -E "Invalid user"
Authentification Locale
last -100
lastb -100
who
w
lastlog
last -f /var/log/wtmp -100
ss -tnp | grep :22
lsof -i :22
Analyse des Historiques
cat ~/.bash_history
for user in /home/*/; do
echo "=== $user ==="
cat "${user}.bash_history" 2>/dev/null
done
cat /root/.bash_history 2>/dev/null
cat ~/.zsh_history
cat ~/.lesshst
cat ~/.mysql_history
cat ~/.pgsql_history
cat ~/.viminfo | grep -E "^|" | head -100
history 100
xxd ~/.bash_history | head
Analyse de Persistance Linux
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
crontab -l -u root
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u "$user" -l 2>/dev/null | grep -v "no crontab"
done
ls -la /etc/systemd/system/
ls -la /usr/lib/systemd/system/
systemctl list-unit-files --type=service
systemctl list-units --type=service --state=enabled
systemctl list-unit-files | grep masked
find /etc/systemd/system/ -name "*.service" -exec cat {} \;
ls -la /etc/init.d/
ls -la /etc/rc*.d/
ls -la /etc/xdg/autostart/
ls -la ~/.config/autostart/
cat ~/.bashrc
cat ~/.bash_profile
cat /etc/rc.local
lsmod
ls -la /lib/modules/$(uname -r)/
cat /etc/modules
/etc/modprobe.d/*.conf
/etc/ld.so.preload 2>/dev/null
/etc/ld.so.conf
ldconfig -p
2. Linux Forensics — Acquisition Disque et RAM
Acquisition Disque
sudo mount -o ro /dev/sda1 /mnt/evidence/
sudo dd if=/dev/sda1 of=/evidence/partition.dd bs=4M
sudo lvdisplay
sudo lvs
sudo dd if=/dev/vg01/lv_root of=/evidence/lvm_root.dd bs=4M
cat /proc/mdstat
sudo dd if=/dev/md0 of=/evidence/raid_image.dd bs=4M
Dump de la RAM Linux
sudo insmod lime.ko "path=/evidence/memory.lime format=lime"
sudo insmod fmem.ko
sudo dd if=/dev/fmem of=/evidence/memory.raw bs=1M status=progress
sudo avml /evidence/memory.raw
Analyse du Disque
find /evidence/mount/ -type f -printf "%T@ %Tc %p\n" | sort -rn | head -100
find /evidence/mount/ -mmin -60 -exec ls -la {} \;
find /evidence/mount/ -newer /tmp/reference.txt -ls
find /evidence/mount/ -perm -4000 -o -perm -2000 -ls
find /evidence/mount/ -name ".*" -type f
find /evidence/mount/ -user root -perm -4000 -exec ls -la {} \;
3. Linux Forensics — Artefacts Réseau
cat /var/log/syslog | grep -E "eth0|wlan0|enp" | tail -20
vol -f memory.raw linux.netstat
vol -f memory.raw linux.arp
iptables-save > /evidence/iptables.txt
ip6tables-save > /evidence/iptables6.txt
nft list ruleset > /evidence/nftables.txt
fail2ban-client status
fail2ban-client status sshd
cat /etc/resolv.conf
cat /etc/hosts
cat /etc/hostname
cat /etc/hosts
4. Linux Forensics — Analyse des Binaries
dpkg -l | grep -E "openssl|bash|sudo|kernel"
rpm -qa | grep -E "openssl|bash|sudo|kernel"
grep " install " /var/log/dpkg.log | tail -50
find /usr/bin/ -mmin -1440 -ls
find /usr/sbin/ -mtime -7 -ls
vol -f memory.raw linux.psaux
vol -f memory.raw linux.check_modules
lsmod | grep -vE "^(Module|$)"
5. macOS Forensics — Artefacts Système
Unified Log (Logs macOS)
log show --last boot --output /evidence/macos_logs.log
log show --start "2024-07-20 00:00:00" --end "2024-07-22 23:59:59"
log show --process Terminal
log show --process sshd-keygen-wrapper
log show --level debug
log show --level error
log show --level fault
log show --predicate 'eventMessage contains "sudo"'
log show --predicate 'eventMessage contains "password"'
log show --predicate 'process == "sshd"'
log stream --level debug --predicate 'process == "sshd"'
log collect --output /evidence/system_logs.logarchive
Analyse des Préférences
defaults read /var/db/dslocal/nodes/Default/users/$USER.plist
security find-generic-password -wa "AirPort"
cat /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist
plutil -p /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist
Analyse du Keychain (Trousseau)
security list-keychains
security dump-keychain /Users/$USER/Library/Keychains/login.keychain
security dump-keychain -r /Library/Keychains/System.keychain 2>/dev/null
security find-internet-password -s "google.com" -w
security find-generic-password -wa "Wi-Fi"
security find-generic-password -s "iCloud"
6. macOS Forensics — Système de Fichiers
APFS (Apple File System)
diskutil apfs list
diskutil apfs listSnapshots /
diskutil apfs listSnapshots disk1s1
diskutil apfs mountSnapshot -uuid <uuid> /Volumes/Snapshot
Analyse du Volume
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
find /Applications -name "*.dmg" -type f
find /Applications -name "*.app" -exec ls -la {} \;
find / -mtime -1 -ls 2>/dev/null | head -100
ls -la /usr/lib/dyld/
TCC (Transparency, Consent, and Control)
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "
SELECT service, client, auth_value, last_modified
FROM access
ORDER BY last_modified DESC;
"
7. macOS Forensics — Persistance
LaunchDaemons / LaunchAgents
ls -la /Library/LaunchDaemons/
ls -la /System/Library/LaunchDaemons/
ls -la /Library/LaunchAgents/
ls -la ~/Library/LaunchAgents/
ls -la /System/Library/LaunchAgents/
for plist in /Library/LaunchDaemons/*.plist; do
echo "=== $plist ==="
plutil -p "$plist" 2>/dev/null | grep -E "ProgramArguments|RunAtLoad|KeepAlive"
done
Cron / At
crontab -l
for user in $(dscl . list /Users | grep -v '^_'); do
crontab -u "$user" -l 2>/dev/null | grep -v "no crontab"
done
ls -la /usr/lib/cron/tabs/
at -l
Login Items
osascript -e 'tell application "System Events" to get the name of every login item'
Kernel Extensions (kext)
kextstat | grep -v com.apple
ls -la /Library/Extensions/
ls -la /System/Library/Extensions/
8. macOS Forensics — Gatekeeper / XProtect
log show --predicate 'subsystem == "com.apple.security"'
sqlite3 /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.plist
spctl -a -t exec -vv /Applications/App.app
xattr -l /Applications/App.app
9. macOS Forensics — FileVault (Chiffrement)
fdesetup status
fdesetup haspersonalrecoverykey
fdesetup showrecoverykey
10. Linux Forensics — Analyse de Conteneurs Docker
ls -la /var/lib/docker/
ls /var/lib/docker/containers/
docker logs container_id > container.log
docker images -a
docker history image_name:tag
docker inspect container_id | jq '.[0].Mounts'
docker inspect container_id | jq '.[0].Config'
find / -name "docker-compose.yml" -o -name "docker-compose.yaml" 2>/dev/null
11. Linux Forensics — Analyse SSH
cat ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys2
ls -la ~/.ssh/
stat ~/.ssh/authorized_keys
cat ~/.ssh/known_hosts
ls -la ~/.ssh/id_rsa
ls -la ~/.ssh/id_ecdsa
cat ~/.ssh/config
ss -tnp | grep :22
ps aux | grep sshd
12. Script d'Acquisition Linux Automatisée
#!/bin/bash
OUTDIR="/evidence/linux_$(hostname)_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTDIR"
echo "=== LINUX FORENSICS ACQUISITION ==="
echo "Host: $(hostname)"
echo "Output: $OUTDIR"
echo "[1] System info..."
uname -a > "$OUTDIR/uname.txt"
cat /etc/*release > "$OUTDIR/os_release.txt"
cat /proc/version > "$OUTDIR/kernel.txt"
cat /proc/cpuinfo > "$OUTDIR/cpu.txt"
free -h > "$OUTDIR/memory.txt"
df -h > "$OUTDIR/disk.txt"
mount > "$OUTDIR/mounts.txt"
lshw -short > "$OUTDIR/hardware.txt" 2>/dev/null
echo "[2] Users..."
cat /etc/passwd > "$OUTDIR/passwd.txt"
cat /etc/shadow > "$OUTDIR/shadow.txt" 2>/dev/null
cat /etc/group > "$OUTDIR/group.txt"
last -100 >
lastlog >
ps auxf >
lsmod >
lsof > 2>/dev/null
ss -tupan >
iptables-save > 2>/dev/null
ip addr >
/etc/hosts >
/etc/resolv.conf >
-r /var/log/* 2>/dev/null
journalctl --no-pager -o short-full > 2>/dev/null
-la /etc/cron* >
-la /etc/systemd/system/ >
find / -name -path - {} \; > 2>/dev/null
/etc/rc.local > 2>/dev/null
-la /etc/init.d/ > 2>/dev/null
user /home/*/ /root/;
2>/dev/null >>
find /home -name - d >
/root/.ssh/authorized_keys > 2>/dev/null
/etc/ssh/sshd_config > 2>/dev/null
/*.txt /logs/* > 2>/dev/null
13. Dépannage Cross-Platform
PROBLÈME : Logs Linux effacés (journals vides)
SOLUTION :
- Vérifier /var/log/journal/ (pas /run/log/journal)
- Les logs systemd persistent par défaut
- Vérifier : journalctl --list-boots (boots précédents)
- Si effacé → logs dans la RAM (Volatility linux.dmesg, linux.bash)
PROBLÈME : macOS SIP empêche l'acquisition
SOLUTION :
- Contournement via Recovery Mode (Cmd+R → csrutil disable)
- Checkm8 + ramdisk (Mac Intel)
- DMA via Thunderbolt (Intel uniquement)
- Sur Apple Silicon M1/M2/M3 : quasiment impossible sans auth
PROBLÈME : APFS verrouillé sur Mac (FileVault)
SOLUTION :
- Si l'utilisateur est connecté → image du volume déverrouillé
- Demander le mot de passe / PRK
- Contournement via DMA (Intel)
- Sur Apple Silicon : T2/Secure Enclave → extraction impossible sans clé
PROBLÈME : Logs macOS unifiés (log show) trop volumineux
SOLUTION :
- Utiliser des prédicats précis
- Exporter au format .logarchive
- Analyser avec l'outil Console.app sur macOS
14. Ressources