はじめに
こんにちは、CISO部の兵藤です。日々ZOZOの安全のためにSOC対応を行なっています。
本記事では、世間で横行しているフィッシング詐欺に関する情報を収集し、ZOZOを騙ったフィッシングを検知する取り組みについて紹介します。
目次
背景と概要
フィッシング詐欺というと、特殊詐欺にあたるものの1つです。「メール」「SMS」などの媒体を介してユーザを本物とよく似せたフィッシングサイトに誘導し、個人情報やクレジットカード情報、IDパスワード情報を搾取する目的で行われることが多いです。
ZOZOではSNSやお客様からの情報を元に、フィッシング詐欺(フィッシングサイトやフィッシングメール)の対応を行なっていました。ですが、本対応だけではフィッシングの対応が後手となってしまい、被害拡大の可能性があります。
そこでCISO部ではフィッシングメール、フィッシングサイトになりうるドッペルゲンガードメインの収集(フィッシングハント)を行い、ZOZOの脅威になりうる情報を検知する基盤を構築しました。
フィッシング詐欺は事業を行なっている企業全てに関係する脅威だと思います。同じような取り組みを実施したいと考える皆様の参考になれば幸いです。
フィッシングハント - ドメイン編
ドッペルゲンガードメイン
攻撃者がフィッシングサイトを建てる際、似たようなサイトになるように努力をすることでしょう。その内の1つにはドメインも含まれており、コンテンツ改竄やホスティングサービスを使用しない場合は新規でドメインを登録する必要があります。
ドメインを取得する際には本物のドメインと類似したドッペルゲンガードメインを利用する場合があります。
本物のドメイン | ドッペルゲンガードメイン |
---|---|
zozo.jp | zoz0(ゼロ).jp |
上記のようなドッペルゲンガードメインが新規で作られていれば、その情報を収集するツールは多くあります。ZOZOではopenSquatというツールを使用し、ドッペルゲンガードメインを収集しています。
openSquat
openSquatはドッペルゲンガードメインを収集するオープンソースのセキュリティツールです。公式サイトはこちらのリンクをご参照ください。
このopenSquatは1日1回新規ドメインリストを更新してくれます。そのドメインリストの中から、keywords.txt
で設定した本物のドメインに対するドッペルゲンガードメインを収集します。また、オプション(--phishing
)によっては既知のフィッシングドメインからドッペルゲンガードメインを収集できます。
構築
概要
ZOZOでは1日1回、上記openSquatを実行する基盤をAWS上に構築しました。以下が概要図になります。
- 1日1回、EventBridgeを用いて起動命令を飛ばす。
- 起動命令をLambdaで処理し、NAT、ECSコンテナを作成。
- コンテナでopenSquatを実行。
- 取得したドッペルゲンガードメインからurlscanを用いてレピュテーションとスクリーンショットを取得。
- 悪性スコアとスクリーンショットをSlackに通知。
- 上記全て完了すればNAT、ECSコンテナの削除を実施。
特徴
この基盤の特徴としてはLambdaではなく、コンテナ上でopenSquatを実行しているところです。
というのもopenSquatは起動するときにファイルを諸々作成することになるので、インメモリで実行されるLambdaでは相性が悪かったという経緯があります。openSquatの構造を変更せずに実装する場合では、コンテナでパッケージ化することが実装の近道でした。
また、urlscanのAPI1を用いることで、ドッペルゲンガードメインのレピュテーションやスクリーンショットを自動取得することも特徴でしょう。この機能によりSlackを確認するだけでフィッシングサイトなのか、ある程度の判断が可能です。
urlscanを利用する上で注意すべき項目としては、スキャンにある程度待ち時間が存在することです。NWの状況によってはスキャンに時間がかかったり、できなかったりします。スキャンが終了するまでの間はレスポンスが404で返されます。そのような状況を踏まえて以下のようにスキャンの合間にtime.sleep
関数を挟んでいます。
try: uuid = do_scan(domain) time.sleep(40) #urlscan完了までの待ち時間 image = get_image(uuid) #自作関数 score = get_score(uuid) #自作関数 domain = domain.replace(".","[.]") #Defang処理
運用
現在、毎日この可愛いワンちゃんがお知らせをしてくれます。フィッシングサイトであれば一目で確認できます。
フィッシングハント - メール編
フィッシングメール収集源
突然ですが、ブログサイトにはメールを使った投稿機能があるのを皆さんご存知でしょうか?
ブログ投稿用のメールアドレスを用意して、そのメールアドレスに届いたメールの内容がブログに投稿されるといった流れです。
このメールアドレスが何らかの理由で流出し、フィッシングメールが届くようになればそのフィッシングメールの内容がブログへ投稿されるようになります。このフィッシングメールが投稿されているブログを監視することでフィッシングメールの収集が可能です。
上記の仕組みについてはフィッシング詐欺ハンターの「にゃんたく」さんの記事2が参考になります。
フィッシングメール収集方法
ブログの情報はRSSを用いて収集が可能です。このRSSの情報を収集すればフィッシングメールを自動的に収集できるというわけです。
RSSのURLは各ブログページのHTMLを表示すれば確認できます。以下が記載例になります。※URLはZOZOのドメインを使用しています。
# feed階層配下 <link rel="alternate" type="application/rss+xml" title="ZOZO - RSS" href="https[:]//zozo.com/feeds/posts/default?alt=rss" /> # index.rdf形式 <link rel="alternate" href="http[:]//zozo.jp/index.rdf" type="application/rss+xml" title="RSS" /> # rss階層 <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https[:]//zozo.com/rss"/>
上記のRSSを用いて、SlackのChannelに投稿させることで、フィッシングメールを収集するChannelが出来上がります。
ZOZOではフィッシングメール情報をRSSを用いてSlackの1Channelに集約しています。以下がその模様です。
Botによる監視
上記のChannelには大量のフィッシングメールが届きます。このフィッシングメール全ての人力監視はリソースを考えると不可能です。
ZOZOではこのフィッシングメールを監視してくれるSlackBotを作成し、何かあればChannelの参加者にメンションを行う仕組みを導入しています。
Botはslack_boltを使用し、Azure Web Appsで起動させています。簡易的なアプリの起動であれば即座に構築できるのでとても便利です。
slack_boltで監視するものは基本的にRSSで投稿されるmessage
イベントになります。これでフィッシングメールの内容がZOZOに関するものか判断します。
@app.event("message") def event_message(client, event, say): content = event["text"]
実際にZOZOを標的にしたフィッシングメールを検知した際には以下のようにメンションとスタンプでお知らせしてくれます。
まとめ
フィッシングメール、フィッシングサイトになりうるドッペルゲンガードメインの収集(フィッシングハント)を行い、ZOZOの脅威となる情報を検知する基盤構築の取り組みを紹介しました。
意外と簡単に基盤が構築できると感じたのではないでしょうか?
ZOZOではこれからもフィッシングメールやフィッシングドメインを能動的に収集し、検知することで少しでもフィッシングの被害に合う方達を無くすことを目的に活動していこうと考えています。
近年では、ホスティングサービスを利用したフィッシングサイトやSNSを利用したフィッシング、またWeb3技術のIPFSを利用したフィッシング3も観測されています。ドッペルゲンガードメインだけでは検知できないフィッシングサイトも上記の通り出現している傾向があるため、フィッシング詐欺への対策は更なる工夫と検知精度が必要です。そのためにも地道にフィッシング詐欺への対策を1つずつ実施し、脅威情報を少しでも多く収集し活用していくことが大切です。
本記事がフィッシング詐欺に対しこれから対策していく足掛かりになれば幸いです。
おわりに
ZOZOでは、一緒に安全なサービスを作り上げてくれる仲間を募集中です。ご興味のある方は、以下のリンクから是非ご応募ください!