시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 38/50편 (전체 438/450)
학습 단계: 백도어·재침투 경로 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
백도어·재침투는 "어떤 통로로 다시 들어오는가"의 문제입니다. 지금까지 다룬 기법을 통로의 방향과 위치(네트워크·애플리케이션·호스트 내부)로 묶어 하나의 지도로 정리합니다.
재침투 경로 지도
[내→외 통로] 리버스 셸(I29) · C2 비컨(I32) · SSH 역방향 터널(I33)
[외→내 통로] 백도어 리스너(I30) · 웹셸(I31)
[이웃 경유] 신뢰 관계·agent 하이재킹(I34)
[깊은 거점] 커널 모듈(I35) · 바이너리 교체(I36)
[검증] 근절 후 복귀 징후(I37)
↓
네트워크 통제(아웃바운드 차단)로 내→외 통로를 한 번에 줄인다
핵심: 호스트 점검 + 네트워크 통제를 함께 써야 통로가 닫힌다
특히 내→외 통로는 아웃바운드 기본 차단 하나로 상당 부분을 무력화할 수 있어, 호스트별 제거와 함께 네트워크 정책을 점검합니다.
| 기법 | 주 탐지 | 룰 ID |
|---|---|---|
| 리버스 셸 | connect 감사·DROP 주기 | 108280 |
| 리스너 | LISTEN 기준선·packet 소켓 | 108290 |
| 웹셸 | 웹서버 → 셸 계보 | 108300 |
| C2 비컨 | 간격 통계 | 108310·108311 |
| SSH 터널 | ssh -R/-D 인자 | 108320 |
| 신뢰 관계 | rhosts·agent 접근 | 108330 |
| 커널 모듈 | finit_module·taint | 108340 |
| 바이너리 교체 | rpm -Va·bin_change | 108350 |
| 복귀 징후 | IOC 감시 목록 | 108360 |
# 재침투 통로 일괄 점검 (분석 방법)
echo "[내→외]"; sudo ss -tnp | grep -E '"(bash|sh|python[0-9.]*|perl|nc|ssh)"' ; ps -eo args | grep -E '[s]sh .*-[A-Za-z]*[RD]'
echo "[외→내]"; sudo ss -lntup | wc -l; sudo grep -rlE 'eval\(|base64_decode\(' /var/www 2>/dev/null | head -3
echo "[이웃]"; sudo find / -xdev \( -name '.rhosts' -o -name 'hosts.equiv' \) 2>/dev/null
echo "[거점]"; cat /proc/sys/kernel/tainted; sudo rpm -Va 2>/dev/null | grep -cE '^..5.* /(usr/)?s?bin/'
[내→외] 셸·터널 연결 없음 [외→내] 리스너 기준선 일치, 웹셸 패턴 없음
[이웃] 신뢰 파일 없음 [거점] tainted 0, 바이너리 불일치 0
네 영역 모두에서 통로가 발견되지 않고, 아웃바운드가 승인 목적지로만 제한된 상태가 정상입니다.
[내→외] bash → 198.51.100.7:443 (SYN 반복), ssh -N -R 2222:localhost:22
[외→내] /var/www/html/uploads/thumb.php
[거점] tainted 12288, sshd 해시 불일치
재침투 통로 종합 판단 흐름입니다(가상의 예시).
[통로 점검] 내→외 · 외→내 · 이웃 · 거점
↓
[깊은 거점?] 커널·바이너리 변조 있음
├─ 예 → 호스트 신뢰 불가 → 이미지 확보 → 재설치
└─ 아니오 → 통로별 제거
↓
[네트워크 통제] 아웃바운드 기본 차단 · C2·터널 목적지 차단
↓
[검증] 복귀 징후 감시 기간(I37)
| 통로 | 1차 통제 |
|---|---|
| 내→외 | 아웃바운드 차단 |
| 외→내 | 인바운드 최소화·웹 실행 금지 |
| 이웃 | 신뢰 해제·키 교체 |
| 거점 | 재설치 |
깊은 거점이 확인되면 호스트 안에서 "깨끗해졌다"고 판단할 근거가 사라지므로, 재설치 여부를 가장 먼저 결정합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108370" level="15">
<if_matched_group>persistence</if_matched_group>
<same_field>agent.id</same_field>
<match type="pcre2">reentry_|module_load|bin_change</match>
<timeframe>86400</timeframe>
<description>동일 호스트 24시간 내 재침투 통로와 깊은 거점 이벤트 동시 발생</description>
<mitre><id>TA0011</id></mitre>
</rule>
</group>
재침투 통로 이벤트와 커널·바이너리 변조 이벤트가 같은 호스트에서 하루 안에 함께 발생하면 최고 수준으로 묶어 경보하는 상관 예시입니다.
| 방향 | 기법 |
|---|---|
| 내→외 | 리버스 셸·C2·터널 |
| 외→내 | 리스너·웹셸 |
| 이웃 | 신뢰 관계 |
| 거점 | 커널 모듈·바이너리 교체 |
| 면접 포인트 | "통로는 방향별로 닫는다 — 깊은 거점이 보이면 정리보다 재설치" |
다음 편 439. 지속성·재침투 — 지속성 인벤토리(전수 점검) 작성 에서는 I영역의 모든 지속성 위치를 하나의 인벤토리 스크립트로 수집해 호스트별 지속성 목록을 만들고 사고 대응·근절 검증에 쓰는 방법을 다룹니다.
이전 편: 437. 지속성·재침투 — 근절 후 재침투(복귀) 징후 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점