📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 141편
이전 글: 140. SSH Traffic 이해 · 다음 글: 142. Port Scan Packet 분석

1. 개념

SMB가 TCP 445(및 NetBIOS 137~139)를 쓰는 구조, SMB1/2/3 버전별 보안 차이, 내부 확산에 쓰이는 원리는 73. SMB와 445 포트 — 내부 확산의 통로에서 다뤘습니다. 이 글은 Wireshark에서 SMB 대화 하나를 명령 단위로 읽는 방법을 다룹니다.

필터대상
smbSMB1 (구버전, 현재 환경에서 보이면 그 자체로 확인 대상)
smb2SMB2·SMB3 (Wireshark는 SMB3도 smb2로 해석)
ntlmsspSession Setup 안의 NTLM 인증 메시지
nbssTCP 139 또는 445 위의 NetBIOS 세션 헤더

2. 동작 원리

SMB2 세션은 정해진 순서로 진행되며, 각 요청·응답 쌍은 smb2.msg_id로 짝지어집니다.

Client 192.168.10.20                         Server 192.168.10.40:445
 NEGOTIATE (cmd 0)        ──→  ←──  방언(dialect) 결정: 2.1 / 3.0 / 3.1.1 등
 SESSION_SETUP (cmd 1)    ──→  ←──  STATUS_MORE_PROCESSING_REQUIRED (NTLM 챌린지)
 SESSION_SETUP (cmd 1)    ──→  ←──  STATUS_SUCCESS 또는 STATUS_LOGON_FAILURE
        ↓ 세션 ID(smb2.sesid) 부여
 TREE_CONNECT (cmd 3) \\srv\share ──→ ←── STATUS_SUCCESS 또는 STATUS_BAD_NETWORK_NAME
        ↓ Tree ID 부여
 CREATE (cmd 5) 파일명  ──→ ←── 파일 핸들(GUID)
 READ (cmd 8) / WRITE (cmd 9) ↔ 데이터
 CLOSE (cmd 6) → TREE_DISCONNECT (cmd 4) → LOGOFF (cmd 2)
  • 서버와 클라이언트가 SMB 3.x 암호화를 쓰면 Session Setup 이후 메시지가 SMB2 Transform Header로 감싸져 명령·파일명이 보이지 않습니다. 이때도 Negotiate와 Session Setup(NTLMSSP의 사용자·도메인·호스트명)은 보입니다.
  • 도메인 환경에서 Kerberos로 인증하면 ntlmssp 대신 kerberos(SPNEGO 안)로 보이며 계정명 위치가 다릅니다(72. LDAP·Kerberos 포트 — 인증 인프라 트래픽 개요).

3. 주요 특징

분석에 자주 쓰는 필드

필드의미필터 예
smb2.cmd명령 번호smb2.cmd == 3 (Tree Connect)
smb2.nt_status응답 상태 코드smb2.nt_status != 0
smb2.tree접근한 공유 경로smb2.tree contains "ADMIN$"
smb2.filenameCreate 요청의 파일·파이프 이름smb2.filename contains ".exe"
smb2.dialect협상된 SMB 버전smb2.dialect
ntlmssp.auth.username / ntlmssp.auth.domain / ntlmssp.auth.hostname인증에 쓴 계정·도메인·단말 이름ntlmssp.auth.username == "admin"

자주 보는 NT Status

값이름읽는 법
0x00000000STATUS_SUCCESS성공
0xc0000016STATUS_MORE_PROCESSING_REQUIRED인증 중간 단계 (정상)
0xc000006dSTATUS_LOGON_FAILURE인증 실패
0xc0000022STATUS_ACCESS_DENIED권한 없음
0xc00000ccSTATUS_BAD_NETWORK_NAME없는 공유 이름
0xc0000034STATUS_OBJECT_NAME_NOT_FOUND없는 파일 (검색 과정에서 정상적으로도 많이 발생)

4. 예시

실습 예시 — 본인 소유 실습망의 Samba 서버(설치는 73. SMB와 445 포트 — 내부 확산의 통로 참고)에 접속하는 트래픽을 분석합니다. 명령과 출력은 예시(값은 환경마다 다름)입니다. smbclient는 Rocky samba-client, Ubuntu smbclient 패키지에 있습니다.

# 캡처 (Rocky/Ubuntu 공통)
sudo tcpdump -i ens33 -nn -w /tmp/smb.pcapng 'tcp port 445'

# 다른 터미널: 공유 목록 조회 → 공유 접속 → 파일 업로드
smbclient -L //192.168.10.40 -U alice
smbclient //192.168.10.40/share -U alice -c 'put sample.txt'

# 1) 명령 흐름: 명령 번호, 상태, 공유, 파일명
tshark -r /tmp/smb.pcapng -Y 'smb2' -T fields -E header=y \
  -e frame.number -e smb2.cmd -e smb2.flags.response -e smb2.nt_status -e smb2.tree -e smb2.filename

# 2) 인증에 쓰인 계정·도메인·단말 이름
tshark -r /tmp/smb.pcapng -Y 'ntlmssp.messagetype == 0x00000003' -T fields \
  -e ip.src -e ntlmssp.auth.domain -e ntlmssp.auth.username -e ntlmssp.auth.hostname

# 3) 명령별 응답 시간 통계
tshark -r /tmp/smb.pcapng -q -z smb2,srt

1)번 결과를 읽을 때는 smb2.flags.response가 False인 줄이 요청, True인 줄이 응답입니다. -L 조회에서는 IPC$ 공유와 srvsvc 파이프에 대한 Create가 보이는데, 이는 공유 목록을 RPC로 요청하는 정상 과정입니다.

GUI에서는 Statistics → Service Response Time → SMB2로 명령별 건수를, File → Export Objects → SMB로 읽고 쓴 파일을 확인할 수 있습니다(암호화되지 않은 경우).

📷 [실습 화면 삽입 위치] 필터 smb2에 smb2.cmd, smb2.nt_status, smb2.tree, smb2.filename 열을 추가해 Negotiate부터 Write까지 보이는 Packet List

📷 [실습 화면 삽입 위치] Session Setup 요청의 NTLMSSP_AUTH 부분에서 Domain·User·Host 이름이 펼쳐진 Packet Details


5. 보안 관점

패킷에서 보이는 것정상일 수 있는 경우추가 확인이 필요한 경우
smb (SMB1) 협상레거시 장비(복합기 등)SMB1이 비활성화돼야 할 서버와의 통신
STATUS_LOGON_FAILURE 반복저장된 비밀번호 만료여러 계정으로 짧은 시간 반복
ADMIN$, C$ Tree Connect관리 도구·배포 시스템일반 단말끼리의 관리 공유 접근
svcctl 파이프 Create + 실행 파일 Write소프트웨어 배포원격 서비스 생성 형태의 원격 실행 (73. SMB와 445 포트 — 내부 확산의 통로의 내부 확산 원리)
한 단말이 여러 서버 445로 연결파일 서버·DC 접근평소 없던 다수 대상 (05 영역 스캔 징후)

6. SOC 관점

흔적 위치확인할 수 있는 것
패킷 캡처계정·단말 이름, 공유 경로, 파일 이름, 명령 흐름, 상태 코드
Windows 보안 이벤트로그온(4624/4625), 공유 접근(5140, 5145는 감사 정책 필요)
Samba 로그인증 실패, 공유 접속 (로그 수준 설정에 따라 다름)
IDS/IPSSMB1 사용, 관리 공유 접근, 원격 서비스 생성 패턴 이벤트

관제자가 확인할 질문

  • 인증에 쓰인 계정과 단말 이름(ntlmssp.auth.hostname)이 출발지 IP의 실제 사용자·자산과 일치하는가?
  • Tree Connect 대상이 일반 공유인가, 관리 공유(ADMIN$, C$, IPC$)인가?
  • Write된 파일 이름과 크기, 이후 같은 대상에 이어진 통신은 무엇인가?

오탐 주의: STATUS_OBJECT_NAME_NOT_FOUND는 탐색기가 파일 존재 여부를 확인하면서 대량으로 발생합니다. IPC$ 접속도 공유 목록 조회 등 정상 동작에 포함되므로 단독으로 이상 판단하지 않습니다.


7. 핵심 정리

  • Wireshark는 SMB2와 SMB3를 모두 smb2로 해석하며, SMB1은 smb로 따로 보입니다.
  • 세션은 Negotiate → Session Setup → Tree Connect → Create → Read/Write → Close 순서로 읽습니다.
  • smb2.cmd, smb2.nt_status, smb2.tree, smb2.filename과 NTLMSSP 필드로 누가·어디에·무엇을 했는지 확인합니다.
  • SMB3 암호화 시에는 Session Setup까지만 보이고 이후는 Transform Header로 감싸집니다.
  • 관리 공유 접근과 원격 서비스 생성 형태는 호스트 이벤트와 교차 확인해 판단합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글