Was macht Analyse von Linux-Systemartefakten?
Verwendungszweck
- Bei der Untersuchung eines kompromittierten Linux-Servers oder -Workstations
- Zur Identifizierung von Persistenzmechanismen (cron, systemd, SSH-Keys)
- Bei der Rückverfolgung von Benutzeraktivitäten durch Shell-History und Authentifizierungsprotokolle
- Während der Incident-Response zur Bestimmung des Umfangs einer Linux-basierten Sicherheitsverletzung
- Zum Erkennen von Rootkits, Backdoors und unbefugten Änderungen
Voraussetzungen
- Forensisches Abbild oder Live-Zugriff auf das Linux-System (schreibgeschützt)
- Verständnis der Linux-Dateisystemhierarchie (FHS)
- Kenntnisse über gängige Linux-Protokollspeicherorte (/var/log/)
- Werkzeuge: chkrootkit, rkhunter, AIDE, auditd-Protokolle
- Vertrautheit mit systemd, cron und PAM-Konfigurationen
- Root-Zugriff für vollständige Artefaktsammlung
Arbeitsablauf
Schritt 1: Montieren und Sammeln von Systemartefakten
# Forensisches Abbild schreibgeschützt einhängen
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/linux_evidence.dd /mnt/evidence
# Sammlungsverzeichnisse erstellen
mkdir -p /cases/case-2024-001/linux/{logs,config,users,persistence,network}
# Authentifizierungsprotokolle sammeln
cp /mnt/evidence/var/log/auth.log* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/secure* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/syslog* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/kern.log* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/audit/audit.log* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/wtmp /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/btmp /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/lastlog /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/faillog /cases/case-2024-001/linux/logs/
# Benutzerartefakte sammeln
for user_dir in /mnt/evidence/home/*/; do
username=$(basename "$user_dir")
mkdir -p /cases/case-2024-001/linux/users/$username
cp "$user_dir"/.bash_history /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.zsh_history /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp -r "$user_dir"/.ssh/ /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.bashrc /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.profile /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.viminfo /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.wget-hsts /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.python_history /cases/case-2024-001/linux/users/$username/ 2>/dev/null
done
# Root-Benutzer-Artefakte sammeln
cp /mnt/evidence/root/.bash_history /cases/case-2024-001/linux/users/root/ 2>/dev/null
cp -r /mnt/evidence/root/.ssh/ /cases/case-2024-001/linux/users/root/ 2>/dev/null
# Systemkonfiguration sammeln
cp /mnt/evidence/etc/passwd /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/shadow /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/group /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/sudoers /cases/case-2024-001/linux/config/
cp -r /mnt/evidence/etc/sudoers.d/ /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/hosts /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/resolv.conf /cases/case-2024-001/linux/config/
cp -r /mnt/evidence/etc/ssh/ /cases/case-2024-001/linux/config/
Schritt 2: Benutzerkonten und Authentifizierung analysieren
# Benutzerkonten auf Anomalien analysieren
python3 << 'PYEOF'
print("=== BENUTZERKONTEN-ANALYSE ===\n")
# /etc/passwd parsen
with open('/cases/case-2024-001/linux/config/passwd') as f:
for line in f:
parts = line.strip().split(':')
if len(parts) >= 7:
username, _, uid, gid, comment, home, shell = parts[0], parts[1], int(parts[2]), int(parts[3]), parts[4], parts[5], parts[6]
# Konten mit UID 0 markieren (Root-Äquivalent)
if uid == 0 and username != 'root':
print(f" ALARM: UID-0-Konto: {username} (Shell: {shell})")
# Konten mit Login-Shells markieren, die diese nicht haben sollten
if shell not in ('/bin/false', '/usr/sbin/nologin', '/bin/sync') and uid >= 1000:
print(f" Benutzer: {username} (UID:{uid}, Shell:{shell}, Home:{home})")
# Systemkonten mit Login-Shells markieren
if uid < 1000 and uid > 0 and shell in ('/bin/bash', '/bin/sh', '/bin/zsh'):
print(f" WARNUNG: Systemkonto mit Shell: {username} (UID:{uid}, Shell:{shell})")
# /etc/shadow für Kontostatus parsen
print("\n=== PASSWORTSTATUS ===")
with open('/cases/case-2024-001/linux/config/shadow') as f:
for line in f:
parts = line.strip().split(':')
if len(parts) >= 3:
username = parts[0]
pwd_hash = parts[1]
last_change = parts[2]
if pwd_hash and pwd_hash not in ('*', '!', '!!', ''):
hash_type = 'Unbekannt'
if pwd_hash.startswith('$6$'): hash_type = 'SHA-512'
elif pwd_hash.startswith('$5$'): hash_type = 'SHA-256'
elif pwd_hash.startswith('$y$'): hash_type = 'yescrypt'
elif pwd_hash.startswith('$1$'): hash_type = 'MD5 (SCHWACH)'
print(f" {username}: {hash_type}-Hash, letzte Änderung: Tag {last_change}")
PYEOF
# Anmeldeverlauf analysieren
last -f /cases/case-2024-001/linux/logs/wtmp > /cases/case-2024-001/linux/analysis/login_history.txt
lastb -f /cases/case-2024-001/linux/logs/btmp > /cases/case-2024-001/linux/analysis/failed_logins.txt 2>/dev/null
Schritt 3: Persistenzmechanismen untersuchen
# Cron-Jobs für alle Benutzer prüfen
echo "=== CRON-JOBS ===" > /cases/case-2024-001/linux/persistence/cron_analysis.txt
# System-Cron
for cronfile in /mnt/evidence/etc/crontab /mnt/evidence/etc/cron.d/*; do
echo "--- $cronfile ---" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
cat "$cronfile" 2>/dev/null >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
echo "" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
done
# Benutzer-Crontabs
for cronfile in /mnt/evidence/var/spool/cron/crontabs/*; do
echo "--- Benutzer-Crontab: $(basename $cronfile) ---" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
cat "$cronfile" 2>/dev/null >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
echo "" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
done
# systemd-Dienste auf Persistenz prüfen
echo "=== SYSTEMD-DIENSTE ===" > /cases/case-2024-001/linux/persistence/systemd_analysis.txt
find /mnt/evidence/etc/systemd/system/ -name "*.service" -newer /mnt/evidence/etc/os-release \
>> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
for svc in /mnt/evidence/etc/systemd/system/*.service; do
echo "--- $(basename $svc) ---" >> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
cat "$svc" >> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
echo "" >> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
done
# Autorisierte SSH-Schlüssel prüfen (Backdoor-Erkennung)
echo "=== SSH AUTHORIZED KEYS ===" > /cases/case-2024-001/linux/persistence/ssh_keys.txt
find /mnt/evidence/home/ /mnt/evidence/root/ -name "authorized_keys" -exec sh -c \
'echo "--- {} ---"; cat {}; echo ""' \; >> /cases/case-2024-001/linux/persistence/ssh_keys.txt
# rc.local und Init-Skripte prüfen
cat /mnt/evidence/etc/rc.local 2>/dev/null > /cases/case-2024-001/linux/persistence/rc_local.txt
# /etc/profile.d/ auf login-ausgelöste Skripte prüfen
ls -la /mnt/evidence/etc/profile.d/ > /cases/case-2024-001/linux/persistence/profile_scripts.txt
# Auf LD_PRELOAD-Hijacking prüfen
grep -r "LD_PRELOAD" /mnt/evidence/etc/ 2>/dev/null > /cases/case-2024-001/linux/persistence/ld_preload.txt
cat /mnt/evidence/etc/ld.so.preload 2>/dev/null >> /cases/case-2024-001/linux/persistence/ld_preload.txt
Schritt 4: Shell-Verlauf und Befehlsausführung analysieren
# Bash-Verlauf für jeden Benutzer analysieren
python3 << 'PYEOF'
import os, glob
print("=== SHELL-VERLAUFSANALYSE ===\n")
suspicious_commands = [
'wget', 'curl', 'nc ', 'ncat', 'netcat', 'python -c', 'python3 -c',
'perl -e', 'base64', 'chmod 777', 'chmod +s', '/dev/tcp', '/dev/udp',
'nmap', 'masscan', 'hydra', 'john', 'hashcat', 'passwd', 'useradd',
'iptables -F', 'ufw disable', 'history -c', 'rm -rf /', 'dd if=',
'crontab', 'at ', 'systemctl enable', 'ssh-keygen', 'scp ', 'rsync',
'tar czf', 'zip -r', 'openssl enc', 'gpg --encrypt', 'shred',
'chattr', 'setfacl', 'awk', '/tmp/', '/dev/shm/'
]
for hist_file in glob.glob('/cases/case-2024-001/linux/users/*/.bash_history'):
username = hist_file.split('/')[-2]
print(f"Benutzer: {username}")
with open(hist_file, 'r', errors='ignore') as f:
lines = f.readlines()
print(f" Befehle insgesamt: {len(lines)}")
flagged = []
for i, line in enumerate(lines):
line = line.strip()
for cmd in suspicious_commands:
if cmd in line.lower():
flagged.append((i+1, line))
break
if flagged:
print(f" Verdächtige Befehle: {len(flagged)}")
for lineno, cmd in flagged:
print(f" Zeile {lineno}: {cmd[:120]}")
print()
PYEOF
Schritt 5: Auf Rootkits und modifizierte Binärdateien prüfen
# Auf bekannte Rootkit-Indikatoren prüfen
# System-Binär-Hashes mit bekannten guten Hashes vergleichen
find /mnt/evidence/usr/bin/ /mnt/evidence/usr/sbin/ /mnt/evidence/bin/ /mnt/evidence/sbin/ \
-type f -executable -exec sha256sum {} \; > /cases/case-2024-001/linux/analysis/binary_hashes.txt
# Auf SUID/SGID-Binärdateien prüfen (potentielle Privilegienausweitung)
find /mnt/evidence/ -perm -4000 -type f 2>/dev/null > /cases/case-2024-001/linux/analysis/suid_files.txt
find /mnt/evidence/ -perm -2000 -type f 2>/dev/null > /cases/case-2024-001/linux/analysis/sgid_files.txt
# Auf verdächtige Dateien in /tmp und /dev/shm prüfen
find /mnt/evidence/tmp/ /mnt/evidence/dev/shm/ -type f 2>/dev/null \
-exec file {} \; > /cases/case-2024-001/linux/analysis/tmp_files.txt
# Auf versteckte Dateien und Verzeichnisse prüfen
find /mnt/evidence/ -name ".*" -not -path "*/\." -type f 2>/dev/null | \
head -100 > /cases/case-2024-001/linux/analysis/hidden_files.txt
# Kernel-Module prüfen
ls -la /mnt/evidence/lib/modules/$(ls /mnt/evidence/lib/modules/ | head -1)/extra/ 2>/dev/null \
> /cases/case-2024-001/linux/analysis/extra_modules.txt
# Auf geänderte PAM-Konfiguration prüfen (Authentifizierungs-Backdoors)
diff /mnt/evidence/etc/pam.d/ /cases/baseline/pam.d/ 2>/dev/null \
> /cases/case-2024-001/linux/analysis/pam_changes.txt
Kernkonzepte
| Konzept | Beschreibung |
|---|---|
| /var/log/auth.log | Primäres Authentifizierungsprotokoll auf Debian/Ubuntu-Systemen |
| /var/log/secure | Primäres Authentifizierungsprotokoll auf RHEL/CentOS-Systemen |
| wtmp/btmp | Binärprotokolle, die erfolgreiche und fehlgeschlagene Anmeldesitzungen aufzeichnen |
| .bash_history | Benutzerbefehlsverlauf (kann von Angreifern gelöscht werden) |
| crontab | Zeitgesteuerte Aufgaben, die häufig für Persistenz verwendet werden |
| authorized_keys | SSH-öffentliche Schlüssel, die passwortlosen Zugriff auf ein Konto gewähren |
| SUID-Bit | Dateiberechtigung, die die Ausführung als Dateibesitzer erlaubt (Angriffsvektor für Privilegienausweitung) |
| LD_PRELOAD | Umgebungsvariable, die eine gemeinsam genutzte Bibliothek vor allen anderen lädt (Hooking-Technik) |
Werkzeuge und Systeme
| Werkzeug | Zweck |
|---|---|
| chkrootkit | Rootkit-Erkennungsscanner für Linux-Systeme |
| rkhunter | Rootkit Hunter - prüft auf Rootkits, Backdoors und lokale Exploits |
| AIDE | Advanced Intrusion Detection Environment - Dateiintegritätsmonitor |
| auditd | Linux-Audit-Framework für Systemaufruf- und Dateizugriffsüberwachung |
| last/lastb | Parse wtmp/btmp für Anmelde- und fehlgeschlagene Anmeldeverläufe |
| Plaso/log2timeline | Erstellung von Super-Zeitlinien, einschließlich Linux-Artefakten |
| osquery | SQL-basierte Systemabfrage für Live-Forensik |
| Velociraptor | Endpunkt-Agent mit Fähigkeiten zur Sammlung von Linux-Artefakten |
Häufige Szenarien
Szenario 1: SSH-Brute-Force gefolgt von Kompromittierung Analysieren Sie auth.log auf fehlgeschlagene SSH-Versuche, gefolgt von Erfolg, identifizieren Sie die angreifende IP, prüfen Sie .bash_history auf Befehle nach der Kompromittierung, untersuchen Sie authorized_keys auf hinzugefügte Backdoor-Schlüssel, prüfen Sie crontab auf Persistenz, überprüfen Sie Netzwerkverbindungen.
Szenario 2: Webserver-Kompromittierung durch Anwendungssicherheitslücke Untersuchen Sie Webserver-Zugriffs- und Fehlerprotokolle auf Exploit-Versuche, prüfen Sie /tmp und /dev/shm auf Webshells, analysieren Sie die Aktivität des Webserver-Benutzers (www-data), prüfen Sie auf Privilegienausweitung über SUID-Binärdateien oder Kernel-Exploits, überprüfen Sie ausgehende Verbindungen.
Szenario 3: Insider-Bedrohung auf einem Datenbankserver Analysieren Sie den bash_history des verdächtigen Benutzers auf Datenbank-Dump-Befehle, prüfen Sie auf große tar/zip-Dateien im Home-Verzeichnis oder /tmp, untersuchen Sie scp/rsync-Befehle auf Datenübertragungen, überprüfen Sie Cron-Jobs auf automatisierten Datenabfluss, prüfen Sie USB-Geräteprotokolle.
Szenario 4: Crypto-Miner auf einer Cloud-Instanz Prüfen Sie auf Prozesse mit hoher CPU-Auslastung in /proc (live) oder systemd-Dienstdateien, untersuchen Sie Crontab-Einträge auf Miner-Neustartskripte, prüfen Sie /tmp auf Mining-Binärdateien, analysieren Sie Netzwerkverbindungen auf Kommunikation mit Mining-Pools, überprüfen Sie authorized_keys auf Angreiferzugriff.
Ausgabeformat
Linux-Forensik-Zusammenfassung:
System: webserver01 (Ubuntu 22.04 LTS)
Hostname: webserver01.corp.local
Kernel: 5.15.0-91-generic
Benutzerkonten:
Insgesamt: 25 (3 mit UID 0 - 1 ANOMAL)
Interaktive Shells: 8 Benutzer
Kürzlich erstellt: admin2 (erstellt 2024-01-15)
Authentifizierungsereignisse:
Erfolgreiche SSH-Anmeldungen: 456
Fehlgeschlagene SSH-Versuche: 12.345 (von 23 eindeutigen IPs)
sudo-Ausführungen: 89
Gefundene Persistenzmechanismen:
Cron-Jobs: 3 verdächtig (Reverse Shell, Miner-Neustart)
systemd-Dienste: 1 unbekannt (update-checker.service)
SSH-Schlüssel: 2 unbefugte Schlüssel in root authorized_keys
rc.local: Geändert mit Download-Cradle
Verdächtige Aktivitäten:
- bash_history enthält wget zu pastebin-URL
- SUID-Binärdatei /t...
…
[truncated for translation]