SolarWinds: 攻撃者のコマンドアンドコントロールのプロセスに関するインサイト

SolarWinds攻撃のフォローアップ分析シリーズの第3回目では、攻撃者がSunburstマルウェアを制御した方法について検証します。

SolarWinds攻撃に関する最新のブログでは、攻撃者がコマンドアンドコントロール(C&C)サーバーの接続に使用したドメイン生成アルゴリズム(DGA)を検証しました。その接続後に行われる制御フローも注目に値します。

Sunburstの制御フローは攻撃者から受信したコマンドによって異なります。ただし、一般的な制御フローは再構築でき、それによって標的のマシン上で行われた通信を把握できます。

以前のブログで説明したように、最初の通信には2種類のDNSリクエストが使用され、いずれもDNSレスポンスを受信しています。攻撃者はDNSレスポンスに2つのフィールドを使用しています。制御フローのための「Aレコード」と、第2のC&Cサーバーでデータを保持するためのCNAMEです。

コマンドとしてのIPアドレス

通常、DNSクエリではホスト名の文字列が数字のIPアドレスに変換されます。たとえば、google.comは142.250.72.238に変換されます。IPアドレスはレスポンスのAレコードに含まれています。SunburstではAレコードからIPアドレスが抽出されますが、その目的はIPアドレスとして使用するのではなく、さまざまなマルウェアの動作のトリガに使用することにあります。また、攻撃者はさまざまな動作をトリガするIPアドレスをランダムに選択するのではなく、Google、Amazon、Microsoftに属するIPアドレスを選択しています。これは検出の可能性を低下させるためと推測されます。それらのIPもIPアドレスとして使用されることはなく、それらのIPアドレスを持つコンピュータシステムがマルウェアに接触することはありません。

DNSレスポンスで受信したIPアドレスの値は、そのときの状態に応じて以下の5つ動作のうちのいずれかを示します。

  • 追加のWindowsドメイン名のチャンクの送信を続行
  • 製品のセキュリティのステータス情報を送信
  • 第2のC&Cチャネルを起動
  • クリーンアップして終了
  • 初めての実行と思わせるために状態をリセット

Sunburstの一般的な感染では、まず、Windowsドメイン名の最初の14文字がC&Cサーバーに送信されます。その後、Windowsドメイン名全体が揃うまで14文字ずつ送信されます。

次に、攻撃者はSunburstに現在のセキュリティ製品のステータスを送信するように指示し、より堅牢な第2のHTTPベースのC&Cサーバーを起動するのに必要な情報を送信します。

図 1.C&C制御フローの例
図 1.C&C制御フローの例

攻撃者はDNSレスポンスでSunburstに指示し、以前無効にしたセキュリティ製品サービスのレジストリキーをデフォルト設定で復元し、終了または内部の状態をリセットして新たに感染したと見せかけることもできます。

図 2.IPアドレスの範囲とそれによって実行される動作
図 2.IPアドレスの範囲とそれによって実行される動作

また、調査やサンドボックスを回避するため、DNSリクエストの結果が10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、224.0.0.0/4、fc00::/7、fec0::/10、ff00::/8などのプライベートIPアドレスの場合、Sunburstはクリーンアップして終了します。

第2のC&C

被害者は第2のC&Cで攻撃の標的にされたと思われます。その場合、DNSレスポンスのCNAMEレコードにはHTTPのC&Cチャネルとして使用するホスト名が含まれていたと推測されます。CNAMEの値がhttp://またはhttps://で開始しているかを確認して、開始していない場合はhttps://を挿入します。

次に、コマンドを受信するためにHTTP GETリクエストが繰り返し実行されます(次のリクエストまでの間(可変)はSunburstは休止状態になります)。URLのパスの部分は常に/swip/upd/で開始し、その後にランダムに選択したURLのパターンが以下の順番で続きます。

オプションで以下から1つ以上選択

  • SolarWinds
  • .CortexPlugin 
  • .Orion

オプションで以下から1つ選択

  • .Wireless
  • .UI
  • .Widgets
  • .NPM
  • .Apollo
  • .CloudMonitoring

前の文字列を選択しなかった場合は以下から1つ選択(前の文字列を選択した場合もオプションで以下から1つ選択可能)

  • .Nodes
  • .Volumes
  • .Interfaces
  • .Components

オプションで末尾に以下を追加

  • -<番号>.<番号>.<前のリクエストのエラーコードまたは成功コード>

末尾に以下を追加

  • .xml

また、パスの最初の文字がドット(.)の場合、そのドットは削除されます。以下は使用可能なURLの例です。

  • https[:]//infinitysoftwares.com/swip/upd/SolarWinds.CortexPlugin.Nodes-5.2.1.xml
  • https[:]//infinitysoftwares.com/swip/upd/Orion.Wireless.UI-3.1.0.xml
  • https[:]//infinitysoftwares.com/swip/upd/Nodes-1.2.0.xml

.xml拡張子の前の最後の桁はランダムな文字ではなく、前のコマンドリクエストの戻りコードを示します。通常、0は成功を意味し、1またはその他の値はエラーを意味します。最初の16のリクエストでは、毎回ランダムに生成された異なるパスが使用されますが、その後は前に使用したランダムな生成が繰り返される場合があります。コマンドの結果としてデータを攻撃者に送信する場合(システム情報の送信など)、パスの構成は異なります。これについては今後のブログで説明します。

また、Sunburstではカスタムヘッダーの「If-None-Match:」も追加され、前に説明した8バイトのユーザーIDをランダムに生成した8バイトのシーケンスでXOR処理し、その8バイトのシーケンスを追加した文字列に設定し、その後、小文字のASCII16進数に変換されます。

図 3.Sunburstのカスタムヘッダー
図 3.Sunburstのカスタムヘッダー

HTTP GETリクエストが行われた後、Sunburstによって攻撃者からの有効なレスポンスが確認されます。レスポンスはステガノグラフィを使用して本物に見せかけたXMLデータのページで、特定のフィールドのみがSunburstに使用されます。

偽のXMLデータで以下のシーケンスが検索されます。

  • ダッシュを含む36個の16進数文字列
  • 32の16進数文字列
  • 16の16進数文字列

これらのシーケンスは16進数以外の文字を除いた状態で連結されています。シーケンスの最初のDWORD(4バイト)は残りのデータのサイズを示し、検証後に次のバイトがXORのキーになります。残りのデータはキーバイトによってXORに復号されてから解凍されます。解凍後の最初の文字は実行する動作を指定する数値で、その後にコマンドの次のデータに含まれる引数の数が続きます。

図 4.Sunburstが受信したデータをデコードしてコマンドを抽出した例
図 4.Sunburstが受信したデータをデコードしてコマンドを抽出した例

以下はコマンド番号とそれによってSunburstが実行する動作です。

図 5.コマンドの番号と実行する動作
図 5.コマンドの番号と実行する動作

攻撃者にデータを送信する必要がない場合は、URLファイル名にエンコードされたリターンコードを含む上記のGETリクエストが送信されます。 

これらのコマンドの結果としてデータを攻撃者に送信する必要がある場合(システム情報の送信など)、データはPOSTリクエスト(エラーが発生してデータを失った場合はHEADリクエスト)として次の通常のHTTP(S)通信に含まれます。これらの動作の詳細とデータを攻撃者に提供する方法については、今後のブログで説明します。

保護/緩和

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

ファイルベースの保護:

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

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

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

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

Explore Upcoming Events

Find experts in the wild

See what's next