424. 지속성·재침투 — rc.local·init 스크립트 부팅 지속성 탐지

changseop lee·2026년 10월 9일

시스템 보안 · 취약점

목록 보기
424/450

시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 24/50편 (전체 424/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

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 자체가 강한 신호가 됩니다.

2. 왜 중요한가

  • 관리자가 잘 열어 보지 않는 레거시 위치라 오래 살아남습니다.
  • init.d 스크립트는 generator가 자동으로 유닛으로 바꿔 systemd 목록에 섞입니다.
  • 실행 권한 하나만 바꿔도 기존 내용이 부팅 시 실행되기 시작합니다.

3. 핵심 명령어 / 설정

확인명령포인트
rc.localls -l /etc/rc.d/rc.local; grep -v '^#' /etc/rc.d/rc.local+x·내용
호환 서비스systemctl status rc-local실행 여부
init.dls -la /etc/init.d/미소유 스크립트
변환 유닛ls /run/systemd/generator.late/sysv 변환 결과

4. 실습 (실습 예시)

# 전통적 부팅 스크립트 점검 (분석 방법)
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

5. 정상 상태

-rw-r--r--. 1 root root 474 /etc/rc.d/rc.local   (실행 권한 없음, 주석만)
rc-local.service: inactive (dead) — ConditionFileIsExecutable 불충족

rc.local에 실행 권한이 없고 내용이 주석뿐이며, init.d에 패키지 미소유 스크립트가 없는 상태가 정상입니다.

6. 이상 상태

-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 실행 권한 부여 + 백그라운드 실행 줄 추가 → 부팅 지속성
  • 출력 버림(>/dev/null) + 숨김 경로 → 은닉 의도
  • 침해 의심 계정이 새벽에 수행 → 정탐

7. 로그 분석 (분석 방법)

부팅 스크립트 분석 흐름입니다(가상의 예시).

[변경 감지] 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에 남으므로, 마지막 재부팅 이후 실제로 실행되었는지까지 확인합니다.

8. SOC 관제 포인트

  • rc.local 실행 권한 변경을 단독 경보로 둡니다.
  • init.d 미소유 스크립트를 정기 점검 항목에 넣습니다.
  • 부팅 직후 기동되는 비표준 경로 프로세스를 함께 탐지합니다.

9. 탐지 규칙

<!-- 실습 예시 룰: 적용 전 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)을 모두 잡으면 내용 추가와 실행 권한 부여를 하나의 룰로 탐지할 수 있습니다.

10. 대응 방법

  1. 초기 확인 — rc.local·init.d 변경 내용과 실행 권한 상태를 확인합니다.
  2. 범위 확인 — 실행 대상 바이너리와 다른 지속성 연결을 확인합니다.
  3. 증거 확보 — 스크립트 사본·chmod 기록·부팅 로그를 보존합니다.
  4. 차단/조치 — 악성 줄을 제거하고 실행 권한을 회수하며 대상 바이너리를 격리합니다.
  5. 재발 방지 — 레거시 부팅 위치를 감시·점검 대상으로 유지합니다.

11. 핵심 정리

위치확인
rc.local+x·내용
init.d미소유 스크립트
rc?.d시작 링크
실행rc-local journal
면접 포인트"잊힌 레거시가 지속성 자리 — rc.local의 실행 권한 변경이 신호"

12. 다음 편 예고

다음 편 425. 지속성·재침투 — 셸 초기화 파일 지속성 탐지 에서는 .bashrc·.bash_profile·/etc/profile.d에 심어 로그인할 때마다 실행되는 지속성을 해시 기준선·감사 로그·내용 패턴으로 탐지하는 방법을 다룹니다.


이전 편: 423. 지속성·재침투 — systemd drop-in·generator 악용 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글