WannaCryとは2017年5月頃に確認され、猛威を振ったをランサムウェアです。なぜ今さら取り上げたのかと言うと、先日このWannaCryを目にする機会があったためです。
WannaCryはすでに色々な人や組織が解析記事を書いています。腕試しにWannaCryを解析して、他所の解析記事と解析結果を比較(答え合わせともいう)してみました。
今回自分が解析したサンプルはmssecsvc.exe
(MD5ハッシュ値: 478abb44dbba06e87decd2df49f3d986
)およびmssecsvc.exeがドロップしたバイナリです。
※逆アセンブル内の変数名や関数名は一部解析に当たり、わかりやすいようにデフォルトのものから変更しています。
解析結果
自分が解析した内容をまとめました。答え合わせの結果、内容が誤っていたり、不正確だったものは(誤)と記してあります。
mssecsvc.exe (MD5ハッシュ値: 478abb44dbba06e87decd2df49f3d986)の解析結果
- ドメイン名
www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea[.]com
に対してHTTP通信を行う。HTTP通信の成否に関わらず、その後の処理を続行する。 - リソースセクションから
R
というリソースを抽出してC:\WINDOWS\tasksche.exe
(MD5ハッシュ値:3233aced9279ef54267c479bba665b90
)として保存し、実行する。 mssecsvc2.0
というWindowsサービスを作成して、永続化する。(コマンドライン: mssecsvc.exe -m security)
初期のWannaCryはC2ドメインへのHTTP通信が成功すると、その後の感染処理を行わずに終了するという性質があったが、今回自分が解析したサンプルはHTTP通信の成否に関わらず、その後の処理を続行するようにコーディングされていた。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-http-beacon.png)
InternetOpenUrlAの結果をediに格納してtest命令を行っているが、その後の処理がNOPされているので、HTTP通信の成否に関わらず、その後の処理を続行する
リソースセクションからR
というリソースを抽出してC:\WINDOWS\tasksche.exe
(MD5ハッシュ値: 3233aced9279ef54267c479bba665b90
)として保存し、実行する。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-extract-R.png)
常駐用のWindowsサービスの作成
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-mssecsvc-service.png)
tasksche.exe (MD5ハッシュ値: 3233aced9279ef54267c479bba665b90)の解析結果
- 自身が
/i
という引数とともに実行されていた場合、tasksche.exeが常駐するためのWindowsサービスを作成し、実行する。(誤)
/i
という引数なしで実行された場合:
Software\WanaCrypt0r\wd
というレジストリキーを作成する。レジストリの値にはtasksche.exeのカレントディレクトリがセットされる。- リソースセクションから
XIA
というリソースを抽出する。XIA
はパスワード保護されたZIPファイル。パスワードはWNcry@2ol7
c.wnry
というファイルを開く。ファイルにはビットコインアドレスが書き込まれる。- カレントディレクトリ以下のファイルに対して隠し属性を付与し、全ユーザーに対してファイル及びフォルダへのアクセス権を付与する。
- 公開鍵、秘密鍵の鍵ペアを作成する (誤)
t.wnry
というファイルを作成し、復号する (誤)
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-reg-hidde-grant-1024x240.png)
XIAの中身
b.wnry
: ビットマップ画像ファイル。ファイルが暗号化されたことをユーザーに通知する警告メッセージが記載されている。
c.wnry
: 形式不明のデータファイル。 TOR onionサーバーのドメイン名と思われる文字列 と TORブラウザへのリンクが確認できる
r.wnry
: テキストファイル。ファイルが暗号化されたことをユーザーに通知する警告メッセージが記載されている。
s.wnry
: ZIPファイル。TOR関連のファイルが含まれている。
msg
: ディレクトリ。このディレクトリの中には複数のリッチテキストファイルが含まれている。ファイルが暗号化されたことをユーザーに通知する警告メッセージが複数言語で記載されている。
分からなかった点・疑問点
- ファイルの暗号化処理を行うコードが見つからなかった。tasksche.exeはアドレス0x401A45のあたりでGetProcAddressを複数回呼び出し、CryptAcquireContextA、CryptImportKey、CryptDestroyKey、CryptEncrypt、CryptDecrypt、CryptGenKeyという暗号に関するAPI関数のアドレスを取得している。このうち、いくつかのAPIはtasksche.exe内で呼び出されているが、データの暗号化を行うCryptEncrypt関数はtasksche.exe内で呼び出されていなかった。
- tasksche.exeの.dataセクション内(アドレス: 0x0040E060)にファイル暗号化の際に参照されると思われるファイル拡張子の一覧が記述されているが、この拡張子一覧を参照しているコードがtasksche.exe内に存在しない。
答え合わせ
WannaCryの解析記事はたくさんありますが、こちらの記事にかなり詳細な解析が載っているので、この記事をもとに答え合わせをしようと思います。
mssecsvc.exe (MD5ハッシュ値: 478abb44dbba06e87decd2df49f3d986)の答え合わせ:
mssecsvc.exeにはSMBのリモートコード実行の脆弱性(MS17-010)をスキャンして悪用する機能があるが、このあたりの解析がゴッソリ抜けていた。
tasksche.exe (MD5ハッシュ値: 3233aced9279ef54267c479bba665b90)の答え合わせ:
- 自身が
/i
という引数とともに実行されていた場合、tasksche.exeが常駐するためのWindowsサービスを作成し、実行する
確かにtasksche.exeが常駐するためのWindowsサービスは作成するが、実際にはもっと色々なことをやっていた。
まず、ランダムな文字列を作成する。作成された文字列はのちにWindowsサービス名として用いられる。次に自身のコピーを<system_drive>\ProgamData\<random name dir>
または<system_drive>\Intel\<random name dir>
に作成する。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-tasksche-ans01.png)
続いて、先述したランダムな文字列を冠するWindowsサービスが存在するか確認する。存在する場合はそのままサービスを実行する。存在しない場合はサービスを作成する。サービス名には先述したランダムな文字列を用いる。作成されたWindowsサービスはtasksche.exeをコマンドプロンプト経由で実行する。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-tasksche-ans02.png)
- 公開鍵、秘密鍵の鍵ペアを作成する
正確には作成するのは鍵ペアではなく、RSA秘密鍵のみ。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-tasksche-ans03.png)
アドレス0x0040EBF8にRSA秘密鍵がハードコードされている。RSA2はRSA秘密鍵のマジックナンバーとのこと。ちなみにRSA公開鍵のマジックナンバーはRSA1。
t.wnry
というファイルを作成し開き、復号する
t.wnryを作成するのではなく、すでに存在しているt.wnryを開く。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-tasksche-ans05.png)
CreateFileAの第5引数に3
が指定されている。ドキュメントによると3 という値はOPEN_EXISTINGを表し、ファイルが存在する場合のみ、そのファイルを開く。ファイルが存在しない場合はエラーを返す。
![](https://mymanfile.com/wp-content/uploads/2020/09/wannacry-tasksche-ans07.png)
t.wnryを開く際、ファイルの先頭8バイトがマジックナンバーWANACRY!
と一致するか確認する。そして、先述したRSA秘密鍵を用いてt.wnryを復号する。復号されたペイロードはDLLとしてメモリにロードされTaskStart
というDLLエクスポート関数が呼び出される。このDLLエクスポート関数がファイルの暗号化処理を行うとのこと。
解析記事によると、t.wnryはZIPファイルXIAに含まれている。それだけでなく、ファイル復号のためのツールもXIAに含まれているらしい。しかし、自分が抽出したXIAには、これらのファイルは含まれていなかった。
どうやら本サンプル(MD5ハッシュ値: 3233aced9279ef54267c479bba665b90)にはファイルの暗号化および復号化を担うペイロードが含まれていないようです。だとすれば、解析時にファイルの暗号化処理を行うコードが見つからなかったことも、拡張子一覧が参照されていなかったことも説明がつきます。
ちなみに解析記事によると、ファイルの暗号化は概ね以下のように行われるようです。
- ファイルはランダムに生成された128ビットのAES共通鍵(CBCモード)によって暗号化される。
- 1つのファイルに付き、1つのAES共通鍵が生成される。
- 生成されたAES共通鍵はRSA公開鍵によって暗号化され、暗号化されたファイルのヘッダー部分に埋め込まれる。
- 暗号化されたファイルの先頭8バイトには
WANACRY!
というマジックナンバーが付与され、.WNCRYという拡張子が付け足される。
もしユーザーが身代金を支払った場合、TOR Onionサーバー経由でRSA秘密鍵が送信され、ファイルの復号を行うという手順になっている模様。
以上。
参考
https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html
https://www.fireeye.com/blog/products-and-services/2017/05/wannacry-ransomware-campaign.html
https://www.microsoft.com/security/blog/2017/05/12/wannacrypt-ransomware-worm-targets-out-of-date-systems/