Positive Technologies
PT Expert Security Center

Cloud Atlas: sheet happens

Cloud Atlas: sheet happens

Авторы:

Георгий Хандожко

Георгий Хандожко

Специалист департамента комплексного реагирования на киберугрозы PT ESC

Александр Григорян

Александр Григорян

Заместитель руководителя департамента комплексного реагирования на киберугрозы PT ESC

Владислав Лунин

Владислав Лунин

Старший специалист группы исследования сложных угроз PT ESC

Ключевые моменты

  • Группировка Cloud Atlas атакует организации в России и Белоруссии с 2014 года.
  • Cloud Atlas продолжает использовать облачные сервисы в качестве C2-серверов. В частности, в рассматриваемой кампании злоумышленники использовали «Яндекс Диск» для хранения вредоносных модулей.
  • Cloud Atlas совершенствует и усложняет свои инструменты. Бэкдор PowerShower выполняет зашифрованные команды, спрятанные в файлах формата XML. VBShower использует Google Sheets в качестве управляющего сервера.

Цепочка атаки

В ноябре 2024 года сотрудники одной из российских государственных организаций обнаружили фишинговую рассылку и обратились к команде PT ESC IR для помощи в расследовании вредоносной активности.

В ходе расследования мы выяснили, что атака является частью фишинговой кампании, нацеленной на сотрудников государственных организаций России и Белоруссии, за которой стоит группировка Cloud Atlas. Эту фишинговую кампанию PT ESC отслеживала с конца октября 2024 года, все известные пострадавшие организации были уведомлены. Активность группировки раннее мы уже описывали в отчете APT Cloud Atlas: Unbroken Threat.

На скриншотах ниже представлен пример фишингового письма, отправленного якобы Министерством связи и информатизации Республики Беларусь.

Рисунок 1. Пример фишингового сообщения

Рисунок 1. Пример фишингового сообщения

Рассылка осуществлялась с адресов @internet.ru. Такой домен почтового адреса можно получить при регистрации на сервисе mail.ru.

Рисунок 2. Создание почтового ящика

Рисунок 2. Создание почтового ящика

Если ранее в качестве документа-приманки Cloud Atlas, как правило, использовала тексты, связанные с текущей геополитической обстановкой, то в рамках этой кампании документы представляли собой запросы о предоставлении определенного рода информации, направленные различными якобы государственными ведомствами.

Обнаруженные нами в ходе расследования инцидента вредоносные документы использовали технику удаленной загрузки шаблона (Template injection).

На скриншотах ниже представлены примеры документов-приманок, которые использовали злоумышленники в ходе фишинговой кампании.

Рисунок 3. Документ-приманка (пример 1)

Рисунок 3. Документ-приманка (пример 1)

Рисунок 4. Документ-приманка (пример 2)

Рисунок 4. Документ-приманка (пример 2)

Ссылка на вредоносный шаблон вшита в поток 1Table вредоносного документа формата DOC.

Рисунок 5. Структура DOC-файла

Рисунок 5. Структура DOC-файла

Рисунок 6. Ссылка на вредоносный шаблон

Рисунок 6. Ссылка на вредоносный шаблон

На момент проведения фишинговой кампании вредоносные документы не детектировались средствами антивирусной защиты.

Рисунок 7. Вердикты средств антивирусной защиты на VirusTotal

Рисунок 7. Вердикты средств антивирусной защиты на VirusTotal

При запуске вредоносного документа загружается шаблон с сервера злоумышленника officeconfirm.technoguides[.]org. К моменту начала расследования инцидента этот сервер был уже недоступен, однако по артефактам, найденным на зараженных узлах, и срабатываниям средства антивирусной защиты мы сделали вывод, что загружаемый шаблон эксплуатировал уязвимость в компоненте Equation Editor.

Также нам удалось обнаружить результаты проверки аналогичного DOC-файла на VirusTotal: на момент загрузки образца управляющий сервер был доступен и результаты поведенческого анализа документа оказались релевантными.

В графе поведенческого анализа в песочнице C2AE был обнаружен GET-запрос к управляющему серверу, в ответ на который сервер вернул файл типа application/hta. Данный запрос был осуществлен через несколько секунд после запроса к вредоносному шаблону.

Рисунок 8. Запрос к вредоносному шаблону в графе поведенческого анализа

Рисунок 8. Запрос к вредоносному шаблону в графе поведенческого анализа

Рисунок 9. Запрос к HTA-файлу в графе поведенческого анализа

Рисунок 9. Запрос к HTA-файлу в графе поведенческого анализа

В более ранних атаках Cloud Atlas также использовала HTA-файлы для доставки на зараженные узлы других инструментов. В частности, в ходе анализа активности на зараженных узлах мы обнаружили факты выполнения вредоносных VB-скриптов, записанных в альтернативные потоки данных файлов с именем AppCache***.log по пути %APPDATA%\Microsoft\Windows. VB-скрипты взаимодействуют с C2-сервером, в качестве которого используется документ Google Sheets.

Команда выполнения вредоносного скрипта на исследуемых узлах была добавлена в ключ автозапуска HKCU:\Software\Microsoft\Windows\CurrentVersion\Run реестра Windows:

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


Рассматриваемый VB-скрипт отправляет данные о зараженном пользователе в документ Google Sheets по API, после чего на узле выполняется код Visual Basic, записанный в другой ячейке того же листа в зашифрованном виде. В результате выполнения таких команд на зараженные узлы доставлялись экземпляры других инструментов группировки Cloud Atlas. В частности, был доставлен бэкдор PowerShower, выполняющий команды, полученные с C2-сервера mehafon[.]com (подробнее — в разделе «Анализ ВПО»).

Следы закрепления PowerShower также были обнаружены в ключе автозапуска:

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


Таким же образом было доставлено ВПО, использующее технику DLL Side-Loading и маскирующееся под компоненты Cisco Webex:

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

Легитимный уязвимый файл CiscoCollabHost.exe вызывает функцию SparkEntryPoint библиотеки CiscoSparkLauncher.dll, расположенной в той же папке. В ней же расположен файл с полезной нагрузкой.

Рисунок 10. Фрагмент псевдокода с вызовом вредоносной библиотеки

Рисунок 10. Фрагмент псевдокода с вызовом вредоносной библиотеки

Рисунок 11. Сертификат исполняемого файла CiscoCollabHost.exe

Рисунок 11. Сертификат исполняемого файла CiscoCollabHost.exe

Рисунок 12. Функция SparkEntryPoint в списке экспортов вредоносной библиотеки

Рисунок 12. Функция SparkEntryPoint в списке экспортов вредоносной библиотеки

В процессе поиска похожих образцов ВПО нам удалось найти библиотеку с совпадающей хеш-суммой списка импортируемых функций (imphash). Само ВПО представляет собой загрузчик конечных функциональных модулей, которые хранятся на «Яндекс Диске». Загрузчик закрепляется в системе посредством создания запланированной задачи с именем CiscoMngr:

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


Итоговую цепочку заражения можно представить следующим образом:

Рисунок 13. Цепочка атаки

Рисунок 13. Цепочка атаки

Анализ ВПО

VBShower

Выполнение обфусцированных подобным образом VB-скриптов встречалось и в более ранних атаках Cloud Atlas. В частности, схожую активность описывали в своем отчете специалисты компании F.A.C.C.T., а также специалисты «Лаборатории Касперского», которые дали вредоносному скрипту имя VBShower.

Ключевым отличием рассматриваемых нами скриптов является использование в качестве C2-сервера Google Sheets, тогда как в предыдущих случаях осуществлялось взаимодействие со стандартными управляющими серверами.

Исходный скрипт выглядит следующим образом:

Рисунок 14. VBShower, исходный скрипт

Рисунок 14. VBShower, исходный скрипт

После деобфускации мы можем заметить, что скрипт считывает содержимое полезной нагрузки, записанной в файле с тем же именем, что и сам файл скрипта, но с расширением .dat. Сама нагрузка представляет собой набор байтов, записанных в шестнадцатеричном виде. Первые два байта являются служебными и используются в ходе дальнейших преобразований.

Обработка каждого байта полезной нагрузки, начиная с третьего, производится в одном из двух режимов:

  • XOR с первым байтом полезной нагрузки с последующим преобразованием результата в соответствующий символ ASCII;
  • добавление шестнадцатеричного представления байта к результирующей строке в исходном виде.

Каждый из обрабатываемых байтов сравнивается со вторым байтом файла полезной нагрузки. Если значения этих байтов равны между собой, происходит переключение режима обработки. В противном случае обработка продолжается в прежнем режиме.

В результате декодирования полезной нагрузки образуется следующая строка, содержащая VB-код, выполняемый с помощью команды Execute:

Рисунок 15. VBShower, фрагмент кода после частичной деобфускации

Рисунок 15. VBShower, фрагмент кода после частичной деобфускации

Обработка данных, записанных в переменной Pbqb, происходит по следующему алгоритму:

  1. Строка, записанная в переменной Pbqb, подается первым аргументом на вход функции деобфускации данных AEFe, результат которой выполняется с помощью функции Execute.
  2. Во второй аргумент (tIOe) функции передается значение переменной yQT6, равное 2. Эта переменная передается в функцию по ссылке, и ее значение модифицируется в теле функции.
  3. Аргумент tIOe определяет индекс, с которого будет считываться подстрока из строковой переменной, переданной в первый аргумент. Таким образом, строка, записанная в переменной Pbqb, считывается начиная со второго символа (опускается лидирующий пробел).
  4. Затем первые 8 символов полученной подстроки считываются и подаются на вход функции QkuA, которая осуществляет побайтовое декодирование данных из шестнадцатеричного формата в соответствующие символы ASCII.
  5. Декодированная строка представляет собой десятичное число, которое конвертируется в тип данных Int, после чего умножается на 2. К полученному числу прибавляется 8.
  6. Итоговое значение используется во вновь вызываемой функции декодирования и определяет длину декодируемой подстроки.
  7. Подстрока декодируется функцией QkuA, после чего из нее удаляются первые 4 символа, которые соответствуют десятичному представлению числа, из которого мы ранее получили длину подстроки.
  8. Значение второго аргумента функции AEFe увеличивается на число, равное длине подстроки. Это значение определяет индекс начала следующего декодируемого блока.

Разберем алгоритм на примере. В функцию деобфускации AEFe подается строка Pbqb. После удаления лидирующего пробела первые 8 символов имеют вид:

30303435


Данная строка представляется как последовательность шестнадцатеричных байтов (0×30 0×30 0×34 0×35), которая декодируется в ASCII-символы «0045».

Строка «0045» приводится к целочисленному типу. На выходе получаем число 45.

45 * 2 + 8 = 98.


Далее считываются и декодируются первые 98 символов исходной строки. После декодирования шестнадцатеричных байтов получается строка:

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


Первые 4 символа отбрасываются, и на выходе функция AEFe возвращает следующую строку, которая будет исполнена как VB-код:

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


Данный код говорит нам о том, что вызов функции деобфускации будет повторен еще 98 раз. Значение переменной yQT6, которое изначально равнялось 2, увеличилось на 98. Это значит, что следующий блок деобфусцируемого кода начинается с 100-го символа исходной строки Pbqb.

В результате выполнения цикла исходная строка Pbqb деобфусцируется полностью. Блоки получившегося VB-кода выполняются последовательно по ходу деобфускации.

Фрагменты соответствующего кода представлены на скриншотах ниже:

Рисунок 16. Фрагмент кода VBShower

Рисунок 16. Фрагмент кода VBShower

Рассмотренный код выполняет следующие действия:

  • Считывает значения параметров ProxyServer и ProxyEnable для ключа реестра HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings и использует их в дальнейших HTTP-запросах, если они заданы.
  • Считывает имя пользователя и домена из ключа реестра HKCU:\Volatile Environment.

Далее в бесконечном цикле осуществляется:

  • Проверка наличия значения параметра NcdAutoSetup в ключе реестра HKCU:\Software\Microsoft\Windows\CurrentVersion\Run. Если значение не установлено, в него записывается строка исполнения текущего VB-скрипта. Таким образом обеспечивается закрепление ВПО в системе.
  • Запись данных о скомпрометированном пользователе в первую свободную ячейку столбца A листа Google Sheets в формате CURRENT_TIMESTAMP#USERNAME#DOMAINNAME.
  • Чтение шестнадцатеричных данных, записанных в ячейках столбца B, выполнение побайтового XOR с первым байтом полезной нагрузки (файл с расширением .dat) и выполнение декодированного VB-кода. После окончания выполнения полученного кода значение соответствующей ячейки заменяется на запись в формате done CURRENT_TIMESTAMP.
  • Запись значения переменной result в ячейку столбца D той же строки, если она не пуста. В самом коде скрипта переменная result ранее нигде задается, но она может быть определена в теле команды, полученной из ячейки B на предыдущем этапе.
  • Чтение данных из временного TMP-файла, расположенного в текущей папке, блоками по 25 000 символов. Каждый символ кодируется в шестнадцатеричном представлении, после чего шифруется методом XOR с ключом, соответствующим второму байту полезной нагрузки из файла .dat. Результат шифрования первого блока записывается в ячейку столбца E, второго блока — в столбец F, и так далее.

После окончания каждой итерации цикла скрипт засыпает на время, равное 2133767 ms + random_value (35+ минут).

Во время исследования скомпрометированных узлов нам не удалось обнаружить временных файлов, вероятно они были удалены. Однако нам удалось восстановить их содержимое. Эти файлы содержали, в частности, информацию о запущенных в системе процессах и запланированных задачах. Вероятно, во временные файлы записывался результат выполнения VB-кода, полученного из документа Google Sheets и выполненного ранее.

В результате сравнения временных меток в документе с временными метками файлов в MFT мы пришли к выводу, что другие инструменты, используемые злоумышленниками, были доставлены на зараженные узлы в результате выполнения полученного кода.

При исследовании файлов PREFETCH на зараженном узле было обнаружено, что процесс cmd.exe взаимодействовал с временным файлом в альтернативном потоке данных.

Рисунок 17. Следы взаимодействия cmd.exe с временным файлом

Рисунок 17. Следы взаимодействия cmd.exe с временным файлом

Помимо информации о процессах и задачах, во временных файлах мы обнаружили вывод содержимого папки %APPDATA%\Cisco с именами файлов и их размером.

Рисунок 18. Содержимое папки Cisco во временных файлах на скомпрометированных узлах

Рисунок 18. Содержимое папки Cisco во временных файлах на скомпрометированных узлах

Файла a.txt на момент анализа на зараженных узлах не было, однако, судя по размеру, его содержимое может совпадать с исполняемым файлом CiscoCollabHost.exe. Размеры файлов с полезной нагрузкой, найденных на скомпрометированных узлах, также совпадают, что может говорить об идентичности этих файлов.

Ниже представлен листинг кода, написанного на языке VB.NET, который расшифровывает полезную нагрузку и приводит вредоносный скрипт к его финальному виду.

Sub Main(args As String())
        ' Путь к вашему файлу с полезной нагрузкой
        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

Листинг 1. Код для деобфускации VBShower

Рисунок 19. Схема работы VBShower

Рисунок 19. Схема работы VBShower

PowerShower

Бэкдор PowerShower, используемый группой Cloud Atlas, был описан в отчете исследователей из Palo Alto. Cкрипт PowerShell, обнаруженный нами в ходе расследования, является модификацией PowerShower. Рассматриваемый скрипт работает в бесконечном цикле, каждая итерация начинается с GET-запроса к управляющему серверу.

Если ответ сервера начинается с символа P, то содержимое ответа записывается в файл Firefox.zip в папке AppData\Local\Temp текущего пользователя. В противном случае содержимое ответа сервера, представляющее собой XML-разметку, записывается в файл со случайным названием.

Далее скрипт считывает значение атрибута annotation элемента xs XML-файла, начиная с последнего символа. Каждый символ получившейся строки сравнивается с символами строки-ключа: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/. Если символы совпадают, индекс соответствующего символа строки-ключа переводится в двоичную систему с добавлением незначащих нулей слева до 6 символов. Получившийся результат добавляется к результирующей строке. Таким образом, символу A будет соответствовать строка 000000, символу B — 000001, и так далее.

Далее результирующая строка, состоящая из нулей и единиц, делится на блоки по 8 символов. Если блок состоит из восьми нулей, то он пропускается. В противном случае строка двоичных символов конвертируется сначала в целочисленное значение, а затем в соответствующий символ ASCII, который добавляется к итоговой строке.

После обработки всех блоков на выходе получается строка, которая впоследствии исполняется как PowerShell-код. После выполнения команды скрипт должен удалить XML-файл с полезной нагрузкой, однако нам повезло обнаружить несколько таких файлов в карантине антивируса.

Ниже представлен пример содержимого одного из таких файлов:

Рисунок 20. Фрагмент зашифрованного кода PowerShell

Рисунок 20. Фрагмент зашифрованного кода PowerShell

После расшифровки строки в атрибуте annotation мы получим следующий PowerShell-код:

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


Результат выполнения кода, записанный в файле AppData\Local\Temp\sapp.xtx (имя файла может отличаться в других экземплярах PowerShower), отправляется на сервер, после чего файл удаляется из системы.

Рисунок 21. Схема работы PowerShower

Рисунок 21. Схема работы PowerShower

Код рассмотренного образца PowerShower выглядит следующим образом:

Рисунок 22. Код PowerShower

Рисунок 22. Код PowerShower

Код PowerShell для расшифрования полезной нагрузки в XML-файле представлен ниже:

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
}


# Путь к файлу полезной нагрузки
$xmlFilePath = "C:\your_path\payload.xml"
$decodedAnnotation = DecodeXmlFile $xmlFilePath
Write-Output "Decoded annotation: $decodedAnnotation"

Листинг 2. Код для расшифрования полезной нагрузки в XML-файле

Загрузчик

Файл CiscoSparkLauncher.dll является первым стейджером загрузчика модулей Cloud Atlas, который расшифровывает и выполняет полезную нагрузку, содержащуюся в файле в той же папке.

Функциональность загрузчика и модулей описывалась в нашей статье APT Cloud Atlas: Unbroken Threat в разделе «Анализ ВПО» и с тех пор практически не изменилась. Небольшому функциональному изменению подвергся основной модуль: в отличие от более ранних версий, теперь в нем для работы с криптографией используется статически слинкованная библиотека Crypto++, убрано сжатие, а также в качестве хранилища украденных данных и вредоносных модулей используется WebDAV «Яндекс Диска». Для доступа в хранилище используется учетная запись pe9ov.sem@yandex.ru. Как и раньше, злоумышленники загружали модуль для похищения файлов с зараженного устройства по определенным параметрам, таким как пути к файлам и их расширения.

Рисунок 23. Следы использования библиотеки Crypto++

Рисунок 23. Следы использования библиотеки Crypto++

Рисунок 24. Фрагмент конфигурации загрузчика

Рисунок 24. Фрагмент конфигурации загрузчика

Заключение

Группировка Cloud Atlas атакует государственные организации в России и Белоруссии уже на протяжении 10 лет. Несмотря на то что арсенал Cloud Atlas не претерпел значительных изменений и злоумышленники все так же полагаются на облачные сервисы, они продолжают экспериментировать с различными популярными платформами.

Использование Google Sheets в качестве управляющего сервера является наиболее важной особенностью рассмотренной кампании и отличает ее от предыдущих атак.

Злоумышленники продолжают совершенствовать свои тактики, техники, процедуры и используемый инструментарий. Вредоносное ПО, используемое Cloud Atlas, дорабатывается и усложняется.

Авторы благодарят за помощь в подготовке статьи команды Incident Response и Threat Intelligence экспертного центра Positive Technologies (PT Expert Security Center).

Следующие разделы содержат информацию о всех полученных образцах и обновленных TTPs.

Сетевые индикаторы

Домены:

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

IP-адреса:

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

Легитимные сервисы, с которыми взаимодействует ВПО:

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

Файловые индикаторы

MITRE TTPs

Выявление активности группировки Cloud Atlas продуктами Positive Technologies

Правила корреляции MaxPatrol SIEM:

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 & PT NGFW (сигнатуры):

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

Срабатывания последних двух сигнатур не являются однозначным признаком активности Cloud Atlas, они могут использоваться для ретроспективного анализа угроз.

PT NAD (репутационные списки):

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

Файловые сигнатуры

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 ) ) ) ) ) )
}