Analyse de la persistance des logiciels malveillants avec Autoruns
Vue d'ensemble
Sysinternals Autoruns extrait les données de centaines de points d'extension de démarrage automatique (ASEP) sur Windows, en analysant plus de 18 catégories, notamment les clés Run/RunOnce, services, tâches planifiées, pilotes, entrées Winlogon, fournisseurs LSA, moniteurs d'impression, abonnements WMI et DLL AppInit. La vérification de la signature numérique filtre les entrées signées par Microsoft. La fonction de comparaison identifie les mécanismes de persistance nouvellement ajoutés par différentiel de base de référence. L'intégration VirusTotal vérifie la réputation des hachages. L'analyse hors ligne via le flag -z permet l'examen d'images disque forensiques.
Quand l'utiliser
- Lors de l'investigation d'incidents de sécurité nécessitant l'analyse de la persistance des logiciels malveillants avec Autoruns
- Lors de la construction de règles de détection ou de requêtes de chasse aux menaces pour ce domaine
- Lorsque les analystes SOC ont besoin de procédures structurées pour ce type d'analyse
- Lors de la validation de la couverture de surveillance pour les techniques d'attaque associées
Prérequis
- Sysinternals Autoruns (GUI) et Autorunsc (CLI)
- Privilèges d'administration sur le système cible
- Python 3.9+ pour l'analyse automatisée
- Clé API VirusTotal pour les vérifications de réputation
- Export de base de référence propre pour comparaison
Workflow
Étape 1 : Scan automatisé de la persistance
#!/usr/bin/env python3
"""Automatisation de l'analyse de persistance basée sur Autoruns."""
import subprocess
import csv
import json
import sys
def scan_and_analyze(autorunsc_path="autorunsc64.exe", csv_path="scan.csv"):
cmd = [autorunsc_path, "-a", "*", "-c", "-h", "-s", "-nobanner", "*"]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=600)
with open(csv_path, 'w') as f:
f.write(result.stdout)
return parse_and_flag(csv_path)
def parse_and_flag(csv_path):
suspicious = []
with open(csv_path, 'r', errors='replace') as f:
for row in csv.DictReader(f):
reasons = []
signer = row.get("Signer", "")
if not signer or signer == "(Not verified)":
reasons.append("Binaire non signé")
if not row.get("Description") and not row.get("Company"):
reasons.append("Métadonnées manquantes")
path = row.get("Image Path", "").lower()
for sp in ["\temp\\", "\appdata\local\temp", "\users\public\\"]:
if sp in path:
reasons.append(f"Chemin suspect")
launch = row.get("Launch String", "").lower()
for kw in ["powershell", "cmd /c", "wscript", "mshta", "regsvr32"]:
if kw in launch:
reasons.append(f"LOLBin : {kw}")
if reasons:
row["reasons"] = reasons
suspicious.append(row)
return suspicious
if __name__ == "__main__":
if len(sys.argv) > 1:
results = parse_and_flag(sys.argv[1])
print(f"[!] {len(results)} entrées suspectes")
for r in results:
print(f" {r.get('Entry','')} - {r.get('Image Path','')}")
for reason in r.get('reasons', []):
print(f" - {reason}")
Critères de validation
- Toutes les catégories ASEP scannées et cataloguées
- Entrées non signées signalées pour investigation
- Chemins suspects et chaînes de lancement LOLBin mis en évidence
- Comparaison de base de référence identifiant les nouveaux mécanismes de persistance