시스템 보안 · 취약점 › I. 지속성 · 재침투 징후 · 30/50편 (전체 430/450)
학습 단계: 백도어·재침투 경로 탐지
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
바인드 셸은 리버스 셸과 반대로 서버가 포트를 열고 기다리는 방식입니다. 공격자는 언제든 그 포트로 접속해 다시 들어옵니다. 매직 패킷을 받을 때만 포트를 여는 은밀한 변형도 있습니다(T1205).
백도어 리스너 유형
① 단순 바인드 셸 : 0.0.0.0:31337 LISTEN (nc -l 류)
② 정상 포트 위장 : 8443·2222 등 그럴듯한 포트
③ 포트 노킹·매직 패킷 : 평소 닫혀 있다가 특정 패킷 수신 시 열림
(raw socket 감시 → ss 목록에 LISTEN 없음)
흔적: bind/listen 시스템 콜, 기준선 외 LISTEN, raw socket 프로세스
핵심: LISTEN 기준선 + raw socket 사용 프로세스까지 본다
③ 유형은 리스닝 포트가 보이지 않으므로 ss -lntp만으로는 놓칩니다. raw/packet 소켓을 연 프로세스를 따로 확인해야 합니다.
| 확인 | 명령 | 포인트 |
|---|---|---|
| 리스닝 | ss -lntup | 기준선 diff |
| 프로세스 | ls -l /proc/<pid>/exe | 실행 파일 경로 |
| raw 소켓 | ss -0 -p / cat /proc/net/packet | 패킷 감시 프로세스 |
| bind 감사 | auditctl -a always,exit -S bind -k reentry_listen | 포트·exe |
# 백도어 리스너 점검 (분석 방법)
sudo ss -lntup | awk 'NR>1{print $5,$7}' | sort > /tmp/listen_now
diff /root/baseline/listen.txt /tmp/listen_now
# raw/packet 소켓을 연 프로세스 (매직 패킷형 확인)
sudo ss -0 -p 2>/dev/null; sudo ss -w -p 2>/dev/null
# 리스너 실행 파일 확인
for p in $(sudo ss -lntp | grep -oE 'pid=[0-9]+' | cut -d= -f2 | sort -u); do echo "$p $(sudo readlink /proc/$p/exe)"; done
0.0.0.0:22 sshd · 0.0.0.0:443 httpd · 127.0.0.1:25 master (기준선 일치)
packet 소켓: NetworkManager(dhcp) 만
리스닝 포트와 프로세스가 기준선과 같고, raw/packet 소켓을 쓰는 프로세스가 알려진 시스템 서비스뿐인 상태가 정상입니다.
> 0.0.0.0:8443 users:(("httpd-worker",pid=6021)) exe=/var/tmp/.w/httpd-worker
packet 소켓: pid=6107 comm=kworker/0:2 exe=/usr/lib/.x/agent
백도어 리스너 분석 흐름입니다(가상의 예시).
[LISTEN 비교] 기준선 diff → 신규 리스너
↓
[raw 소켓] packet/raw 소켓 사용 프로세스 확인
↓
[실행 파일] /proc/<pid>/exe 경로·삭제 여부·해시
↓
[접속 기록] 해당 포트 인바운드 연결(방화벽·conntrack·accept 감사)
| 유형 | 탐지 수단 |
|---|---|
| 바인드 셸 | LISTEN 기준선 |
| 포트 위장 | 실행 파일 경로 |
| 매직 패킷 | raw/packet 소켓 |
커널 스레드는 /proc/<pid>/exe가 비어 있어야 정상입니다. kworker 이름인데 실행 파일 경로가 있다면 사용자 공간 프로세스의 위장입니다.
<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_i,persistence,">
<rule id="108290" level="13">
<if_sid>108000</if_sid>
<field name="audit.key">reentry_listen</field>
<field name="audit.exe" type="pcre2">^/(tmp|var/tmp|dev/shm|usr/lib/\.|home/)|/\.[^/]+/</field>
<description>임시·숨김 경로 실행 파일의 소켓 bind(백도어 리스너 의심)</description>
<mitre><id>T1205</id></mitre>
</rule>
</group>
bind 시스템 콜을 감사하고, 실행 파일이 임시·숨김 경로인 경우를 경보합니다. 정상 서비스의 bind는 패키지 경로이므로 오탐이 적습니다.
| 유형 | 확인 |
|---|---|
| 바인드 셸 | ss -lntup |
| 위장 포트 | exe 경로 |
| 매직 패킷 | ss -0 / packet 소켓 |
| 근거 | bind 감사 |
| 면접 포인트 | "보이는 LISTEN만이 리스너가 아니다 — packet 소켓을 연 프로세스까지 본다" |
다음 편 431. 지속성·재침투 — 웹셸 재침투 탐지 에서는 웹 루트에 남긴 웹셸을 통한 재침투를 웹 로그 패턴·웹서버 자식 프로세스·파일 생성 감시를 결합해 탐지하는 방법을 다룹니다.
이전 편: 429. 지속성·재침투 — 리버스 셸 재접속 시도 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점