「ぷらら」メールサーバが
Transix DS-Liteからの特定ポートアクセスをblockingしていた。「ぷらら」サポートセンタとのやり取りで、「スパムメール対策」が関係するかもしれないので「メール接続認証」を確認するように言われた。それ以前の「接続」問題だったのだがopensslを使って接続できる「465ポート」で「認証」と「メール送信」を行い、Wiresharkでパケット確認をしてみた。ポートブロック解除後にポート587にstartTLSでSMTP送信のパケットキャプチャ確認もしてみた。
(1)「認証用」データを作る
「ユーザID」(ぷららはメールアドレス)と「パスワード」から
SMTP認証を参考に認証用データを作る(macOS Mojave)。
printf "%s\0%s\0%s" someone@any.plala.or.jp someone@any.plala.or.jp PASSWORD | base64 | tr -d '\n' | pbcopy
接続時に使用するのでコピーしておく(macOSでは、「pbcopy」でクリップボードにコピーされる)。
(2)「openssl s_client」でメールサーバに接続し、SMTP認証を行う
echo -e "auth plain c29tZW9uZUBhbnkucGxhbGEub3IuanAAc29tZW9uZUBhbnkucGxhbGEub3IuanAAUEFTU1dPUkQ=\nquit" | openssl s_client -quiet -crlf -connect secure.plala.or.jp:465 2> /dev/null
220 msc11.plala.or.jp ESMTP server ready Mon, 17 Jun 2019 17:25:49 +0900
235 Authentication successful
221 msc11.plala.or.jp ESMTP server closing connection
「Authentication successful」で認証されたことが確認できる。
(3)Wiresharkでメールサーバへの接続をパケットキャプチャする
echo -e "ehlo\nquit" | openssl s_client -connect secure.plala.or.jp:465 -quiet -crlf 2>/dev/null
220 msc12.plala.or.jp ESMTP server ready Sun, 23 Jun 2019 11:29:10 +0900
250-msc12.plala.or.jp
250-AUTH=LOGIN PLAIN CRAM-MD5
250-AUTH LOGIN PLAIN CRAM-MD5
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
221 msc12.plala.or.jp ESMTP server closing connection
wiresharkでキャプチャすると465(SSL)なのでSSL接続後のデータが暗号化されている
(4)openssl s_clientで接続時の復号鍵を取り出す
Wiresharkのwiki(
TLS Decryption)では、「RSA private key」( Diffie-Hellman [DH] 鍵交換方式が主流になってきているので暗号方式を限定して接続しないと復号できない)か「Key log file」(logに記録されるPre-Master-SecretとClientHello MessagesのClient RandomからMaster-Secretを算出する) を使ってSSL/TLSパケット復号が解説されている。
詳細解説。opensslの接続ログで「Session-ID」と「Master-Key」が記録されるが、
「Session-ID」は使えないようだ。2011年の記事なので「RSA Session-ID:xxxx Master-Key:yyyy」で確認してみたが復号されない。
「openssl」のバージョン1.1.1以降では、ログに鍵を記録するcallbackが用意されているらしい。version 1.1.1c(28 May 2019)では、s_clientに「-keylogfile」オプションがあり、ファイルを指定すると「CLIENT_RANDOM書式」の鍵が記録される。ファイルは、接続毎に鍵が追記されて行く。macOS Mojaveでは、「LibreSSL 2.6.5」(openssl 1.0.1APIと1.0.2APIの一部)が実装されている。LibreSSLでcallbackが実装されているかは不明。「openssl s_client」には、「-keylogfile」オプションも無いし、「SSLKEYLOGFILE」も機能していないようだ。
「openssl s_client」のオプション「-msg」指定で、「Client/Server Hello」パラメータと「Master-Key」が出力されるので「CLIENT_RANDOM zzzz yyyy」形式の鍵情報を取り出すことができる。下記は、SMTPのstartTLS接続で「smtp.log」にログを記録している。
echo -e "ehlo\nquit" | openssl s_client -connect secure.plala.or.jp:465 -quiet -crlf -msg 2>/dev/null > smtp.log
「smtp.log」のClientHelloデータ
ClientHello識別子+24bitメッセージ長+プロトコルバージョン+(32bit gmt unix time + 28bytes乱数)。7バイト目から38バイト目までがClientHelloのRandom値
cat smtp.log | grep -A 3 -e "ClientHello" | sed '1d' | tr '\n' ' ' | sed 's/ //g' | sed -e 's/^.\{12\}\(.\{64\}\).*$/\1/g'
でRandom値を取り出す。
9420cdb22e9988f8a1e95918182a60d646622553e337e15d1fdcb4d991d91d7e
「Master-Key」を取り出す。
cat smtp.log | grep -e "Master-Key:" | sed -e 's/^.*Master-Key: \(.*\)$/\1/g'
F82000D96468E651DA48D98D30339F83BA8841CA8D15470A829AC89ED5E6218AC9BD73CD7396CC91B51A87136346A5EF
「Session-ID」も取り出してみる。
cat smtp.log | grep -e "Session-ID:" | sed -e 's/^.*Session-ID: \(.*\)$/\1/g'
C4C84A1A82C0858DBD58C5985362256745E9908B257171CFB5AA4A8778946C30
Wiresharkの「Preference-Protocol-SSL」の「(Pre)Master-Secret log filename」の書式で書き出す
--- pick-ssl-keys.sh ---
#!/bin/bash
fl1="smtp.log"
okf1="smtp-random-key.log"
okf2="smtp-session-key.log"
krand=`cat $fl1 | grep -A 3 -e "ClientHello" | sed '1d' | tr '\n' ' ' | sed 's/ //g' | sed -e 's/^.\{12\}\(.\{64\}\).*$/\1/g'`
ksess=`cat $fl1 | grep -e "Master-Key:" | sed -e 's/^.*Master-Key: \(.*\)$/\1/g'`
isess=`cat $fl1 | grep -e "Session-ID:" | sed -e 's/^.*Session-ID: \(.*\)$/\1/g'`
echo "CLIENT_RANDOM $krand $ksess" > $okf1
echo "RSA Session-ID:$isess Master-Key:$ksess" > $okf2
echo "CLIENT_RANDOM $krand $ksess"
echo "RSA Session-ID:$isess Master-Key:$ksess"
CLIENT_RANDOM 9420cdb22e9988f8a1e95918182a60d646622553e337e15d1fdcb4d991d91d7e F82000D96468E651DA48D98D30339F83BA8841CA8D15470A829AC89ED5E6218AC9BD73CD7396CC91B51A87136346A5EF
RSA Session-ID:C4C84A1A82C0858DBD58C5985362256745E9908B257171CFB5AA4A8778946C30 Master-Key:F82000D96468E651DA48D98D30339F83BA8841CA8D15470A829AC89ED5E6218AC9BD73CD7396CC91B51A87136346A5EF
smtp-random-key.log smtp-session-key.log
「one-liner」でClient/ServerのRandom値を
取出すスクリプト。CLIENT_RANDOM書式でClientHelloのRandom値だけ出力させてみた。
cat smtp.log | awk '/Master-Key:/{key=$2} {b=1;e=16;if(l==3)b=7;if(l==1)e=6;for(i=b;i<=e;i++)s=s$i;if(l--==1)r[s]=1}/ ClientHello$/{l=3;s=""} END{for(rnd in r)print "CLIENT_RANDOM",rnd,key}'
CLIENT_RANDOM 9420cdb22e9988f8a1e95918182a60d646622553e337e15d1fdcb4d991d91d7e F82000D96468E651DA48D98D30339F83BA8841CA8D15470A829AC89ED5E6218AC9BD73CD7396CC91B51A87136346A5EF
「smtp-random-key.log」を「(Pre)Master-Secret log filename」に指定して復号。
SMTPプロトコルが表示される
(5)secure.plala.or.jp:587 startTLSでメール送信とパケットキャプチャ
「WIreshark」を起動しキャプチャ状態で「openssl s_client」を実行
echo -e "auth plain c29tZW9uZUBhbnkucGxhbGEub3IuanAAc29tZW9uZUBhbnkucGxhbGEub3IuanAAUEFTU1dPUkQ=\nmail from: someone@any.plala.or.jp\nrcpt to: xxxxxxxx@yyyyy.plala.or.jp\ndata\nsubject: testing\ntesting mail body\n.\nquit" | openssl s_client -quiet -crlf -connect secure.plala.or.jp:587 -starttls smtp -msg 2>/dev/null > smtp.log
「Wireshark」のキャプチャを停止し、鍵ファイルを作成する。
CLIENT_RANDOM a15c8dc12b2abb53443c1ec7e1b7006bb9de23dff19413a8b8f0971d1b7903b8 A9AB2E5EE5DE555C424AC90A2D16E912C6B8C6476BD013CE3BEF0625FDB1B9BFA870EAAD3668064178C20AB73FA7CFE4
RSA Session-ID:74F21376499E738F1B87CB2B78999040E06D93E005426283939C43016FF6293C Master-Key:A9AB2E5EE5DE555C424AC90A2D16E912C6B8C6476BD013CE3BEF0625FDB1B9BFA870EAAD3668064178C20AB73FA7CFE4
「Preference-Protocol-SSL」の「(Pre)Master-Secret log filename」に「smtp-random-key.log」を指定する。指定されたログファイルに作成したデータをマージしても良い(複数のCLIENT_RANDOM)。
SMTP認証とSMTPメール送信が復号されキャプチャデータとして表示される
受信したメール(ぷららメールサーバからぷららメールサーバへopenssl s_clientで)