메일헤더 분석하기
가끔 자신의 메일주소를 발신자로 한 스팸이나 바이러스 메일이 발송되는 경우가 있는데, 이런 경우 자신의 PC가 바이러스에 감염됐다고 단정할 수 있을까? 실제로 스팸이나 바이러스 메일 등은 송신자와 수신자를 수시로 바꿔 전송되기 때문에 메일헤더를 제대로 이해하지 못하면 어디에서 전송된 메일인지 알 수 없다. 즉, 발신자의 메일 주소는 쉽게 위조할 수 있기 때문에 발신자의 메일주소 만으로는 아무런 의미가 없다는 것이다. 항상 접하면서도 결코 쉽지만은 않은 메일헤더를 분석함으로써 메일의 전송경로를 추적해 보도록 하자.
가끔 자신의 메일주소를 발신자로 한 스팸이나 바이러스 메일이 발송되는 경우가 있는데, 이런 경우 자신의 PC가 바이러스에 감염됐다고 단정할 수 있을까? 실제로 스팸이나 바이러스 메일 등은 송신자와 수신자를 수시로 바꿔 전송되기 때문에 메일헤더를 제대로 이해하지 못하면 어디에서 전송된 메일인지 알 수 없다. 즉, 발신자의 메일 주소는 쉽게 위조할 수 있기 때문에 발신자의 메일주소 만으로는 아무런 의미가 없다는 것이다. 항상 접하면서도 결코 쉽지만은 않은 메일헤더를 분석함으로써 메일의 전송경로를 추적해 보도록 하자.
메일의 전송과정
이메일은 발신자로부터 수신자까지 여러 과정을 거쳐 전송되는데, 각 단계를 간단하게 나타내면 다음과 같다.
발송자 → MUA → MTA → 라우팅 → MTA → MDA → MUA → 수신자
① ② ③ ④ ⑤ ⑥
메일의 전송 과정에 참여하는 주요 요소는 다음과 같다.
MUA(Mail User Agent) : MTA와 사용자 간의 인터페이스를 제공하는데, 쉽게 이야기하면 PC에서 사용하는 메일 프로그램이라고 생각하면 된다. 대표적인 예로 유닉스의 메일프로그램인 /bin/mail, elm, pine 이나 유도라, 마이크로소프트 아웃룩 익스프레스 등이 있다.
MTA(Mail Transfer Agent) : 메일 메시지를 저장하고 포워딩하거나 전송하는 역할을 한다. 대표적인 예로 일반적인 메일서버 프로그램인 sendmail이나 qmail 또는 마이크로소프트 서버 등이 있다.
MDA(Mail Delivery Agent) : sendmail 등의 MTA가 서버에서 수신한 메일을 /var/spool/mail/user 등과 같은 사용자의 로컬메일 박스 파일로 옮기는 역할을 한다. 대표적인 예로 procmail 이 있다.
①번 단계처럼 사용자가 MUA를 이용해 메일을 작성하는 과정에서는 다음과 같은 메일 헤더가 사용된다.
From, To, Cc, Bcc, Subject, Reply-to, Priority, Precedence, Resent-To, Resent-Cc
②번 단계처럼 MUA를 통해 메일을 발송할 때는 다음과 같은 헤더가 자동으로 추가된다.
Date, From, Sender, X-Mailer, Mime-Version, Content-Type, Content-Transfer-Encoding
③번 단계와 같이 MUA를 통해 발송된 메일을 MTA가 수신할 때는 다음과 같은 추가적인 헤더가 포함된다.
From, Date, Message-Id, Received, Return-Path
MTA에서 다른 MTA로 전송되는 과정에서는 다음과 같은 헤더가 추가된다.
Received
끝으로 ④ 단계와 같이 MTA가 MDA로 전송하는 과정에서 다음과 같은 헤더가 추가된다.
Apparently-To, From
메일헤더 보기
많이 사용하는 아웃룩 익스프레스에서 메일헤더를 확인하려면 해당 메시지를 선택한 후 마우스 오른쪽 버튼 메뉴에서 속성→자세히를 선택하면 (화면 1)과 같이 메일 헤더를 확인할 수 있다.
마이크로소프트 아웃룩을 사용하는 경우에는 해당 메시지에서 마우스 오른쪽 버튼 메뉴에서 옵션을 선택하면 (화면 2)와 같이 ‘인터넷 머리글(H)’이란 부분을 볼 수 있는데, 이 부분이 바로 헤더다.
메일 헤더는 포털 등에서 제공하는 웹 메일에서도 확인할 수 있는데, 한메일의 경우 (화면 3)과 같이 메시지 제목을 선택한 후 해당 메일에서 ‘메일 헤더보기’라는 메뉴를 선택하면 된다.
스팸 메일 헤더 분석
이제 한 스팸 메일의 헤더를 예로 들어 헤더의 의미를 분석해 보자.
Received: from medentech.isdn.esat.net (medsvr01.medentech.com)[193.120.114.219]
by relay03.avnetcom.co.kr(8.11.6/8.11.6) with ESMTP id 18qi5I-0002Is-00 for mkeh@avnetcom.co.kr; Wed, 05 Mar 2007 23:14:01 +0000
Received: from test.com ([200.59.38.130]) by medsvr01.medentech.com
with Microsoft SMTPSVC(5.0.2195.5329); with SMTP id h093ANn04454; for mkeh@avnetcom.co.kr; Wed, 5 Mar 2007 23:10:53 +0000
Return-Path: hahaha@tt.co.kr
From: "섹시마스터" <hahaha@tt.co.kr>
To: "mkeh@avnetcom.co.kr" <mkeh@avnetcom.co.kr>
Date: 5 Mar 2007 23:10:55 +0000
Message-ID: <MEDSVR01kNsjUHQHh2w00000278@medsvr01.medentech.com>
Subject: 지금 바로 확인해 보세요.
각 줄의 메일 헤더가 각각 어떤 의미를 가지고 있는지 순서대로 알아보도록 하자.
Received: from medentech.isdn.esat.net
자기 자신이 medentech.isdn.esat.net 라고 언급한 호스트(이는 발신 호스트에서 수신 호스트에게 ‘HELO 호스트 이름’ 또는 ‘EHLO 호스트 이름’ 형식으로 알려준다)로부터 메일을 수신했다는 의미다. 이는 다음과 같이 telnet으로 25/tcp로 접속해 HELO로 응답하는 것을 확인할 수 있다.
# telnet mail.tt.co.kr 25
Trying 211.47.68.99...
Connected to mail.tt.co.kr.
Escape character is '^]'.
220 mail.tt.co.kr ESMTP
HELO client.tt.co.kr
250 mail.tt.co.kr Hello [211.47.66.50], pleased to meet you
(medsvr01.medentech.com)[193.120.114.219]
실제 IP는 193.120.114.219이고, 호스트의 이름은 medsvr01.medentech.com이라는 것을 의미한다.
수 신하는 메일서버에서는 발신 호스트의 IP인 193.120.114.219에 대한 Reverse DNS 질의(호스트 이름에 대한 IP 주소 질의를 Forward DNS질의라 하고 반대로 IP 주소에 대한 호스트 이름 질의를 Reverse DNS 질의라 한다.)를 이용해 호스트의 이름이 medsvr01.medentech.com이라는 것을 확인한 것이다. 만약 Reverse DNS 질의에서 호스트 이름이 응답되지 않을 경우에는 공란으로 나타난다.
by relay03.avnetcom.co.kr(8.11.6/8.11.6)
메일을 수신한 호스트는 relay03.avnetcom.co.kr이고, 메일 프로그램의 버전은 8.11.6이라는 것을 알 수 있다. 버전 정보로 보아 sendmail로 예상된다.
with ESMTP id 18qi5I-0002Is-00
esmtp 프로토콜을 통해 수신하는 호스트에서 해당 메시지를 구별하기 위해 18qi5I-0002Is-00라는 ID를 부여했다. ID는 해당 호스트에서 내부적으로 사용하기 위해 쓰이는데, 관리자가 메일의 로그파일에서 해당 메일을 검색할 때 사용되기도 한다.
for mkeh@avnetcom.co.kr
메시지가 전송될 메일 주소다.
Wed, 05 Mar 2007 23:14:01 +0000
이 메일이 전송된 시각이다. 2007년 3월 5일 오후 11시 14분 1초에 전송됐다는 것을 알 수 있다.
Return-Path: hahaha@tt.co.kr
메일 전송에 실패했을 경우 Return-Path에서 지정한 주소로 반송된다는 의미다.
Received: from test.com ([200.59.38.130]) by medsvr01.medentech.com with Microsoft SMTPSVC(5.0.2195.5329); with SMTP id h093ANn04454; for mkeh@avnetcom.co.kr; Wed, 5 Mar 2007 23:10:53 +0000
IP가 200.59.38.130이고 호스트 이름이 test.com인 호스트에서 호스트 이름이 medsvr01.medentech.com인 메일서버로 메일이 전송됐다는 것을 의미한다. 2007년 3월 5일 11시 10분경에 전송됐다. 즉, test.com에서 medsvr01.medentech.com을 경유해 relay03.avnetcom.co.kr으로 전송까지는 약 4분 정도 소요된 것을 알 수 있다. 그러나 서버의 시간이 정확하게 설정돼 있지 않으면 의미가 없을 수 있다. 해당 메일서버 프로그램은 Microsoft SMTPSVC이며, 버전은 5.0.2195.5329라는 것을 알 수 있다.
Message-ID: <MEDSVR01kNsjUHQHh2w00000278@medsvr01.medentech.com>
Message-ID: 또는 Message-Id나 Message-id로 사용되는데, 이 ID는 메일 전송 내내 해당 메일을 인식하고 구분하기 위한 용도로 사용된다. Received: 헤더에 있는 SMTP ID와는 다른 것이라는 점에 주의해야 한다. SMTP ID는 특정한 메일 전송과정에만 의미가 있는 반면(따라서 SMTP ID는 다른 호스트에게는 의미가 없다), Message-ID는 메일전송이 완료될 때까지 의미를 가지고 있다. 때때로 Message-ID에는 발송자의 메일 주소가 일부 포함되기도 한다.
메일 헤더에서 가장 주목해야 할 부분은 바로 Received: from 부분이다. Received: 는 각각의 MTA가 릴레이(relay)를 하면서 하나씩 추가되는데, 메일 전송 경로를 추적할 때 매우 유용하게 사용된다. 앞서 살펴본 바와 같이 형식은 다음과 같다.
Received: ["from" 발송 호스트] "by" 수신 호스트 ["with" 메일 프로토콜] "id" 문자열 ["for 수신자메일주소" ] ";" 날짜 및 시각
또한 다음과 같은 형식도 사용할 수 있다.
Received: from 발송호스트의 이름([발송 호스트의 IP 주소]) by 수신 호스트 (수신서버의 메일 소프트웨어)
Received: from은 제일 아래 부분에서 위쪽으로 순서대로 메일이 전송된 것이므로, 예제 헤더의 경우 실제 해당 메일을 처음 발송한 곳은 제일 아래쪽에 있는 Received: from 인 test.com ([200.59.38.130])이라는 것을 알 수 있다. 따라서 해당 메일을 처음 발송한 곳을 알려면 메일 헤더에서 제일 밑에 보이는 Received: from 부분을 살펴보면 되는 것이다.
그러나 전문적인 스패머라면 이런 추적을 어렵게 하기 위해 메일 발송 전에 다음 예제의 ①, ②와 같이 위조된 Received: 헤더를 추가하는 경우가 많다.
③ Received: from galangal.org ([104.128.23.115]) by mail.bieberdorf.edu (8.8.5)...
② Received: from nowhere by fictitious-site (8.8.3/8.7.2)...
① Received: No Information Here, Go Away!
메일 발송자의 입장에서 볼 때 이미 메일 서버를 통해 발송된 메일에 대해서는 헤더 추가나 변경 등 메일에 대한 제어를 할 수 없고, 또한 Received: 헤더는 메일 전송과 함께 밑에서 위로 순서대로 추가된다. 따라서 만약 위조됐다면, 위조된 부분은 통상적으로 아래 부분에 보이게 될 것이다. 만약 이러한 경우라면 이는 곧 다른 말로 Received: 헤더 부분에서 위조된 부분 이하부터는 의미가 없다는 것을 뜻한다. 따라서 헤더 경로를 추적할 때에는 아래에서부터 위로 살펴보는 것과 더불어 위에서 아래로의 경로도 함께 살펴봐야 한다.