📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 141편
이전 글: 140. SSH Traffic 이해 · 다음 글: 142. Port Scan Packet 분석
SMB가 TCP 445(및 NetBIOS 137~139)를 쓰는 구조, SMB1/2/3 버전별 보안 차이, 내부 확산에 쓰이는 원리는 73. SMB와 445 포트 — 내부 확산의 통로에서 다뤘습니다. 이 글은 Wireshark에서 SMB 대화 하나를 명령 단위로 읽는 방법을 다룹니다.
| 필터 | 대상 |
|---|---|
smb | SMB1 (구버전, 현재 환경에서 보이면 그 자체로 확인 대상) |
smb2 | SMB2·SMB3 (Wireshark는 SMB3도 smb2로 해석) |
ntlmssp | Session Setup 안의 NTLM 인증 메시지 |
nbss | TCP 139 또는 445 위의 NetBIOS 세션 헤더 |
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)
ntlmssp 대신 kerberos(SPNEGO 안)로 보이며 계정명 위치가 다릅니다(72. LDAP·Kerberos 포트 — 인증 인프라 트래픽 개요).분석에 자주 쓰는 필드
| 필드 | 의미 | 필터 예 |
|---|---|---|
smb2.cmd | 명령 번호 | smb2.cmd == 3 (Tree Connect) |
smb2.nt_status | 응답 상태 코드 | smb2.nt_status != 0 |
smb2.tree | 접근한 공유 경로 | smb2.tree contains "ADMIN$" |
smb2.filename | Create 요청의 파일·파이프 이름 | smb2.filename contains ".exe" |
smb2.dialect | 협상된 SMB 버전 | smb2.dialect |
ntlmssp.auth.username / ntlmssp.auth.domain / ntlmssp.auth.hostname | 인증에 쓴 계정·도메인·단말 이름 | ntlmssp.auth.username == "admin" |
자주 보는 NT Status
| 값 | 이름 | 읽는 법 |
|---|---|---|
| 0x00000000 | STATUS_SUCCESS | 성공 |
| 0xc0000016 | STATUS_MORE_PROCESSING_REQUIRED | 인증 중간 단계 (정상) |
| 0xc000006d | STATUS_LOGON_FAILURE | 인증 실패 |
| 0xc0000022 | STATUS_ACCESS_DENIED | 권한 없음 |
| 0xc00000cc | STATUS_BAD_NETWORK_NAME | 없는 공유 이름 |
| 0xc0000034 | STATUS_OBJECT_NAME_NOT_FOUND | 없는 파일 (검색 과정에서 정상적으로도 많이 발생) |
실습 예시 — 본인 소유 실습망의 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
| 패킷에서 보이는 것 | 정상일 수 있는 경우 | 추가 확인이 필요한 경우 |
|---|---|---|
smb (SMB1) 협상 | 레거시 장비(복합기 등) | SMB1이 비활성화돼야 할 서버와의 통신 |
STATUS_LOGON_FAILURE 반복 | 저장된 비밀번호 만료 | 여러 계정으로 짧은 시간 반복 |
ADMIN$, C$ Tree Connect | 관리 도구·배포 시스템 | 일반 단말끼리의 관리 공유 접근 |
svcctl 파이프 Create + 실행 파일 Write | 소프트웨어 배포 | 원격 서비스 생성 형태의 원격 실행 (73. SMB와 445 포트 — 내부 확산의 통로의 내부 확산 원리) |
| 한 단말이 여러 서버 445로 연결 | 파일 서버·DC 접근 | 평소 없던 다수 대상 (05 영역 스캔 징후) |
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | 계정·단말 이름, 공유 경로, 파일 이름, 명령 흐름, 상태 코드 |
| Windows 보안 이벤트 | 로그온(4624/4625), 공유 접근(5140, 5145는 감사 정책 필요) |
| Samba 로그 | 인증 실패, 공유 접속 (로그 수준 설정에 따라 다름) |
| IDS/IPS | SMB1 사용, 관리 공유 접근, 원격 서비스 생성 패턴 이벤트 |
관제자가 확인할 질문
ntlmssp.auth.hostname)이 출발지 IP의 실제 사용자·자산과 일치하는가?ADMIN$, C$, IPC$)인가?오탐 주의: STATUS_OBJECT_NAME_NOT_FOUND는 탐색기가 파일 존재 여부를 확인하면서 대량으로 발생합니다. IPC$ 접속도 공유 목록 조회 등 정상 동작에 포함되므로 단독으로 이상 판단하지 않습니다.
smb2로 해석하며, SMB1은 smb로 따로 보입니다.smb2.cmd, smb2.nt_status, smb2.tree, smb2.filename과 NTLMSSP 필드로 누가·어디에·무엇을 했는지 확인합니다.