自宅に設置したハニーポッドdionaeaで収集された
0ab2aeda90221832167e5127332dd702(以下 本ファイル)を解析した結果と
その結果から考えられることを記していく。
表層解析
本ソフト内の可読ascii文字列・API・PE情報の取得・分析した。
また、VirusTotal・HYBIRD ANALYSESを利用し、既知の情報についても調査した。
オンラインデータベースへのリンク
- HYBIRD ANALYSES
- Virus Total
各ハッシュ値
- md5sum
0ab2aeda90221832167e5127332dd702 - sha256sum
64bb708b31b4b043018457c1098465ea83da7d6408c7029b2f68c333fc25891c - sha1sum
f370045d8ac3f4ba78acf8bfe4c4d35758d5ea05
ファイル情報
- xxd
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
MZファイルシグニチャが含まれていることから実行ファイルであることが分かる。
- file
0ab2aeda90221832167e5127332dd702: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows
32ビットの実行ファイルであることが分かる。
以下のVirusTotalの検索結果では、 63 / 70のアンチウイルスソフトウェアが本ファイルをマルウェアだと検知した。
docs.google.com
ファイル情報からwindowsの実行ファイルであり、virusTotalの結果からマルウェアであると考えられる。
また、virus Totalのresultから本ファイルは、「Ransom.Wannacry」「Trojan.Agent.CZTF」と呼ばれている事がわかった。
文字列の抽出
一覧は、スプレッドシート参照のこと
抜粋
特徴が現れた文字列
compiler-stamp,Thu May 11 12:21:37 2017 | UTC
- パソコンを起動したときに、本ソフトウェアも自動起動する可能性
GetStartupInfoA
- 実行環境を読み取る可能性
GetEnvironmentStrings
GetExitCodeProcess
- プロセスの作成・削除が行われる可能性
GetCurrentProcessId
GetExitCodeProcess
- ファイルの作成、移動、削除が行われる可能性
MoveFileW
MoveFileExW
WriteFile
DeleteFileW
- このマルウェアは、ドロッパーの可能性
FindResourceA
LoadResource
LockResource
- shellやコマンドプロンプトが使われる可能性
GetCommandLineA
SHELL32.dll
- ユーザーの意図しないスリープをする可能性
Sleep
- バーチャルプロテクトを施している可能性
VirtualProtect
- windowsレジストリに影響を与える可能性
RegCreateKeyW
- ファイルが暗号化される可能性
CryptDestroyKey
CryptDecrypt
CryptEncrypt
CryptImportKey
CryptReleaseContext
- ランサムウェアの可能性
CryptDestroyKey
CryptDecrypt
CryptEncrypt
CryptImportKey
CryptReleaseContext
Microsoft Security Center (2.0) Service
Microsoft Base Cryptographic Provider v1.0
- 関連があると考えられる実行ファイル
mssecsvc.exe
tasksche.exe
WanaCrypt0r
- 通信していると考えられるIP
172.16.99.5
192.168.56.20
表層解析から分かったこと
難読化処理が行われている。
また、本ソフトウェアの文字列からファイルを暗号化する関数や Microsoft Base Cryptographic Provider v1.0」はCryptoapiを呼び出すプロバイダーを確認できたためランサムウェアだと考えられる。
compiler-stampが2017年となっており、攻撃者が変更していなければこの頃に作られたと考えられる。
Intel-386より以前のコンピュータでコンパイルされたことも分かった。
GUIも対応しているようだ。GUIで脅迫文などを表示するのでは無いかと考えられる。
また、関連があるとみられる「mssecsvc.exe」「tasksche.exe」「WanaCrypt0r」はランサムウェアのwannacry、wannacryの亜種のようだ。
こちらも後に解析していきたい。また、通信していると考えられるIPと何を行っているかについては動的解析によって調査する。
ちなみに、wannacryは Windowsを標的としたワーム型ランサムウェアである。
2017年5月12日から大規模なサイバー攻撃が開始され150か国、23万台以上のコンピュータに感染し、
コンピュータの身代金として暗号通貨ビットコインを要求する手法で世界中に大きな被害を与えた。
(引用:NEC Solution Innovators, n.d.)
Cryptoapiは、アプリケーション開発者が認証、エンコード、暗号化を Windows ベースのアプリケーションに 追加できるようにする機能を持つ (間接引用:Microsoft, n.d.)
動的解析
Any.Runで動かしてみると、PlayGameという関数が実行されたのみでHTTP/DNS共に一切の通信をしなかった。
また、PlayGameというプログラムが動作したのみで、他にはコンピュータに何も影響を及ぼさなかった。
any.run
まや、仮想環境化で本ファイルを実行しようとすると、windows defenderのリアルタイム保護が働き
「ランサムウェアが見つかりました。」という通知が表示され、本ソフトウェアが自動的に削除された。
静的解析
Imports
・KERNEL32
CloseHandle
WriteFile
CreateFileA
SizeofResourse
LockResourse
LoadResourse
FindResourseA
CreateProcessA
・MSVCRT
free
initterm
malloc
adjust_fdiv
sprintf
PlayGame()
動的解析でエキスポートされていたPlayGame関数をGhidraを用いてリバースエンジニアしてみると、
以下のようであった。
PlayGame(void){ sprintf(&DAT_10003038,”C:\\WINDOWS\\mssecsvc.exe”) FUN_10001016(); FUN_100010ab(); return 0; }
sprintfで&DAT_10003038に”C:\WINDOWS\mssecsvc.exe”を渡すと同時に、
FUN_10001016()
FUN_100010ab()
の2つの関数が実行されていた。
それぞれの関数についてざっくり見ていく。
FUN_10001016()
FUN_10001016(void) { HRSRC hResInfo; HGLOBAL hResData; DWORD *pDVar1; DWORD DVar2; HANDLE hFile; DWORD local_4; hResInfo = FindResourceA(DAT_1000313c,(LPCSTR)0x65,&DAT_10003010); if ((((hResInfo != (HRSRC)0x0) && (hResData = LoadResource(DAT_1000313c,hResInfo), hResData != (HGLOBAL)0x0)) && (pDVar1 = (DWORD *)LockResource(hResData), pDVar1 != (DWORD *)0x0)) && (DVar2 = SizeofResource(DAT_1000313c,hResInfo), DVar2 != 0)) { DVar2 = *pDVar1; hFile = CreateFileA(&DAT_10003038,0x40000000,2,(LPSECURITY_ATTRIBUTES)0x0,2,4,(HANDLE)0x0); if (hFile != (HANDLE)0xffffffff) { WriteFile(hFile,pDVar1 + 1,DVar2,&local_4,(LPOVERLAPPED)0x0); CloseHandle(hFile); } return 1; } return 0; }
hResInfoは、FindResourseAはDAT_1000313cが指すポインタに&DAT_10003010型の0x65を検索している。
関数が成功した場合、戻り値は指定されたリソースの情報ブロックへのハンドルで、リソースへのハンドルを取得するには、このハンドルを LoadResource 関数に渡す必要がある。
関数が失敗した場合、戻り値は NULLを返す。 (FindResourceA 関数 (Winbase.h) - Win32 Apps, 2022)
if文が少し分かりづらいので、箇条書きに直し、解釈を入れる。
・hResInfo != (HRSRC)0x0 && hResData = LoadResource(DAT_1000313c,hResInfo)
hResInfoがNULL(アドレスが0x0)では無いかを確認する。また、DAT_1000313cの最初のバイトへのポインターを取得するために使用できるhResInfoを取得する。
関数が成功した場合、戻り値はリソースに関連付けられているデータへのハンドル。
関数が失敗した場合、戻り値は NULL (LoadResource 関数 (Libloaderapi.h) - Win32 Apps, 2022)
・hResData != (HGLOBAL)0x0 && pDVar1 = (DWORD )LockResource(hResData)
hResInfoがNULL(アドレスが0x0)では無いかを確認する。また、 hResDataへのポインターを取得する。
関数が成功した場合、戻り値はリソースの最初のバイトへのポインター。関数が失敗した場合は NULL 。(LockResource 関数 (Libloaderapi.h) - Win32 Apps, 2022)
・pDVar1 != (DWORD )0x0)) && DVar2 = SizeofResource(DAT_1000313c,hResInfo)
hResInfoがNULL(アドレスが0x0)では無いかを確認する。また、hResInfoが指すリソースのサイズ (バイト単位) を取得。関数が成功した場合、戻り値はリソース内のバイト数。
関数が失敗した場合は、0 を返す。
(SizeofResource 関数 (Libloaderapi.h) - Win32 Apps, 2022)
・DVar2 != 0
DVar2が0(アドレスが0x0)では無いかを確認する。
各処理が終わるごとに、前の関数が成功しているかを確かめ、次の処理を行っている様子が分かった。
黄色でハイライトされている部分の下では、上で得た情報を元にCreateFileA関数でファイルを作ろうとし、成功した場合は書き込みを行うようだ。
FUN_100010ab()
FUN_100010ab(void) { BOOL var1; int var2; LPSTR *ppCVar1; _STARTUPINFOA local_58; _PROCESS_INFORMATION local_14; local_14.hProcess = (HANDLE)0x0; local_14.hThread = (HANDLE)0x0; local_14.dwProcessId = 0; local_14.dwThreadId = 0; ppCVar1 = &local_58.lpReserved; for (var2 = 0x10; var2 != 0; var2 = var2 + -1) { *ppCVar1 = (LPSTR)0x0; ppCVar1 = ppCVar1 + 1; } local_58.cb = 0x44; local_58.wShowWindow = 0; local_58.dwFlags = 0x81; var1 = CreateProcessA((LPCSTR)0x0,&DAT_10003038,(LPSECURITY_ATTRIBUTES)0x0, (LPSECURITY_ATTRIBUTES)0x0,0,0x8000000,(LPVOID)0x0,(LPCSTR)0x0,&local_58, &local_14); if (var1 != 0) { CloseHandle(local_14.hThread); CloseHandle(local_14.hProcess); } return 0; }
となっており、黄色でハイライトされている部分でなにやら分岐の処理を行っている事がわかる。
黄色でハイライトされている部分の逆コンパイル前のアセンブリは以下のようになっている。
TEST EAX,EAXに注目してほしい。
TESTは、論理積(AND)命令であるが、ANDの結果を保存せず、フラグだけ変化するため、条件分岐によく使われる。
ANDの結果が0だったらZF=1になり、ZFが立つ(JZ=1)ので、その下のJZ命令で、LAB_10001110にジャンプするようだ。
(アセンブラに手を出してみる【ジャンプ命令編】, 2020)
(//, n.d.)
また、var1はBool型のCreateProcessA関数の結果であり、この関数に失敗すると0が返されるようだ。
そのため、上の分岐は、CreateProcessA関数が成功したかどうかを見ているようだ。
以上で本ソフトウェアの解析を終える。
表層解析では、ランサムウェアかと思われたが、動的解析・静的解析では特にその特徴を見つけることが出来ず、
本ソフトウェアが何であるのかを断定することが出来なかった。引き続き、学習を続け、改めて本ソフトウェアがどんな挙動をするのかを調べていきたい。
参考文献
References
//. (n.d.). // - Wikipedia. Retrieved December 10, 2022, from https://wiki.onakasuita.org/pukiwiki/?TEST
アセンブラに手を出してみる【ジャンプ命令編】. (2020, April 3). いろはの物置き場. Retrieved December 10, 2022, from https://168iroha.net/blog/topic/?id=202004031013&sorting=post_date
FindResourceA 関数 (winbase.h) - Win32 apps. (2022, October 5). Microsoft Learn. Retrieved December 11, 2022, from https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-findresourcea
LoadResource 関数 (libloaderapi.h) - Win32 apps. (2022, October 4). Microsoft Learn. Retrieved December 11, 2022, from https://learn.microsoft.com/ja-jp/windows/win32/api/libloaderapi/nf-libloaderapi-loadresource
LockResource 関数 (libloaderapi.h) - Win32 apps. (2022, October 5). Microsoft Learn. Retrieved December 11, 2022, from https://learn.microsoft.com/ja-jp/windows/win32/api/libloaderapi/nf-libloaderapi-lockresource
Microsoft. (n.d.). C (セキュリティ用語集). C (セキュリティ用語集). Retrieved December 1, 2022, from https://learn.microsoft.com/ja-jp/windows/win32/secgloss/c-gly
NEC Solution Innovators. (n.d.). WannaCry(マルウェア、ランサムウェア) | セキュリティ用語集 | サイバーセキュリティ. NECソリューションイノベータ. Retrieved December 1, 2022, from https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/39.html
SizeofResource 関数 (libloaderapi.h) - Win32 apps. (2022, September 27). Microsoft Learn. Retrieved December 11, 2022, from https://learn.microsoft.com/ja-jp/windows/win32/api/libloaderapi/nf-libloaderapi-sizeofresource