📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 67편
이전 글: 66. Telnet과 평문 프로토콜의 위험 · 다음 글: 68. POP3

1. 개념

SMTP(Simple Mail Transfer Protocol)는 메일을 보내고 전달하는 프로토콜입니다(RFC 5321). 메일 포트 전체(25·587·465·110·995·143·993)의 역할 구분, 봉투와 헤더의 차이, Postfix 로그 추적은 82. 메일 프로토콜 SMTP·POP3·IMAP에서 다뤘습니다.

이 글은 SMTP라는 프로토콜의 대화 규칙만 봅니다. 누가 누구에게 말하는지, 서버가 무엇을 할 수 있다고 알리는지, 응답 숫자가 무엇을 뜻하는지입니다.

구성 요소역할SMTP 관련 포트
MUA (Mail User Agent)사용자의 메일 프로그램587/465로 제출
MSA (Mail Submission Agent)사용자 제출을 받아 인증587(RFC 6409), 465(RFC 8314)
MTA (Mail Transfer Agent)서버 간 전달(릴레이)25
MDA (Mail Delivery Agent)수신 메일함에 저장SMTP 이후 단계

2. 동작 원리

SMTP는 텍스트 명령 → 3자리 응답 코드를 한 줄씩 주고받는 구조입니다. 서버가 먼저 220 인사말을 보내고, 클라이언트가 EHLO로 대화를 시작합니다.

클라이언트(MTA/MUA)                               서버 192.168.10.30:25
  │ ── TCP 연결 ──────────────────────────────────→ │
  │ ←─ 220 준비됨 (서버 배너) ───────────────────── │
  │ ── EHLO client.example.com ───────────────────→ │
  │ ←─ 250-확장 기능 목록 (STARTTLS, AUTH, SIZE…) ─ │
  │                                                │
  │ ── STARTTLS ──────────────────────────────────→ │  ← 선택
  │ ←─ 220 Ready to start TLS ──────────────────── │
  │ ⇄  TLS Handshake → 이후 암호화                   │
  │ ── EHLO (다시) ─────────────────────────────────→ │  ← TLS 후 재협상
  │ ── AUTH / MAIL FROM / RCPT TO / DATA ─────────→ │
  │ ←─ 250 queued ──────────────────────────────── │
  │ ── QUIT → 221 ────────────────────────────────→ │
  • STARTTLS는 같은 포트에서 평문으로 시작해 TLS로 전환하는 방식입니다(RFC 3207). 전환 전까지의 배너·EHLO 응답은 네트워크에서 그대로 보입니다.
  • TLS 전환 후 클라이언트는 EHLO를 다시 보내며, 서버는 이때 AUTH 같은 기능을 새로 알릴 수 있습니다.
  • 465번은 접속 즉시 TLS로 시작하므로 SMTP 명령이 평문 구간에 나타나지 않습니다.

3. 주요 특징

응답 코드는 첫 자리로 결과를, 둘째 자리로 분류를 나타냅니다.

첫 자리의미예
2xx성공220 준비, 250 완료, 221 종료
3xx추가 입력 필요354 본문 입력 시작, 334 AUTH 다음 단계
4xx일시적 실패 (재시도 대상)421 서비스 불가, 450 메일함 일시 사용 불가, 451 처리 오류
5xx영구적 실패530 인증 필요, 535 인증 실패, 550 거부, 554 트랜잭션 실패

응답 뒤의 5.7.1 같은 숫자는 확장 상태 코드(RFC 3463)입니다. 클래스.주제.상세 구조이며, 주제 7은 보안·정책 관련(예: 릴레이 거부, 인증 문제)이라 관제에서 특히 눈여겨볼 값입니다.

EHLO 확장 기능은 서버가 지원하는 기능을 알리는 목록입니다.

확장의미관제 포인트
STARTTLSTLS 전환 가능서버 간 구간에서 이 줄이 사라지면 강제 평문화 가능성
AUTH PLAIN LOGIN지원 인증 방식평문 구간에서 AUTH가 보이면 자격 증명 노출
SIZE 10240000최대 메시지 크기—
PIPELINING명령 연속 전송 허용—
8BITMIME, SMTPUTF88비트·UTF-8 메시지—
VRFY, EXPN(명령)주소 확인·목록 확장계정 존재 여부 확인에 악용 가능

4. 예시

실습 예시 — 본인 소유 VM의 로컬 전용 Postfix(설치는 82. 메일 프로토콜 SMTP·POP3·IMAP 참고)에서 EHLO 응답과 정책 설정을 확인합니다.

# EHLO 응답 확인 (-C: 줄 끝 CRLF)
nc -C 127.0.0.1 25
# 접속 후 입력: EHLO lab.local  →  QUIT

# STARTTLS 전환 후 응답 확인 (TLS가 설정된 경우)
openssl s_client -starttls smtp -connect 127.0.0.1:25 -quiet

# VRFY 명령 허용 여부와 릴레이 제한 정책 (Rocky/Ubuntu 공통)
postconf disable_vrfy_command smtpd_relay_restrictions

EHLO 응답 형식 예시(값은 환경마다 다름):

220 mail.lab.local ESMTP Postfix
EHLO lab.local
250-mail.lab.local
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 SMTPUTF8

마지막 줄만 250 (공백)이고 나머지는 250-(하이픈)입니다. 하이픈은 "응답이 아직 이어진다"는 뜻입니다. 여기서 VRFY가 보이면 disable_vrfy_command = yes로 끌 수 있습니다.

거부 응답 형식 예시(값은 환경마다 다름):

RCPT TO:<user@example.org>
554 5.7.1 <user@example.org>: Relay access denied

📷 [실습 화면 삽입 위치] nc로 EHLO를 보냈을 때 250- 확장 목록이 출력된 화면


5. 보안 관점

  • 오픈 릴레이: 인증 없이 제3자 도메인으로의 전달을 허용하는 MTA는 스팸 중계에 악용되고 차단 목록에 오릅니다. 554 5.7.1 Relay access denied는 정책이 제대로 막고 있다는 증거입니다.
  • 계정 확인: VRFY, EXPN, 그리고 RCPT TO 응답 차이(250 vs 550)로 계정 존재 여부를 추정할 수 있습니다. 한 출발지가 다양한 수신자로 RCPT만 반복하고 DATA 없이 끝나면 확인 시도를 의심합니다.
  • STARTTLS 제거: 중간에서 EHLO 응답의 STARTTLS 줄을 지우면 서버 간 전달이 평문으로 진행될 수 있습니다. MTA-STS, DANE 같은 정책으로 보완합니다.
  • 평문 AUTH: AUTH PLAIN의 값은 Base64 인코딩일 뿐 암호화가 아닙니다. TLS 전환 전에 AUTH가 보이면 자격 증명 노출입니다.

6. SOC 관점

흔적 위치확인할 수 있는 것
MTA 로그응답 코드·확장 상태 코드, 거부 사유, AUTH 결과
메일 게이트웨이차단 사유, TLS 사용 여부, 발신 IP 평판
IDS/NSM평문 구간의 배너·EHLO·명령, STARTTLS 사용 여부
방화벽25/587/465 연결의 출발지·목적지·빈도

관제자가 확인할 질문

  • 이 연결은 MTA 간 전달(25)인가, 사용자 제출(587/465)인가? 출발지가 그 역할에 맞는가?
  • 5xx 중 5.7.x(정책·보안) 거부가 특정 출발지에서 반복되는가?
  • 한 세션에서 RCPT TO만 많고 DATA가 없는가?
  • 서버 간 구간인데 STARTTLS 없이 평문으로 전달되었는가?

오탐 주의: 4xx는 그레이리스팅(처음 보는 발신 서버를 일부러 일시 거부)이나 수신 서버 과부하에서도 정상적으로 발생합니다. 정상 MTA는 일정 시간 뒤 재시도하므로, 재시도 여부로 구분합니다.


7. 핵심 정리

  • SMTP는 명령 한 줄과 3자리 응답 코드를 주고받는 텍스트 프로토콜이며, 서버의 220 배너로 시작합니다.
  • 2xx 성공, 3xx 추가 입력, 4xx 일시 실패, 5xx 영구 실패이며, 확장 상태 코드의 x.7.x는 보안·정책 관련입니다.
  • EHLO 응답은 서버의 기능 목록(STARTTLS, AUTH, SIZE 등)이며 평문 구간에서 보입니다.
  • STARTTLS는 같은 포트에서 평문 → TLS로 전환하는 방식이라 전환 전 구간은 관찰 가능하고, 제거 공격의 대상이 됩니다.
  • 관제에서는 릴레이 거부, RCPT만 반복되는 세션, 평문 AUTH, STARTTLS 누락을 주의합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글