SMTP/POP3の観測
前置き
メール送信を担うプロトコルはSMTPです。 SMTPの基本的な機能はメールを受け取って宛先のユーザーのメールボックスに届けることです。
メール受信を担うプロトコルはPOP3もしくはIMAPです。 どちらのプロトコルもユーザー認証を行い適切なメールボックスに蓄積されているメールを取り出すことが出来ます。 以下の図はPOP3によるシンプルなメール受信を示すものですが、IMAPはメール受信だけでなくメールサーバ側にサブフォルダを作成したり一部のメールだけを取り出す事が可能です。
メールクライアントの設定
手元の研修用環境LinuxはVirtualBox NATを通じてenp0s3
でメール関連プロトコルを待ち受けています。
プロトコル | ポート |
---|---|
SMTP | 25 |
POP3 | 110 |
IMAP | 143 |
メールサーバのドメインはsample.local
で内部にsshuser
アカウントが存在します。
これを宛先にすることでメールの動作確認が可能です。
パケットの観測
- SMTPメッセージ
取得したパケットを右クリック
>追跡
>TCPストリーム
で一連のメッセージをまとめて表示します。
サーバからのメッセージが青く、クライアントからのメッセージが赤く表示されます。
SMTPメッセージにはユーザー認証が無くメールをただ送信するだけです。
- POP3(アプリケーション層)
POP3はサーバに接続して最初にユーザー認証を行っています。 メールボックスに蓄積されているメールの件数を確認してメールを全件受信しています。
- IMAP(アプリケーション層)
IMAPはPOP3よりも複雑なメッセージをやり取りしています。
- MIME
メールはテキストデータだけとは限らず画像や動画のようなデータが添付されることもあります。
そのようなデータはMIME
という方式でエンコードされて一時的にテキストデータとして相手に受け渡されます。
受信側ではMIME
のルールに従ってデータをデコードし元の画像や動画を再生します。
以下のpythonコードはMIMEエンコードされたデータを元のPNG画像ファイルにデコードするものです。 このような手順でメールクライアントは受信したエンコードデータを元のデータに再生しています。
import base64
mime = "iVBORw0KGgoAAAANSUhEUgAAADgAAAATCAIAAABKj1m8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAtSURBVEhL7c5BDQAwEASh+je9NcHnkkEBb0cU1YpqRbWiWlGtqFZUK6oVtbYP/o9sPe0vjZgAAAAASUVORK5CYII="
with open("F:\My Documents\Downloads\decode.png", "wb") as f:
f. write(base64.b64decode(mime))