{{tag>manimani.cc}} # smtp auth を telnet で突破する ……まぁこんなのどこで役に立つんだか、ってハナシですが。システム構築中は役に立つかもしれません。なお、突破できたのは cram-md5 だけで、digest-md5 とかはお手上げです。 ## やってみる まず接続します。別に 25 でも 587 でも構わないんですが、うちの環境は 587 は開けてない((smtps の 465 を開けてます))ので 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` コマンドでやってもいいですし、なんなら[こういうサイトさん](http://www.convertstring.com/ja/EncodeDecode/Base64Decode)を利用してもいいと思います。例えば `base64` コマンドでやるなら…… ``` # echo -n 'PDE3NTE1MTg0MDA2MDQ3NDEuMTQ5MTczNjI0OUBtYWlsLm1hbmltYW5pLmNjPg==' | base64 -d <1751518400604741.1491736249@mailどっとmanimaniどっとcc> ``` こんな感じですね。で。たぶん、メールサーバーは「この文字列をお前のパスワード文字列でハッシュかけて返してこい!」と言っているので、従います。 ``` $ perl -e "use Digest::HMAC_MD5 qw(hmac_md5_hex); print ' ', hmac_md5_hex('<1751518400604741.1491736249@mailどっとmanimaniどっとcc>', ''), \"\n\";" 6553c56904e2aec7ec7dc22395927814 ``` ここは perl じゃなくてもいいです。`openssl md5 -hmac` とか駆使してもいいです。なんならスクリプト化して置いておいてもいいと思います。要は、` <メールサーバーから渡された文字列を自分のパスワードをソルトにしてハッシュ化した文字列>` が作れるのであればなんでも OK です。この場合は `hmac_md5_hex()` の第1引数にメールサーバーから渡された文字列、第2匹数にに対応するパスワードを指定します。`` とハッシュかけたパスワードの間は半角スペース1つです。 ここまでできたら、今度は作成した ` 6553c56904e2aec7ec7dc22395927814` を base64 でエンコーディングします。例えば…… ``` # echo -n ' 6553c56904e2aec7ec7dc22395927814' | base64 eW90dGFAbWFuaW1hbmkuY2MgNjU1M2M1NjkwNGUyYWVjN2VjN2RjMjIzOTU5Mjc4MTQ= ``` ……こんな感じで作ってもいいですし、先述のサイトさんのエンコーダを使ってもいいと思います。 ここまできたら、さっきから待っている telnet のコンソールに作成した文字列を返します。 ``` 334 PDE3NTE1MTg0MDA2MDQ3NDEuMTQ5MTczNjI0OUBtYWlsLm1hbmltYW5pLmNjPg== eW90dGFAbWFuaW1hbmkuY2MgNjU1M2M1NjkwNGUyYWVjN2VjN2RjMjIzOTU5Mjc4MTQ= 235 2.7.0 Authentication successful ``` 認証さえ通ってしまえば、あとは普通の smtp と同じです。 ``` MAIL FROM: 250 2.1.0 Ok RCPT TO: 250 2.1.5 Ok DATA 354 End data with . 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