よくわからないJavaScriptが綺麗にされたらCard Stealerだった件

よくわからないJavaScriptが綺麗にされたらCard Stealerだった件

こんにちは、Recruit-CSIRTのきっかわです。 「ウィルスオタクの若手エース」と呼ばれるようになったから、というわけではないでしょうが(笑)、このたび、話にはよく聞くが見かけたことのなかった「クレジットカード情報を盗むJavscript」を見つけたので、そのマルウェアと周辺の攻撃について情報を共有します。みなさんにとって本ブログが有益な情報になれば幸いです。

忙しい方へ

  • 今回発見されたJavaScriptの概要
    • クレジットカードのチェックディジットの計算とクレジットカード番号の構成をチェックする
    • チェックが通ると、外部サイトへ入力情報を全て送信する
  • Javascriptコードの仕込まれ方
    • Webサイトのjsファイルを改ざんして動作
    • 元のサイトの動きに対して、見た目上の動きは変わらない
  • IOC
          https://ww1-filecloud[.]com/img

攻撃の流れ

今回観測した攻撃の流れは、以下と推測しており、クレジットカード情報の盗み出しを目的としていると考えられます。

  1. 攻撃者は、AWS S3のPublic Bucketsを調査
  2. 攻撃者は、見つかったAWS S3に対し、バケットポリシーをチェック
  3. 攻撃者は、PUT権限がついていると分かると、正規のJavaScriptにマルウェアを混入してアップロード
  4. マルウェアは、改ざんされたJavaScriptがロードされる全てのページにおいて、クレジットカード情報の入力があるとその情報を取得し、データを送信

クレジットカード情報盗み出しの手口については、徳丸先生のブログ で詳しく解説されています。今回のマルウェアは、当該ブログに記載されている4つ目のタイプに分類され、具体的に以下2つの手法を 利用していました。

  • setInterval()を用いて、500msごとにフォーム内容をチェック、カード情報が入力されていた場合は確認ボタンなどが押されなくても自動的にデータが攻撃者へ送信
  • マルウェアの設置は、RCE可能な脆弱性などを経由したものではなく、Anonymous PUT権限がついているAWS S3を探し、正規のJavaScript内にマルウェアを注入、PUTメソッドでアップロード

では、具体的なマルウェアについて見ていきます。

見つかったマルウェア

実際に見つかったマルウェアは以下のコードから始まるもので、本来のJavaScriptに追記する形で混入されていました。

cardstealer

マルウェアの処理の流れは以下です。

  1. ページの読み込みが完全に終わったら、0.5秒おきに以下のJavaScriptを実行する。
  2. ページ中すべてのinputタグ、selectタグ、textareaタグの値を取得する。
  3. 取得した中身にクレジットカード番号があるかチェックする。
  4. クレジットカード番号があれば、その情報をBase64エンコードし、データをGETで送信する。

アンチデバッグとして、Windowサイズによる開発者ツールが起動しているかの確認もありましたが、ここでは割愛します。

では、もう少し動作を詳しくみていきましょう。 なお、ソースコードは難読化を一部解除、関数名の置き換えやコメントを追加し、読みやすくしています。

データ取得

マルウェアのJavaScript中には、 _0x5c3409.SaveAllFields() 関数があり、そこではinputタグ、selectタグ、textareaタグの値を取得します。データを取得する際、_0x5c3409.SavePram関数が呼ばれ、クレジットカード番号が入力されているかのチェックをしています。正しいクレジットカード番号が入力されていると、フラグである _0x5c3409.IsValid が True になり、このフラグが外部へ情報を送信するかの判定用として利用されていました。

 

クレジットカード番号チェック

クレジットカード番号のチェック処理を詳しくみてみます。 このマルウェアでは以下の2種類の判定法により、正しいクレジットカード番号かをチェックしています。

  • クレジットカード番号の形式
  • クレジットカード番号のチェックディジット計算

この判定を用いることで、本当に正しいクレジットカードのみを取得できるようため、ノイズを消去する目的として入れているのでしょう。

 

データ送信

このマルウェアは、クレジットカード番号が入力されていれば、その時の入力情報を全て取得し、データを送信します。 全ての情報を取得する理由は、クレジットカードを利用するためには、氏名や有効期限、CVVなどが必要になるためと推測できます。

取得した情報はBase64エンコードされ、imgタグのsrcを利用して攻撃者のサーバに送信されます。

 

おわりに

今回、AWS S3に置かれていたJavaScriptのマルウェアが見つかったので解析してみました。その中身は、純粋なクレジットカード番号が欲しい攻撃者の設置したCard Stealerでした。

そして、攻撃の起点としては、AWS S3を利用していました。みなさんのAWS環境のS3のバケットポリシーは大丈夫でしょうか?今一度、確認してみてください。

IOC

  • URL
    https://ww1-filecloud[.]com/img?reff=[送信データ]
  • SHA-256
    0a692f81e0ccac7518f18915ad4eb95135e3c323d68752b30ac6ae4d067b8b37