Windows 서버 침해 정황 분석|작업 스케줄러·이벤트 로그·TaskCache 점검 사례
2026. 6. 9. 16:26ㆍ오류 해결노트
IT 운영 업무를 하다 보면 단순 장애처럼 보였던 현상이 보안 침해 정황으로 이어지는 경우가 있습니다.
이번에는 운영 중인 Windows 기반 웹서버에서 비정상 게시글 등록, 이벤트 로그 삭제, 작업 스케줄러 로그 비활성화 현상이 함께 확인되어 원인을 추적했던 과정을 정리해보려고 합니다.
회사명, 실제 서버 경로, 파일명, 내부 시스템명은 모두 제외하고, IT 운영 실무 관점에서 어떤 순서로 확인했고 어떤 조치를 진행했는지만 정리했습니다.
1. 처음 확인한 이상 징후
처음에는 웹 게시판에 비정상 등록 데이터가 다량으로 쌓인 것이 시작이었습니다.
짧은 시간 동안 반복적으로 게시글이 등록되었고, 일부 입력값에는 SQL Injection 테스트로 보이는 문자열이 포함되어 있었습니다. 또한 화면에서는 이미지 파일만 업로드되도록 제한되어 있었지만, 실제 업로드 경로에는 허용되지 않은 확장자의 파일이 생성된 정황도 확인되었습니다.
이때까지는 단순 스팸 등록이나 게시판 취약점 시도로 볼 수도 있었지만, 서버 이벤트 로그를 확인하는 과정에서 더 큰 이상 징후가 발견되었습니다.
2. 이벤트 로그가 주기적으로 삭제되는 현상
Windows 이벤트 로그를 확인하던 중 Security 로그가 주기적으로 삭제되는 정황을 확인했습니다.
특히 보안 로그 삭제 이벤트가 반복적으로 발생했고, 삭제 주체는 일반 사용자 계정이 아니라 SYSTEM 권한으로 확인되었습니다. 또한 작업 스케줄러 Operational 로그가 활성화되어 있어도 일정 시간이 지나면 다시 비활성화되는 현상도 있었습니다.
이 시점부터는 단순 웹 게시판 문제가 아니라, 서버 내부에 지속성 있는 악성 작업이 존재할 가능성을 두고 조사했습니다.
3. Temp 경로의 의심 파일 생성 확인
먼저 임시 경로를 감시했습니다.
그 결과 특정 시간대마다 Windows Temp 경로에 실행 파일, 배치 파일, VBScript 파일 등이 생성되었다가 삭제되는 흐름이 확인되었습니다.
일부 파일은 보안 솔루션에서 악성 행위로 탐지되었고, 생성 후 바로 삭제되는 방식으로 흔적을 줄이려는 정황도 있었습니다.
이 단계에서 단순히 파일 목록만 확인해서는 원인 파악이 어렵다고 판단했고, 실시간 프로세스 추적 도구를 사용해 실행 흐름을 확인했습니다.
4. Procmon을 통한 프로세스 흐름 분석
Process Monitor를 사용해 의심 시간대의 프로세스 실행, 파일 접근, 레지스트리 변경 흐름을 추적했습니다.
처음에는 분석 도구가 정상적으로 실행되지 않았습니다. 확인 결과, 일부 분석 도구 실행을 방해하는 레지스트리 설정이 등록되어 있었습니다. 해당 설정을 백업 후 제거한 뒤 Procmon을 정상적으로 실행할 수 있었습니다.
Procmon 분석 결과, 작업 스케줄러 서비스가 SYSTEM 권한으로 특정 명령을 실행하고 있었고, 정상 문서처럼 위장된 파일에서 여러 실행 파일과 스크립트를 임시 경로로 추출하려는 흐름이 확인되었습니다.
즉, 임시 폴더에 파일이 우연히 생긴 것이 아니라, 작업 스케줄러 기반의 악성 작업이 주기적으로 동작하고 있던 구조였습니다.
5. 정상 문서처럼 위장된 컨테이너 파일 확인
조사 과정에서 정상 문서처럼 보이는 파일 하나가 확인되었습니다.
겉으로 보기에는 일반 문서 파일처럼 보였지만, 내부에는 실행 파일, 배치 파일, 스크립트 파일 등이 포함되어 있었습니다. 이 파일은 실제 문서라기보다 악성 도구를 담고 있는 컨테이너 파일에 가까웠습니다.
작업 스케줄러의 악성 작업은 이 파일을 압축 파일처럼 사용해 내부 파일을 임시 경로로 추출하고, 이후 후속 명령을 실행하는 구조였습니다.
해당 파일은 증적 보존 후 원본 경로에서 격리했습니다.
6. 작업 스케줄러 목록에 보이지 않던 악성 작업
처음에는 작업 스케줄러 UI와 PowerShell 명령으로 수상한 작업을 찾으려고 했습니다. 하지만 일반적인 조회 방식에서는 의심 작업이 바로 보이지 않았습니다.
이후 레지스트리의 TaskCache 영역을 확인했습니다. TaskCache 바이너리 값에서 문자열을 추출해보니 악성 명령이 포함된 GUID 항목을 확인할 수 있었습니다.
해당 TaskCache Actions 안에는 다음과 같은 행위가 포함되어 있었습니다.
- 감사 정책 초기화 시도
- 이벤트 로그 비활성화
- 위장 파일에서 실행 파일 추출
- 임시 경로의 후속 스크립트 실행
- 일부 분석 방해 및 권한 조작 시도
특히 이 항목은 일반 Tree 매핑에는 보이지 않았고, Tasks 및 Boot 영역에 남아 있었습니다. 그래서 일반 작업 스케줄러 목록에서는 바로 확인되지 않았던 것으로 보입니다.
7. 실제 조치한 내용
이번 조치에서는 다음 순서로 대응했습니다.
1) 업로드 경로 접근 차단
웹 게시판 업로드 경로에 대해 실행성 파일과 허용되지 않은 확장자의 접근을 제한했습니다.
화면단에서 이미지 파일만 허용하는 것과 별개로, 서버단에서도 확장자 검증과 업로드 경로 실행 차단이 필요하다고 판단했습니다.
2) 의심 파일 증적 보존 및 격리
정상 문서처럼 위장되어 있던 컨테이너 파일을 증적 보존 후 원본 경로에서 격리했습니다.
이 파일이 원래 이름으로 남아 있으면 작업 스케줄러가 다시 내부 파일을 추출하려고 시도할 수 있기 때문에, 원본 위치에서 사용할 수 없도록 처리했습니다.
3) 분석 방해 레지스트리 제거
분석 도구 실행을 방해하던 IFEO Debugger 설정을 확인하고 백업 후 제거했습니다.
이후 Procmon을 정상 실행할 수 있었고, 작업 스케줄러 서비스와 악성 명령의 실행 흐름을 확인할 수 있었습니다.
4) 악성 TaskCache 백업 및 삭제
TaskCache에서 악성 명령이 포함된 GUID 항목을 확인했습니다.
해당 항목은 증적 백업 후 삭제했고, 관련 Boot 영역 등록 흔적도 함께 제거했습니다.
삭제 후에는 TaskCache에서 의심 키워드를 재검색하여 잔존 여부를 확인했습니다.
5) 이벤트 로그 재활성화 및 재발 확인
작업 스케줄러 Operational 로그를 다시 활성화한 뒤, 일정 시간 동안 다시 비활성화되는지 확인했습니다.
조치 후 기존처럼 이벤트 로그가 주기적으로 삭제되거나 작업 스케줄러 로그가 비활성화되는 현상은 멈춘 상태로 확인되었습니다.
8. 참고한 점검 명령어
아래 명령어들은 실제 내부 경로나 파일명을 제외하고, 점검 방식만 참고할 수 있도록 일반화한 예시입니다.
이벤트 로그 상태 확인
wevtutil gl Microsoft-Windows-TaskScheduler/Operational
이벤트 로그 활성화
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
최근 보안 로그 삭제 이벤트 확인
Get-WinEvent -FilterHashtable @{
LogName='Security'
Id=1102
StartTime=(Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Id, Message
특정 경로의 의심 파일 확인
Get-ChildItem "<점검대상경로>" -Force |
Where-Object {$_.Name -match "의심키워드"} |
Select-Object FullName, CreationTime, LastWriteTime, Length
작업 스케줄러 최근 실행 작업 확인
Get-ScheduledTask | ForEach-Object {
try {
$info = Get-ScheduledTaskInfo -TaskName $_.TaskName -TaskPath $_.TaskPath
[PSCustomObject]@{
TaskPath = $_.TaskPath
TaskName = $_.TaskName
LastRunTime = $info.LastRunTime
LastTaskResult = $info.LastTaskResult
}
} catch {}
} | Sort-Object LastRunTime -Descending
짧은 주기의 예약작업 확인
Get-ScheduledTask | ForEach-Object {
[PSCustomObject]@{
TaskPath = $_.TaskPath
TaskName = $_.TaskName
State = $_.State
Triggers = ($_.Triggers | Out-String).Trim()
Actions = ($_.Actions | Out-String).Trim()
}
} | Where-Object {
$_.Triggers -match "PT1M|PT2M|Interval|Repetition|Minute"
}
TaskCache 백업
reg export "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache" "<백업파일경로>" /y
TaskCache 내 의심 키워드 검색
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache" /f "의심키워드" /s
IFEO Debugger 설정 확인
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" |
ForEach-Object {
$p = Get-ItemProperty $_.PsPath -ErrorAction SilentlyContinue
if ($p.Debugger) {
[PSCustomObject]@{
Name = $_.PSChildName
Debugger = $p.Debugger
}
}
}
파일 생성·수정 시간 확인
Get-Item "<점검대상파일>" |
Select-Object FullName, CreationTime, LastWriteTime, LastAccessTime, Length
파일 해시 확인
Get-FileHash "<점검대상파일>" -Algorithm SHA256
USN Journal 확인
fsutil usn readjournal <드라이브명>: csv > <저장파일경로>
USN Journal에서 특정 파일명 검색
Select-String -Path "<USN저장파일>" -Pattern "점검대상파일명|점검대상키워드" |
Out-File "<결과저장파일>" -Encoding UTF8
9. 실무적으로 느낀 점
이번 사례에서 가장 중요했던 부분은 보이는 현상만 보고 끝내지 않는 것이었습니다.
처음에는 게시판 스팸 등록처럼 보였지만, 실제로는 서버 내부에 악성 예약작업이 남아 있었고, 이벤트 로그 삭제와 분석 도구 실행 방해까지 함께 동작하고 있었습니다.
특히 작업 스케줄러 UI에 보이지 않는다고 해서 예약작업이 없다고 판단하면 안 됩니다. TaskCache, Boot, 레지스트리, Temp 파일 생성 흐름, Procmon 로그를 같이 봐야 원인을 좁힐 수 있었습니다.
또한 이벤트 로그가 지워지는 서버는 이미 공격자가 흔적을 숨기고 있을 가능성이 있으므로, 단순 로그 확인보다 실시간 감시와 증적 보존이 중요하다는 점을 다시 느꼈습니다.
10. 정리
이번 조치의 핵심은 다음과 같습니다.
- 웹 게시판 이상 등록으로 서버 점검 시작
- 이벤트 로그 주기적 삭제 및 작업 스케줄러 로그 비활성화 확인
- Temp 경로에서 의심 파일 생성 및 삭제 반복 확인
- Procmon으로 작업 스케줄러 기반 실행 흐름 확인
- 정상 문서처럼 위장된 컨테이너 파일 확인
- TaskCache 내 악성 예약작업 GUID 확인
- 증적 보존 후 의심 파일 격리 및 TaskCache 삭제
- 이벤트 로그 삭제 현상 중단 확인
IT 운영 업무에서는 장애 대응뿐 아니라 보안성 이상 징후도 함께 볼 수밖에 없습니다.
특히 웹서버에서 알 수 없는 파일 생성, 이벤트 로그 삭제, 작업 스케줄러 로그 비활성화가 함께 보인다면 단순 오류가 아니라 침해 정황으로 보고 접근하는 것이 안전합니다.