증거 패키지
세션의 최종 산출물은 복사하고 검토할 수 있는 폴더다. 오리엔테이션(T+0) 단계에서 템플릿을 복사해 폴더를 만들고, 수집물을 번호가 매겨진 디렉터리에 넣는다. 판정을 받는 쪽이 나중에 이 폴더만으로 검사를 재현할 수 있어야 한다.
폴더 지도
| 경로 | 내용 | 왜 필요한가 |
|---|---|---|
00-meta.txt | 사건 ID, 동의, 빌드, 시계, 진술, 호출·접속 시각, UTC 시작·종료, 녹화 해시, 실행한 도구, 보존 기간, 세션 종료 기록 | 모든 타임스탬프 해석의 기준점. 비어 있으면 뒤의 증거가 시각 없이 뜬다 |
녹화 원본 (예: recording.mp4) | 세션 전체 녹화 | 세션 중 관찰(삭제·종료 시도 포함)의 근거. 편집하지 않는다 |
hashes-sha256.txt | 패키지 전체 파일의 SHA-256 목록 | 패키지가 수집 뒤 바뀌지 않았음을 확인하는 기준 |
01-scanner/ | 스캐너 export 원본 | 히트가 단서로 쓰였는지 검증하는 자료. FP로 기각한 히트도 여기 남는다 |
02-prefetch/ | T+0 Prefetch 폴더 목록, Prefetch 정렬 캡처, 파서 export | 실행 후보 축의 재현 포인트. T+0 목록은 검사 도구가 .pf를 만들기 전의 상태다 |
03-usn/ | USN 필터 export, 이중 도구 확인 | 파일 생성·삭제 축. "비어 있음" 주장의 근거 |
04-registry/ | BAM 키 export·파서 CSV, UserAssist, Shim/Amcache, IFEO·RunMRU 열거 | SID별 실행 기록 축 |
05-process/ | T+0 스냅샷(프로세스 트리·서비스 시작 시각), 프로세스 트리·모듈 목록 스크린샷 | 라이브 축. 재부팅 후 재현 불가라 당시 캡처가 전부다 |
06-af/ | 안티포렌식 패스 메모·샷, 1102/104 필터, 로그 무결성 스냅(채널·.evtx 경로·ACL·4616), Defender 설정·예외 변경(5001·5007) | 공백 해석의 근거. "왜 비어 있는가"와 "로그가 손대지 않았는가"를 여기서 답한다 |
07-verdict.md | 라벨 + 축 표 + 서사 (필수) | 패키지의 결론부 |
08-escalation/ | Ring0·DMA 게이트 산출 | Ring0·DMA 증거는 전부 여기로. 06-은 AF 슬롯이라 Ring0용이 아니다 |
09-platform-env/ | HVCI·IOMMU·플랫폼 요구 캡처 | 환경 가중치의 근거 |
10-recent-lnk/ | Recent 정렬 샷, LNK 파서 출력, 점프리스트 | R3-REC 축 |
11-signature/ | 서명 속성·sigcheck 출력, 경로·해시, Defender 탐지 이벤트(1116·1117) | R3-SIG 축 |
12-memory/ | 덤프 해시·도구 버전, 플러그인 출력 | R3-MEM 축(수행 시) |
13-macro/ | 매크로 SW 바인딩 샷, 온보드 테스트 결과 | R3-MAC 축 |
폴더 번호는 타임라인 순서가 아니다. 실제 검사 순서는 Recent(T+22) → 서명(T+25) → 메모리(T+30) → 매크로(T+36)이고, 순서의 기준은 07-verdict.md의 축 표다.
축을 수행했다면 07-verdict.md 축 표의 Evidence path 칸을 반드시 채운다. 스킵했다면 스킵 사유를 적는다. 칸을 비워 두면 재현이 끊긴다.
이벤트 로그 export(.evtx)는 그 로그를 읽은 축의 폴더에 둔다. 로그 삭제·무결성 관련 로그와 Defender 설정·예외 변경(5001·5007)은 06-af/, Defender 탐지 이벤트(1116·1117)는 11-signature/에 둔다. 녹화 원본과 해시 목록은 패키지 루트에 둔다.
메타 파일 (00-meta.txt)
아래 템플릿을 복사해 그대로 채운다. 하나라도 비면 타임라인 해석이 흔들린다.
case_id: CASE-YYYYMMDD-###
analyst:
reviewer:
call_time:
connect_time:
start_utc:
end_utc:
start_local:
end_local:
timezone:
windows_build:
hostname:
target_check: |
vm_guest: yes/no (msinfo32 System Model: )
shared_pc: yes/no (PC방·공용 PC)
game:
anti_cheat:
report_summary:
consent: yes/no
recording: |
file:
sha256:
tools_run: |
# tool | version | sha256 | axis | run_time_utc
-
retention:
session_close: |
remote_session_closed: yes/no
unattended_access_removed: yes/no/n.a.
tools_removed: yes/no (drivers included)
notes:시각 칸은 모두 UTC로 적고, 현지 시각은 start_local·end_local과 timezone으로만 남긴다.
call_time·connect_time: 대상자를 호출한 시각과 원격 접속을 시작한 시각. 두 시각 사이는 정리 시도가 들어갈 수 있는 구간이라 안티포렌식 패스에서 먼저 본다.target_check: msinfo32 시스템 모델로 본 VM 게스트 여부와 PC방·공용 PC 여부.report_summary: 제보 시간대(데모 시각·행위·닉네임)를 고정하는 칸이다.recording: 녹화 파일 이름과 SHA-256.tools_run: 실행한 검사 도구마다 이름·버전·SHA-256·맡은 축·실행 시각을 한 줄씩 적는다. 도구가 남긴 Prefetch·USN·BAM 기록을 대상자의 기록과 가르는 기준이다. "두 번째 도구로 확인했다"는 주장도 여기 적힌 버전과 함께일 때만 재현된다.retention: 조직 정책이 정한 보존 기간과 파기 예정일.session_close: 원격 세션 종료, 무인 접근 해제, 검사 도구·드라이버 정리 여부.
판정 파일 (07-verdict.md)
템플릿 구조는 다음과 같다.
- Labels: Primary 라벨 하나(Confirmed | Suspicious | Insufficient | Clean(조건부)). 환경 노트(IOMMU/HVCI/VBS/플랫폼)는 치트 라벨과 분리해서 적는다. Next step 칸에는 Suspicious면 권고(추가 검사·재소환·에스컬레이션)와 이유를, Insufficient면 재검사 조건을 적는다.
- Axes completed: 축별 상태 표. 행마다 결과와 Evidence path(어느 폴더에 근거가 있는지)가 들어간다. Ring3 축 10개(SCAN·PF·USN·BAM·REC·SIG·PROC·MEM·AF·MAC)에 더해 Platform env 행(
09-platform-env/)과 R0/DMA gate 행(08-escalation/)이 있다. 게이트에 들어가지 않았으면 R0/DMA gate 행에n/a와 사유를 적는다. 수행하지 않은 축은skipped와 이유. - Narrative: 무엇을 검사했고 무엇이 제보 시간대와 정렬됐으며 어떤 FP를 기각했고 왜 에스컬레이션했는지 3~8문장. 호출과 접속 사이 구간의 활동이 판정에 영향을 줬으면 두 시각을 적는다.
- Rubric application: 독립 축 수(Confirmed면 2 이상), 어떤 축인지, 파일 정체 근거, 커뮤니티 출처만으로 판정하지 않았는지, Ring0/DMA 단독 Confirmed를 피했는지.
- Session facts: 거부·중단·세션 중 조작의 관찰 사실과 시각, 녹화의 해당 구간. 라벨과 따로 적는다.
- Sign-off: 분석자·검토자·날짜(UTC). Confirmed는 검토자가 증거 패키지만으로 같은 결론에 이르는지 확인하고 서명한다. 검토자가 없으면 Reviewer 칸에
none을 적는다.
템플릿 전문은 다음과 같다.
# Verdict: CASE-ID
## Labels
- **Primary:** Confirmed | Suspicious | Insufficient | Clean(조건부)
- **Environment notes:** (IOMMU/HVCI/VBS/platform; not a cheat label)
- **Next step:** (Suspicious: 추가 검사 / 재소환 / 에스컬레이션 + 이유. Insufficient: 재검사 조건)
## Axes completed
| Axis | Result | Evidence path |
|---|---|---|
| SCAN | | 01-scanner/ |
| PF | | 02-prefetch/ |
| USN | | 03-usn/ |
| BAM | | 04-registry/ |
| REC | | 10-recent-lnk/ |
| SIG | | 11-signature/ |
| PROC | | 05-process/ |
| MEM | skipped/done | 12-memory/ |
| AF | | 06-af/ |
| MAC | | 13-macro/ |
| Platform env | | 09-platform-env/ |
| R0/DMA gate | n/a / done | 08-escalation/ |
## Narrative
(3–8 sentences: what was checked, what aligned to report window, FP dismissed, escalation decision.
If activity between call_time and connect_time matters, state both times.)
## Rubric application
> Confirmed requires >=2 independent axes.
- Independent axes count (>=2 required):
- Which axes:
- File identity basis (hash/signature/rule re-run, or download origin/known name/memory strings):
- Community-only avoided?: yes/no
- Ring0/DMA single-axis Confirmed avoided?: yes/no
## Session facts (separate from label)
- Refusal / interruption / in-session manipulation: none / (time, what was observed, recording offset)
## Sign-off
- Analyst:
- Reviewer: (none → write "none")
- 검토자 확인: 증거 패키지만으로 같은 결론에 이르렀다 yes/no
- Date (UTC):라벨 규칙은 판정 루브릭에 있다.
우회 시도 흔적과 로그 무결성 상태
부정 결과는 "로그가 비어 있었다"가 아니라 "로그 무결성 상태가 이랬다"로 남긴다. 아래 항목은 조회한 결과 자체가 증거다. 이상이 없어도 확인했다는 사실과 쓴 도구를 적는다.
- 채널·로그 상태 스냅: 검사에 쓴 이벤트 채널의 enabled 상태와 .evtx 파일 경로 →
06-af/ - 파일 ACL: ConsoleHost_history·.evtx·Prefetch 경로의 명시적 deny 엔트리 →
06-af/ - 서비스 상태: TabletInputService·SysMain·EventLog의 시작 유형과 실행 상태, 비활성화 시각 →
06-af/ - IFEO 키 열거: Image File Execution Options 아래 Debugger 값이 걸린 exe 목록 →
04-registry/ - RunMRU: 값이 비었거나 새 항목만 있는 패턴 →
04-registry/ - PowerShell 프로필:
$PROFILE의 PSReadLine 히스토리 저장 설정(HistorySavePath·HistorySaveStyle)과 히스토리 파일의 부재·공백 →06-af/ - Everything 제외 목록: Everything.ini의 exclude 설정과 제외 전에 인덱싱된 데이터베이스 잔재 →
06-af/ - 볼륨 우회 흔적:
.vhd·.vhdx파일 존재, 저널이 없는 FAT32 볼륨의 마운트 기록(MountedDevices·SetupAPI) →06-af/또는03-usn/ - Defender 설정: 실시간 보호 끔(5001)과 설정·예외 변경(5007) 이벤트, 그 시각 →
06-af/
이 중 어느 항목에서든 이상이 나오면 07-verdict.md 축 표의 Evidence path에 담은 폴더를 적는다. "비어 있음"의 사유를 이 목록으로 설명할 수 있으면 그것이 곧 안티포렌식 해석의 근거다.
세션 종료 전 필수
00-meta.txt: 빈 템플릿으로 두지 않는다. 호출·접속 시각, UTC 시작·종료, 녹화 해시, 실행 도구 기록, 보존 기간, 세션 종료 기록이 채워져 있다.07-verdict.md: 라벨 하나 + 축 표 + 3~8문장 서사 + Sign-off. Confirmed면 검토자가 서명하고, 검토자가 없으면none을 적는다.- 수행한 축에 대응하는 폴더에 재현 포인터(파일명·경로·샷). 축마다 대표 스크린샷이나 export가 최소 하나는 있어야 한다.
- 스킵한 축은 verdict 표에
skipped와 그 이유를 적는다. - 로그 무결성 상태(채널·.evtx 경로·ACL·4616)의 확인 결과가 패키지에 있다.
- 녹화 원본이 패키지 루트에 있다.
- 해시 목록(
hashes-sha256.txt)을 마지막에 만든다. 패키지의 모든 파일의 SHA-256 목록이다. 패키지 루트에서 아래 명령으로 뽑아 패키지 밖에 저장한 뒤 루트로 옮긴다. 목록 파일 자신이 목록에 섞이지 않게 하려는 것이다.
Get-ChildItem -Recurse -File | Get-FileHash -Algorithm SHA256 | Export-Csv ..\hashes-sha256.txt -NoTypeInformation부정 결과도 증거다. "없음"을 주장한 항목은 검사 시각, 쓴 도구와 버전을 남긴다. 나중에 다른 도구로 같은 항목이 나오면 누가 무엇을 놓쳤는지 구분할 수 있다.
이 일곱 가지가 없으면 산출물은 미완이고, Clean(조건부) 주장의 근거도 약해진다.
보존·파기
보존 기간은 조직 정책이 정한다. 그 기간을 00-meta.txt의 retention에 적고, 동의를 받을 때 알린다. 기간이 지나 파기하면 무엇을 언제 누가 지웠는지 기록을 남긴다. 패키지를 지우면 그 안의 기록도 사라지므로 파기 기록은 패키지 밖의 사건 목록에 둔다. 관련 법 조항 요약은 개인정보·법적 고려에 있다.
주의
- 개인정보나 계정 비밀번호를 패키지에 넣지 않는다.
- 치트 바이너리 전체를 불필요하게 보관하지 않는다. 정책과 법무 범위를 따른다.
- "나중에 정리"하겠다며 verdict를 비운 채 세션을 끝내지 않는다.
- 녹화 원본을 편집하거나 다시 인코딩하지 않는다. 해시가 바뀐다.
- 슬롯 번호를 타임라인 순서로 읽지 않는다.
06-은 AF이고 Ring0/DMA는08-escalation이다.
Sources
- MS 이벤트 1102 — 로그 삭제 감사 이벤트
- MS Learn: Microsoft Defender Antivirus event IDs and error codes (1116·1117·5001·5007)
- MS Learn: Get-FileHash (기본 알고리즘 SHA256)
- Broadcom KB 438099: VMware tools installation failed (VM 게스트의 msinfo32 시스템 모델 값)
