Systemd charge ses configurations depuis de multiples répertoires, en appliquant un ordre de priorité strict. Lors d’une analyse hors ligne sur une image forensique montée (ex: /mnt/analyse/), les analystes doivent auditer ces chemins méthodiquement.
/etc/systemd/system/
Priorité haute (Zone rouge). Ce répertoire est réservé aux configurations de l’administrateur système. Les fichiers ici surchargent les valeurs par défaut. C’est l’endroit principal où les attaquants déposent leurs fichiers .service malveillants pour établir une persistance de niveau root.
/usr/lib/systemd/system/
Priorité basse (Défauts du système). C’est ici que les paquets installés placent leurs fichiers de service par défaut. Les attaquants avancés peuvent modifier un fichier légitime ici (ex: ssh.service) et utiliser le “Timestomping” pour se fondre dans la masse.
~/.config/systemd/user/
Persistance au niveau utilisateur. Systemd permet aux utilisateurs non privilégiés de gérer leurs propres services. Si un démon de serveur web (www-data) est compromis, les attaquants peuvent établir une persistance furtive ici sans avoir besoin des privilèges root.
Un service systemd est défini par un fichier texte brut de style INI. L’analyse des directives de configuration révèle l’intention de l’attaquant et la mécanique d’exécution de la charge utile.
evil-network-manager.service
[Unit]
Description=High Performance Network Service # Description trompeuse pour leurrer les admins juniors
After=network.target
[Service]
Type=simple
# LA CHARGE UTILE : génère un reverse shell interactif
ExecStart : le chemin absolu vers le binaire ou le script exécuté. Recherchez des commandes pointant vers des répertoires de préparation (staging) comme /tmp/ ou /dev/shm/, des fichiers cachés (/usr/bin/.sys), ou des commandes shell offusquées.
Restart=always : indique un malware hautement résilient conçu pour survivre à l’interruption de son processus.
ExecStartPre / ExecStartPost : directives utilisées pour exécuter des commandes furtives immédiatement avant ou après le démarrage d’un service.
Les acteurs de la menace s’adaptent continuellement pour contourner les scripts de triage basiques qui se contentent de chercher de nouveaux fichiers .service.
Au lieu de créer un nouveau service ou de modifier un service légitime (ce qui brise les hashs des fichiers), systemd permet de surcharger des directives spécifiques en créant un répertoire .d.
L’attaque : un adversaire crée /etc/systemd/system/ssh.service.d/override.conf. À l’intérieur, il ajoute une directive ExecStartPost=/tmp/backdoor.sh.
Le résultat : le démon SSH légitime démarre normalement, mais systemd exécute silencieusement la porte dérobée de l’attaquant juste après. Le fichier original ssh.service reste intact.
Les Timers systemd peuvent remplacer complètement les tâches cron héritées.
L’attaque : un analyste passe en revue tous les services activés et ne trouve rien de malveillant. Cependant, un attaquant a créé un fichier backup.timer qui déclenche un fichier backup.service (la charge utile) inactif toutes les 15 minutes.
Action DFIR : les analystes doivent expressément chasser les fichiers se terminant par .timer dans l’ensemble des répertoires systemd.
4. Traçage de l’activation des services (Liens symboliques)
Pour qu’un service systemd démarre automatiquement au boot, il doit être “activé” (via systemctl enable). Cette action crée un lien symbolique (symlink) à l’intérieur d’un répertoire .wants.
Pour identifier exactement ce qui est configuré pour s’exécuter au démarrage sur un disque inactif, les analystes doivent lister le contenu des répertoires cibles :
Si un lien symbolique existe dans ces dossiers et pointe vers un fichier de service suspect (ex: S99evil.service -> /etc/systemd/system/evil.service), le mécanisme de persistance est pleinement armé.
title: Création de Persistance via Service Systemd
id: 9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: stable
description: Détecte l'utilisation de systemctl pour activer un service, ou la création de fichiers unit systemd dans des emplacements suspects, indiquant une persistance potentielle.
logsource:
category: process_creation
product: linux
detection:
selection_systemctl:
Image|endswith: '/systemctl'
CommandLine|contains|all:
- 'enable'
selection_suspicious_path:
CommandLine|contains|any:
- '/tmp/'
- '/dev/shm/'
- '/var/tmp/'
condition: selection_systemctl or selection_suspicious_path