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