Que fait Analyse de la journalisation des blocs de scripts PowerShell ?
Quand l'utiliser
- Lors de l'investigation d'incidents de sécurité nécessitant l'analyse de la journalisation des blocs de scripts PowerShell
- Lors de la construction de règles de détection ou de requêtes de chasse aux menaces pour ce domaine
- Quand les analystes SOC ont besoin de procédures structurées pour ce type d'analyse
- Lors de la validation de la couverture de surveillance de sécurité pour les techniques d'attaque associées
Prérequis
- Familiarité avec les concepts et outils d'opérations de sécurité
- Accès à un environnement de test ou laboratoire pour une exécution sécurisée
- Python 3.8+ avec les dépendances requises installées
- Autorisation appropriée pour toute activité de test
Instructions
- Installer les dépendances :
pip install python-evtx lxml - Collecter les journaux d'opérations PowerShell :
Microsoft-Windows-PowerShell%4Operational.evtx - Analyser les entrées d'ID d'événement 4104 en utilisant python-evtx pour extraire ScriptBlockText, ScriptBlockId et MessageNumber/MessageTotal pour la reconstruction de scripts multi-parties.
- Appliquer les heuristiques de détection :
- Commandes encodées en Base64 (
-EncodedCommand,FromBase64String) - Coffres de téléchargement (
DownloadString,DownloadFile,Invoke-WebRequest,Net.WebClient) - Modèles de contournement AMSI (
AmsiUtils,amsiInitFailed) - Indicateurs d'obfuscation (entropie élevée, insertion de guillemets, concaténation de chaînes)
- Commandes encodées en Base64 (
- Générer un rapport avec les scripts reconstitués, les scores de risque et les correspondances MITRE ATT&CK.
python scripts/agent.py --evtx-file /chemin/vers/PowerShell-Operational.evtx --output ps_analysis.json
Exemples
Détection d'exécution de commande encodée
import base64
if "-encodedcommand" in script_text.lower():
encoded = script_text.split()[-1]
decoded = base64.b64decode(encoded).decode("utf-16-le")
Reconstruction d'un script multi-blocs
Les scripts répartis sur plusieurs événements 4104 partagent un ScriptBlockId. Concaténer les blocs ordonnés par MessageNumber pour reconstituer le script complet.