Захист від програм-вимагачів на Windows за допомогою Wazuh

Забезпечення захисту від програм-вимагачів на кінцевих точках є важливим, оскільки такі атаки стали однією з найпоширеніших і найшкідливіших кіберзагроз, з якими стикаються організації та приватні особи. Кількість таких атак продовжує зростати через фінансову привабливість.

Атаки з використанням програм-вимагачів використовують складні технології, такі як передові алгоритми шифрування і тактики соціальної інженерії, щоб уникнути виявлення і підвищити успішність атаки. Крім того, поява моделей Ransomware-as-a-Service (RaaS) знизила вхідний бар’єр для кіберзлочинців, дозволивши навіть зловмисникам-початківцям запускати атаки з використанням програм-вимагачів.

Інтегруючи VirusTotal з Wazuh, можна виявити шкідливе програмне забезпечення після запису на диск і видалити його за допомогою модуля Wazuh Active Response до того, як воно зробить шкоду. Якщо VirusTotal не виявляє програм-вимагачів, застосовуються користувацькі правила для виявлення певних дій, пов’язаних з ними, під час їхнього виконання.

Для забезпечення захисту використовується модуль Wazuh Command і Volume Shadow Copy Service, VSS (вбудована служба тіньового копіювання томів) в Windows для періодичного запуску команд, які створюють знімки контрольованої кінцевої точки. Ці знімки використовуються для відновлення файлів до того, як вони були зашифровані шкідливим ПЗ. Команда також відключає VSS після кожної операції, щоб захистити знімки від видалення зловмисниками.

Інфраструктура

  • Встановлена і зареєстрована на сервері Wazuh кінцева точка Windows 11 з агентом Wazuh.

Виявлення та реагування на програми-вимагачі до їхнього виконання

Wazuh виявляє програми-вимагачі під час запису на диск завдяки інтеграції з VirusTotal. У цьому розділі описано, як налаштувати модуль моніторингу цілісності файлів Wazuh (FIM) на контрольованій кінцевій точці Windows, щоб він сповіщав про додавання або зміну файлів у контрольованому каталозі. Потім змінені або додані файли скануються за допомогою VirusTotal для виявлення шкідливого програмного забезпечення. При виявленні шкідливого ПЗ Wazuh видаляє шкідливий файл до його виконання за допомогою скрипта Wazuh Active Response.

Кінцева точка Windows

На кінцевій точці Windows налаштовується модуль Wazuh FIM і скрипт Wazuh Active Response, який видаляє шкідливі файли.

Налаштування моніторингу цілісності файлів

Для налаштування модуля Wazuh FIM на моніторинг змін у папках майже в режимі реального часу необхідно виконати наступні кроки.

1) Додати наведений нижче запис у блок <syscheck>, щоб відстежувати зміни у папках Downloads, Documents і Desktop всіх користувачів:

<directories realtime="yes">C:\Users\*\Downloads</directories>
<directories realtime="yes">C:\Users\*\Documents</directories>
<directories realtime="yes">C:\Users\*\Desktop</directories>

Видалення шкідливого програмного забезпечення за допомогою скриптів Wazuh Active Response

Щоб створити скрипт Wazuh Active Response, який видаляє файли, виявлені VirusTotal як шкідливі, необхідно виконати наступні кроки.

1) Завантажити інсталятор Python з офіційного сайту Python.

2) Запустити інсталятор Python після завантаження і переконатися, що встановлені наступні прапорці:

  • Install launcher for all users

  • Add python.exe to PATH. Це додасть інтерпретатор Python до шляху виконання.

3) Створити скрипт Wazuh Active Response remove-threat.py в директорії C:\Program Files (x86)\ossec-agent\active-response\bin. Цей скрипт видаляє будь-який файл, визначений VirusTotal як шкідливий:

#!/usr/bin/python3
# Copyright (C) 2015-2022, Wazuh Inc.
# All rights reserved.

import os
import sys
import json
import datetime

if os.name == 'nt':
    LOG_FILE = "C:\\Program Files (x86)\\ossec-agent\\active-response\\active-responses.log"
else:
    LOG_FILE = "/var/ossec/logs/active-responses.log"

ADD_COMMAND = 0
DELETE_COMMAND = 1
CONTINUE_COMMAND = 2
ABORT_COMMAND = 3

OS_SUCCESS = 0
OS_INVALID = -1

class message:
    def __init__(self):
        self.alert = ""
        self.command = 0

def write_debug_file(ar_name, msg):
    with open(LOG_FILE, mode="a") as log_file:
        log_file.write(str(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')) + " " + ar_name + ": " + msg +"\n")

def setup_and_check_message(argv):

    # get alert from stdin
    input_str = ""
    for line in sys.stdin:
        input_str = line
        break


    try:
        data = json.loads(input_str)
    except ValueError:
        write_debug_file(argv[0], 'Decoding JSON has failed, invalid input format')
        message.command = OS_INVALID
        return message

    message.alert = data

    command = data.get("command")

    if command == "add":
        message.command = ADD_COMMAND
    elif command == "delete":
        message.command = DELETE_COMMAND
    else:
        message.command = OS_INVALID
        write_debug_file(argv[0], 'Not valid command: ' + command)

    return message


def send_keys_and_check_message(argv, keys):

    # build and send message with keys
    keys_msg = json.dumps({"version": 1,"origin":{"name": argv[0],"module":"active-response"},"command":"check_keys","parameters":{"keys":keys}})

    write_debug_file(argv[0], keys_msg)

    print(keys_msg)
    sys.stdout.flush()

    # read the response of previous message
    input_str = ""
    while True:
        line = sys.stdin.readline()
        if line:
            input_str = line
            break

    # write_debug_file(argv[0], input_str)

    try:
        data = json.loads(input_str)
    except ValueError:
        write_debug_file(argv[0], 'Decoding JSON has failed, invalid input format')
        return message

    action = data.get("command")

    if "continue" == action:
        ret = CONTINUE_COMMAND
    elif "abort" == action:
        ret = ABORT_COMMAND
    else:
        ret = OS_INVALID
        write_debug_file(argv[0], "Invalid value of 'command'")

    return ret

def main(argv):

    write_debug_file(argv[0], "Started")

    # validate json and get command
    msg = setup_and_check_message(argv)

    if msg.command < 0:
        sys.exit(OS_INVALID)

    if msg.command == ADD_COMMAND:
        alert = msg.alert["parameters"]["alert"]
        keys = [alert["rule"]["id"]]
        action = send_keys_and_check_message(argv, keys)

        # if necessary, abort execution
        if action != CONTINUE_COMMAND:

            if action == ABORT_COMMAND:
                write_debug_file(argv[0], "Aborted")
                sys.exit(OS_SUCCESS)
            else:
                write_debug_file(argv[0], "Invalid command")
                sys.exit(OS_INVALID)

        try:
            file_path = msg.alert["parameters"]["alert"]["data"]["virustotal"]["source"]["file"]
            if os.path.exists(file_path):
                os.remove(file_path)
            write_debug_file(argv[0], json.dumps(msg.alert) + " Successfully removed threat")
        except OSError as error:
            write_debug_file(argv[0], json.dumps(msg.alert) + "Error removing threat")


    else:
        write_debug_file(argv[0], "Invalid command")

    write_debug_file(argv[0], "Ended")

    sys.exit(OS_SUCCESS)

if __name__ == "__main__":
    main(sys.argv)

4) Запустити наступні команди, щоб встановити pyinstaller і перетворити скрипт remove-threat.py Wazuh Active Response у виконуваний файл Windows:

> pip install pyinstaller
> pyinstaller -F "C:\Program Files (x86)\ossec-agent\active-response\bin\remove-threat.py"

Друга команда створить виконуваний файл remove-threat.exe у папці з назвою dist в робочому каталозі.

5) Скопіювати виконуваний файл remove-threat.exe в каталог C:\Program Files (x86)\ossec-agent\active-response\bin.

6) Перезапустити агент Wazuh за допомогою PowerShell з адміністративними привілеями, щоб застосувати зміни конфігурації:

> Restart-Service -Name wazuh

Wazuh server

Тепер варто налаштувати інтеграцію Wazuh та VirusTotal на перевірку змінених або доданих файлів. Тут також налаштовується модуль Wazuh Active Response на запуск виконуваного файлу remove-threat.exe.

Інтеграція Wazuh з VirusTotal

Щоб налаштувати інтеграцію Wazuh з VirusTotal, потрібно виконати наступні дії на Wazuh server.

1) Додати наступну конфігурацію в блок <ossec> файлу /var/ossec/etc/ossec.conf, щоб увімкнути інтеграцію VirusTotal. Замінити <YOUR_VIRUS_TOTAL_API_KEY> на необхідний ключ API VirusTotal. Це дозволить Wazuh запускати запит VirusTotal на файл щоразу, коли буде виявлено додавання або модифікацію файлу:

  <integration>
    <name>virustotal</name>
    <api_key><YOUR_VIRUS_TOTAL_API_KEY></api_key>
    <rule_id>554,550</rule_id>
    <alert_format>json</alert_format>
  </integration>

Примітка: Безплатний тариф VirusTotal API обмежує кількість запитів до чотирьох на хвилину. Якщо користувач володіє преміумключем VirusTotal API з високою частотою запитів, він може налаштувати Wazuh на моніторинг більшої кількості каталогів, окрім папок «Downloads», «Desktop» і «Documents».

Налаштування модуля Wazuh Active Response

Щоб налаштувати модуль Wazuh Active Response, слід виконати наступні кроки на Wazuh server.

1) Додати наступну конфігурацію в блок <ossec> файлу /var/ossec/etc/ossec.conf, щоб налаштувати команду Wazuh Active Response:

  <command>
    <name>remove-threat</name>
    <executable>remove-threat.exe</executable>
    <timeout_allowed>no</timeout_allowed>
  </command>

  <active-response>
    <disabled>no</disabled>
    <command>remove-threat</command>
    <location>local</location>
    <rules_id>87105</rules_id>
  </active-response>

Коли VirusTotal виявляє шкідливе програмне забезпечення, записане на диск, запускається програма remove-threat.exe, яка видаляє шкідливе ПЗ з контрольованої кінцевої точки.

Налаштування користувацьких правил

Для створення користувацьких правил, які запускатимуть сповіщення, коли скрипт Wazuh Active Response успішно або невдало видаляє файл загрози, необхідно виконати наведені нижче кроки.

1) Створити файл правил virustotal_rules.xml у каталозі /var/ossec/etc/rules/:

# touch /var/ossec/etc/rules/virustotal_rules.xml

2) Додати наступні користувацькі правила до файлу правил /var/ossec/etc/rules/virustotal_rules.xml:

<group name="virustotal,">
  <rule id="100092" level="12">
      <if_sid>657</if_sid>
      <match>Successfully removed threat</match>
      <description>$(parameters.program) removed threat located at $(parameters.alert.data.virustotal.source.file)</description>
  </rule>

  <rule id="100093" level="12">
    <if_sid>657</if_sid>
    <match>Error removing threat</match>
    <description>Error removing threat located at $(parameters.alert.data.virustotal.source.file)</description>
  </rule>
</group>

3) Перезапустити менеджер Wazuh, щоб застосувати зміни конфігурації:

# systemctl restart wazuh-manager

Візуалізація сповіщень

Правило з ID 554 спрацьовує, коли модуль Wazuh FIM виявляє новий доданий файл у контрольованому каталозі.

wazuh-fim-module

Правило з ID 87105 спрацьовує, коли VirusTotal виявляє шкідливий файл. На зображенні нижче VirusTotal виявив шкідливий файл з програмою-вимагачем ASERT.

asert-ransomware

Правило з ID 100092 спрацьовує, коли скрипт Wazuh Active Response remove-threat успішно видаляє виявлену VirusTotal програму-вимагач.

ransomware-detected-virustotal

Виявлення виконання програм-вимагачів

Wazuh може виявляти деякі варіанти програм-вимагачів під час їх виконання за допомогою спеціальних правил. Ці правила відстежують типові дії, пов’язані з атаками програм-вимагачів, такі як видалення тіньових копій томів або обмеження відновлення системи.

Кінцева точка Windows

Щоб встановити та налаштувати Sysmon, необхідно виконати наведені нижче кроки. Sysmon – це системна служба Windows, яка реєструє детальну інформацію про системні дії, такі як створення процесів, мережеві з’єднання та доступ до файлів, для моніторингу безпеки.

Налаштування Sysmon

1) Щоб встановити та налаштувати Sysmon, слід виконати наступні команди в PowerShell з правами адміністратора:

# Set Variables
$url = "https://download.sysinternals.com/files/Sysmon.zip"
$outputPath = "C:\Temp\Sysmon.zip"
$extractPath = "C:\Temp"
$configUrl = "https://wazuh.com/resources/blog/emulation-of-attack-techniques-and-detection-with-wazuh/sysmonconfig.xml"
$configPath = "$extractPath\sysmonconfig.xml"

# Install Sysmon
New-Item -ItemType Directory -Path C:\Temp
Invoke-WebRequest -Uri $url -OutFile $outputPath
Expand-Archive -Path $outputPath -DestinationPath $extractPath
wget -Uri $configUrl -OutFile $configPath
& "$extractPath\Sysmon64.exe" -accepteula -i $configPath

2) Додати наступну конфігурацію в блок <ossec_config> файлу C:\Program Files (x86)\ossec-agent\ossec.conf для збору журналів Sysmon і пересилання їх на Wazuh server для аналізу:

<localfile>
  <location>Microsoft-Windows-Sysmon/Operational</location>
  <log_format>eventchannel</log_format>
</localfile>

3) Перезапустити Wazuh agent за допомогою PowerShell з правами адміністратора, щоб застосувати зміни конфігурації:

> Restart-Service -Name wazuh

Wazuh server

На Wazuh server налаштовуються користувацькі правила для генерування сповіщень при виявленні дій, пов’язаних з виконанням програм-вимагачів.

Налаштування користувацьких правил

Щоб створити користувацькі правила, потрібно виконати наступні кроки на Wazuh server.

1) Створити файл правил ransomware_rules.xml в каталозі /var/ossec/etc/rules/:

# touch /var/ossec/etc/rules/ransomware_rules.xml

2) Додати наступні користувацькі правила до файлу правил /var/ossec/etc/rules/ransomware_rules.xml. Ці правила складаються з групи ймовірних дій програм-вимагачів, які спостерігаються на вражених кінцевих точках, і не є специфічними для одного типу шкідливого програмного забезпечення. Правила можуть спрацьовувати або не спрацьовувати залежно від програми-вимагача:

<group name="malware,ransomware,ransomware_pre_detection">
<!-- Rules to detect Ransomware attack -->

 <!-- Suspicious command execution -->
 <rule id="100600" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.parentCommandLine" type="pcre2">(?i)[c-z]:\\\\Windows\\\\System32\\\\svchost\.exe\s-k\sWerSvcGroup</field>
    <field name="win.eventdata.commandLine" type="pcre2">(?i)[c-z]:\\\\Windows\\\\system32\\\\WerFault\.exe\s-pss\s-s\s\d+\s-p\s\d+\s-ip\s\d+</field>
    <description>Possible WerFault DLL Sideloading $(win.eventdata.commandLine).</description>
    <mitre>
      <id>T1546.008</id>
    </mitre>
 </rule>

 <rule id="100601" level="10" >
    <if_sid>61603</if_sid>
    <field name="win.eventdata.parent.image.path" type="pcre2">(?i)regedit.exe</field>
    <field name="win.eventdata.commandLine" type="pcre2">(?i)schtasks.exe \/create.*\\cmd.exe.*start wordpad.exe.*.dll</field>
    <description>Suspicious scheduled task created.</description>
    <mitre>
      <id>T1546.008</id>
    </mitre>
 </rule>

 <rule id="100602" level="7">
   <if_sid>92027</if_sid>
   <field name="win.eventdata.CommandLine" type="pcre2">Install-WindowsFeature.*RSAT-ADPowerShell</field>
   <description>Remote Server Administration Tools installed.</description>
   <mitre>
     <id>T1562</id>
   </mitre>
  </rule>

<!-- Impair defenses -->
  <rule id="100603" level="10">
    <if_sid>92042</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">netsh advfirewall set currentprofile state off</field>
    <description>Windows firewall disabled.</description>
    <mitre>
      <id>T1562</id>
    </mitre>
  </rule>
  
  <rule id="100604" level="10">
    <if_sid>61614</if_sid>
    <field name="win.eventdata.targetObject" type="pcre2" >HKLM\\\\System\\\\CurrentControlSet\\\\Services\\\\WinDefend</field>
    <field name="win.eventdata.eventType" type="pcre2">^DeleteKey$</field>
    <field name="win.eventdata.user" type="pcre2" >NT AUTHORITY\\\\SYSTEM</field>
    <description>Windows defender service $(win.eventdata.user) has been deleted on $(win.system.computer). Possible malicious activity.</description>
    <mitre>
      <id>T1562.001</id>
    </mitre>
  </rule>
  
  <rule id="100605" level="10">
    <if_sid>92027,92021</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)powershell.*New-ItemProperty.*Windows Defender.*DisableAntiSpyware.*-Value 1.*</field>
    <description>Windows defender service has been deleted on $(win.system.computer). Possible malicious activity.</description>
    <mitre>
      <id>T1562.001</id>
    </mitre>
  </rule>
 
  <rule id="100606" level="10">
    <if_sid>92008,92027</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)powershell.*Set-MpPreference.*-DisableRealTimeMonitoring.*true</field>
    <description>Windows defender realtime protection has been disabled on $(win.system.computer). Possible malicious activity.</description>
    <mitre>
      <id>T1562.001</id>
    </mitre>
  </rule>

  <rule id="100607" level="10">
    <if_sid>92042</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">reg.exe .*Windows Defender\\Real-Time Protection.*Disable|\/d</field>
    <description>Windows defender realtime protection has been disabled on $(win.system.computer). Possible malicious activity.</description>
    <mitre>
      <id>T1562</id>
    </mitre>
  </rule>

  <rule id="100608" level="10">
    <if_sid>92042</if_sid>
    <field name="win.eventdata.ruleName" type="pcre2">(?i)Disabling Security Tools</field>
    <field name="win.eventdata.targetObject" type="pcre2">(?i)Windows Defender</field>
    <description>Windows Defender feature disabled on $(win.system.computer). Possible malicious activity</description>
    <mitre>
      <id>T1562</id>
    </mitre>
  </rule>

  <rule id="100609" level="10">
    <if_sid>92042</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">dism .* \/Disable-feature \/FeatureName:Windows-Defender</field>
    <description>Windows Defender disabled.</description>
    <mitre>
      <id>T1562</id>
    </mitre>
  </rule>

  <rule id="100610" level="10">
    <field name="win.system.providerName" type="pcre2">(?i)SecurityCenter</field>    
    <field name="win.eventdata.data" type="pcre2">(?i)Windows Defender, SECURITY_PRODUCT_STATE_SNOOZED</field>    
    <description>Windows Defender snoozed on $(win.system.computer). Possible malicious activity</description>
    <mitre>
      <id>T1562</id>
    </mitre>
  </rule>

<!-- System recovery inhibition -->  
  <rule id="100611" level="10">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)bcdedit\s\s\/set\s{default}\sbootstatuspolicy\signoreallfailures</field>
    <description>Boot configuration data edited.</description>
    <mitre>
      <id>T1059</id>
    </mitre>
  </rule>


<!-- Persistence detection --> 
  <rule id="100612" level="10">
    <if_sid>92300</if_sid>
    <field name="win.eventdata.image" type="pcre2">(?i)\.exe</field>
    <field name="win.eventdata.eventType" type="pcre2">(?i)SetValue</field>
    <field name="win.eventdata.targetObject" type="pcre2">(?i)HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\\\\[A-Za-z0-9]+</field>
    <description>New run key added to registry by $(win.eventdata.image).</description>
    <mitre>
      <id>T1547.001</id>
    </mitre>
  </rule>
    
 
 <rule id="100613" level="10">
    <if_sid>61613</if_sid>
    <field name="win.eventdata.image" type="pcre2">\.exe</field>
    <field name="win.eventdata.targetFilename" type="pcre2">(?i)ProgramData\\\\Microsoft\\\\Windows\\\\Start Menu\\\\Programs\\\\Startup\\\\.+\.exe</field>
    <description>$(win.eventdata.targetFilename) added to Startup programs by $(win.eventdata.image).</description>
    <mitre>
      <id>T1547.001</id>
    </mitre>
  </rule>
  
  <rule id="100614" level="10">
    <field name="win.eventdata.ruleName" type="pcre2">(?i)Credential Dumping</field>
    <field name="win.eventdata.sourceImage" type="pcre2">WerFault.exe</field>
    <description>WerFault abused to dump credentials.</description>
    <mitre>
      <id>T1003</id>
    </mitre>
  </rule>
  
<!-- System recovery inhibition -->
  <rule id="100615" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)vssadmin\s\sdelete\sshadows\s\/all\s\/quiet</field>
    <description>Volume shadow copy deleted using $(win.eventdata.originalFileName). Potential ransomware activity detected.</description>
    <mitre>
      <id>T1490</id>
      <id>T1059.003</id>
    </mitre>
  </rule>
  
  <rule id="100616" level="12">
    <if_sid>92032</if_sid>
    <field name="win.eventdata.parentCommandLine" type="pcre2">(?i)vssadmin.*delete.*shadow</field>
    <description>Volume shadow copy deleted using $(win.eventdata.originalFileName). Potential ransomware activity detected.</description>
    <mitre>
      <id>T1490</id>
      <id>T1059.003</id>
    </mitre>
  </rule>
  
  <rule id="100617" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i).*Shadowcopy .*Delete</field>
    <description>Volume shadow copy deleted using $(win.eventdata.originalFileName). Potential ransomware activity detected.</description>
    <mitre>
      <id>T1490</id>
      <id>T1059.003</id>
    </mitre>
  </rule>

  <rule id="100618" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">wmic shadowcopy delete</field>
    <description>$(win.eventdata.originalFileName) invoked to delete shadow copies. Potential ransomware activity detected.</description>
    <mitre>
      <id>T1490</id>
      <id>T1059.003</id>
    </mitre>
  </rule>

  <rule id="100619" level="12">
    <field name="win.system.providerName" type="pcre2">(?i)Microsoft-Windows-Sysmon</field>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)delete shadows</field>
    <description>Volume Shadow copy deleted on $(win.system.computer). Potential ransomware activity detected.</description>
    <mitre>
      <id>T1490</id>
      <id>T1059.003</id>
    </mitre>
  </rule>

  <rule id="100620" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)bcdedit\s\s\/set\s{default}\srecoveryenabled\sNo</field>
    <description>System recovery disabled. Possible ransomware activity detected.</description>
    <mitre>
      <id>T1059</id>
    </mitre>
  </rule>

  <rule id="100621" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)wbadmin\s\sdelete\scatalog\s-quiet</field>
    <description>System catalog deleted. Possible ransomware activity detected.</description>
    <mitre>
      <id>T1059</id>
    </mitre>
  </rule>
  
  <rule id="100622" level="12">
    <if_sid>61603</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)bcdedit\s\s\/set\s{default}\srecoveryenabled\sNo</field>
    <description>System recovery disabled. Possible ransomware activity detected.</description>
    <mitre>
      <id>T1059</id>
    </mitre>
  </rule>
  
  <rule id="100623" level="12">
    <if_sid>92032</if_sid>
    <field name="win.eventdata.CommandLine" type="pcre2">(?i)wevtutil.*cl</field>
    <description>Windows event logs deleted. Possible malicious activity detected.</description>
    <mitre>
      <id>T1070.001</id>
    </mitre>
  </rule>

<!-- Ransom note file creation -->

  
  <rule id="100626" level="10" timeframe="50" frequency="3" ignore="300">
    <if_matched_sid>554</if_matched_sid>
    <same_field>md5</same_field>
    <different_field>file</different_field>
    <description>The file $(file) has been created in multiple directories in a short time. Possible ransomware activity.</description>
  </rule>
  
  <rule id="100627" level="7" timeframe="30" frequency="10" ignore="300">
    <if_matched_sid>550</if_matched_sid>
    <field name="file" type="pcre2">(?i)C:\\Users</field>
    <description>Multiple Files modified in the User directory in a short time.</description>
  </rule>

  <rule id="100629" level="7" timeframe="300" frequency="2" ignore="300">
    <if_matched_sid>63104</if_matched_sid>
    <field name="win.system.message" type="pcre2">(?i)log file was cleared</field>
    <description>Windows Log File Cleared.</description>
    <mitre>
      <id>T1070.001</id>
    </mitre>

  </rule>

</group>

<group name="ransomware,ransomware_detection">
  <rule id="100628" level="12" timeframe="300" frequency="2" ignore="300">
    <if_matched_group>ransomware_pre_detection</if_matched_group>
    <if_sid>100626,100627,100615,100616,100617,100618,100619</if_sid>
    <description>Ransomware activity detected.</description>
  </rule>
</group>

Роз’яснення правил:

  • Правило з ID 100600 спрацьовує, коли WerFault, ймовірно, зловживають за допомогою DLL Sideloading.
  • Правило з ID 100601 спрацьовує, коли створюється підозріле завдання за розкладом.
  • Правило з ID 100602 спрацьовує, коли шкідливе програмне забезпечення встановлює інструменти віддаленого адміністрування серверів.
  • Правило з ID 100603 спрацьовує, коли брандмауер Windows вимкнено.
  • Правила з ID 100604, 100605, 100606, 100607, 100608, 100609 і 100610 спрацьовують у разі підміни служби Windows Defender.
  • Правило з ID 100611 спрацьовує, коли редагуються дані конфігурації завантаження Windows.
  • Правило з ID 100612 спрацьовує, коли до реєстру Windows додається новий ключ запуску.
  • Правило з ID 100613 спрацьовує, коли програма додається до програм запуску.
  • Правило з ID 100614 спрацьовує при зловживанні Windows WerFault для скидання облікових даних користувача.
  • Правила з ID 100615, 100616, 100617, 100618 і 100619 спрацьовують при спробі видалити тіньову копію тому Windows.
  • Правила з ID 100620, 100622 спрацьовують, коли BCDEdit змінює дані конфігурації завантаження, щоб унеможливити відновлення системи.
  • Правило з ID 100621 спрацьовує, коли wbadmin використовується для видалення системних каталогів Windows.
  • Правила з ID 100623 і 100629 спрацьовують у разі спроби видалення журналів подій Windows.
  • Правило з ID 100626 спрацьовує, коли за короткий проміжок часу в декількох каталогах створюється файл, що вказує на можливе створення записки з вимогою викупу.
  • Правило з ID 100627 спрацьовує, коли в каталозі користувача за короткий проміжок часу змінюється декілька файлів, що вказує на можливу активність шифрування файлів програми-вимагача.
  • Правило з ID 100628 спрацьовує при виявленні декількох дій з виконанням програми-вимагача, що вказує на активність зловмисників.
  • Правило з ID 100800 спрацьовує, коли модуль Wazuh Active Response успішно відновлює зашифровані файли на контрольованій кінцевій точці.

3) Перезапустити менеджер Wazuh, щоб застосувати зміни конфігурації:

# systemctl restart wazuh-manager

Примітка: Хоча метод виявлення, описаний в цій статті, виявляє кілька варіантів програм-вимагачів, варто зазначити, що він виявляє не всі типи програм-вимагачів. Ця методика була протестована з Crosslock, Phobos, BlackCat, Babuk, AESRTRansomware, AgendaRansomware, BlackBasta, LockBit і Chaos.

Візуалізація сповіщень

На зображеннях нижче показано правила з ID 100630, 100616, 100617 і 100623, які спрацьовують при виявленні виконання програми-вимагача. Виявлено такі дії, як спроби видалити тіньові копії томів або очистити журнали подій Windows.

ransomware-activity-detected (1)
ransomware-execution (1)
visualizing-alerts (1)
windows-event-logs-deleted (1)

Захист від програм-вимагачів за допомогою Wazuh Active Response

Wazuh забезпечує захист від деяких різновидів програм-вимагачів, зберігаючи тіньові копії томів, які використовуються для відновлення зашифрованих файлів. В цьому розділі налаштовується модуль Wazuh Command and Active Response для автоматичного відновлення файлів при виявленні виконання програми-вимагача.

Кінцева точка Windows

На кінцевій точці Windows налаштовується скрипт Wazuh Active Response і модуль Wazuh Command.

Налаштування модуля Wazuh Command

1) Додати наступну конфігурацію до локального конфігураційного файлу C:\Program Files (x86)\ossec-agent\ossec.conf:

<ossec_config>
  <wodle name="command">
    <disabled>no</disabled>
    <tag>vss</tag>
    <command>C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe -c "net stop VSS ; sc.exe config VSS start=Demand ; net start VSS ; WMIC shadowcopy call create Volume=C:\ ; net stop VSS ; sc.exe config VSS start=disabled"</command>
    <interval>12h</interval>
    <run_on_start>yes</run_on_start>
    <timeout>300</timeout>
  </wodle>
</ossec_config>

Це налаштує команду, яка виконує наступні дії:

  • Змінює конфігурацію запуску тіньової служби тому на Demand. Це запобігає самостійному запуску служби під час завантаження системи. Замість цього вона запускатиметься лише тоді, коли користувач або інший процес явно запитає її.
  • Запускає команду, яка створює тіньову копію тому кінцевої точки за допомогою vssadmin.
  • Зупиняє службу тіні тому і встановлює тип її запуску на disabled. Ця дія захищає ПК від успішного видалення тіньових копій томів програмами-вимагачами. Зазвичай програми-вимагачі намагаються видалити знімки VSS за допомогою таких команд, як vssadmin delete shadows /all. Якщо VSS вимкнено, ця команда не виконується.

Примітка: VSS не зберігає копії відображених мережевих ресурсів. Якщо на кінцевому пристрої не використовується диск C:\, слід змінити літеру диска у команді. Періодичність створення тіньових копій становить 12 годин. Цей параметр можна налаштувати, змінивши значення параметра <interval> на потрібну частоту.

Налаштування скрипту Wazuh Active Response

Для відновлення зашифрованих файлів використовується спеціальний скрипт Wazuh Active Response rollback.ps1, який відновлює файли в папку резервної копії.

1) Створити скрипт rollback.ps1 в директорії C:\Program Files (x86)\ossec-agent\active-response\bin\ і додати до нього наведений нижче скрипт. Цей скрипт відновлює файли з тіньових копій томів:

# Define the base paths
$EncryptedPath = "C:\users"
$RecoveryPath = "C:\Recovered_Files"  # Default recovery path, change as needed

# Paths to ignore during restoration and deletion
$IgnorePaths = @(
    "C:\Windows",
    "C:\Program Files",
    "C:\Program Files (x86)",
    "C:\C:\Recovered_Files"  # Add more paths as needed
)

# Log file location
$LogFile = "$RecoveryPath\RecoveryLog.txt"

# Ensure the log file directory exists
$LogFileDirectory = [System.IO.Path]::GetDirectoryName($LogFile)
if (-not (Test-Path -Path $LogFileDirectory)) {
    New-Item -Path $LogFileDirectory -ItemType Directory -Force
}

# Clear or create the log file
if (Test-Path -Path $LogFile) {
    Clear-Content -Path $LogFile
} else {
    New-Item -Path $LogFile -ItemType File
}

# Function to log messages
function Log-Message {
    param (
        [string]$Message
    )
    $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $LogFile -Value "$Timestamp - $Message"
    Write-Host "$Timestamp - $Message"
}

try {
    Log-Message "Starting recovery process..."

    # Run vssadmin list shadows and capture the output
    start-sleep 120
    cmd /c sc config VSS start=Demand
    cmd /c net start VSS
    start-sleep 5
    Log-Message "Listing shadow copies..."
    
    # Extract the shadow copy volume path using Select-String
    $ShadowCopyVolumes = C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe -c "Get-WmiObject -Query 'SELECT * FROM Win32_ShadowCopy' | Select-Object -ExpandProperty DeviceObject"

    if ($ShadowCopyVolumes.Count -gt 0) {
        $ShadowCopyVolume = $ShadowCopyVolumes[-1]  # Select the last shadow copy volume
        Log-Message "Latest Shadow Copy Volume found: $ShadowCopyVolume"
    } else {
        throw "Unable to find Shadow Copy Volume path in vssadmin output."
    }

    # Ensure ShadowCopyVolume ends with a backslash
    if (-not $ShadowCopyVolume.EndsWith("\")) {
        $ShadowCopyVolume += "\"
    }

    # Log the adjusted ShadowCopyVolume path
    Log-Message "Adjusted Shadow Copy Volume path: $ShadowCopyVolume"

    # Create symbolic link between shadow copy and backup folder
    $LinkPath = Join-Path -Path $RecoveryPath -ChildPath "backup"
    Log-Message "Creating symbolic link at $LinkPath..."

    # Remove any existing symbolic link or folder
    if (Test-Path -Path $LinkPath) {
        Remove-Item -Path $LinkPath -Recurse -Force
        Log-Message "Existing symbolic link or folder removed at $LinkPath"
    }

    # Create the symbolic link
    $linkCmdOutput = cmd /c mklink /d "$LinkPath" "$ShadowCopyVolume"
    Log-Message "Symbolic link command output: $linkCmdOutput"

    # Verify symbolic link creation
    if (-not (Test-Path -Path $LinkPath)) {
        throw "Failed to create symbolic link at $LinkPath"
    }
    Log-Message "Symbolic link created successfully: $LinkPath -> $ShadowCopyVolume"

    Write-Host "Files restore completed."
    "Wazuh_Ransomware_Protection: File restore completed for $($env:computername) at $(Get-Date)" | Out-File -FilePath "C:\Program Files (x86)\ossec-agent\active-response\active-responses.log" -Append -Encoding UTF8
}
catch {
    $ErrorMsg = $Error[0].ToString()
    Log-Message "Error: $ErrorMsg"
    Write-Error "An error occurred: $ErrorMsg"
}

    # Stop VSS service
    cmd /c sc config VSS start=disabled
    cmd /c net stop VSS
    start-sleep 5
    Log-Message "Turned off VSS service..."

2) Створити скрипт rollback.bat в каталозі C:\Program Files (x86)\ossec-agent\active-response\bin\ і додати до нього наведений нижче скрипт. Цей скрипт запускає rollback.ps1 за допомогою пакетного запуску Windows, оскільки модуль Wazuh Active Response не може виконувати скрипти PowerShell безпосередньо:

@echo off
Powershell -ExecutionPolicy bypass -File "C:\Program Files (x86)\ossec-agent\active-response\bin\rollback.ps1"

3) Перезапустити Wazuh agent за допомогою PowerShell з адміністративними привілеями, щоб застосувати зміни конфігурації:

> Restart-Service -Name wazuh

Wazuh server

На Wazuh server налаштується модуль Wazuh Active Response на запуск скрипта “відкату” при виявленні виконання програми-вимагача.

Налаштування користувацьких декодерів

Для декодування логів, згенерованих скриптом rollback.bat Wazuh Active Response, потрібно додати наступні декодери.

1) Додати наступні декодери до файлу /var/ossec/etc/decoders/local_decoder.xml для декодування логів, створених Wazuh Active Response rollback.ps1:

<decoder name="Wazuh_Ransomware">
  <prematch>Wazuh_Ransomware_Protection:</prematch>
</decoder>

<decoder name="Wazuh_Ransomware_child">
  <parent>Wazuh_Ransomware</parent>
  <regex type="pcre2">Wazuh_Ransomware_Protection: (.*)</regex>
  <order>rollback_status</order>
</decoder>

Налаштування користувацьких правил

1) Додати наступне користувацьке правило до файлу правил /var/ossec/etc/rules/ransomware_rules.xml.

<group name="ransomware,ransomware_rollback,">
  <rule id="100800" level="5">
    <field name="rollback_status">completed</field>
    <description>Wazuh_Ransomware_Protection: Files restored successfully.</description>
  </rule>
</group>

Це правило запускає сповіщення, коли скрипт Wazuh Active Response успішно відновлює файли на контрольованій кінцевій точці.

Налаштування модуля Wazuh Active Response

Щоб налаштувати команду Wazuh Active Response, слід додати наступну конфігурацію в блок <ossec> файлу /var/ossec/etc/ossec.conf:

  <command>
    <name>rollback_windows</name>
    <executable>rollback.bat</executable>
    <timeout_allowed>no</timeout_allowed>
  </command>

  <active-response>
    <command>rollback_windows</command>
    <location>local</location>
    <rules_id>100628</rules_id>
  </active-response>

Команда rollback_windows запускається, коли користувацькі правила виявляють виконання програми-вимагача. Це запускає скрипт Wazuh Active Response для відновлення файлів з останньої збереженої тіньової копії тому. Відновлені файли зберігаються в папці, розташованій за адресою C:\Recovered_Files.

ВАЖЛИВО!
Метод відновлення файлів, описаний в цій статті, особливо ефективний для програм-вимагачів, які не шифрують системні та програмні файли. Модуль Wazuh Active Response не може спрацювати, якщо папка з програмними файлами зашифрована, оскільки він також шифрує файли Wazuh, необхідні для роботи модуля Active Response. Цей скрипт Wazuh Active Response було протестовано з використанням програми-вимагача Babuk. У випадках, коли модуль Wazuh Active Response не спрацьовує, адміністратори можуть вручну відновити свої системи зі знімків VSS, запустивши скрипт rollback.ps1 через Powershell з адміністративними привілеями та виконавши наступні кроки:

  • Відредагувати скрипт і замінити $ShadowCopyVolumes = C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe -c «Get-WmiObject -Query “SELECT * FROM Win32_ShadowCopy” | Select-Object -ExpandProperty DeviceObject» на $ShadowCopyVolumes = cmd /c vssadmin list shadows | Select-String -Pattern ”Shadow Copy Volume:\s*(.+)” | ForEach-Object { $_.Matches.Groups[1].Value.Trim() }
  • Запустити скрипт можна за допомогою наступної команди: Powershell -ExecutionPolicy bypass -File «C:\Program Files (x86)\ossec-agent\active-response\bin\rollback.ps1»

Доступність сховища має вирішальне значення для успішного відновлення файлів, оскільки недостатній обсяг пам’яті призведе до невдачі процесу відновлення. Якщо в системі не вистачає вільного місця, адміністраторам потрібно вручну видалити файли, щоб звільнити місце.

2) Перезапустити менеджер Wazuh, щоб застосувати зміни конфігурації:

# systemctl restart wazuh-manager

Візуалізація сповіщень

Запуск зразків програм-вимагачів на контрольованій кінцевій точці Windows генерує сповіщення на інформаційній панелі Wazuh.

Після виявлення виконання програми-вимагача запускається скрипт Wazuh Active Response, який відновлює зашифровані файли, як показано нижче.

wazuh-active-response-script-new

Наступне сповіщення спрацьовує, коли скрипт Wazuh Active Response успішно відновлює зашифровані файли.

ransomware-script-successfully-recovers

Підписатися на новини