Registry-Autostarts¶
Was sie sind¶
Windows startet Programme und lädt DLLs von vielen Registry-Orten aus: beim Booten, bei der Anmeldung, wenn ein
Programm startet oder beendet wird, wenn cmd.exe geöffnet wird, wenn eine COM-Klasse erstellt wird oder wenn Spooler,
LSA, netsh oder der Zeitdienst ihre Plug-ins laden. Angreifer nutzen diese Orte für Persistenz,
Rechteausweitung und DLL-Injektion, und auch legitime Software verwendet sie. Juntei liest sie
aus SOFTWARE, SYSTEM, NTUSER.DAT und UsrClass.dat in eine einzige Tabelle. Es schreibt einen Datensatz pro
Programm, DLL oder Paket und versieht jeden mit seiner MITRE-ATT&CK-Technik.
Bestmögliche Schlussfolgerung: Der Hive hat dieses Programm bzw. diese DLL zum Starten oder Laden konfiguriert. Das beweist nicht, dass das Programm lief. Damit es ausgeführt wird, müssen die Bedingungen erfüllt sein, die der Mechanismus nennt (eine Anmeldung, der Start des debuggten Programms, das Erstellen der Klasse), und es braucht andere Ausführungsbelege.
Speicherorte¶
| Hive | Was gelesen wird |
|---|---|
SOFTWARE |
Microsoft\Windows\CurrentVersion\Run, RunOnce (+Setup), RunOnceEx, RunServices(Once) und Policies\Explorer\Run, mit ihren Kopien unter Wow6432Node und im Terminal-Server-Installationsmodus; Explorer\StartupApproved\Run, Run32 und StartupFolder; Winlogon (Shell, Userinit, Taskman, AppSetup, GinaDLL, … und Notify); Windows AppInit_DLLs mit LoadAppInit_DLLs; Image File Execution Options\* Debugger (mit UseFilter) und VerifierDlls; SilentProcessExit\* MonitorProcess; Active Setup\Installed Components\* StubPath; NetSh; Command Processor AutoRun |
SYSTEM |
Control\Session Manager (BootExecute, SetupExecute, Execute, PendingFileRenameOperations, KnownDLLs, AppCertDlls, Environment .NET-Profiler-Variablen); Control\Lsa Authentication, Security und Notification Packages (+OSConfig); SecurityProviders; Control\Print Monitore, Anbieter und Druckprozessoren; Services\W32Time\TimeProviders |
NTUSER.DAT |
die Run-Schlüssel und StartupApproved des Benutzers; Windows NT\CurrentVersion\Windows Load und Run; Winlogon Shell; Environment (UserInitMprLogonScript, .NET-Profiler); Control Panel\Desktop SCRNSAVE.EXE; PackagedAppXDebug; Command Processor AutoRun; Software\Classes (als UsrClass.dat) |
UsrClass.dat |
CLSID\*\InprocServer32 und LocalServer32 (sowie die unter Wow6432Node); shell\open\command von Programmtypen (exefile, batfile, scrfile, …) und von dem, was automatisch erhöhte Programme starten (ms-settings, mscfile, Folder, …); ActivatableClasses\…\DebugInformation |
Sichern Sie jeden Hive mit seinen Transaktionsprotokollen. Benutzer-Hives liegen in Users\<name>\NTUSER.DAT und
Users\<name>\AppData\Local\Microsoft\Windows\UsrClass.dat.
Hinweise für die Analyse¶
- Auch Standardwerte werden gemeldet. Die meisten Datensätze auf einem sauberen System sind Windows-Standardwerte:
Userinitistuserinit.exe;Shellistexplorer.exe;KnownDLLs, LSA-Pakete, Druckmonitore, netsh-Hilfsprogramme und Active-Setup-Komponenten haben alle Standardeinträge.
Suchen Sie nach Abweichungen von einem sauberen Build derselben Version.
- StartupApproved deckt nur die Autostartliste des Task-Managers ab. Es gibt an, ob ein Run-
Eintrag oder eine Datei im Autostartordner dort deaktiviert ist, und seit wann. Ein Eintrag ohne passenden Run-
Wert wird mit dem Detail „only in StartupApproved“ gemeldet. Er kann einen entfernten Autostart
sichtbar machen.
- OverridesMachineRegistration benötigt den SOFTWARE-Hive des Systems. Eine COM-Klasse oder ein
Befehl eines Benutzers wird damit abgeglichen, und der Hive wird auf dieselbe Weise gefunden wie der SYSTEM-Hive des Hosts. Eine
Überschreibung ist das Muster von COM-Hijacking (T1546.015). OneDrive und andere benutzerbezogene Installationen
registrieren außerdem eigene Klassen, die nichts überschreiben.
- ImagePath und Args werden nur dort von der Befehlszeile getrennt, wo sich dies erkennen lässt.
- Ein in Anführungszeichen gesetztes Programm wird am schließenden Anführungszeichen getrennt.
- Ein erstes Wort ohne Ordner gilt als Programm (cmd /c …).
- Andernfalls wird am kürzesten Anfang getrennt, der mit der Erweiterung eines Programms endet.
Ein Pfad mit Leerzeichen ohne Anführungszeichen kann ein anderes Programm ausführen (C:\Program.exe), sofern eines existiert.
- GlobalFlag bestimmt Enabled für VerifierDlls und MonitorProcess. VerifierDlls wird
nur mit 0x100 geladen. MonitorProcess läuft nur mit 0x200 und 0x1 in ReportingMode von SilentProcessExit\<program>.
Ein Modus von 2 (ein Dump) oder 4 (eine Benachrichtigung) führt nichts aus, und
Details nennt die Flags des Modus.
- KeyLastWrittenUTC ist der letzte Schreibzugriff auf den Schlüssel, nicht auf den Wert. Mehrere Werte teilen ihn sich.
Mit Juntei parsen¶
Usage: juntei parse-registry persistence <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SOFTWARE, SYSTEM, NTUSER.DAT and UsrClass.dat hives
-f, --file <FILE> Parse one of them
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Filtering:
--all-control-sets Every control set of a SYSTEM hive, not only the one in use
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry persistence -d collection/ -o persistence.csv
juntei parse-registry persistence -f NTUSER.DAT -t jsonl \
| jq 'select(.Mechanism != "com_server" or .OverridesMachineRegistration == true)'
Die Zusammenfassung zählt die Datensätze nach Mechanismus. Sie listet außerdem die Einträge unter StartupApproved\Run und Run32
auf, denen ihr Run-Wert fehlt (Dateien im Autostartordner haben keinen, der verloren gehen könnte), sowie die COM-Klassen
und Befehle des Benutzers, die die des Computers überschreiben.
Wie jeder parse-registry-Befehl lehnt er ein -o ab, das einer der gelesenen Dateien entspricht, auch
mit -C. Das umfasst den Hive, seine Transaktionsprotokolle sowie die SYSTEM- und SOFTWARE-Hives des Systems,
ob über Pfad, symbolischen Link oder Hardlink. Wenn er es nicht feststellen kann, schreibt er nicht.
Ausgabefelder¶
| Feld | Interpretation |
|---|---|
Host, SourcePath, HiveType |
Host-Kontext, Quell-Hive und dessen Typ. |
User, UserSID |
Bei Benutzer-Hives: der Profilordner und die SID. Die SID stammt aus dem Namen des Stammschlüssels von UsrClass.dat, andernfalls aus der ProfileList des Systems. |
Mechanism |
run, run_once, winlogon, ifeo_debugger, silent_process_exit, appinit_dlls, appcert_dlls, boot_execute, lsa_security_package, com_server, uac_bypass_command, … |
AttackTechnique |
MITRE-ATT&CK-Technik, sofern eine passt (T1547.001, T1546.012, …). |
KeyPath, ValueName |
Der Schlüssel unterhalb des Hive-Stamms (Namen wie geschrieben) und der Wert (leer: der Standardwert). |
Data |
Der Text des Werts oder ein Element einer Liste. Leer, wenn er nicht gelesen werden kann oder wenn nur StartupApproved den Eintrag nennt. |
ImagePath, Args |
Das Programm bzw. die DLL und die Argumente, sofern sie sich unterscheiden lassen (siehe oben). |
Enabled, DisabledAtUTC |
Was StartupApproved, LoadAppInit_DLLs, GlobalFlag (mit ReportingMode), UseFilter, IsInstalled, das Enabled des Zeitanbieters oder ScreenSaveActive aussagt. Leer, wenn nichts davon etwas aussagt. |
Details |
Weiteres: was eine ausstehende Umbenennung bewirkt, der Name der COM-Klasse, ReportingMode, FilterFullPath, eine Active-Setup-ShellComponent, … |
OverridesMachineRegistration |
Bei einer COM-Klasse oder einem Befehl eines Benutzers: ob der Computer dieselbe/denselben registriert. Leer ohne den SOFTWARE-Hive des Systems. |
WOW64 |
Unter Wow6432Node: für 32-Bit-Programme. |
KeyLastWrittenUTC |
Letzter Schreibzugriff auf den Schlüssel. |
DataRaw |
Die Bytes des Werts (hexadezimal), wenn sie kein Text oder kein gültiges UTF-16 sind. |
TransactionLogStatus, LogsApplied |
Kontext der Registry-Wiederherstellung. |
Problems |
Falsche Werttypen, nicht lesbare Daten, StartupApproved-Einträge mit falscher Größe. |
Untersuchungsstrategie¶
- Beginnen Sie mit der Zusammenfassung:
- COM-Klassen und Befehle, die die des Computers überschreiben;
StartupApproved-Einträge ohne ihrenRun-Wert;- die Mechanismen, die selten Einträge haben (
ifeo_debugger,silent_process_exit,appinit_dlls,appcert_dlls,uac_bypass_command,file_association,logon_script,dotnet_profiler). - Vergleichen Sie LSA-Pakete,
BootExecute,KnownDLLs, Druckmonitore und netsh-Hilfsprogramme mit einem sauberen Build derselben Windows-Version. - Lösen Sie
ImagePathim Dateisystem auf ($MFT, Hashes und Signaturen) und prüfen Sie Pfade in Benutzer- profilen,ProgramDataundTemp. - Korrelieren Sie
KeyLastWrittenUTCmit Registry-Ereignissen aus Security und Sysmon, Prozesserstellung, Prefetch und Amcache. - Verwenden Sie
parse-registry read --recover-deleted, um Autostarts zu finden, die aus diesen Schlüsseln entfernt wurden.