CLI/TUI Python pour le triage forensique des systèmes Ubuntu — détecte et remédie aux mécanismes de persistance avec collecte d'artefacts, corrélation temporelle et intégration Wazuh.
Triage forensique pour systèmes Ubuntu en direct — collecte automatisée d'artefacts, détection de persistance et remédiation guidée en environ une minute.
Lorsque vous soupçonnez qu'un système Linux est compromis, les 30 à 40 premières minutes sont généralement consacrées à exécuter les mêmes dix commandes en séquence : vérifier les processus en cours d'exécution, rechercher des tâches cron suspectes, faire un grep sur LD_PRELOAD, scanner authorized_keys à la recherche de nouvelles entrées, auditer sudoers. Chaque étape est manuelle, implique des changements de contexte et est source d'erreurs sous pression. Oubliez une seule source — par exemple, /etc/sudoers.d/ au lieu de simplement /etc/sudoers, ou les crontabs utilisateur en plus de /etc/cron.d/ — et vous obtenez une image incomplète.
Les options existantes ne résolvent pas ce problème proprement. lynis est un auditeur de durcissement, pas un outil de triage — il signale les faiblesses de configuration sur un système propre et génère du bruit sur un système compromis. chkrootkit et rkhunter vérifient les signatures de rootkits connus mais sont aveugles aux techniques de persistance nouvelles comme les timers systemd détournés ou les entrées cron d'apparence légitime. Les requêtes SIEM génériques nécessitent une infrastructure de journalisation qui peut ne pas exister sur le système que vous examinez. Et les suites forensiques comme Volatility ciblent les images mémoire, pas un shell en direct sur un hôte en fonctionnement.
Le manque est un outil qui s'exécute sur le système en direct immédiatement, couvre les vecteurs de persistance les plus courants, corrèle l'activité entre les sources de journaux dans une chronologie, et vous indique exactement ce qu'il faut examiner — sans nécessiter d'agent externe, de base de données ou de connexion internet.
ubuntils s'exécute en quatre étapes séquentielles :
/proc, les tables cron, les unités systemd, les clés SSH, les fichiers sudoers, les définitions d'environnement, l'intégrité des paquets (dpkg --verify), la configuration PAM/NSS et les modules du noyau chargés. La plupart des collecteurs terminent en une ou deux secondes ; dpkg --verify, qui revérifie chaque fichier de paquet installé, domine — un scan complet a pris 29 à 68 secondes sur une VM de bureau Ubuntu 26.04 arm64.--rules — sur les artefacts collectés, produisant une liste de résultats classés et notés par confiance en environ une seconde.--json).ubuntils lui-même n'effectue aucun appel réseau, et chaque fonctionnalité — règles personnalisées et corrélation incluses — s'exécute sur des artefacts collectés localement. La seule façon dont les résultats peuvent quitter l'hôte est l'intégration Wazuh : si un agent Wazuh est installé, un scan en direct écrit ses résultats dans un fichier local que l'agent expédie ensuite à son manager. Passez --no-wazuh pour désactiver cela pour une exécution.
ubuntils scan reste inchangé par tout ce qui suit — il est toujours 100 % actif, mono-hôte, et chaque option existante fonctionne à l'identique. Deux commandes supplémentaires, collect et analyze, divisent le même pipeline de détection/chronologie en un flux de travail d'acquisition puis d'analyse adapté au mode hors ligne, pour les cas où vous ne pouvez pas (ou ne souhaitez pas) exécuter la détection directement sur l'hôte faisant l'objet de l'investigation — voir Analyse hors ligne : collect et analyze ci-dessous, y compris ses réserves concernant la couverture de détection.
Ubuntu 22.04+ et tout système avec PEP 668 (recommandé) :
Ubuntu 22.04+ bloque pip install à l'échelle du système. Utilisez pipx — il gère l'environnement de manière transparente pour que vous n'ayez jamais à y penser :
sudo apt install pipx -y
pipx ensurepath # then open a new shell
git clone https://github.com/asmitdesai/ubuntils.git
cd ubuntils
pipx install -e .
ubuntils scan # not `ubuntils scan` — see below
Exécutez-le en tant qu'utilisateur normal : scan et collect se réinvoquent eux-mêmes sous sudo. Taper ubuntils … vous-même échoue avec command not found, car le secure_path de sudo n'inclut pas ~/.local/bin où pipx place la commande. Si vous devez le lancer depuis un shell root, appelez le binaire installé par son chemin (~youruser/.local/bin/ubuntils scan), ou installez-le plutôt dans un environnement virtuel :
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/ubuntils scan
Systèmes plus anciens / installation manuelle :
git clone https://github.com/asmitdesai/ubuntils.git
cd ubuntils
pip install -r requirements.txt -e .
ubuntils scan
ubuntils nécessite les droits root pour un accès complet aux artefacts. Si vous exécutez ubuntils scan en tant qu'utilisateur non-root, il se réinvoquera automatiquement avec sudo en utilisant le même interpréteur Python (par chemin absolu), afin que l'environnement correct soit utilisé sans transmettre votre PATH au processus root. Chaque commande externe (ss, dpkg, systemctl, …) est résolue sur un chemin de recherche fixe, appartenant à root, jamais votre PATH. Une exécution sans root ignorera /etc/shadow, certaines entrées de /proc et les fichiers cron protégés, et journalisera des avertissements pour chacun.
Détection uniquement — TUI interactive :
ubuntils scan
Détection avec sortie JSON enregistrée dans un fichier :
ubuntils scan --json > /tmp/triage-$(hostname)-$(date +%Y%m%d).json
Détection avec aperçu de remédiation CLI (exécution à blanc — aucune modification appliquée) :
ubuntils scan --remediate
Détection avec remédiation CLI appliquée :
ubuntils scan --remediate --confirm
Version imprimable :
ubuntils version
Collectez un bundle inviolable pour une analyse ultérieure ou hors ligne :
ubuntils collect --output /path/to/bundle.tar.gz
Analyser un bundle précédemment collecté (aucun accès root requis) :
ubuntils analyze /path/to/bundle.tar.gz --json
Analyser une image forensique montée ou une arborescence de système de fichiers extraite au lieu d'un bundle :
ubuntils analyze --root /mnt/forensic-image --json