시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 6/50편 (전체 406/450)
학습 단계: 지속성·재침투 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
지속성이 "안에 남겨 둔 장치"라면 재침투(re-entry)는 "밖에서 다시 들어오는 길"입니다. 재침투 경로는 방향(내→외, 외→내)과 수단(계정, 서비스, 백도어)으로 나눌 수 있습니다.
재침투 경로 유형
외 → 내 (인바운드)
· 유효 계정 재사용 (탈취 비밀번호·키) T1078
· 원격 서비스 (SSH·VPN·RDP) T1133 / T1021.004
· 백도어 리스너·웹셸 T1505.003
내 → 외 (아웃바운드)
· 리버스 셸·C2 비컨이 공격자에게 연결 T1071
· 터널(SSH -R, 프록시) T1572
핵심: 인바운드는 "접속 기록", 아웃바운드는 "연결 시작 프로세스"로 본다
분석 축은 누가(계정·키), 어디서(출발지·목적지), 무엇으로(프로세스·서비스), 언제(주기·시간대) 네 가지입니다.
| 경로 | 주 로그 | 핵심 필드 |
|---|---|---|
| 유효 계정 | /var/log/secure, auth.log | 계정·출발지 IP·인증 방식 |
| SSH 키 | sshd(LogLevel VERBOSE) | 키 지문 |
| 웹셸 | access_log + execve | URI·웹서버 자식 프로세스 |
| 리스너 | ss -lntp, auditd bind | 포트·프로세스 |
| 리버스 연결 | auditd connect, 방화벽 | 목적지 IP·포트·exe |
# 재침투 경로별 현황 확인 (분석 방법)
# 인바운드: 최근 SSH 성공 로그인의 출발지·방식
sudo grep -E 'Accepted (password|publickey)' /var/log/secure | awk '{print $9,$11,$7}' | sort | uniq -c
# 리스너: 기준선에 없는 리스닝 포트
sudo ss -lntup
# 아웃바운드: 셸·인터프리터가 맺은 외부 연결
sudo ss -tnp state established | grep -E 'bash|sh|python|perl|nc'
$ grep Accepted /var/log/secure (출발지 = 관리망 10.10.1.0/24)
$ ss -lntup (sshd:22, httpd:443 — 기준선과 동일)
접속 출발지가 관리망·승인 대역이고, 리스닝 포트와 외부 연결이 기준선 범위 안에 있는 상태가 정상입니다.
Accepted publickey for root from 203.0.113.50 (신규 출발지)
ss: LISTEN 0.0.0.0:31337 users:(("kworkerd",pid=2211))
ss: ESTAB 10.10.2.15:41922 → 198.51.100.7:443 users:(("bash",pid=3010))
재침투 경로 분석 축입니다(가상의 예시).
[인바운드] 접속 로그 → 누가(계정·키 지문) · 어디서(IP)
[리스너] ss·auditd bind → 무엇이(프로세스) 포트를 열었나
[아웃바운드] auditd connect → 무엇이 · 어디로 · 얼마나 자주
↓
[결합] 같은 호스트·같은 시간대의 경로를 묶어 재침투 체인 확인
| 축 | 질문 |
|---|---|
| 누가 | 어떤 계정·키인가 |
| 어디서 | 출발지·목적지는 승인 대역인가 |
| 무엇으로 | 어떤 프로세스·서비스인가 |
| 언제 | 주기적인가, 업무 시간 외인가 |
경로 하나만 막으면 다른 경로로 돌아오므로, 네 축을 모든 경로에 똑같이 적용해 전수 확인합니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108050" level="10">
<if_sid>108000</if_sid>
<field name="audit.key">reentry_net</field>
<field name="audit.exe" type="pcre2">/(ba)?sh$|/python[0-9.]*$|/perl$|/nc$|/ncat$</field>
<description>셸·인터프리터의 외부 연결 시도(재침투 채널 의심)</description>
<mitre><id>T1071</id></mitre>
</rule>
</group>
connect 시스템 콜을 reentry_net 키로 감사하고, 연결을 시작한 실행 파일이 셸·인터프리터인 경우를 높은 레벨로 경보합니다.
| 방향 | 경로 |
|---|---|
| 외→내 | 유효 계정·원격 서비스·리스너·웹셸 |
| 내→외 | 리버스 셸·C2·터널 |
| 분석 축 | 누가·어디서·무엇으로·언제 |
| 면접 포인트 | "재침투는 방향과 수단으로 분류 — 비밀번호 변경만으로는 키·백도어 경로가 남는다" |
다음 편 407. 지속성·재침투 — 정상 자동화와 악성 지속성의 구분 에서는 백업·모니터링·배포 도구가 만드는 정상 자동 실행과 공격자의 지속성을 작성 주체·경로·내용·이력으로 구분하는 방법을 다룹니다.
이전 편: 405. 지속성·재침투 — 지속성 메커니즘 분류와 MITRE ATT&CK 매핑
📚 시리즈 전체 보기: 시스템 보안 · 취약점