Anti-forensics Pass — 안티포렌식 패스
Ring3 아티팩트 카드들을 돌고 나서 아티팩트 공백, 이벤트 삭제, 클리너 잔여물을 확인하는 패스다. "너무 깨끗한" 시스템은 깨끗한 것이 아니라 지운 것일 수 있다.
왜 중요한가
위협 모델은 실행·은닉·와이프로 이어지는 치트 라이프사이클을 다룬다. 이 패스는 그 와이프 단계의 흔적을 읽는다.
흔적이 없다는 것 자체가 신호다. 긴 게임 세션 뒤에 Prefetch가 비어 있고 BAM 기록이 없고 USN에 공백이 있으면, "아무것도 안 했다"보다 "무언가 지웠다"가 설명력이 높다. Windows는 사용하면 사용한 만큼 기록을 남기는 시스템이므로, 활동량과 기록량의 불일치는 관찰할 수 있는 이상이다.
다만 부재가 곧 와이프는 아니다. 새 PC, 서비스 비활성화, 기업 로그 포워딩 같은 정당한 사유가 있을 수 있다. 이 패스에서 할 일은 부재의 사유를 식별하는 것이다. 부재를 판정 재료로 쓰려면 "왜 없는가"에 정상 답이 없어야 한다.
무엇인가
| 항목 | 설명 |
|---|---|
| 보는 것 | PF/USN/BAM/Recent의 공백, 이벤트 로그 삭제 기록, 클리너 잔여물, 서비스·레지스트리·ACL 변경, Defender 설정·예외·보호 기록, 볼륨 섀도 복사본 |
| 이벤트 | Security 1102(Security 로그 삭제), System 104(로그 삭제), Application 3079(USN 저널 삭제 지표로 알려짐), Security 4616(시스템 시각 변경), System 7036(서비스 상태 변경), System 7045(서비스 설치), Security 4657(레지스트리 값 변경, 감사 설정 시). Defender Operational 1116·1117(위협 탐지·조치: 위협 이름·경로), 1013(보호 기록 삭제), 5001(실시간 보호 꺼짐), 5007(구성 변경, 이전 값·새 값) |
| MITRE | T1070 Indicator Removal · T1070.001 · T1070.004 · T1070.006 Timestomp · T1562.002 Disable Windows Event Logging · T1112 Modify Registry · T1685 Disable or Modify Tools · T1490 Inhibit System Recovery |
| 도구 | Event Viewer, wevtutil, EvtxECmd, fsutil usn queryjournal, services.msc, Get-MpPreference, vssadmin list shadows, 기존 Ring3 타임라인 |
| 보조 | Sysmon 1/7/8/10(배포 시) |
이벤트 ID를 볼 때 두 가지를 기억한다. 첫째, 1102는 "Security 로그가 지워졌다"를 남기는 이벤트고, 누가 언제 지웠는지 주체와 시각이 들어 있다. 둘째, 3079는 DFIR 문헌에서 USN 저널 삭제 지표로 널리 쓰이지만 MS 공식 카탈로그의 단일 근거로는 단정하지 않는다. 저널 메타데이터(fsutil usn queryjournal)와 fsutil.exe의 실행 기록으로 교차 확인한다.
Defender 이벤트는 이벤트 뷰어의 응용 프로그램 및 서비스 로그 > Microsoft > Windows > Windows Defender > Operational에 있다. 5007은 바뀐 설정의 이전 값과 새 값을 담고, 예외를 추가하면 새 값에 \Microsoft\Windows Defender\Exclusions 경로가 들어간다. 예외 자체는 HKLM\SOFTWARE\Microsoft\Windows Defender\Exclusions의 Paths·Extensions·Processes 아래에, 그룹 정책으로 넣은 예외는 HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions 아래에 남는다. 관리자 PowerShell의 Get-MpPreference는 ExclusionPath·ExclusionExtension·ExclusionProcess로 두 곳을 합쳐 보여 준다. 다만 HideExclusionsFromLocalAdmins 정책이 켜져 있으면 Get-MpPreference와 레지스트리 편집기에서 예외가 보이지 않는다.
SS에서 어떻게 쓰나
- T+33에 이전 카드에서 만든 타임라인을 전체 조감한다.
- 긴 세션에 비해 아티팩트가 너무 적은지 판단한다. 기대 밀도의 기준은 "이 PC가 이 시간 동안 만들었어야 할 기록"이다.
- Event Viewer에서 Security 1102·System 104를 필터링해 제보 시간대 근처를 확인한다. 지운 주체(계정)도 기록한다.
- 클리너 exe(CCleaner, BleachBit, 배치 스크립트) 이름이 PF·BAM·USN에 있는지 확인한다.
- 서비스 상태를 본다. SysMain·EventLog·PcaSvc·DPS가 꺼져 있거나, 실행 중인데 기록이 끊긴 조합을 찾는다.
- 타임존·시계 조작 힌트를 확인한다(USN 몰림, 이벤트 4616, 이벤트 순서 역전).
- Defender Operational 로그에서 1116·1117·1013·5001·5007을 필터링하고, 예외 목록과 실시간 보호 상태를 본다. 검사자가 도구를 돌리려고 실시간 보호를 끄거나 예외를 넣어도 5001·5007이 남으므로, 검사 시작 시각을 경계로 나눠 적는다.
vssadmin list shadows로 남아 있는 볼륨 섀도 복사본을 확인한다. 삭제가 의심되면 삭제 도구의 실행 흔적을 찾는다.- 결과를 "기대 vs 실재" 체크리스트로 정리한다.
로그 무결성 검사
개별 이벤트를 읽기 전에 로그 자체가 손대지 않은 상태인지를 먼저 본다. "로그가 있는가"보다 "로그를 건드렸는가"가 앞선다. 삭제 이벤트(1102·104)와 별개로, 아래 항목은 로그 채널 자체의 상태를 확인한다.
| 확인 항목 | 정상 | 이상 |
|---|---|---|
| 채널 활성 상태 | 검사에 쓰는 채널(PowerShell Operational·System 등)이 Enabled | 채널이 "사용 안 함". 비활성 상태 자체가 흔적이고, 비활성화 이후의 기록 공백과 함께 본다 |
.evtx 파일 경로 | 채널 등록정보의 로그 파일(.evtx, Windows 이벤트 로그 파일) 경로가 %SystemRoot%\System32\Winevt\Logs 기본값 | 비기본 경로. 경로 변경·실행·복원 시퀀스는 타임라인 공백과 함께 남는다 |
| ACL | 로그 파일·디렉터리가 기본 권한 | 쓰기·읽기 deny 엔트리. 정상 상태에 없는 권한이다 |
| 시간 순서 | 이벤트 순서와 타임스탬프가 일치 | 순서 역전, 미래·과거 혼재. Security 4616(시스템 시각 변경)과 함께 본다 |
| 연속성 | 제보 시간대를 포함해 기록이 이어진다 | 활동과 무관한 갑작스러운 공백, 공백 직전의 비활성화·경로 변경·재활성화 |
이 검사는 무결성 위반의 방향을 가린다. 위반이 보이면 어떤 기법이 쓰였는지는 아래 우회 기법 표에서 가리고, 산출물은 "로그가 온전한가"에 대한 판단 한 줄이다.
우회 기법과 남는 흔적
안티포렌식 기법은 "지우는 행위 자체가 기록을 남긴다"는 공통점이 있다. 검사자는 지워진 내용이 아니라 지우는 행위의 흔적을 본다.
| 기법 | 공격자가 하는 일 | 남는 흔적 |
|---|---|---|
| Security 로그 삭제 | wevtutil cl security 또는 이벤트 뷰어의 "로그 지우기"로 감사 기록을 통째로 지운다 | 지우는 행위 자체가 Security 1102를 남긴다. 삭제 시각·주체가 기록된다. 제보 시간대 직전의 1102가 핵심 리드(재검증 전 단서, 용어집). wevtutil.exe의 PF·BAM |
| 다른 채널 로그 삭제 | System·Application·PowerShell Operational 등 다른 채널을 같은 방식으로 정리한다 | Security 외 채널의 삭제는 System 로그에 104(Microsoft-Windows-Eventlog)로 남고, 이벤트에 지운 채널 이름이 들어 있다. wevtutil.exe의 PF·BAM |
| USN 저널 삭제 | fsutil usn deletejournal /D C:로 저널을 통째로 지워 파일 변경 기록을 없앤다 | 저널이 새로 시작돼 가장 오래된 레코드가 로그인·게임 시작 이후다. queryjournal의 저널 ID·시작 시각이 부팅 이후다. Application 3079는 저널 삭제 지표로 알려져 있다(메타데이터와 교차 확인). fsutil.exe의 PF·BAM |
| Prefetch 삭제·SysMain 정지 | .pf 일괄 삭제 또는 SysMain 서비스 비활성화 | USN에 *.pf DELETE가 짧은 창에 몰린다. 서비스 비활성은 System 7036(상태 변경)과 services.msc의 시작 유형이 증거다. 비활성 시각 이후 .pf 갱신이 끊긴다 |
| 레지스트리 아티팩트 정리 | BAM·UserAssist·MUICache 같은 실행 기록 키를 지우거나 값을 비운다 | 키의 LastWriteTime이 제보 시간대 직전. 감사 설정이 있으면 Security 4657. reg.exe·regedit.exe의 PF·BAM. 지워진 키가 다른 키의 타임스탬프와 불일치 |
| 서비스·스레드 정지 | 로깅 서비스를 끄거나, 서비스는 둔 채 특정 스레드만 Suspend해 기록만 멈춘다 | 서비스가 "실행 중"인데 해당 로그가 끊긴 불일치가 리드다. System Informer에서 sechost.dll·pcasvc.dll 같은 서비스 스레드가 Suspended |
| 서비스 재시작으로 메모리 문자열 비우기 | DPS·PcaSvc 같은 서비스나 explorer.exe를 재시작해 메모리에 쌓인 실행 경로 문자열을 비운다 | 서비스를 호스팅하는 svchost의 시작 시각이 부팅 시각보다 한참 늦다(explorer.exe는 로그온 시각과 비교). System 7036의 정지→실행 기록, 비어 있거나 얇은 문자열. 판독은 Process / Module 카드 |
| 기능 제한 정책 값 | DisableCMD, NoRun, NoDrives, DisableRegistryTools, DisablePCA 같은 정책 값으로 검사 도구·기록 경로를 막는다 | 그 값의 존재 자체가 증거다. 개인 PC에서 Explorer·Policy 계열 제한이 켜져 있으면 검사 방해 정황. 기업 관리 기기가 아니면 설명이 필요하다 |
| ACL 쓰기 거부 | icacls C:\Windows\Prefetch /deny SYSTEM:(WD)처럼 로깅 경로의 SYSTEM 쓰기를 막거나 상속을 끊는다 | .pf 생성이 멈춘 채 SysMain은 실행 중. 폴더 보안 탭의 Deny 항목, USN의 SECURITY_CHANGE, icacls.exe의 PF·BAM |
| 클리너 실행 | CCleaner·BleachBit·배치 스크립트로 다축 정리 | 클리너 자체의 설치·실행 기록이 PF·BAM·USN에 남는다. "정리 도구 실행 → 직후 아티팩트 소멸" 타임라인이 결정적 패턴 |
| Defender 예외 추가 | 로더·치트 폴더나 확장자·프로세스를 Defender 예외에 넣어 검사에서 뺀다 | Defender Operational 5007의 새 값에 \Microsoft\Windows Defender\Exclusions 경로. HKLM\SOFTWARE\Microsoft\Windows Defender\Exclusions(정책이면 HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions)의 Paths·Extensions·Processes 값. 예외가 Downloads·Temp 같은 사용자 쓰기 경로나 제보 경로를 가리키면 리드다. 비관리 PC에 예외 숨김 정책(HideExclusionsFromLocalAdmins)이 있으면 그 값 자체가 흔적이다 |
| 실시간 보호 끄기 | Windows 보안에서 실시간 보호를 끄고 치트를 실행한다 | Defender Operational 5001(실시간 보호 꺼짐)의 시각. 검사자가 도구 실행을 위해 끈 5001과 검사 시작 시각으로 나눈다 |
| 보호 기록 삭제 | Windows 보안의 보호 기록(탐지 이력)을 지운다 | Defender Operational 1013(기록 삭제)의 시각·사용자. 탐지 이벤트 1116·1117의 위협 이름·경로는 로그 채널에 따로 남고, 채널까지 지웠다면 System 104가 남는다 |
| 볼륨 섀도 복사본 삭제 | 섀도 복사본을 지워 이전 파일 상태를 되살릴 수 없게 한다 | vssadmin list shadows로 남은 복사본을 본다. 삭제에 쓰인 vssadmin.exe·wmic.exe·PowerShell의 PF·BAM과 명령줄 기록(4688·ScriptBlock). 복사본이 없는 것만으로는 시스템 보호 설정과 구분되지 않는다 |
| 시계 조작 | 시스템 시각을 바꿔 타임라인 정렬을 깬다 | Security 4616(시각 변경). USN에 미래·과거가 혼재하고, 이벤트 로그의 순서가 뒤집힌다. 부팅 시각 근처의 USN 몰림 |
| 서비스 설치·삭제 | 와이퍼·로더를 서비스로 올렸다가 지운다 | System 7045에 서비스 이름·이미지 경로·계정이 남는다. 삭제돼도 로그엔 이름이 남는다. 7036과 같이 본다 |
| PowerShell 히스토리 회피 | 히스토리 저장 경로를 끄거나 ConsoleHost_history.txt에 쓰기 거부 ACL을 걸고, 명령에 주석을 붙여 기록에서 빠뜨린다. 구버전 호스트(PowerShell 2.0)로 실행해 기록 경로를 갈라놓기도 한다. Windows 11 24H2는 2025년 8월 릴리스부터 2.0이 빠져 -Version 2를 붙여도 5.1로 실행된다 | powershell 실행량(PF·ScriptBlock 로그)과 히스토리 기록량의 불일치, 파일의 deny ACL 엔트리, $PROFILE·기록의 HistorySavePath 설정, 세션 일부만 비어 있는 패턴. 2.0이 빠진 빌드에서 2.0 엔진이 동작하면 재설치 흔적(ps2DLC.zip·loadGAC.ps1)을 찾는다 |
| 이벤트 채널 비활성·경로 변경 | 이벤트 뷰어에서 로그를 "사용 안 함"으로 바꾸거나 .evtx 파일 경로를 변경했다가 실행 후 복원한다 | 채널이 비활성이라는 사실 자체가 흔적이다. 채널 등록정보의 비기본 경로, 비활성화 이후의 기록 공백, 복원 시점의 불연속. 시각 변경이 겹치면 4616이 함께 남는다 |
| 이벤트 뷰어 보기 조작 | 열 목록에서 날짜·시간 열을 제거해 육안 확인을 방해한다 | 보기 설정만 바뀌므로 내보내기·파서에는 정상으로 남는다. 실익은 거의 없는 우회지만 시도 자체를 정황으로 기록한다 |
| 서비스 단위 로깅 차단 | TabletInputService 같은 입력 기록 서비스를 비활성화해 특정 로그만 끊는다 | 서비스 상태 변경 이벤트(7036·7040), sc qc의 비정상 시작 유형, 비활성 상태 자체 |
| 기록의 부분 파괴 | BAM 엔트리 수동 삭제·타임스탬프 편집, .pf 내용 비우기·LastWriteTime 조작, RunMRU 값 삭제 | 대상 키의 ACL 변경 자체, 내용이 비거나 잘린 .pf(저널의 DATA_TRUNCATION), 저널이 기록한 실제 수정 시각과 파일 표기 시각의 불일치, RunMRU의 비정상 공백 |
| 게임·원격 도구 로그 선택 삭제 | .minecraft의 logs 폴더·계정 json, AnyDesk의 appdata를 골라 지워 게임·연결 기록을 지운다 | logs 폴더 통째 삭제 또는 새로 만들어진 생성 시각, ad.trace 부재·갑자기 바뀐 AnyDesk ID, 다른 파일만 남긴 선택적 삭제 패턴, USN의 삭제 체인 |
| 기록 경로의 정책·휴지통 회피 | 휴지통 "즉시 삭제" 설정, shell:recent 경로 권한 제거 등으로 기록 생성 자체를 막는다 | 설정 자체가 레지스트리에 남고 비정상 ACL이 보인다. 지워진 파일은 USN에 그대로 남는다 |
"너무 깨끗함"을 읽는 법
부재를 신호로 쓰려면 기대값이 필요하다. 체크리스트는 "이 세션에서 존재해야 할 것"과 "실제 있는 것"의 대조다.
| 기대 | 실재 | 해석 |
|---|---|---|
| 몇 시간 게임 → PF·BAM·USN 활동 | 기대보다 현저히 적음 | 환경 사유(새 PC·서비스 off)를 먼저 배제. 설명이 없으면 와이프 리드 |
| SysMain 켜져 있음 | .pf 거의 없음, 기본 프로세스조차 없음 | 정리 정황. 서비스를 껐으면 "끈 시각" 이후만 비어야 정상이다 |
| 저널이 수개월 된 PC | 가장 오래된 USN이 오늘 | 저널 삭제 또는 랩. queryjournal 메타데이터로 구분 |
| 이벤트 로그 연속 | 제보 시간대 직전에 1102·104 | 정당한 로그 관리와 구분 필요. 주체·시각·맥락이 답을 준다 |
부재 단독은 절대 Confirmed 근거가 아니다. 정당한 설명 후보가 여럿 있고, 아래 오탐 절에 정리했다. 그 후보들을 배제하고도 불일치가 남을 때만 "지워졌다" 가설을 유지한다.
정상 vs 이상
| 구분 | 정상 | 이상 |
|---|---|---|
| 타임라인 밀도 | 활동에 비례 | 긴 세션인데 PF/BAM 없고 USN 공백, 환경 설명 없음 |
| 이벤트 로그 | 연속, 최대 크기 순환 | 1102·104가 제보 시간대 근처, 주체가 검사 대상 |
| 클리너 | 없거나 일상 관리(설치가 오래됨) | 제보 시간대 직전 설치·실행, 직후 아티팩트 소멸 |
| 서비스 | SysMain·EventLog 실행 중 | 정지됐거나, 실행 중인데 스레드만 Suspended |
| 레지스트리 | 정책 키 없음 | DisableCMD·NoRun·DisablePCA 같은 제한 값 존재(비관리 기기) |
| 시계 | 일관 | 4616, USN 시각 몰림, 이벤트 순서 역전 |
| Defender | 예외 없음 또는 설치된 개발 도구·게임 경로, 실시간 보호 켜짐 | 사용자 쓰기 경로·제보 경로를 가리키는 예외, 제보 시간대 직전의 5001·5007·1013 |
| 서비스 호스트 | DPS·PcaSvc 호스트가 부팅 직후 시작 | 부팅보다 한참 늦은 시작과 7036 정지·실행, 비어 있는 메모리 문자열 |
오탐
- 새 PC·새 프로필: 깨끗한 것이 당연하다. 설치 시각·프로필 생성 시각을 본다.
- 정책으로 끈 서비스: "SSD라서 Prefetch를 껐다"는 설명이 실제로 성립하는 경우가 있다. 서비스 상태와 비활성 시각을 기록한다.
- 기업 로그 포워딩: 로컬 로그가 비어 보여도 포워딩됐을 수 있다. 머신이 도메인·MDM 관리인지 본다.
- 디스크 풀·파손·저널 랩: 물리적 사유다.
queryjournal의 랩 상태와 디스크 여유 공간을 본다. - 정상 로그 순환·시스템 관리: 최대 크기 도달로 밀려난 오래된 이벤트, 사용자의 정기 디스크 정리. 로그 설정의 크기·가장 오래된 이벤트 시각·클리너 설치 시각을 본다.
- 서드파티 백신: Windows 10·11에서 다른 백신을 설치하면 Defender가 자동으로 비활성 모드가 된다. 설치된 보안 제품과 설치 시각을 기록한다.
- 검사자의 조작: 검사 도구를 돌리려고 실시간 보호를 끄거나 예외를 넣으면 5001·5007이 검사 중에 생긴다. 검사 시작 시각 이후 항목은 따로 적는다.
교차 검증
| 교차 카드 | 확인 내용 |
|---|---|
| R3-PF/USN/BAM/REC | 모든 Ring3 카드의 잔여 증거. 부재 패턴이 "어디서" 비었는지가 기법을 가린다 |
| R3-SCAN | 와이프 직전에도 남는 스캐너 히트·export |
| MITRE T1070 | 기법 프레이밍. 단독 확정 근거 아님 |
| 에스컬레이션 | 안티포렌식 + 커널 의심 → Ring0 에스컬레이션 여부 검토 |
AF 클러스터(공백 + 삭제 이벤트 + 클리너 잔여물)가 모이면 Suspicious 이상을 정당화한다. Confirmed로 올리려면 "무엇을 지웠는가"를 지지하는 다른 축이 하나 더 필요하다.
증거 캡처
06-af/ 폴더에 둔다.
- 이벤트 로그 필터(1102·104·7036·7045·4616·4657) 스크린샷(시각·주체 포함)
- "기대 vs 실재" 아티팩트 체크리스트(표)
fsutil usn queryjournal출력 (저널 삭제 의심 시)- 서비스 상태 스크린샷 + 의심 서비스의 스레드 상태 (System Informer)
- 클리너 경로·실행 기록(있을 때)
- 기능 제한 정책 값 스크린샷(있을 때)
- Windows 보안의 실시간 보호 상태와 예외(제외) 목록 화면,
Get-MpPreference의 Exclusion 항목, Defender Operational 필터(1116·1117·1013·5001·5007) 화면 vssadmin list shadows출력(섀도 복사본 삭제 의심 시)- 서비스 재시작이 의심되면 호스트 시작 시각·부팅 시각 메모와 7036 필터 화면
흔한 실수
- "깨끗하니 와이프했다"고 단정한다. 환경 사유를 먼저 배제해야 한다.
- 1102 하나로 Confirmed를 내린다. 누가 왜 지웠는지 맥락이 필요하다.
- "Prefetch가 없다"를 "Prefetch가 지워졌다"로 읽는다. 서비스 상태부터 확인한다.
- 이 패스를 건너뛰고 판정에 들어간다.
- 3079를 단독 증거로 쓴다. 저널 메타데이터와 교차 확인한다.
Community SS 커뮤니티에서는 "PF 비우기 + BAM 지우기 + USN 지우기"를 순서대로 하는 패턴이 공유된다. 역설적으로 이 와이프 시퀀스 자체가 USN·이벤트 로그에 고유한 패턴을 남긴다. Application 3079가 저널 삭제 지표로 반복 인용되지만 단독 증거로 쓰지 않고
queryjournal메타데이터·fsutil실행 기록과 교차 확인한다.SS 가이드 중에는 도구를 돌리기 전에 Defender와 다른 백신을 모두 끄라고 안내하는 것이 있다. 그대로 따르면 검사 중에 5001이 생기므로, 검사자가 만든 기록과 대상자가 만든 기록을 시각으로 나눠 둔다. 서비스를 멈추면 7036이 남지만 스레드만 멈추면 이벤트가 남지 않아, 가이드들은 스레드 정지를 더 은밀한 우회로 설명한다.
Sources
- MITRE: T1070 · T1070.001 · T1070.004 · T1070.006 · T1562.002 · T1112 · T1543.003 · T1685 Disable or Modify Tools · T1490 Inhibit System Recovery
- MS Learn: Event 1102 (Security 로그 삭제) · Event 4688 · Event 4657 (레지스트리 값 변경) · Event 4616 (시스템 시각 변경) · fsutil usn · Change Journals · Sysmon
- SigmaHQ: Eventlog Cleared(System 104) · Sysmon 설정: SwiftOnSecurity sysmon-config · sysmon-modular
- MS Learn Defender: Microsoft Defender Antivirus 이벤트 ID(1013·1116·1117·5001·5007) · 예외 구성(Get-MpPreference·HideExclusionsFromLocalAdmins) · 타사 백신과의 호환(비활성 모드)
- Defender 예외 흔적: Huntress: Defender 예외의 레지스트리 위치 · SigmaHQ: Windows Defender Exclusions Added(5007)
- MS Learn 섀도 복사본: vssadmin list shadows · vssadmin delete shadows
- KB5065506: Windows에서 PowerShell 2.0 제거
Next
- 마지막 카드 → Macro
- 판정으로 → 판정 루브릭
- 에스컬레이션 → Ring3로 부족한 순간
