SolarWinds: Sunburstによって攻撃者にデータを返送する方法

SolarWinds攻撃のフォローアップ分析シリーズの第4回目では、攻撃者にデータが送信される方法について検証します。

前回のブログでは攻撃者がどのようにSunburstマルウェアを制御しているかを検証し、攻撃者にデータを送信するためのさまざまなコマンドについて詳しく説明しました。今回は、Sunburstによってどのようにしてこのデータが攻撃者に送信されされているかを説明します。

前回のブログで説明したHTTP(S)GETリクエストを実行する代わりに、コマンドで攻撃者にデータが送信されている場合、SunburstによってHTTP(S)POSTリクエストが開始されます。

Sunburstでは、HTTP(S)GETリクエストとは異なるHTTP(S)POSTリクエストに対してランダムに生成されたURLパスが使用されます。

送信するデータが10,000バイトを超える場合、URLのパスは以下のようになります。

  • /pki/crl/{0}{1}-{2}.crl
    • エレメント「0」は100から10,000の間の数値です。
    • エレメント「1」はオプションで以下のいずれかになります。
      • -root
      • -cert
      • -universal_ca
      • -ca
      • -primary_ca
      • -timestamp
      • -global
      • -secureca
    • エレメント「2」は最後のエラーコードです。

Content-Typeヘッダーが「application/octet-stream」に設定され、その次にPOSTのデータが続きます。POSTのデータは送信するデータをUTF8でエンコードし、最後のエラーコードとユーザーIDを連結してから圧縮されます。

その後、圧縮されたBLOBのすべてのバイトが合計され、合計値の最下位のバイトがキーとして使用されます。圧縮されたBLOBはキーのバイトによってXOR処理され、キーのバイトは暗号化されたデータの前に挿入されます。

図 1.SunburstのPOSTのデータの構造
図 1.SunburstのPOSTのデータの構造

送信するデータが10,000バイト以下の場合、URLのパスは以下の2つのいずれかの形式になります。

  • /fonts/woff/{0}-{1}-{2}-webfont{3}.woff2
    • エレメント「0」は100〜10,000の乱数です。
    • エレメント「1」は「opensans」または「noto」です
    • エレメント「2」は以下のいずれかです。
      • bold
      • bolditalic
      • extrabold
      • extrabolditalic
      • italic
      • light
      • lightitalic
      • regular
      • semibold
      • semibolditalic
    • エレメント「3」は最後のエラーコードです。
  • /fonts/woff/{0}-{1}-{2}{3}.woff2
    • エレメント「0」は100〜10,000の乱数です。
    • エレメント「1」は以下のいずれかです。
      • freefont
      • SourceCodePro
      • SourceSerifPro
      • SourceHanSans
      • SourceHanSerif
    • エレメント「2」は以下のいずれかです。
      • Bold
      • BoldItalic
      • ExtraBold
      • ExtraBoldItalic
      • Italic
      • Light
      • LightItalic
      • Regular
      • SemiBold
      • SemiBoldItalic
    • エレメント「3」は最後のエラーコードです。

また、10,000バイトを超えるデータの場合のように、暗号化されたデータを直接送信するのではなく、ステガノグラフィを使用して偽JSON BLOBにして送信します。 

JSONのBLOBには以下のフィールドが含まれています。

  • userId - GUIDに難読化したユーザーID
  • sessionId - HTTPセッションごとにランダムに生成したGUID
  • Timestamp - 1970年1月1日以降のミリ秒から5分を減算した値に、2番目のビットが通常1に設定された0から512までのランダムな値を追加
  • Index - 増分値
  • EventType - Orionに設定
  • EventName - EventManagerに設定
  • DurationMs - 0から512の間のTimestampと同じランダム値
  • Succeeded - trueに設定
  • Message - Base64でエンコードしたデータのチャンク

送信する暗号化されたデータは、複数の可変サイズのチャンクに分割されます。各チャンクのサイズはランダムに決定されますが、通常は小さいサイズから大きいサイズに変わります。ランダムに選択されたサイズが0の場合、代わりに16バイトから28バイトのランダムなチャンクが生成され、Timestampの値が18446744073709551613の値によってAND処理され、それによって2番目のビットが0に設定されます。その後、各チャンクはエンコードされてJSON BLOBに追加され、Content-Typeヘッダーがapplication/jsonに設定されたHTTP(S)POSTデータとして送信されます。

図 2.Sunburstによって送信されたとされる不正なJSONファイルの例
図 2.Sunburstによって送信されたとされる不正なJSONファイルの例

受信時には、攻撃者はMessageのすべてのチャンクをデコードして連結する必要がありますが、Timestampの2番目のビットが設定されていない不完全なチャンクはスキップします。

これまで、SolarWinds攻撃のコマンドアンドコントロール(C&C)のプロセスを検証してきましたが、このシリーズはこのブログで終わりです。

前回までのブログでは、攻撃者がSunburstを使用してセキュリティソフトウェアを無効にして検出を回避した方法、C&Cのためのドメイン名の生成に使用された珍しいドメイン生成アルゴリズム(DGA)、Sunburstの制御フローとIPアドレス値のコマンドとしての使用について説明しました。  この最後のブログでは、Sunburstによってデータを攻撃者に返送する方法について詳しく説明し、SunburstのC&Cのプロセスについて概説しました。

保護/緩和

こうした攻撃に関連するツールは、シマンテックのエンドポイント製品を実行するマシン上で検出されブロックされます。

ファイルベースの保護:

  • Backdoor.Raindrop
  • Backdoor.Teardrop
  • Backdoor.Sunburst
  • Backdoor.Sunburst!gen1
  • Backdoor.SuperNova

ネットワークベースの保護:

  • システム感染Sunburstマルウェアのアクティビティ

Symantec Protection Bulletinで保護に関する最新情報をご確認ください。

Explore Upcoming Events

Find experts in the wild

See what's next