시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 5/50편 (전체 405/450)
학습 단계: 지속성·재침투 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
지속성 기법은 종류가 많아 보이지만 "언제 다시 실행되는가(트리거)"와 "어디에 심는가(위치)" 두 축으로 정리하면 대부분 분류할 수 있습니다. 이 분류를 MITRE ATT&CK의 Persistence(TA0003) 기법에 매핑하면 탐지 커버리지를 점검할 수 있습니다.
트리거 × 위치 분류
로그인 시 : authorized_keys, PAM, .bashrc, profile.d
시간·주기 : cron, at, systemd timer
부팅 시 : systemd service, rc.local, init.d, 커널 모듈
이벤트 시 : udev 규칙, 서비스 재시작(Restart=always)
모든 실행 시 : ld.so.preload, 바이너리 교체
외부 접속 시 : 웹셸, 백도어 리스너, 백도어 계정
핵심: 트리거를 알면 "언제 다시 나타날지"를 예측 가능
분류의 목적은 암기가 아니라 탐지 공백 찾기입니다. 각 칸마다 "어떤 로그로 보이는가"를 채워 보면 감시하지 않는 위치가 드러납니다.
| 분류 | 대표 위치 | MITRE 기법 |
|---|---|---|
| 계정 생성 | /etc/passwd | T1136.001 |
| SSH 키 | authorized_keys | T1098.004 |
| 인증 모듈 | /etc/pam.d, pam_*.so | T1556.003 |
| cron·at | /etc/cron*, /var/spool | T1053.003 / T1053.002 |
| systemd | /etc/systemd/system | T1543.002 / T1053.006 |
| RC 스크립트 | /etc/rc.local | T1037.004 |
| 셸 설정 | .bashrc, profile.d | T1546.004 |
| 동적 링커 | /etc/ld.so.preload | T1574.006 |
| 커널 모듈 | /lib/modules | T1547.006 |
| 웹셸 | 웹 루트 | T1505.003 |
# 분류별 탐지 커버리지 점검표 만들기 (분석 방법)
# 1) 현재 auditd에 걸린 지속성 관련 watch 키 확인
sudo auditctl -l | grep -oE -- '-k [a-z_]+' | sort | uniq -c
# 2) Wazuh 로컬 룰에 매핑된 MITRE ID 추출
sudo grep -oE 'T1[0-9]{3}(\.[0-9]{3})?' /var/ossec/etc/rules/local_rules.xml 2>/dev/null | sort -u
# 3) 분류표와 비교해 비어 있는 기법을 공백으로 기록
분류 감시 수단 MITRE
cron watch persist_cron T1053.003 ✔
systemd watch persist_svc T1543.002 ✔
ssh key watch account_persist T1098.004 ✔
주요 분류마다 최소 하나의 감시 수단(auditd watch·FIM·로그)과 탐지 규칙이 연결된 상태가 정상입니다.
분류 감시 수단 MITRE
udev (없음) T1546.017 ✘
ld.so.preload (없음) T1574.006 ✘
pam_*.so (없음) T1556.003 ✘
→ 공격자가 선택할 수 있는 "보이지 않는 칸" 존재
분류 기반 커버리지 분석 흐름입니다(가상의 예시).
[분류표] 트리거 × 위치 × MITRE
↓
[매핑] 분류별 감시 수단·룰 ID 연결
↓
[공백] 매핑 안 된 칸 = 탐지 사각
↓
[보강] watch·FIM·룰 추가 → 재검증(테스트 이벤트)
| 상태 | 의미 |
|---|---|
| 감시+룰 | 탐지 가능 |
| 감시만 | 기록은 있으나 경보 없음 |
| 없음 | 탐지 불가(사각) |
"감시만" 상태도 사고 후 조사에는 쓸 수 있지만 실시간 탐지는 되지 않으므로 룰까지 연결해야 합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108040" level="3">
<if_sid>108000</if_sid>
<field name="audit.key" type="pcre2">^persist_</field>
<description>지속성 위치 감시 이벤트 분류(MITRE 매핑 기반)</description>
<mitre><id>TA0003</id></mitre>
</rule>
</group>
persist_ 접두어로 감사 키를 통일하면 하나의 상위 룰로 모든 지속성 위치 이벤트를 묶고, 하위 룰에서 분류별 MITRE ID를 붙일 수 있습니다.
| 축 | 내용 |
|---|---|
| 트리거 | 로그인·시간·부팅·이벤트·실행·외부 접속 |
| 위치 | 계정·인증·스케줄·서비스·부팅·셸 |
| 매핑 | MITRE TA0003 하위 기법 |
| 활용 | 커버리지 공백 점검 |
| 면접 포인트 | "지속성은 트리거와 위치로 분류 — 매핑표의 빈칸이 탐지 사각" |
다음 편 406. 지속성·재침투 — 재침투(re-entry) 경로의 유형과 분석 축 에서는 공격자가 다시 들어오는 경로(유효 계정·원격 서비스·백도어·역방향 연결)를 유형화하고 각 경로의 분석 축을 다룹니다.
이전 편: 404. 지속성·재침투 — 지속성 정상 기준선 만들기
📚 시리즈 전체 보기: 시스템 보안 · 취약점