Windows 레지스트리 아티팩트 분석은(는) 무엇을 하나요?
사용 시기
- 침해 사고 중 Windows 시스템에서 사용자 활동을 조사할 때
- 악성코드가 사용하는 자동 실행/지속성 메커니즘을 식별할 때
- 설치된 소프트웨어, USB 장치, 네트워크 연결을 추적할 때
- 내부 위협 조사에서 사용자 행동을 재구성할 때
- 레지스트리 타임스탬프를 다른 포렌식 아티팩트와 상관 분석할 때
사전 조건
- 포렌식 이미지 또는 추출된 레지스트리 하이브 파일
- RegRipper, Registry Explorer (Eric Zimmerman), 또는 python-registry
- 레지스트리 하이브 위치에 접근 가능 (SAM, SYSTEM, SOFTWARE, NTUSER.DAT, UsrClass.dat)
- Windows 레지스트리 구조 이해 (하이브, 키, 값)
- SIFT 워크스테이션 또는 포렌식 분석 환경
워크플로
1단계: 포렌식 이미지에서 레지스트리 하이브 추출하기
# 포렌식 이미지를 읽기 전용으로 마운트
mkdir /mnt/evidence
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence
# 시스템 레지스트리 하이브 복사
cp /mnt/evidence/Windows/System32/config/SAM /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/SYSTEM /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/SOFTWARE /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/SECURITY /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/DEFAULT /cases/case-2024-001/registry/
# 사용자별 하이브 복사
cp /mnt/evidence/Users/*/NTUSER.DAT /cases/case-2024-001/registry/
cp /mnt/evidence/Users/*/AppData/Local/Microsoft/Windows/UsrClass.dat /cases/case-2024-001/registry/
# 트랜잭션 로그 복사 (더티 하이브 복구용)
cp /mnt/evidence/Windows/System32/config/*.LOG* /cases/case-2024-001/registry/logs/
# 추출된 모든 하이브 해시 생성
sha256sum /cases/case-2024-001/registry/* > /cases/case-2024-001/registry/hive_hashes.txt
2단계: RegRipper로 자동 아티팩트 추출 분석
# RegRipper 설치
git clone https://github.com/keydet89/RegRipper3.0.git /opt/regripper
# NTUSER.DAT (사용자 프로필)에 대해 RegRipper 실행
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-f ntuser > /cases/case-2024-001/analysis/ntuser_report.txt
# SYSTEM 하이브에 대해 실행
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-f system > /cases/case-2024-001/analysis/system_report.txt
# SOFTWARE 하이브에 대해 실행
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SOFTWARE \
-f software > /cases/case-2024-001/analysis/software_report.txt
# SAM 하이브 (사용자 계정)에 대해 실행
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SAM \
-f sam > /cases/case-2024-001/analysis/sam_report.txt
# 특정 플러그인 실행
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p userassist > /cases/case-2024-001/analysis/userassist.txt
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p usbstor > /cases/case-2024-001/analysis/usbstor.txt
3단계: 지속성 및 자동 실행 항목 추출
# python-registry를 사용한 대상 추출
pip install python-registry
python3 << 'PYEOF'
from Registry import Registry
# SOFTWARE 하이브 열기
reg = Registry.Registry("/cases/case-2024-001/registry/SOFTWARE")
# Run 키 확인 (자동 시작)
autorun_paths = [
"Microsoft\\Windows\\CurrentVersion\\Run",
"Microsoft\\Windows\\CurrentVersion\\RunOnce",
"Microsoft\\Windows\\CurrentVersion\\RunServices",
"Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run",
"Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run"
]
for path in autorun_paths:
try:
key = reg.open(path)
print(f"\n=== {path} (마지막 수정 시간: {key.timestamp()}) ===")
for value in key.values():
print(f" {value.name()}: {value.value()}")
except Registry.RegistryKeyNotFoundException:
pass
# 설치된 서비스 확인
key = reg.open("Microsoft\\Windows NT\\CurrentVersion\\Svchost")
print(f"\n=== Svchost 그룹 ===")
for value in key.values():
print(f" {value.name()}: {value.value()}")
PYEOF
# 사용자별 자동 실행을 위해 NTUSER.DAT 확인
python3 << 'PYEOF'
from Registry import Registry
reg = Registry.Registry("/cases/case-2024-001/registry/NTUSER.DAT")
user_autorun = [
"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce",
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run"
]
for path in user_autorun:
try:
key = reg.open(path)
print(f"\n=== {path} (마지막 수정 시간: {key.timestamp()}) ===")
for value in key.values():
print(f" {value.name()}: {value.value()}")
except Registry.RegistryKeyNotFoundException:
pass
PYEOF
4단계: 사용자 활동 아티팩트 분석
# UserAssist 데이터 추출 (ROT13 인코딩된 프로그램 실행 기록)
python3 << 'PYEOF'
from Registry import Registry
import codecs, struct, datetime
reg = Registry.Registry("/cases/case-2024-001/registry/NTUSER.DAT")
ua_path = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist"
key = reg.open(ua_path)
for guid_key in key.subkeys():
count_key = guid_key.subkey("Count")
print(f"\n=== {guid_key.name()} ===")
for value in count_key.values():
decoded_name = codecs.decode(value.name(), 'rot_13')
data = value.value()
if len(data) >= 16:
run_count = struct.unpack('<I', data[4:8])[0]
focus_count = struct.unpack('<I', data[8:12])[0]
timestamp = struct.unpack('<Q', data[60:68])[0] if len(data) >= 68 else 0
if timestamp > 0:
ts = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds=timestamp//10)
print(f" {decoded_name}: 실행={run_count}, 포커스={focus_count}, 마지막={ts}")
else:
print(f" {decoded_name}: 실행={run_count}, 포커스={focus_count}")
PYEOF
# 최근 문서 추출 (MRU 목록)
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p recentdocs > /cases/case-2024-001/analysis/recentdocs.txt
# 입력된 URL 추출 (브라우저)
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p typedurls > /cases/case-2024-001/analysis/typedurls.txt
# Explorer에서 입력된 경로 추출
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p typedpaths > /cases/case-2024-001/analysis/typedpaths.txt
5단계: 시스템 및 네트워크 정보 추출
# SYSTEM 하이브에서 컴퓨터 이름 및 OS 버전
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p compname > /cases/case-2024-001/analysis/system_info.txt
# 네트워크 인터페이스 및 구성
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p nic2 >> /cases/case-2024-001/analysis/system_info.txt
# 무선 네트워크 이력
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SOFTWARE \
-p networklist > /cases/case-2024-001/analysis/network_history.txt
# 시간대 구성
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p timezone > /cases/case-2024-001/analysis/timezone.txt
# 종료 시간
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p shutdown > /cases/case-2024-001/analysis/shutdown.txt
# 제거 키에서 설치된 소프트웨어
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SOFTWARE \
-p uninstall > /cases/case-2024-001/analysis/installed_software.txt
주요 개념
| 개념 | 설명 |
|---|---|
| 레지스트리 하이브 | 레지스트리의 한 섹션을 저장하는 바이너리 파일 (SAM, SYSTEM, SOFTWARE, NTUSER.DAT) |
| MRU (최근 사용 목록) | 최근에 접근한 파일, 명령어, 검색어를 추적하는 목록 |
| UserAssist | 타임스탬프와 함께 프로그램 실행을 추적하는 ROT13 인코딩 레지스트리 항목 |
| ShimCache | 실행된 프로그램을 기록하는 애플리케이션 호환성 캐시 |
| AmCache | 실행 파일의 SHA-1 해시를 포함한 상세 실행 이력 |
| BAM/DAM | Windows 10+에서 프로그램 실행을 추적하는 백그라운드/데스크톱 활동 관리자 |
| 마지막 쓰기 시간 | 레지스트리 키가 마지막으로 수정된 시간을 나타내는 타임스탬프 |
| 트랜잭션 로그 | 비정상 종료 후 레지스트리 상태 복구를 가능하게 하는 저널 파일 |
도구 및 시스템
| 도구 | 목적 |
|---|---|
| RegRipper | 플러그인 아키텍처를 통한 자동화된 레지스트리 아티팩트 추출 |
| Registry Explorer | Eric Zimmerman의 대화형 레지스트리 분석 GUI 도구 |
| python-registry | 프로그래밍 방식 레지스트리 하이브 파싱을 위한 Python 라이브러리 |
| RECmd | Eric Zimmerman의 명령줄 레지스트리 분석 도구 |
| yarp | 파이썬 기반 분석을 위한 또 다른 레지스트리 파서 |
| AppCompatCacheParser | 전용 ShimCache/AppCompatCache 파서 |
| AmcacheParser | 전용 AmCache.hve 분석 도구 |
| ShellBags Explorer | ShellBag 아티팩트 분석을 위한 특수 도구 |
일반적인 시나리오
시나리오 1: 악성코드 지속성 조사 SOFTWARE 및 NTUSER.DAT 하이브를 추출하고, 모든 Run/RunOnce 키에서 승인되지 않은 항목을 확인하며, 서비스에서 의심스러운 추가를 검사하고, 예약된 작업 레지스트리 키를 확인하며, 자동 실행 타임스탬프를 악성코드 실행 타임라인과 상관 분석합니다.
시나리오 2: 사용자 활동 재구성 UserAssist를 분석하여 프로그램 실행 이력을 확인하고, RecentDocs에서 접근된 파일을 조사하며, TypedPaths에서 Explorer 탐색을 확인하고, ShellBags에서 폴더 접근 패턴을 추출하여 사고 기간 동안 사용자 활동의 타임라인을 구축합니다.
시나리오 3: 승인되지 않은 소프트웨어 탐지 Uninstall 키를 파싱하여 모든 설치된 애플리케이션을 확인하고, 승인된 소프트웨어 기준선과 비교하며, BAM/DAM에서 승인 목록에 없는 최근 실행 프로그램을 확인하고, 제거 후에도 AppCompatCache에서 실행 증거를 조사합니다.
시나리오 4: USB 데이터 유출 조사 SYSTEM 하이브에서 USBSTOR 항목을 추출하여 연결된 장치를 확인하고, 장치 일련번호를 MountedDevices와 상관 분석하며, NTUSER.DAT의 MountPoints2에서 이동식 미디어에 대한 사용자 접근을 확인하고, SetupAPI 로그에서 첫 연결 타임스탬프를 조사합니다.
출력 형식
레지스트리 분석 요약:
시스템: DESKTOP-ABC123 (Windows 10 Pro Build 19041)
시간대: 동부 표준시 (UTC-5)
마지막 종료: 2024-01-18 23:45:12 UTC
자동 실행 항목:
HKLM Run: 5개 항목 (1개 의심: "updater.exe" -> C:\ProgramData\svc\updater.exe)
HKCU Run: 3개 항목 (모두 정상)
서비스: 142개 항목 (2개 알 수 없음: "WinDefSvc", "SysMonAgent")
사용자 활동 (NTUSER.DAT):
UserAssist 프로그램: 234개 항목
최근 문서: 89개 항목
입력된 URL: 45개 항목
입력된 경로: 12개 항목
연결된 USB 장치:
- Kingston DataTraveler (일련번호: 0019E06B4521) - 처음: 2024-01-10, 마지막: 2024-01-18
- WD My Passport (일련번호: 575834314131) - 처음: 2024-01-15, 마지막: 2024-01-15
설치된 소프트웨어: 127개 애플리케이션
의심스러운 발견: 검토 대상으로 3개 항목 플래그 지정