시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 36/50편 (전체 436/450)
학습 단계: 백도어·재침투 경로 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
가장 은밀한 지속성 중 하나는 이미 있는 시스템 바이너리를 바꿔치기하는 것입니다(T1554). 변조된 sshd는 특정 비밀번호를 받으면 무조건 통과시키고, 변조된 passwd는 바뀐 비밀번호를 몰래 기록합니다. 파일 이름과 위치가 그대로라 목록 점검에는 걸리지 않습니다.
교체 대상과 효과
sshd → 마스터 비밀번호 백도어, 자격증명 기록
passwd/su → 입력 비밀번호 수집
ps/ls/ss → 특정 프로세스·파일·연결 숨기기
cron/systemd 관련 바이너리 → 숨은 작업 실행
판별 근거: 패키지 DB 해시(rpm -V), 외부 기준 해시, 파일 시간·크기
핵심: 이름이 아니라 "해시"로 본다 — 패키지 DB 자체 변조 가능성도 고려
rpm -V 출력 예
S.5....T. /usr/sbin/sshd (S=크기, 5=해시, T=수정 시각 다름)
A영역 25편이 패키지 무결성 점검을 다뤘다면, 이번 편은 교체된 바이너리가 지속성·재침투 수단으로 쓰이는 상황을 탐지·검증하는 데 집중합니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| 패키지 검증 | rpm -Va / debsums -s | 5 표시 바이너리 |
| 외부 비교 | sha256sum vs 동일 버전 깨끗한 시스템 | DB 변조 대비 |
| 수정 감사 | ausearch -k bin_change -i | 쓴 주체 |
| 실행 중 파일 | ls -l /proc/<pid>/exe | (deleted) 여부 |
# 시스템 바이너리 교체 점검 (분석 방법)
sudo rpm -Va 2>/dev/null | grep -E '^..5' | grep -E ' /(usr/)?(s)?bin/'
sudo debsums -s 2>/dev/null | head
# 핵심 바이너리 해시를 외부 기준(골든 이미지)과 비교
for b in /usr/sbin/sshd /usr/bin/passwd /usr/bin/su /usr/bin/ps /usr/bin/ss; do sha256sum "$b"; done > /tmp/bin_now.sha256
diff /root/golden/bin.sha256 /tmp/bin_now.sha256
sudo ausearch -k bin_change -i 2>/dev/null | grep -E 'name=/usr/(s)?bin|exe=|auid=' | tail
rpm -Va: 바이너리 해시 불일치 없음 (설정 파일 c 표시만)
골든 이미지 해시와 일치
패키지 검증에서 바이너리 해시 불일치가 없고, 외부 기준 해시와도 일치하는 상태가 정상입니다.
S.5....T. /usr/sbin/sshd
S.5....T. /usr/bin/passwd
bin_change: name=/usr/sbin/sshd auid=webadmin exe=/usr/bin/cp (03:14)
바이너리 교체 분석 흐름입니다(가상의 예시).
[무결성 점검] rpm -Va / debsums → 해시 불일치 목록
↓
[교차 검증] 외부 기준 해시(DB 변조 대비)
↓
[교체 주체] bin_change 감사 → auid·exe·시각
↓
[영향] 교체 이후 해당 바이너리를 거친 인증·명령 → 노출 범위
| 표시 | 의미 |
|---|---|
| S | 크기 다름 |
| 5 | 해시 다름 |
| T | 수정 시각 다름 |
| c | 설정 파일(정상 변경 가능) |
공격자가 패키지 DB까지 고쳤다면 rpm -V가 깨끗하게 나올 수 있습니다. 그래서 핵심 바이너리는 외부에 보관한 기준 해시와 비교해야 합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108350" level="15">
<if_sid>108000</if_sid>
<field name="audit.key">bin_change</field>
<field name="audit.file.name" type="pcre2">^/usr/(s)?bin/|^/(s)?bin/</field>
<field name="audit.exe" negate="yes" type="pcre2">/(rpm|dnf|yum|dpkg|apt|unattended-upgrade)</field>
<description>패키지 관리자 외 시스템 바이너리 쓰기(바이너리 교체 지속성 의심)</description>
<mitre><id>T1554</id></mitre>
</rule>
</group>
시스템 바이너리 디렉터리를 -p wa -k bin_change로 감시하고 패키지 관리자가 아닌 쓰기를 최고 수준으로 경보합니다.
| 확인 | 근거 |
|---|---|
| 해시 | rpm -Va·debsums |
| DB 변조 대비 | 외부 기준 해시 |
| 주체 | bin_change 감사 |
| 영향 | 교체 이후 비밀번호 노출 |
| 면접 포인트 | "이름은 같고 내용만 다르다 — 바이너리는 해시로, 기준 해시는 서버 밖에 둔다" |
다음 편 437. 지속성·재침투 — 근절 후 재침투(복귀) 징후 탐지 에서는 사고 근절 이후 같은 공격자가 돌아오는 징후를 IOC 재출현·같은 기법 재사용·근절 전후 비교로 탐지하고 근절 실패 원인을 찾는 방법을 다룹니다.
이전 편: 435. 지속성·재침투 — 커널 모듈·루트킷 지속성 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점