콘텐츠로 이동

레지스트리 자동 실행

개요

Windows는 많은 레지스트리 위치에서 프로그램을 시작하고 DLL을 로드합니다. 부팅 시, 로그온 시, 프로그램이 시작하거나 종료할 때, cmd.exe가 열릴 때, COM 클래스가 생성될 때, 또는 스풀러, LSA, netsh나 시간 서비스가 플러그인을 로드할 때가 그렇습니다. 공격자는 지속성, 권한 상승 및 DLL 인젝션을 위해 이러한 위치를 사용하며, 정상 소프트웨어도 이를 사용합니다. Juntei는 SOFTWARE, SYSTEM, NTUSER.DAT 및 UsrClass.dat에서 이 위치들을 읽어 하나의 테이블로 만듭니다. 프로그램, DLL 또는 패키지당 하나의 레코드를 기록하며, 각각에 MITRE ATT&CK 기법을 태그로 붙입니다.

가장 타당한 결론: 하이브가 이 프로그램 또는 DLL을 시작하거나 로드하도록 구성했습니다. 이것이 프로그램이 실행되었음을 증명하지는 않습니다. 실행되려면 해당 메커니즘이 지정하는 조건(로그온, 디버깅 대상 프로그램의 시작, 클래스 생성)이 충족되어야 하며, 다른 실행 증거도 필요합니다.

위치

하이브 읽는 항목
SOFTWARE Microsoft\Windows\CurrentVersion\Run, RunOnce(+Setup), RunOnceEx, RunServices(Once) 및 Policies\Explorer\Run과 그 Wow6432Node 및 터미널 서버 설치 모드 사본, Explorer\StartupApproved\Run, Run32 및 StartupFolder, Winlogon(Shell, Userinit, Taskman, AppSetup, GinaDLL, … 및 Notify), LoadAppInit_DLLs와 함께 Windows의 AppInit_DLLs, Image File Execution Options\*의 Debugger(UseFilter 포함) 및 VerifierDlls, SilentProcessExit\*의 MonitorProcess, Active Setup\Installed Components\*의 StubPath, NetSh, Command Processor의 AutoRun
SYSTEM Control\Session Manager(BootExecute, SetupExecute, Execute, PendingFileRenameOperations, KnownDLLs, AppCertDlls, Environment의 .NET 프로파일러 변수), Control\Lsa의 Authentication, Security 및 Notification Packages(+OSConfig), SecurityProviders, Control\Print의 모니터, 공급자 및 인쇄 프로세서, Services\W32Time\TimeProviders
NTUSER.DAT 사용자의 Run 키와 StartupApproved, Windows NT\CurrentVersion\Windows의 Load 및 Run, Winlogon의 Shell, Environment(UserInitMprLogonScript, .NET 프로파일러), Control Panel\Desktop의 SCRNSAVE.EXE, PackagedAppXDebug, Command Processor의 AutoRun, Software\Classes(UsrClass.dat으로서)
UsrClass.dat CLSID\*\InprocServer32 및 LocalServer32(및 Wow6432Node의 것), 프로그램 유형(exefile, batfile, scrfile, …)과 자동 권한 상승 프로그램이 시작하는 대상(ms-settings, mscfile, Folder, …)의 shell\open\command, ActivatableClasses\…\DebugInformation

각 하이브를 트랜잭션 로그와 함께 수집하십시오. 사용자 하이브는 Users\<name>\NTUSER.DAT와 Users\<name>\AppData\Local\Microsoft\Windows\UsrClass.dat에 있습니다.

분석 시 주의 사항

  • 기본값도 보고됩니다. 깨끗한 시스템의 레코드 대부분은 Windows 기본값입니다.
  • Userinit는 userinit.exe입니다.
  • Shell은 explorer.exe입니다.
  • KnownDLLs, LSA 패키지, 인쇄 모니터, netsh 도우미 및 Active Setup 구성 요소에는 모두 기본 항목이 있습니다.

같은 버전의 깨끗한 빌드와 다른 점을 찾으십시오. - StartupApproved는 작업 관리자의 시작 프로그램 목록만 다룹니다. Run 항목이나 시작 프로그램 폴더의 파일이 그곳에서 비활성화되었는지, 그리고 언제 비활성화되었는지를 나타냅니다. 일치하는 Run 값이 없는 항목도 "only in StartupApproved"라는 세부 정보와 함께 보고됩니다. 이는 제거된 자동 실행 항목을 보여 줄 수 있습니다. - OverridesMachineRegistration에는 시스템의 SOFTWARE 하이브가 필요합니다. 사용자의 COM 클래스나 명령은 이 하이브와 대조되며, 이 하이브는 호스트의 SYSTEM 하이브와 같은 방식으로 찾습니다. 재정의는 COM 하이재킹 패턴(T1546.015)입니다. OneDrive 및 기타 사용자별 설치도 아무것도 재정의하지 않는 자체 클래스를 등록합니다. - ImagePath와 Args는 구분할 수 있는 경우에만 명령줄에서 분리됩니다. - 따옴표로 묶인 프로그램은 닫는 따옴표에서 분리됩니다. - 폴더가 없는 첫 단어는 프로그램으로 간주됩니다(cmd /c …). - 그 외에는 프로그램 확장자로 끝나는 가장 짧은 시작 부분에서 분리됩니다.

공백이 포함된 따옴표 없는 경로는 다른 프로그램(C:\Program.exe)이 존재하면 그것을 실행할 수 있습니다. - GlobalFlag가 VerifierDlls와 MonitorProcess의 Enabled를 결정합니다. VerifierDlls는 0x100이 있을 때만 로드됩니다. MonitorProcess는 0x200과 SilentProcessExit\<program> ReportingMode의 0x1이 있을 때만 실행됩니다. 모드 2(덤프) 또는 4(알림)는 아무것도 실행하지 않으며, Details에 모드의 플래그가 표시됩니다. - KeyLastWrittenUTC는 키의 마지막 쓰기 시간이며, 값의 마지막 쓰기 시간이 아닙니다. 여러 값이 이를 공유합니다.

Juntei로 파싱하기

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)'

요약은 메커니즘별 레코드 수를 집계합니다. 또한 Run 값 없이 남아 있는 StartupApproved\Run 및 Run32 항목(시작 프로그램 폴더의 파일에는 잃을 값 자체가 없음)과, 머신의 등록을 재정의하는 사용자 COM 클래스 및 명령을 나열합니다.

모든 parse-registry 명령과 마찬가지로, -C를 사용하더라도 읽는 파일 중 하나를 -o로 지정하면 거부합니다. 여기에는 하이브, 그 트랜잭션 로그, 그리고 시스템의 SYSTEM 및 SOFTWARE 하이브가 경로, 심볼릭 링크 또는 하드 링크로 지정된 경우가 포함됩니다. 판단할 수 없는 경우에는 쓰지 않습니다.

출력 필드

필드 해석
Host, SourcePath, HiveType 호스트 컨텍스트, 원본 하이브 및 그 유형입니다.
User, UserSID 사용자 하이브의 경우 프로필 폴더와 SID입니다. SID는 UsrClass.dat의 루트 키 이름에서, 그렇지 않으면 시스템의 ProfileList에서 얻습니다.
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 기법(T1547.001, T1546.012, …)입니다.
KeyPath, ValueName 하이브 루트 아래의 키(기록된 그대로의 이름)와 값(비어 있으면 기본값)입니다.
Data 값의 텍스트 또는 목록의 한 항목입니다. 읽을 수 없거나 StartupApproved만 해당 항목을 지정하는 경우 비어 있습니다.
ImagePath, Args 구분할 수 있는 경우 프로그램 또는 DLL과 인수입니다(위 참조).
Enabled, DisabledAtUTC StartupApproved, LoadAppInit_DLLs, GlobalFlag(ReportingMode 포함), UseFilter, IsInstalled, 시간 공급자의 Enabled 또는 ScreenSaveActive가 나타내는 상태입니다. 아무것도 나타내지 않으면 비어 있습니다.
Details 추가 정보입니다. 보류 중인 이름 변경이 수행하는 작업, COM 클래스 이름, ReportingMode, FilterFullPath, Active Setup의 ShellComponent, …
OverridesMachineRegistration 사용자의 COM 클래스 또는 명령의 경우, 머신이 같은 것을 등록하고 있는지 여부입니다. 시스템의 SOFTWARE 하이브가 없으면 비어 있습니다.
WOW64 Wow6432Node 아래에 있음, 즉 32비트 프로그램용입니다.
KeyLastWrittenUTC 키의 마지막 쓰기 시간입니다.
DataRaw 값이 텍스트가 아니거나 유효한 UTF-16이 아닌 경우 값의 바이트(16진수)입니다.
TransactionLogStatus, LogsApplied 레지스트리 복구 컨텍스트입니다.
Problems 잘못된 값 유형, 읽을 수 없는 데이터, 크기가 잘못된 StartupApproved 항목입니다.

조사 전략

  1. 요약부터 시작하십시오.
  2. 머신의 등록을 재정의하는 COM 클래스와 명령
  3. Run 값이 없는 StartupApproved 항목
  4. 항목이 거의 없는 메커니즘(ifeo_debugger, silent_process_exit, appinit_dlls, appcert_dlls, uac_bypass_command, file_association, logon_script, dotnet_profiler)
  5. LSA 패키지, BootExecute, KnownDLLs, 인쇄 모니터 및 netsh 도우미를 같은 Windows 버전의 깨끗한 빌드와 비교하십시오.
  6. ImagePath를 파일 시스템($MFT, 해시 및 서명)과 대조하여 확인하고, 사용자 프로필, ProgramData 및 Temp 경로를 점검하십시오.
  7. KeyLastWrittenUTC를 Security 및 Sysmon 레지스트리 이벤트, 프로세스 생성, Prefetch 및 Amcache와 상관 분석하십시오.
  8. parse-registry read --recover-deleted를 사용하여 이 키들에서 제거된 자동 실행 항목을 찾으십시오.

추가 정보