
Analyseur de fichiers de journalisation de traces d'événements en Python pur
Lecteur de fichiers de trace d'événements (ETL) en pur Python
etl-parser est une bibliothèque d'analyse en pur Python pour les fichiers journaux Windows ETL. ETL est le format par défaut pour ETW ainsi que pour le journaliseur du noyau.
etl-parser n'a aucune dépendance système et fonctionnera aussi bien sous Windows que sous Linux.
Étant donné que ce format n'est pas documenté, nous avons fusionné les informations du blog de Geoff Chappel et les activités de rétro-ingénierie menées par l'équipe CERT d'Airbus.
Qu'est-ce que ETL et pourquoi est-ce pénible à utiliser ? Considérez ETL comme un conteneur, analogue à AVI pour les fichiers vidéo. Lire ETL est tout aussi frustrant que de lire un fichier AVI sans le bon codec.
etl-parser tente de résoudre ce problème en incluant des analyseurs pour les formats de journal bien connus suivants :
etl-parser ?etl-parser propose deux scripts.
Le premier script, etl2xml, transforme tous les événements ETL connus en XML :
etl2xml -i example.etl -o example.xml
Le deuxième script, etl2pcap, transforme les captures réseau créées via netsh au format de fichier pcap :
netsh trace start capture=yes
netsh trace stop
etl2pcap -i NetTrace.etl -o NetTrace.pcap
Vous pouvez également utiliser etl-parser comme une bibliothèque :
from etl.etl import IEtlFileObserver, build_from_stream
from etl.system import SystemTraceRecord
from etl.perf import PerfInfo
from etl.event import Event
from etl.trace import Trace
from etl.wintrace import WinTrace
class EtlFileLogger(IEtlFileObserver):
def on_system_trace(self, event: SystemTraceRecord):
"""Message MOF du noyau avec ID de processus et ID de thread"""
mof = event.get_mof() # Appel de l'analyseur MOF
def on_perfinfo_trace(self, event: PerfInfo):
"""Message MOF du noyau avec horodatage"""
mof = event.get_mof() # Appel de l'analyseur MOF
def on_trace_record(self, event: Trace):
"""inconnu"""
def on_event_record(self, event: Event):
"""Événement ETW, c'est ce que vous recherchez"""
# Choisissez la fonction "parse_" qui correspond à votre événement
message = event.parse_tracelogging() # Appel de l'analyseur TraceLogging
message = event.parse_etw() # Appel de l'analyseur basé sur le manifeste
def on_win_trace(self, event: WinTrace):
"""inconnu"""
etw = event.parse_etw()
with open("example.etl", "rb") as etl_file:
etl_reader = build_from_stream(etl_file.read())
etl_reader.parse(EtlFileLogger())
etl-parser est disponible via pip :
pip install etl-parser
Sinon, vous pouvez installer etl-parser en utilisant setup.py :
git clone https://github.com/airbus-cert/etl-parser.git
cd etl-parser
pip install -e .
Si vous rencontrez une erreur d'analyse, veuillez ouvrir un ticket sur le dépôt GitHub d'Airbus CERT.
Le format de journal EVTX est assez bien documenté, avec de nombreuses bibliothèques et outils disponibles aujourd'hui. Ce n'est pas le cas pour ETL : au moment du développement, il n'existe aucun projet open-source significatif à notre connaissance et le format ETL n'est pas bien documenté.
ETL est massivement utilisé par les programmeurs système Windows pour journaliser des artefacts utiles :
C:\Windows\System32\WDI\LogFiles\BootPerfDiagLogger.etlC:\Windows\System32\WDI\LogFiles\ShutdownPerfDiagLogger.etlNetTrace.etl via netshC:\Windows\System32\WDI\<GUID>\<GUID>\snapshot.etlDe nombreuses nouvelles API telles que Tracelogging ou WPP sont basées sur ETW. Ces API sont largement utilisées par les développeurs Microsoft pour Windows. Tracelogging est pris en charge par etl-parser, WPP le sera dans une future version.
Microsoft propose de nombreux consommateurs qui créent des traces ETL, comme xperf.exe, logman.exe, netsh.exe, etc.
Nous pensons que c'est une mine d'or pour les analystes DFIR.
etl-parser est publié sous la licence Apache 2.0.