시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 23/50편 (전체 423/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
새 유닛을 만들면 눈에 띄기 때문에, 공격자는 이미 있는 정상 서비스에 설정을 덧붙이는 방법을 씁니다. drop-in(<unit>.d/override.conf)으로 ExecStartPre를 추가하면 sshd가 시작될 때마다 악성 명령이 함께 실행됩니다.
은밀한 systemd 지속성
① drop-in
/etc/systemd/system/sshd.service.d/override.conf
[Service]
ExecStartPre=/bin/sh -c '/usr/lib/.x/agent &'
② generator
/etc/systemd/system-generators/x ← 부팅 시 유닛을 동적으로 생성
③ 환경 주입
Environment=LD_PRELOAD=/usr/lib/.x/lib.so
핵심: 서비스 이름은 정상 — "systemctl cat"의 drop-in 부분을 본다
systemctl cat은 원본 유닛 아래에 drop-in 내용을 함께 보여 주므로, 원본 외에 추가된 블록이 있는지 확인하는 것이 핵심입니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| drop-in 목록 | systemd-delta --type=extended,overridden | 확장·재정의 |
| 유닛 전체 | systemctl cat sshd | 추가 블록 |
| drop-in 파일 | find /etc/systemd /run/systemd -name '*.conf' -path '*.d/*' | 신규 파일 |
| generator | ls /etc/systemd/system-generators /usr/local/lib/systemd/system-generators | 미소유 파일 |
# drop-in·generator 점검 (분석 방법)
systemd-delta --type=extended,overridden --no-pager
sudo grep -rnE 'ExecStart(Pre|Post)?=|Environment=.*LD_' /etc/systemd/system/*.d/ 2>/dev/null
ls -la /etc/systemd/system-generators /usr/local/lib/systemd/system-generators 2>/dev/null
# 결과를 기준선과 비교
systemd-delta --no-pager | sort > /tmp/delta_now; diff /root/baseline/systemd_delta.txt /tmp/delta_now
[EXTENDED] /usr/lib/systemd/system/httpd.service → /etc/systemd/system/httpd.service.d/limits.conf
(LimitNOFILE=65535, 티켓 CHG-0712)
drop-in이 리소스 제한·환경 설정처럼 승인된 운영 목적이고 실행 명령을 추가하지 않는 상태가 정상입니다.
[EXTENDED] sshd.service → /etc/systemd/system/sshd.service.d/override.conf (신규)
ExecStartPre=/bin/sh -c '/usr/lib/.x/agent &'
/etc/systemd/system-generators/x (패키지 미소유)
drop-in·generator 분석 흐름입니다(가상의 예시).
[delta 비교] systemd-delta 기준선 diff
↓
[내용] drop-in의 ExecStart*/Environment 추가 여부
↓
[계보] 대상 서비스(sshd)의 자식으로 실행된 비정상 프로세스
↓
[generator] 미소유 파일 → 생성되는 유닛(/run/systemd/generator*)
| 지시어 | 위험 |
|---|---|
| ExecStartPre/Post | 추가 명령 실행 |
| Environment=LD_PRELOAD | 라이브러리 주입 |
| generator | 부팅 초기 실행 |
generator가 만든 유닛은 /run/systemd/generator* 아래 휘발성 경로에 생기므로 재부팅 후 다시 만들어집니다. 원본인 generator 파일을 찾아야 근절됩니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108220" level="13">
<if_sid>108000</if_sid>
<field name="audit.key">persist_svc</field>
<field name="audit.file.name" type="pcre2">\.service\.d/.*\.conf$|system-generators/</field>
<description>systemd drop-in·generator 생성·수정(기존 서비스 하이재킹 지속성 의심)</description>
<mitre><id>T1543.002</id></mitre>
</rule>
</group>
drop-in 디렉터리와 generator 경로를 감시합니다. 정상 운영에서도 drop-in은 생길 수 있으므로 Alert 이후 내용에 실행 지시어가 있는지 확인하는 절차를 함께 둡니다.
systemctl daemon-reload 후 서비스를 재시작합니다.| 기법 | 탐지 |
|---|---|
| drop-in | systemd-delta·systemctl cat |
| ExecStartPre | 실행 지시어 검토 |
| generator | 미소유 파일 |
| 복구 | 제거 + daemon-reload |
| 면접 포인트 | "새 유닛 대신 정상 서비스에 덧붙인다 — systemd-delta로 추가 블록을 본다" |
다음 편 424. 지속성·재침투 — rc.local·init 스크립트 부팅 지속성 탐지 에서는 rc.local·init.d·rc?.d 같은 전통적 부팅 스크립트에 숨긴 지속성을 호환 서비스(rc-local.service) 동작과 함께 탐지하는 방법을 다룹니다.
이전 편: 422. 지속성·재침투 — systemd timer 지속성 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점