SOC Prime Bias: 重大な脅威

05 5月 2026 17:05

「AccountDumpling」30,000以上のFacebookアカウントを侵害するGoogle発フィッシング波を追跡

Author Photo
Ruslan Mikhalov SOC Primeの脅威リサーチ責任者 linkedin icon フォローする
「AccountDumpling」30,000以上のFacebookアカウントを侵害するGoogle発フィッシング波を追跡
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

フィッシング作戦がGoogle AppSheetを悪用して、正規のように見えるメールを送信し、NetlifyとVercelにホストされた悪意のあるページに被害者を誘導します。これらのページはFacebookアカウントの完全な復旧詳細を収集し、リアルタイムでTelegramボットに転送します。このキャンペーンはベトナムを拠点とする個人に関連付けられており、すでに3万以上のFacebookアカウントが侵害されています。盗まれたアカウントは、その後、アカウント復旧サービスを宣伝するストアフロントを通じて収益化されます。

調査

Guardioの研究者は、配信経路をAppSheetまで追跡し、4つの別々のフィッシングクラスターを特定し、何百もの悪意のあるホスティングURLを集めました。彼らはまたTelegramボットのトークンとチャットIDを抽出し、ベトナムの名前が含まれたCanva PDFにインフラを接続し、被害者の地理的拡散を分析しました。彼らの研究は、一つのグループがフィッシングキットを開発し、別のグループがキャンペーンを行い、第三のグループが盗まれたアカウントアクセスから利益を得るモジュラーエコシステムを明らかにしました。

緩和策

防御者は、知られている悪意のあるNetlifyおよびVercelのサブドメインをブロックし、AppSheetにより生成されたメールを監視して疑わしい行動を促すリンクを含むものを検出し、TelegramボットAPIエンドポイントへの外部接続を検知すべきです。組織はまた、Facebookのログインと復旧フローの検証を強化し、機密性の高い復旧アクションには再認証を要求するべきです。ユーザーには、信頼できるGoogleサービスから送信されたメールでもフィッシングの試みの一部となりうることを思い出させるべきです。

対応

セキュリティチームは、以下からのメールに対して警告する必要があります: noreply@appsheet.com が不明なNetlify、Vercel、または shorten.tv ドメインを含むリンク。これらのドメインへのDNSルックアップは、可能なデータ流出を特定するためにTelegramボットの通信と相関させる必要があります。資格情報が盗まれた場合、影響を受けたユーザーはパスワードをリセットする必要があり、妥協されたFacebookアカウントは直ちにレビューされるべきです。関連するインジケーターもSOCと外部の脅威インテリジェンスチャネルと共有されるべきです。

"graph TB %% Class definitions classDef action fill:#99ccff %% Nodes action_phishing["<b>Action</b> – <b>T1566 フィッシング</b><br/>Google AppSheetを介してフィッシングし、ユーザーに資格情報を明らかにさせたり、悪意のあるリンクをクリックさせたりする。"] class action_phishing action action_cloud_abuse["<b>Action</b> – <b>T1496.004 リソースハイジャック:クラウドサービスハイジャック</b><br/>クラウドメールサービスを悪用して認証された悪意のあるメールを送信。<br/><b>追加技法</b> – <b>T1021.007 リモートサービス:クラウドサービス</b><br/>正規のクラウドリモートサービスを使用して悪意のある活動を行う。"] class action_cloud_abuse action action_credential_harvest["<b>Action</b> – <b>T1606 ウェブ資格情報偽造</b><br/>Netlify/Vercelにホストされた資格情報収集ページの作成。<br/><b>追加技法</b> – <b>T1212 資格情報アクセスのための悪用</b><br/>ウェブプラットフォームを悪用してユーザー資格情報を取得。"] class action_credential_harvest action action_gather_info["<b>Action</b> – <b>T1589 被害者のアイデンティティ情報収集</b><br/>被害者のアイデンティティデータの収集。<br/><b>追加技法</b> – <b>T1591.002 被害者組織情報収集:ビジネス関係</b><br/>ビジネス関係の詳細を収集。<br/><b>追加技法</b> – <b>T1591.004 被害者組織情報収集:役割の特定</b><br/>組織内の被害者の役割を特定。"] class action_gather_info action action_exfil_telegram["<b>Action</b> – <b>T1041 C2チャネル上でのデータ外部送信</b><br/>TelegramボットC2チャネルを通じたデータの外部送信。<br/><b>追加技法</b> – <b>T1552.001 保護されていない資格情報:ファイル内の資格情報</b><br/>ファイル内に保存された資格情報の収集。"] class action_exfil_telegram action action_facebook_access["<b>Action</b> – <b>T1078 正当なアカウントの利用</b><br/>盗まれた正当なアカウントを使用してFacebookビジネスリソースにアクセス。"] class action_facebook_access action %% Connections action_phishing –>|leads_to| action_cloud_abuse action_cloud_abuse –>|leads_to| action_credential_harvest action_credential_harvest –>|leads_to| action_gather_info action_gather_info –>|leads_to| action_exfil_telegram action_exfil_telegram –>|leads_to| action_facebook_access "

攻撃プロセスフロー

シミュレーション実行

前提条件:Telemetry & Baselineプレフライトチェックが合格していること。

理由:このセクションは、検出ルールを引き起こすために意図された敵対技術(TTP)の正確な実行を詳細に記述します。コマンドと物語は、特定されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリを生成することを目的としています。抽象的または関連性のない例は誤診につながります。

  • 攻撃の物語とコマンド:

    1. 偵察: 攻撃者は公開ソースからFacebook社員のメールアドレスのリストを収集します。

    2. AppSheetの悪用セットアップ: 侵害されたGoogle Workspaceアカウントを使用して、攻撃者はメール通知を送信するAppSheetアプリを作成します。アプリは、デフォルトのAppSheetバウンスドメイン appsheet.bounces.google.com.

    3. フィッシングペイロード: 通知メールには、「あなたのFacebookパスワードの有効期限が切れます– 今すぐリセットしてください」と誘引する資格情報収集ページを指す悪意のあるリンクが含まれています。

    4. キャンペーンの開始: 攻撃者がAppSheetワークフローをトリガーし、プラットフォームが作成されたメールをターゲットリストに送信します。その結果、送信者のメールに以下のメタデータが一致します。

      • 送信者メール = noreply@appsheet.com
      • 配信ドメイン = appsheet.bounces.google.com
    5. 結果: SIEMルールは、受信したログエントリを評価し、両方のフィールドを一致させてアラートを生成します。

  • 回帰テストスクリプト: 以下のスクリプトは、Google Apps Script APIを使用してAppSheetスタイルの通知をエミュレートするための手順2‑4を自動化します。Gmail APIを介してメールを送信する権限を持つサービスアカウントのJSONが必要です。

    # Python 3.x – Gmail APIを介して作成されたフィッシングスタイルのメールを送信
    import base64, json, sys
    from email.mime.text import MIMEText
    from google.oauth2 import service_account
    from googleapiclient.discovery import build
    
    # ---- Configuration -------------------------------------------------
    SERVICE_ACCOUNT_FILE = "service-account.json"   # <-- パスを置き換えます
    SCOPES = ["https://www.googleapis.com/auth/gmail.send"]
    SENDER = "noreply@appsheet.com"
    RECIPIENT = "victim@facebook.com"
    SUBJECT = "重要:Facebookアカウントのアクションが必要"
    BODY = """
    親愛なるFacebookユーザーのみなさま、
    
    当社の記録によると、あなたのパスワードは24時間以内に有効期限が切れます。
    下記のリンクをクリックして直ちにリセットしてください:
    
    https://malicious.example.com/steal?uid=12345
    
    ありがとうございます。
    Facebookセキュリティチーム
    """
    # --------------------------------------------------------------------
    
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    
    try:
        service = build('gmail', 'v1', credentials=credentials)
        message = MIMEText(BODY, "plain")
        message["to"] = RECIPIENT
        message["from"] = SENDER
        message["subject"] = SUBJECT
        # AppSheetバウンスドメインを模倣するためのカスタムヘッダーを追加します。
        message["X-Delivery-Domain"] = "appsheet.bounces.google.com"
    
        raw = base64.urlsafe_b64encode(message.as_bytes()).decode()
        send_body = {"raw": raw}
        result = service.users().messages().send(userId="me", body=send_body).execute()
        print(f"Message sent, ID={result['id']}")
    except Exception as e:
        print(f"Error sending email: {e}", file=sys.stderr)
        sys.exit(1)
  • クリーンアップコマンド: 送信フォルダからテストメッセージを削除し、サービスアカウントトークンを取り消します。

    # PowerShell – Gmail APIを使用してGmailの送信フォルダからテストメッセージを削除
    $serviceAccount = "service-account.json"
    $scopes = @("https://www.googleapis.com/auth/gmail.modify")
    $cred = (Get-Content $serviceAccount | ConvertFrom-Json) | `
            New-Object Google.Apis.Auth.OAuth2.ServiceAccountCredential `
                -ArgumentList ([Google.Apis.Auth.OAuth2.ServiceAccountCredential]::Initializer) `
                -Property @{Scopes = $scopes}
    $gmail = New-Object Google.Apis.Gmail.v1.GmailService -ArgumentList $cred
    
    # メッセージIDを取得(送信スクリプトからの実際のIDに置き換え)
    $msgId = "INSERT_MESSAGE_ID_HERE"
    $gmail.Users.Messages.Delete("me", $msgId).Execute()
    Write-Host "テストメールが削除されました。"