Cloud Atlas: sheet happens

Authors: Georgy Khandozhko, Alexander Grigoryan, Vladislav Lunin.

Highlights

  • The cybercriminal group dubbed Cloud Atlas has been targeting organizations in Russia and Belarus since 2014.
  • Cloud Atlas continues to utilize cloud services as C2 servers. Specifically, the attackers used Yandex Disk (a cloud storage service) to store malicious modules during the campaign analyzed in this article.
  • Cloud Atlas keeps improving its tools, adding new capabilities. The PowerShower backdoor executes encrypted commands hidden within XML files. VBShower uses Google Sheets as its command-and-control server.

Attack chain

In November 2024, employees of a Russian government agency discovered a phishing campaign and turned to the PT ESC IR team for assistance in investigating the malicious activity.

During the investigation, we determined that the attack was part of a phishing campaign orchestrated by the Cloud Atlas group and targeting employees of government agencies in Russia and Belarus. PT ESC had been tracking this phishing campaign since late October 2024, and all known affected organizations had been notified. We previously described the activity of the group in our report APT Cloud Atlas: Unbroken Threat.

The screenshots below show an example of a phishing email, purportedly sent by the Ministry of Communications and Informatization of the Republic of Belarus.

Example of a phishing message
Figure 1. Example of a phishing message

The emails were sent from @internet.ru addresses. A user can obtain such an email account when registering with the mail.ru service.

Creating an email account
Figure 2. Creating an email account

In the past, Cloud Atlas typically used documents related to the current geopolitical situation as bait. In this campaign, however, the documents were disguised as official requests for specific types of information, purportedly from various government agencies.

The malicious documents discovered during the incident investigation used a remote template injection technique (Template Injection).

The screenshots below showcase examples of decoy documents used by the attackers during the phishing campaign.

Decoy document (example 1)
Figure 3. Decoy document (example 1)
Decoy document (example 2)
Figure 4. Decoy document (example 2)

The link to a malicious template is embedded in the 1Table stream of the malicious DOC file.

Structure of a DOC file
Figure 5. Structure of a DOC file
Link to a malicious template
Figure 6. Link to a malicious template

At the time of the phishing campaign, antivirus tools were not able to detect the malicious documents.

Verdicts of antivirus engines on VirusTotal
Figure 7. Verdicts of antivirus engines on VirusTotal

When such a malicious document is launched, a template is downloaded from the attacker's server officeconfirm.technoguides[.]org. By the time the incident investigation began, this server was already inaccessible. However, based on the artifacts found on the infected hosts and judging by the antivirus tool triggers, we concluded that the downloaded template exploited a vulnerability in the Equation Editor component.

We also discovered that a similar DOC file had been checked on VirusTotal before: at the time when the file was uploaded, the command-and-control server was accessible, and the behavioral analysis results of the document were relevant.

During the behavioral analysis in the C2AE sandbox, a GET request to the C2 server was detected, and the server responded to it by returning an HTML Application (HTA) file. This request was made just seconds after requesting the malicious template.

Request to a malicious template, as detected by behavioral analysis
Figure 8. Request to a malicious template, as detected by behavioral analysis
Request to an HTA file, as detected by behavioral analysis
Figure 9. Request to an HTA file, as detected by behavioral analysis

In earlier attacks, Cloud Atlas also used HTA files to deliver other malicious tools to infected hosts. In particular, the analysis of activity on infected hosts revealed instances of malicious VB scripts being executed. These scripts were recorded in alternate data streams of files named AppCache***.log, located at %APPDATA%\Microsoft\Windows. VB scripts interact with a C2 server, which in this case is a Google Sheets document.

The command to execute the malicious script on the hosts under investigation was added to the autorun key of the Windows registry (HKCU:\Software\Microsoft\Windows\CurrentVersion\Run):

NcdAutoSetup - wscript /B "%APPDATA%\Microsoft\Windows\AppCache498625573823535133.log:AppCache 498625573823535133.vbs"

The VB script under examination sent data about the infected user to a Google Sheets document via API. Following this, Visual Basic code, encrypted and stored in a different cell of the same sheet, was executed on the host. As a result of executing such commands, instances of other Cloud Atlas group tools were delivered to the infected hosts. In particular, the PowerShower backdoor was delivered; it executed commands received from the C2 server mehafon[.]com (for more details, see the "Malware analysis" section).

Traces of PowerShower persistence were also found in the autorun key:

Canon_upd - powershell -ep bypass -w 01 "%AllUsersProfile%\Canon\CanonHost.ps1"

The same delivery method was also used for another malware, which used the DLL Side-Loading technique, disguising itself as components of Cisco Webex:

  • %APPDATA%\Cisco\CiscoCollabHost.exe;
  • %APPDATA%\Cisco\CiscoSparkLauncher.dll.

The legitimate but vulnerable file CiscoCollabHost.exe calls the SparkEntryPoint function of the CiscoSparkLauncher.dll library, which is located in the same folder. The folder also contains the payload file.

Malicious code snippet invoking a malicious library
Figure 10. Malicious code snippet invoking a malicious library
Certificate of the executable file CiscoCollabHost.exe
Figure 11. Certificate of the executable file CiscoCollabHost.exe
The function SparkEntryPoint in the export list of the malicious library
Figure 12. The function SparkEntryPoint in the export list of the malicious library

In the process of searching for similar malware samples, we found a library with a matching import hash (imphash). The malware itself acts as a loader for the main functional modules, which are stored on Yandex Disk. The loader persists in the system by creating a scheduled task named CiscoMngr:

<Actions Context="Author">
    <Exec>
      <Command>%APPDATA%\Cisco\CiscoCollabHost.exe</Command>
    </Exec>
  </Actions>

The entire infection chain can be visualized as follows:

Attack chain
Figure 13. Attack chain

Malware analysis

VBShower

The execution of VB scripts obfuscated in this manner has already been observed in earlier Cloud Atlas attacks. In particular, similar activity has been described in a F.A.C.C.T. report and in a Kaspersky APT report, which named the malicious script VBShower.

A key difference in the scripts we examine here is the use of Google Sheets as the C2 server, as opposed to traditional command-and-control servers in previous cases.

The original script looks as follows:

VBShower, original script
Figure 14. VBShower, original script

After deobfuscation, we see that the script reads the payload content, which is recorded in a file with the same name as the script file itself, but with a .dat extension. The payload itself is a set of bytes in hexadecimal format. The first two bytes are service bytes and are used in subsequent transformations.

Processing each payload byte, starting from the third, is carried out in one of two modes:

  • XOR with the first byte of the payload followed by converting the result into the corresponding ASCII character
  • Adding the hexadecimal representation of a byte to the resulting string in its original form

Each byte that is being processed is compared to the second byte of the payload file. If the values of these bytes are equal, the processing mode switches. Otherwise, the processing continues in the current mode.

As a result of payload decoding, the following string is formed, containing VB code executed via the Execute command:

VBShower, a code snippet after partial deobfuscation
Figure 15. VBShower, a code snippet after partial deobfuscation

The processing of data recorded in the Pbqb variable follows this algorithm:

  1. The string stored in the Pbqb variable is passed as the first argument to the AEFe data deobfuscation function; the result is executed using the Execute function.
  2. The second argument (tIOe) of the function is assigned the value of the variable yQT6, which equals 2. This variable is passed to the function by reference, and its value is modified within the function body.
  3. The tIOe argument specifies the index from which the substring will be read from the string variable passed to the first argument. Thus, the string stored in the variable Pbqb is read starting from the second character (the leading space is omitted).
  4. The first eight characters of the resulting substring are then read and fed into the QkuA function, which performs byte-by-byte decoding of the data from hexadecimal format into the corresponding ASCII characters.
  5. The decoded string is a decimal number that is converted into an Int data type, then multiplied by 2 and added to 8.
  6. The final value is used in the newly invoked decoding function and determines the length of the substring to be decoded.
  7. The substring is decoded using the QkuA function, after which the first four characters are removed. These characters correspond to the decimal representation of the number from which we previously obtained the length of the substring.
  8. The value of the second argument of the AEFe function is added to the number equal to the length of the substring. The resulting value determines the start index of the next decodable block.

Let's break down the algorithm with an example. The AEFe deobfuscation function receives the string Pbqb. After removing the leading space, the first eight characters appear as:

30303435

This string is represented as a sequence of hexadecimal bytes (0×30 0×30 0×34 0×35), which decodes into the ASCII characters "0045″.

The string "0045″ is converted to an integer type. The resulting integer number is 45.

45 * 2 + 8 = 98.

The first 98 characters of the original string are then read and decoded, producing the following string:

0045For uuHD=1 To 98:Execute AEFe(Pbqb,yQT6):Next

The first four characters are discarded, and the AEFe function outputs the following string, which will be executed as VB code:

For uuHD=1 To 98:Execute AEFe(Pbqb,yQT6):Next

This code indicates that the deobfuscation function will be called 98 more times. The value of the variable yQT6, which was initially 2, has increased by 98. This means that the next block of deobfuscated code starts at the 100th character of the original Pbqb string.

When the cycle is complete, the original string Pbqb is fully deobfuscated. The resulting VB code blocks are executed sequentially during the deobfuscation process.

The relevant code snippets are shown in the screenshots below:

VBShower code snippet
Figure 16. VBShower code snippet

The code performs the following operations:

  • Read the values of the ProxyServer and ProxyEnable parameters for the registry key HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings and uses them in subsequent HTTP requests, if they are set.
  • Extract the username and domain from the registry key HKCU:\Volatile Environment.

The following operations are then performed in an infinite loop:

  • Check for the presence of the NcdAutoSetup parameter in the registry key HKCU:\Software\Microsoft\Windows\CurrentVersion\Run. If the value is not set, the current VB script execution string is written to it. This helps the malware to persist in the system.
  • Write the compromised user's details in the first available cell of column A in the Google Sheets document, formatted as CURRENT_TIMESTAMP#USERNAME#DOMAINNAME.
  • Read the hexadecimal data stored in column B, performing byte-by-byte XOR with the first byte of the payload (.dat file), and execute the decoded VB code. Upon completion of the executed code, replace the value in the corresponding cell with an entry in the format "done CURRENT_TIMESTAMP".
  • Write the value of the variable "result" in the cell in column D of the same row, provided it is not empty. Within the script code itself, the variable "result" is not initially defined, but it can be set within the command body that is obtained from cell B in the previous step.
  • Read data from a temporary TMP file located in the current folder, in blocks of 25,000 characters. Each character is encoded in hexadecimal representation, then encrypted using the XOR method with a key matching the second byte of the payload from the .dat file. The encryption result of the first block is recorded in column E, the second block in column F, and so on.

At the end of each cycle iteration, the script goes to sleep for a period of time equal to 2133767 ms + random_value (35+ minutes).

During our investigation of the compromised hosts, we were unable to locate any temporary files, probably because they had been deleted. However, we managed to recover their contents. These files contained, among other things, information about running processes and scheduled tasks in the system. Presumably, the temporary files stored the result of executing the VB code obtained from the Google Sheets document.

By comparing the timestamps in the document with the timestamps in MFT files, we concluded that other tools used by the attackers were delivered to the infected hosts as a result of the code execution.

Examination of PREFETCH files on a compromised host revealed that the cmd.exe process had interacted with a temporary file in an alternate data stream.

Traces of cmd.exe interacting with a temporary file
Figure 17. Traces of cmd.exe interacting with a temporary file

In addition to information about processes and tasks, the temporary files were found to store the extracted contents of the %APPDATA%\Cisco folder, including file names and file sizes.

Contents of the Cisco folder in temporary files on compromised hosts
Figure 18. Contents of the Cisco folder in temporary files on compromised hosts

At the time of the analysis, the file a.txt was not present on the infected hosts. However, judging by its size, its contents may match the executable file CiscoCollabHost.exe. The sizes of the payload files found on the compromised hosts also match, which may indicate the identical nature of these files.

Below is a code in VB.NET that decodes the payload and brings the malicious script to its final form.

		Sub Main(args As String())
        ' Path to the payload file
        datPayload = "C:\your_path\payload.dat"

        content = File.ReadAllText(datPayload)
        xorByte = Mid(content, 3, 2)

        checkByte = Mid(content, 1, 2)

        cond = True

        For i = 5 To Len(content) Step 2
            currentByte = Mid(content, i, 2)
            Do
                If currentByte = xorByte Then
                    cond = Not cond
                    currentByte = " "
                    Exit Do
                End If

                If cond Then
                    currentByte = Chr("&H" & checkByte Xor "&H" & currentByte)
                End If
            Loop While False
            firtsDecodeStage = firtsDecodeStage + currentByte
        Next

        resArr = Split(firtsDecodeStage, Chr(34))
        hexPayload = resArr(1)

        payloadIndex = 2

        Deobfuscate(hexPayload, payloadIndex)

        For uuHD = 1 To 98
            decodedChunk = Deobfuscate(hexPayload, payloadIndex)
            Console.WriteLine(decodedChunk)
        Next

    End Sub

    Function Deobfuscate(inputStr, ByRef ind)
        nextBlockLength = CInt(Decode(Mid(inputStr, ind), 8)) * 2
        Deobfuscate = Mid(Decode(Mid(inputStr, ind), nextBlockLength + 8), 5)
        ind = ind + nextBlockLength + 8
    End Function

    Function Decode(inputStr, Length)
        ReDim resultArr(Length)

        For ind = 1 To Length Step 2
            resultArr(ind) = Chr(CInt(Chr(38) + "H" + Mid(inputStr, ind, 2)))
        Next

        Decode = Join(resultArr, "")
    End Function
Listing 1. Deobfuscation code for VBShower
VBShower workflow
Figure 19. VBShower workflow

PowerShower

The PowerShower backdoor used by the Cloud Atlas group was described in a Palo Alto report. The PowerShell script we discovered during our investigation is a modification of PowerShower. The script operates in an infinite loop, with each iteration beginning with a GET request to the C2 server.

If the server response begins with the letter "P", the content of the response is saved to a file named Firefox.zip in the AppData\Local\Temp folder of the current user. Otherwise, the content of the server response, which is in XML format, is saved to a file with a random name.

Next, the script reads the value of the annotation attribute of the xs element in the XML file, starting from the last character. Each character of the resulting string is compared with the characters of the key string: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/. If the characters match, the index of the corresponding character in the key string is converted to binary, with leading zeros added to make it six characters long. The output is added to the final string. Thus, the character A will correspond to the string 000000, the character B to 000001, and so on.

The resulting string, composed of zeros and ones, is then divided into blocks of eight characters each. If a block consists of eight zeros, it is skipped. Otherwise, the string of binary symbols is first converted into an integer value, and then into the corresponding ASCII character, which is added to the final string.

When the processing of all blocks is complete, the output is a string that is subsequently executed as PowerShell code. After executing the command, the script is supposed to delete the XML file containing the payload. However, we were fortunate to find several such files in the antivirus quarantine.

Below is an example of the content of one such file:

An encrypted PowerShell code snippet
Figure 20. An encrypted PowerShell code snippet

After decrypting the string in the annotation attribute, we will obtain the following PowerShell code:

$la = net accounts;[io.file]::WriteAllText($env:temp+"\sapp.xtx", $la);;;

The result of the code execution, recorded in the file AppData\Local\Temp\sapp.xtx (the file name may vary in other instances of PowerShower), is sent to the server, after which the file is deleted from the system.

PowerShower workflow
Figure 21. PowerShower workflow

The code of the examined PowerShower sample is as follows:

PowerShower code
Figure 22. PowerShower code

The PowerShell code for decrypting the payload in the XML file is shown below:

function DecodeAnnotation($annotation) {
    $customAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    $binaryString = ""

    foreach ($char in $annotation.ToCharArray()) {
        $index = $customAlphabet.IndexOf($char)
        if ($index -ge 0) {
            $binaryString += [Convert]::ToString($index, 2).PadLeft(6, '0')
        }
    }

    $byteList = @()
    for ($i = 0; $i -lt $binaryString.Length; $i += 16) {
        $byte = $binaryString.Substring($i, [Math]::Min(16, $binaryString.Length - $i))
        if ($byte.Length -eq 16) {
            $byteList += [Convert]::ToByte($byte.Substring(0, 8), 2)
            $byteList += [Convert]::ToByte($byte.Substring(8, 8), 2)
        }
    }

    $decodedText = [System.Text.Encoding]::Unicode.GetString($byteList)
    return $decodedText
}

function DecodeXmlFile($xmlFilePath) {
    [xml]$xmlContent = Get-Content -Path $xmlFilePath -Raw

    $annotationNodes = $xmlContent.Relationships.xs.annotation
    if ($annotationNodes -eq $null) {
        Write-Output "No annotation field found in the XML file."
        return
    }

    $annotationString = ($annotationNodes[-1..-$annotationNodes.Length] -join '')

    $decodedText = DecodeAnnotation $annotationString
    return $decodedText
}


# Path to the payload file
$xmlFilePath = "C:\your_path\payload.xml"
$decodedAnnotation = DecodeXmlFile $xmlFilePath
Write-Output "Decoded annotation: $decodedAnnotation"
Listing 2. PowerShell code for decrypting the payload in the XML file

Dropper

CiscoSparkLauncher.dll is the first stager of Cloud Atlas malware. It decrypts and executes the payload contained in a file in the same folder.

The functionality of the dropper and malware modules, described in our article APT Cloud Atlas: Unbroken Threat in the malware analysis section, has remained virtually unchanged since then. The core module has undergone a minor functional change: unlike earlier versions, it now uses a statically linked Crypto++ library for cryptography, compression has been removed, and WebDAV of Yandex Disk is used for storing stolen data and malicious modules. The account pe9ov.sem@yandex.ru is used to access the storage. As in previous cases, the attackers uploaded a module to steal files from the infected device based on specific parameters, such as file paths and extensions.

Traces of use of the Crypto++ library
Figure 23. Traces of use of the Crypto++ library
Fragment of the dropper configuration
Figure 24. Fragment of the dropper configuration

Conclusion

For the past 10 years, the Cloud Atlas group has been targeting government agencies in Russia and Belarus. Although the Cloud Atlas toolset has not changed significantly and attackers continue to rely on cloud services, they constantly experiment with different popular platforms.

The use of Google Sheets as a command-and-control server is the most significant feature of the analyzed campaign, setting it apart from previous attacks.

The malicious actors continue to refine their tactics, techniques, procedures, and tools. The malware used by Cloud Atlas is becoming more sophisticated and enhanced.

The authors would like to thank the incident response and threat intelligence teams of the PT ESC (PT Expert Security Center) for their help in preparing this article.

The following sections contain information on all received samples and updated TTPs.

Network indicators

Domains:

mehafon.com
officeconfirm.technoguides.org
technoguides.org
mirconnect.info
jhsdshdkajdhgfyhsfhjshh.cfd
web-whatapp.net

IP addresses:

79.143.87[.]233
188.127.235[.]216
185.99.2[.]168
176.124.33[.]86
80.85.153[.]195

User Agent:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20200201 Firefox/132.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.2535.93

Legitimate services with which the malware interacts:

webdav.yandex.ru (213.180.204.148)
oauth2.googleapis.com
sheets.googleapis.com
googleusercontent.com

File-based indicators

NameSHA-256SHA-1MD5
Malicious DOC files
О представлении информации.doc9943fee873c0642216d1578fc4373648b670b5bc47a8bf37366063041518f8b2d9bd15881ad8b654a2240a897cbeb46c03552d1efa2423762b6ebb9cdb3371cc435efb7b
O predstavlenii informatsii.doc
design.doce09f90563be00fc947a80bb1902a1b05c9e9aa8c86d01a34204717d68eb1684f92457167f373eb0bd34fa03e3344d247488e915eb4b1f2d8e823e45596f2d7e79aa1c6f6
Запрос.docc985309140500090ad457c4e380b461b7548cf837ddd45415edd4653e2ef50b2bf962be239d6db58be188467edb6700d05225372563b7d91c3fde2ae643f2cc1224eb9ec
e91df17051b16bde97e7dec66a67025d2905612cc0bc5e3bc6b93493edf43d70828cb4553ec59c285f2ad56298c66cd8e916e77844619aef8f1b984492a75e8c23a01b71
Инструкция по информационной безопасности.doc9e838d7ad444130873a8c171d204283eb23ce9c2c5e3eb9d604848ef4401d71d3cdefb581cbd9460c7572f98ac749e4c1657b4f2d651f5bdbf100196f287573fc284ae08
PowerShower
CanonHost.ps189d56295bc8571334aa6916587d3ca6be01934b97f5fdf1cf895d1beda1d73bf5a247da8a8b132b39bdcd1c057c895f9814c8334510afa061564a097676f79c8c2d89b97
CloudAtlas Loader 1st stage
CiscoSparkLauncher.dll650409dc7ba6e4565e7ba598d9a21fa422cdc0404ab188d368faced929d634cfe60cf309532278a1cca95cd4b354416d1556e4b18e276bc2326ab8c24df56e7153788da1
dmneirin.dll8521d257295396a487dc0d7ccbeed25c05dcc12944e7f1addb06b57412676bf6c71b68514dfe47a714dd99c04dce16514b605179257df0985cfaf3b947e042fb9af82eed
CloudAtlas Loader Payload
fornicarybf6cfd89f09e0a28ec76ba1e2610c7fed149c4b94fa59f0a5a07f989fc7faa91da64ff5480d8884fd32a69c2af5aa2fbb5cdb526d3fa018d222df3a5aa47392cf4083e6a
VBShower payload
AppCache***.log:
AppCache***.dat
27f77e73e1b1ce12b098362019266f5acb64f4bc34752ca0e3a16229880d300de49b39b0bc9d2cfa9c6befcc4aac9d017442682717ba532cca6b69ccd7934ad16ab3b878
AppCache***.log:
AppCache***.vbs
b52233e2f3e885928834aaf1a8df86ec8e741fba2de5fedb31d1ed86768aeb4b31bea0a78548fc58e936fcd6a62876abf50a8fd86e9ecd9294139bc453f02e448cc8359e
CloudAtlas Loader Payload
rescuable---
Malicious task
CiscoMngr---

MITRE TTPs

IDNameDescription
Resource Development
T1583Acquire InfrastructureCloud Atlas utilized the server officeconfirm.technoguides[.]org 
for storing remote templates, as well as cloud services as their C2 server
T1585Establish AccountsCloud Atlas registered accounts on yandex.ru. Example: pe9ov.sem@yandex.ru
T1587.001Develop Capabilities: MalwareCloud Atlas has developed their own malware: PowerShower, CloudAtlas Loader, CloudAtlas Loader Payload, and VBShower
T1608.001Stage Capabilities: Upload MalwareCloud Atlas deployed malware on controlled servers and cloud services
Initial Access
T1566.001Phishing: Spearphishing AttachmentCloud Atlas sent phishing emails with malicious content from the internet.ru domain
Execution
T1204.002User Execution: Malicious FileCloud Atlas sent emails with malicious DOC files
T1559.001Inter-Process Communication: Component Object ModelThe Cloud Atlas used COM components in their tools
T1059.001Command and Scripting Interpreter: PowerShellCloud Atlas used PowerShell scripts to load and run their components
T1059.005Command and Scripting Interpreter: Visual BasicCloud Atlas used Visual Basic scripts to load and run their components
T1203Exploitation for Client ExecutionCloud Atlas used vulnerabilities in Microsoft Office components to launch their malicious components
T1047Windows Management InstrumentationCloud Atlas utilized WMI to execute code
Persistence
T1547.001Boot or Logon Autostart Execution: Registry Run Keys / Startup FolderCloud Atlas used registry keys (autorun) for persistence Example: HKCU:\Software\Microsoft\Windows\CurrentVersion\Run
T1053.005Scheduled Task/Job: Scheduled TaskCloud Atlas utilized the Windows Task Scheduler for persistence. The attackers created a task named CiscoMngr
Defense Evasion
T1221Template InjectionCloud Atlas used the remote template injection technique to hide the malicious payload
T1027Obfuscated Files or InformationCloud Atlas encrypted their components to protect them from discovery and analysis
T1140Deobfuscate/Decode Files or InformationCloud Atlas decrypted the payload to execute malicious code
T1070.004Indicator Removal: File DeletionCloud Atlas deleted files containing the payload or the result of the malware’s activity
T1564.004Hide Artifacts: NTFS File AttributesCloud Atlas utilized alternative data streams to conceal the malware contents
T1574.002Hijack Execution Flow: DLL Side-LoadingCloud Atlas employed the DLL Side-Loading technique to execute malicious code. The attackers exploited a vulnerable legitimate file, CiscoCollabHost.exe (Cisco WebEx)
T1036.005Masquerading: Match Legitimate Name or LocationCloud Atlas used file names that matched legitimate software components to conceal malicious files
Discovery
T1087.002Account Discovery: Domain AccountCloud Atlas obtained usernames and domain names from infected hosts through the Windows registry key HKCU:\Volatile Environment
T1057Process DiscoveryCloud Atlas received a list of running processes on compromised systems
T1012Query RegistryCloud Atlas sent requests to the Windows registry to determine the proxy server settings. The malware read the values of the ProxyServer and ProxyEnable parameters for the registry key HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings
Collection
T1025Data from Removable MediaCloud Atlas used tools to collect information from various remote devices
T1039Data from Network Shared DriveCloud Atlas used tools to collect information from various network devices
T1005Data from Local SystemCloud Atlas used tools to collect information from the file system
T1560.003Archive Collected Data: Archive via Custom MethodCloud Atlas used custom data encryption algorithms
T1119Automated CollectionCloud Atlas used automated methods to collect data collection from infected devices
Command and Control
T1573.001Encrypted Channel: Symmetric CryptographyCloud Atlas used AES encryption to hide network communication
T1041Exfiltration Over C2 ChannelCloud Atlas used a C2 channel to transfer collected data
T1102Web ServiceCloud Atlas utilized cloud services such as Yandex Disk and Google Sheets as their C2 servers
T1105Ingress Tool TransferCloud Atlas delivered malware to compromised hosts
Exfiltration
T1030Data Transfer Size LimitsCloud Atlas uploaded command execution results to Google Sheets cells in parts, due to the character limit in cells.
T1567.002Exfiltration Over Web Service: Exfiltration to Cloud StorageCloud Atlas uploaded the results of the malware activity to the cloud services Yandex Disk and Google Sheets

How activity of Cloud Atlas can be detected with Positive Technologies products

MaxPatrol SIEM correlation rules:

Alternate_Data_Stream
Malicious_Office_Document
Windows_Autorun_Modification
Execute_Malicious_Powershell_Cmdlet
Execute_Malicious_Command
Execute_Encoded_Powershell
Scheduled_Task_Manipulation
Script_Files_Execution
DLL_Side_Loading
Malicious_Activity_From_Office_Documents
Obfuscated_Powershell
Run_Masquerading_Executable_File

PT NAD and PT NGFW (signatures):

LOADER [PTsecurity] RtcpProxy (APT CloudAtlas) sid: 10008367
SUSPICIOUS [PTsecurity] PROPFIND method in http request sid: 10008218
SUSPICIOUS [PTsecurity] MKCOL method in http request sid: 10008219

Alerts triggered by the last two signatures are not definitive indicators of Cloud Atlas activity; they can be used for retrospective threat analysis.

PT NAD (reputation lists):

ESC-manual-cloudatlas-ip
ESC-manual-cloudatlas-dns

PT Sandbox:

apt_win_ZZ_CloudAtlas__Stealer__Plugin
apt_win_ZZ_CloudAtlas__Dropper__FirstDll
apt_win_ZZ_CloudAtlas__Dropper__FirstExe
apt_mem_ZZ_CloudAtlas__Trojan__InitialModule
apt_win_ZZ_CloudAtlas__Backdoor__MainModule
apt_mem_ZZ_CloudAtlas__Backdoor__MainModule
apt_win_ZZ_CloudAtlas__Dropper__RTF
apt_win_ZZ_CloudAtlas__Dropper__VBS
apt_win_ZZ_CloudAtlas__Backdoor__PS
apt_win_ZZ_CloudAtlas__Stealer__PS
apt_win_ZZ_CloudAtlas__Trojan__PS
apt_win_ZZ_CloudAtlas__Backdoor__native__PowerShower

File signatures

rule PTESC_tool_win_ZZ_OfficeTemplate__Downloader__DOC_v2{
  strings:
    $a = {00 A5 06 6E 04 B4}
    $b = {FF FF FF 7F FF FF FF 7F}
    $c = {B4 00 B4 00 81 81 12 30 00}
  condition:
    uint16be ( 0 ) == 0xd0cf and filesize < 10MB and ( for any i in ( 300 .. 400 ) : ( ( ( uint8be ( @a + i ) == 0x68 ) or 
( uint8be ( @a + i ) == 0x48 ) ) and ( ( uint8be ( @a + i + 2 ) == 0x74 ) or ( uint8be ( @a + i + 2 ) == 0x54 ) ) and ( (
uint8be ( @a + i + 4 ) == 0x74 ) or ( uint8be ( @a + i + 4 ) == 0x54 ) ) and ( ( uint8be ( @a + i + 6 ) == 0x70 ) or (
uint8be ( @a + i + 6 ) == 0x50 ) ) and ( for any y in ( 14 .. 70 ) : ( uint8be ( @a + y + i ) == 0x2f and ( for any z in ( 4
.. 70 ) : ( uint8be ( @a + z + i + y ) == 0x2f or uint8be ( @a + z + i + y ) == 0x3f ) ) ) ) ) or for any j in ( 100 .. 200 )
: ( ( ( uint8be ( @b + j ) == 0x68 ) or ( uint8be ( @b + j ) == 0x48 ) ) and ( ( uint8be ( @b + j + 2 ) == 0x74 ) or (
uint8be ( @b + j + 2 ) == 0x54 ) ) and ( ( uint8be ( @b + j + 4 ) == 0x74 ) or ( uint8be ( @b + j + 4 ) == 0x54 ) ) and ( (
uint8be ( @b + j + 6 ) == 0x70 ) or ( uint8be ( @b + j + 6 ) == 0x50 ) ) and ( for any y in ( 14 .. 70 ) : ( uint8be ( @b + y
+ j ) == 0x2f and ( for any z in ( 4 .. 70 ) : ( uint8be ( @b + z + j + y ) == 0x2f or uint8be ( @b + z + j + y ) == 0x3f ) )
) ) ) or for any k in ( 200 .. 400 ) : ( ( ( uint8be ( @c + k ) == 0x68 ) or ( uint8be ( @c + k ) == 0x48 ) ) and ( ( uint8be
( @c + k + 2 ) == 0x74 ) or ( uint8be ( @c + k + 2 ) == 0x54 ) ) and ( ( uint8be ( @c + k + 4 ) == 0x74 ) or ( uint8be ( @c +
k + 4 ) == 0x54 ) ) and ( ( uint8be ( @c + k + 6 ) == 0x70 ) or ( uint8be ( @c + k + 6 ) == 0x50 ) ) and ( for any y in ( 14
.. 70 ) : ( uint8be ( @c + y + k ) == 0x2f and ( for any z in ( 4 .. 70 ) : ( uint8be ( @c + z + k + y ) == 0x2f or uint8be (
@c + z + k + y ) == 0x3f ) ) ) ) ) )
}
Share this article:

Get in touch

Fill in the form and our specialists
will contact you shortly