필수 사용자 프로필 지속성
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
위협 행위자는 필수 사용자 프로필을 악용하여 Windows 엔드포인트에서 지속성을 구축할 수 있습니다. 사용자가 로그온할 때, 표준 레지스트리 API에 의존하지 않고 프로필 디렉토리 내의 NTUSER.MAN 파일 내에 악의적인 레지스트리 변경이 레지스트리 하이브에 로드되어 명령 또는 바이너리가 사용자 로그인 시 은밀하게 실행되게 할 수 있습니다.
조사
이 보고서는 Windows 레지스트리 하이브를 조작하여 필수 사용자 프로필을 생성하는 개념 증명 기술을 설명합니다. Swarmer 및 HiveSwarming과 같은 도구가 내보낸 레지스트리 데이터를 .MAN 형식으로 변환하여 공격자가 레지스트리 API 활동에 초점을 맞춘 EDR 모니터링을 우회할 수 있는 방법을 보여줍니다.
완화
조직은 사용자 프로필 디렉토리 내에서 NTUSER.MAN 파일의 생성 또는 수정을 모니터링해야 하며, 특히 필수 프로필이 일반적으로 사용되지 않는 경우를 주의해야 합니다. 강력한 파일 시스템 텔레메트리와 Windows 사용자 프로필 서비스 이벤트의 상관관계를 통해 이 지속성 기술을 탐지할 수 있습니다.
대응
예상치 못한 NTUSER.MAN 파일이 생성되거나 의심스러운 Offreg.dll 로딩이 관찰되면 조사자는 무단으로 레지스트리가 변경된 사용자 프로필을 검사해야 합니다. 파일 생성에 대한 Sysmon 이벤트 ID 11을 Windows 사용자 프로필 서비스 이벤트 ID 5 및 67과 연관시켜 필수 프로필이 로드되었는지 확인합니다.
공격 흐름
탐지
가능한 지속성 지점 [ASEPs – Software/NTUSER Hive] (registry_event 경유)
Swarmer 유틸리티 실행 시도 가능성 (cmdline 이용)
Swarmer 유틸리티 실행 시도 가능성 (powershell 이용)
사용자 프로필 디렉토리 내 NTUSER.MAN 파일 생성 [Windows 파일 이벤트]
시뮬레이션 실행
전제 조건: 텔레메트리 및 베이스라인 사전 점검이 완료되어야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적수 기술 실행(TTP)의 정확한 내용을 상세히 설명합니다. 명령과 설명은 반드시 식별된 TTP를 직접 반영하고 탐지 논리에 의해 예상되는 정확한 텔레메트리를 생성해야 합니다. 추상적이거나 관련이 없는 예는 오진을 유발할 수 있습니다.
-
공격 서사 및 명령: 적수는 사용자 로그온 동안 지속성을 유지하려고 합니다. 감시될 수 있는 현재 레지스트리를 수정하는 대신, 공격자는 사용자 프로필 디렉토리에
NTUSER.MAN파일을 떨어뜨려 “필수 프로필”을 생성합니다. 다음 로그인 시 Windows는 이 파일을 사용하여 사용자 레지스트리 하이브를 구성합니다. 이 방법은 “악성” 레지스트리 구성이 기술적으로 표준 레지스트리 수정 이벤트가 아닌 프로필 초기화 과정의 일부이기 때문에 은밀합니다. 이 시뮬레이션은 탐지 논리를 트리거하기 위해 사용자 프로필 하위 폴더에 더미NTUSER.MAN파일을 생성합니다.끝이: 'NTUSER.MAN'and포함: 'Users'논리입니다. -
회귀 테스트 스크립트:
# 지속성 테스트를 위한 NTUSER.MAN 생성 시뮬레이션 $targetDir = Join-Path $env:USERPROFILE "AppDataLocalTempSimulatedProfile" # 디렉토리가 존재하지 않으면 생성 if (!(Test-Path $targetDir)) { New-Item -Path $targetDir -ItemType Directory -Force } # 탐지 규칙을 트리거하기 위해 NTUSER.MAN 파일 생성 $filePath = Join-Path $targetDir "NTUSER.MAN" Set-Content -Path $filePath -Value "Simulated Mandatory Profile Content" Write-Host "[+] 시뮬레이션 완료. 파일이 생성된 위치: $filePath" -ForegroundColor Green -
정리 명령:
# 시뮬레이션 아티팩트 정리 $targetDir = Join-Path $env:USERPROFILE "AppDataLocalTempSimulatedProfile" if (Test-Path $targetDir) { Remove-Item -Path $targetDir -Recurse -Force Write-Host "[+] 정리 성공. 아티팩트 제거." -ForegroundColor Yellow } else { Write-Host "[-] 정리 실패: 디렉토리를 찾을 수 없음." -ForegroundColor Red }