시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 24/50편 (전체 424/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
systemd 시대에도 rc.local과 SysV init 스크립트는 호환 계층으로 살아 있습니다(T1037.004). 관리자가 거의 보지 않는 파일이라 공격자가 부팅 시 실행할 명령을 숨기기 좋습니다.
전통적 부팅 지속성 위치
/etc/rc.local (/etc/rc.d/rc.local) ← 실행 권한이 있으면 rc-local.service가 실행
/etc/init.d/<script> ← systemd-sysv-generator가 유닛으로 변환
/etc/rc?.d/S??name ← 런레벨별 시작 링크
조건: rc.local은 실행 권한(+x)이 있어야 동작
핵심: "파일 내용"과 "실행 권한 변경"을 함께 본다
RHEL 계열은 rc.local에 기본적으로 실행 권한이 없습니다. 따라서 chmod +x /etc/rc.d/rc.local 자체가 강한 신호가 됩니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| rc.local | ls -l /etc/rc.d/rc.local; grep -v '^#' /etc/rc.d/rc.local | +x·내용 |
| 호환 서비스 | systemctl status rc-local | 실행 여부 |
| init.d | ls -la /etc/init.d/ | 미소유 스크립트 |
| 변환 유닛 | ls /run/systemd/generator.late/ | sysv 변환 결과 |
# 전통적 부팅 스크립트 점검 (분석 방법)
ls -l --time-style=full-iso /etc/rc.d/rc.local /etc/rc.local 2>/dev/null
grep -vE '^\s*(#|$)' /etc/rc.d/rc.local 2>/dev/null
systemctl status rc-local --no-pager 2>/dev/null | head -5
for f in /etc/init.d/*; do rpm -qf "$f" >/dev/null 2>&1 || dpkg -S "$f" >/dev/null 2>&1 || echo "미소유: $f"; done
ls /run/systemd/generator.late/ 2>/dev/null
-rw-r--r--. 1 root root 474 /etc/rc.d/rc.local (실행 권한 없음, 주석만)
rc-local.service: inactive (dead) — ConditionFileIsExecutable 불충족
rc.local에 실행 권한이 없고 내용이 주석뿐이며, init.d에 패키지 미소유 스크립트가 없는 상태가 정상입니다.
-rwxr-xr-x. 1 root root 531 2026-10-08 02:59 /etc/rc.d/rc.local
/usr/lib/.x/agent >/dev/null 2>&1 &
chmod 이벤트: auid=webadmin exe=/usr/bin/chmod a1=0755 /etc/rc.d/rc.local
부팅 스크립트 분석 흐름입니다(가상의 예시).
[변경 감지] rc.local·init.d 감시 + chmod 이벤트
↓
[실행 조건] rc.local +x ? init.d 스크립트가 유닛으로 변환되었나
↓
[내용] 실행 대상 경로·백그라운드·출력 버림
↓
[부팅 확인] 재부팅 후 rc-local.service 실행 기록·프로세스
| 신호 | 해석 |
|---|---|
| rc.local +x | 실행 활성화 |
& + >/dev/null | 은닉 백그라운드 |
| 미소유 init.d | 추가 스크립트 |
rc.local 실행 기록은 journalctl -u rc-local에 남으므로, 마지막 재부팅 이후 실제로 실행되었는지까지 확인합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108230" level="12">
<if_sid>108000</if_sid>
<field name="audit.key">persist_boot</field>
<field name="audit.file.name" type="pcre2">^/etc/(rc\.d/)?rc\.local$|^/etc/(rc\.d/)?init\.d/|^/etc/rc[0-6S]\.d/</field>
<description>rc.local·init 스크립트 변경·권한 변경(부팅 지속성 의심)</description>
<mitre><id>T1037.004</id></mitre>
</rule>
</group>
-p wa로 쓰기와 속성 변경(chmod)을 모두 잡으면 내용 추가와 실행 권한 부여를 하나의 룰로 탐지할 수 있습니다.
| 위치 | 확인 |
|---|---|
| rc.local | +x·내용 |
| init.d | 미소유 스크립트 |
| rc?.d | 시작 링크 |
| 실행 | rc-local journal |
| 면접 포인트 | "잊힌 레거시가 지속성 자리 — rc.local의 실행 권한 변경이 신호" |
다음 편 425. 지속성·재침투 — 셸 초기화 파일 지속성 탐지 에서는 .bashrc·.bash_profile·/etc/profile.d에 심어 로그인할 때마다 실행되는 지속성을 해시 기준선·감사 로그·내용 패턴으로 탐지하는 방법을 다룹니다.
이전 편: 423. 지속성·재침투 — systemd drop-in·generator 악용 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점