시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 25/50편 (전체 425/450)
학습 단계: 스케줄·서비스·부팅 지속성 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
셸 초기화 파일은 사용자가 로그인하거나 셸을 열 때마다 실행됩니다(T1546.004). 관리자가 로그인하는 순간 백도어가 다시 켜지도록 만들 수 있어, 관리자의 정상 행동이 지속성의 트리거가 됩니다.
셸 초기화 파일
전역 : /etc/profile, /etc/profile.d/*.sh, /etc/bashrc (/etc/bash.bashrc)
개인 : ~/.bash_profile, ~/.bashrc, ~/.profile, ~/.bash_logout
흔한 삽입
· (nohup /tmp/.x >/dev/null 2>&1 &) ← 로그인 시 백도어 기동
· alias sudo='/tmp/.s' ← 비밀번호 가로채기
· export PROMPT_COMMAND='...' ← 명령마다 실행
핵심: 전역 파일은 "모든 사용자", alias 변조는 "자격증명 수집"
특히 alias sudo나 PROMPT_COMMAND 변조는 지속성과 자격증명 수집을 동시에 노리는 패턴이라 우선순위가 높습니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| 해시 비교 | sha256sum /etc/profile.d/* /etc/bashrc | 기준선 diff |
| 위험 패턴 | grep -nE 'nohup|alias sudo|PROMPT_COMMAND|/dev/tcp' | 삽입 줄 |
| 개인 파일 | find /home /root -maxdepth 2 -name '.bash*' -newer <기준> | 최근 변경 |
| 패키지 | rpm -qf /etc/profile.d/<file> | 미소유 |
# 셸 초기화 파일 점검 (분석 방법)
sudo sha256sum /etc/profile /etc/profile.d/* /etc/bashrc 2>/dev/null | diff /root/baseline/persist-*/shell.sha256 -
sudo grep -nE 'nohup|alias +(sudo|su|ssh)=|PROMPT_COMMAND|/dev/tcp|base64 -d|curl|wget' \
/etc/profile /etc/profile.d/* /etc/bashrc /root/.bash* /home/*/.bash* 2>/dev/null
sudo find /root /home -maxdepth 2 -name '.bash*' -mtime -7 -ls 2>/dev/null
/etc/profile.d/ : bash_completion.sh, colorls.sh, lang.sh (패키지 소유, 해시 일치)
위험 패턴: 없음
전역 파일이 패키지 소유·해시 일치이고, 개인 파일에 백그라운드 실행·alias 변조·네트워크 명령이 없는 상태가 정상입니다.
/etc/profile.d/sys-locale.sh (미소유, 03:01 생성)
(nohup /usr/lib/.x/agent >/dev/null 2>&1 &)
/root/.bashrc:31: alias sudo='/var/tmp/.s/sudo'
셸 초기화 파일 분석 흐름입니다(가상의 예시).
[변경 감지] profile.d·bashrc 감시 + 해시 기준선
↓
[패턴 검사] nohup/& · alias 변조 · PROMPT_COMMAND · 네트워크 명령
↓
[영향 범위] 전역(모든 사용자) vs 개인(해당 계정)
↓
[실행 흔적] 로그인 이후 생성된 백그라운드 프로세스·수집 파일
| 패턴 | 목적 |
|---|---|
| nohup ... & | 백도어 재기동 |
| alias sudo | 비밀번호 수집 |
| PROMPT_COMMAND | 명령마다 실행 |
가짜 sudo가 발견되면 그 이후 해당 계정으로 sudo를 쓴 모든 관리자의 비밀번호가 노출된 것으로 보고 교체 대상에 넣습니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108240" level="12">
<if_sid>108000</if_sid>
<field name="audit.key">persist_shell</field>
<field name="audit.file.name" type="pcre2">^/etc/(profile|bashrc|bash\.bashrc)$|^/etc/profile\.d/|/\.(bashrc|bash_profile|profile|bash_logout)$</field>
<description>셸 초기화 파일 변경(로그인 트리거 지속성 의심)</description>
<mitre><id>T1546.004</id></mitre>
</rule>
</group>
전역 파일은 모든 변경을 경보하고, 개인 파일은 변경이 잦을 수 있으므로 FIM diff의 위험 패턴 포함 여부로 하위 룰을 분리해 운영합니다.
| 범위 | 위치 |
|---|---|
| 전역 | /etc/profile(.d), /etc/bashrc |
| 개인 | ~/.bashrc, ~/.bash_profile |
| 위험 패턴 | nohup·alias sudo·PROMPT_COMMAND |
| 파급 | 비밀번호 수집 가능 |
| 면접 포인트 | "관리자의 로그인이 트리거가 된다 — alias sudo 변조는 지속성이자 자격증명 탈취" |
다음 편 426. 지속성·재침투 — udev 규칙 지속성 탐지 에서는 장치 이벤트마다 명령을 실행하는 udev 규칙(RUN+=)을 악용한 지속성을 rules.d 감시와 규칙 내용 분석으로 탐지하는 방법을 다룹니다.
이전 편: 424. 지속성·재침투 — rc.local·init 스크립트 부팅 지속성 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점