smtp auth を telnet で突破する

……まぁこんなのどこで役に立つんだか、ってハナシですが。システム構築中は役に立つかもしれません。なお、突破できたのは cram-md5 だけで、digest-md5 とかはお手上げです。

まず接続します。別に 25 でも 587 でも構わないんですが、うちの環境は 587 は開けてない1)ので 25 でやります。

# telnet mailどっとmanimaniどっとcc 25
Escape character is '^]'.
220 mailどっとmanimaniどっとcc ESMTP ready.

繋がったら挨拶をします。EHLO です。

EHLO mailどっとmanimaniどっとcc
250-mailどっとmanimaniどっとcc
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8

挨拶しました。この挨拶って結構ダイジで、postfix には「挨拶しないヤツは信用しない」って設定もあったと思います。

挨拶が済んだので、認証をお願いします。

AUTH CRAM-MD5
334 PDE3NTE1MTg0MDA2MDQ3NDEuMTQ5MTczNjI0OUBtYWlsLm1hbmltYW5pLmNjPg==

認証をお願いすると、メールサーバーは base64 エンコードされた文字列(challenge?)を返してきます。とりあえず base64 デコードします。これは base64 コマンドでやってもいいですし、なんならこういうサイトさんを利用してもいいと思います。例えば base64 コマンドでやるなら……

# echo -n 'PDE3NTE1MTg0MDA2MDQ3NDEuMTQ5MTczNjI0OUBtYWlsLm1hbmltYW5pLmNjPg==' | base64 -d
<1751518400604741.1491736249@mailどっとmanimaniどっとcc>

こんな感じですね。で。たぶん、メールサーバーは「この文字列をお前のパスワード文字列でハッシュかけて返してこい!」と言っているので、従います。

$ perl -e "use Digest::HMAC_MD5 qw(hmac_md5_hex); print '<user-id> ', hmac_md5_hex('<1751518400604741.1491736249@mailどっとmanimaniどっとcc>', '<password>'), \"\n\";"
<user-id> 6553c56904e2aec7ec7dc22395927814

ここは perl じゃなくてもいいです。openssl md5 -hmac とか駆使してもいいです。なんならスクリプト化して置いておいてもいいと思います。要は、<user-id> <メールサーバーから渡された文字列を自分のパスワードをソルトにしてハッシュ化した文字列> が作れるのであればなんでも OK です。この場合は hmac_md5_hex() の第1引数にメールサーバーから渡された文字列、第2匹数に<user-id>に対応するパスワードを指定します。<user-id> とハッシュかけたパスワードの間は半角スペース1つです。

ここまでできたら、今度は作成した <user-id> 6553c56904e2aec7ec7dc22395927814 を base64 でエンコーディングします。例えば……

# echo -n '<user-id> 6553c56904e2aec7ec7dc22395927814' | base64
eW90dGFAbWFuaW1hbmkuY2MgNjU1M2M1NjkwNGUyYWVjN2VjN2RjMjIzOTU5Mjc4MTQ=

……こんな感じで作ってもいいですし、先述のサイトさんのエンコーダを使ってもいいと思います。

ここまできたら、さっきから待っている telnet のコンソールに作成した文字列を返します。

334 PDE3NTE1MTg0MDA2MDQ3NDEuMTQ5MTczNjI0OUBtYWlsLm1hbmltYW5pLmNjPg==
eW90dGFAbWFuaW1hbmkuY2MgNjU1M2M1NjkwNGUyYWVjN2VjN2RjMjIzOTU5Mjc4MTQ=
235 2.7.0 Authentication successful

認証さえ通ってしまえば、あとは普通の smtp と同じです。

MAIL FROM:<from@mail.address>
250 2.1.0 Ok
RCPT TO:<to@mail.address>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject:test
From:from@mail.address
To:to@mail.address
test message!!
.
QUIT
250 2.0.0 Ok: queued as 0000000000
221 2.0.0 Bye
Connection closed by foreign host.

……くれぐれも、不用意に他所様のサーバーに対してやらないように、お願いしますねw

1)
smtps の 465 を開けてます
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:manimani.cc:smtp_auth_with_telnet