ATT&CK: T1053.003 Cron, T1053.005 Scheduled Task (Windows), T1053.006 Systemd Timers · Persistence (TA0003)
OS 네이티브 스케줄러는 가장 자주 쓰이는 지속성 메커니즘. 별도 바이너리 설치 불필요하고 운영 작업과 섞여 있어 상대적으로 조용. 다만 ATT&CK로 분류되는 흔적은 명확하다.
1. Windows — schtasks
1.1 사용자 로그온 시 실행 (사용자 권한)
schtasks /Create /SC ONLOGON /TN "Updater" /TR "powershell -W Hidden -c <command>"
/SC ONLOGON: 로그온 시 트리거.- 일반 사용자 권한으로 등록 가능 → 권한 상승 없이 지속성.
1.2 특정 시간 반복 (관리자 권한 필요)
schtasks /Create /SC DAILY /ST 09:00 /TN "DailyMaint" /TR "..." /RU SYSTEM
/RU SYSTEM은 관리자 필요.
1.3 XML로 상세 설정
schtasks /Create /XML task.xml /TN "ComplexTask"
XML에 트리거/조건/권한을 상세 지정. 복잡한 조건(네트워크 연결 시, 특정 이벤트 발생 시)이 필요하면.
1.4 숨기기 시도
Task Scheduler GUI에서 숨기는 흔한 트릭:
- 작업 이름에
\포함 → GUI에서 가끔 안 보임 (OS 패치로 상당 부분 수정됨) SD(Security Descriptor)를 조작해 GUI에서 안 보이게 (고전 트릭 — 요즘 EDR이 거의 다 탐지)
현실: EDR이 schtasks /Create 명령 자체를 모니터링. 숨기기는 거의 안 통함.
1.5 흔적
- Event ID 4698 (A scheduled task was created) — 가장 명확.
- Event ID 4702 (A scheduled task was updated).
C:\Windows\System32\Tasks\<TaskName>XML 파일.- 레지스트리
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\.
2. Linux — cron
2.1 사용자 crontab
# 사용자 권한
(crontab -l 2>/dev/null; echo "@reboot /home/alice/.local/bin/beacon") | crontab -
2.2 시스템 cron 디렉터리 (root)
cat > /etc/cron.d/update <<EOF
0 * * * * root /opt/update.sh
EOF
/etc/cron.{hourly,daily,weekly,monthly}/: 각 간격에 실행되는 스크립트./etc/cron.d/: 명시적 cron 포맷 파일.
2.3 흔적
/var/log/cron(RHEL/CentOS),/var/log/syslog(Debian/Ubuntu).- 각 사용자 crontab은
/var/spool/cron/<user>또는/var/spool/cron/crontabs/<user>. auditd로그:/etc/cron.d/*쓰기 이벤트.
2.4 안 걸리기 어려운 이유
- cron 파일 쓰기 자체가 명확한 이벤트 — auditd 룰로 쉽게 커버됨.
@reboot트리거는 특히 특이한 패턴.
3. Linux — systemd timer (더 현대적 접근)
systemd timer는 cron 대안으로 로그가 journald에 통합되고 더 유연. 공격자/방어자 모두 cron보다 선호 추세.
3.1 유닛 작성
# /etc/systemd/system/updater.service
[Unit]
Description=Updater
[Service]
Type=oneshot
ExecStart=/usr/local/bin/updater.sh
# /etc/systemd/system/updater.timer
[Unit]
Description=Run updater hourly
[Timer]
OnBootSec=5min
OnUnitActiveSec=1h
Persistent=true
[Install]
WantedBy=timers.target
3.2 활성화
systemctl daemon-reload
systemctl enable --now updater.timer
3.3 사용자 수준 timer (root 불필요)
mkdir -p ~/.config/systemd/user/
# 유닛 파일을 거기에 작성
systemctl --user enable --now updater.timer
사용자 세션 유지 조건(linger)이 필요하지만, loginctl enable-linger <user>로 활성화하면 로그아웃해도 실행.
3.4 흔적
journalctl -u updater.timer.systemctl list-timers.- 유닛 파일 생성은 auditd 룰로 커버.
4. 세 가지 비교
| 측면 | schtasks | cron | systemd timer |
|---|---|---|---|
| 사용자 권한만으로 | ○ (일부 트리거) | ○ (user crontab) | ○ (user units) |
| 로그 통합성 | Event Log | 분산(/var/log/*) | journald (가장 좋음) |
| 조건부 트리거 | 매우 풍부 | 시간만 | 시간/이벤트/상태 |
| EDR 탐지 패턴 성숙도 | 매우 성숙 | 매우 성숙 | 상대적으로 덜 성숙 |
5. 블루팀 룰
- Windows: Event 4698을 포함한 SIGMA 룰이 거의 다 커버 (
win_susp_scheduled_task_creation.yml등). - Linux:
auditctl -w /etc/cron.d/ -p wa+/etc/systemd/system/*.service모니터링. - 모든 OS: 스케줄 작업 생성 자체는 정상 운영에서도 흔함 — 룰은 “작업 내용이 특이한가”(powershell 숨김 플래그, base64 명령, 임시 디렉터리 참조)로 노이즈 축소.
참고
- MITRE ATT&CK — T1053
- LOLBAS: schtasks
man 5 crontab,man systemd.timer