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 명령, 임시 디렉터리 참조)로 노이즈 축소.

참고