Улучшение разведки угроз с Wazuh и Criminal IP

Criminal IP – это платформа разведки угроз, которая предоставляет информацию об IP-адресах, доменах и других сетевых компонентах. Она предоставляет необходимые данные для оценки рисков и выявления потенциальных угроз, что позволяет командам безопасности проактивно реагировать на злонамеренную активность. Интеграция Wazuh с Criminal IP создает синергию, которая улучшает мониторинг безопасности, управление сетью и системное администрирование.

Компании могут создать эффективный механизм защиты, используя подробную информацию Criminal IP вместе с возможностями Wazuh XDR, минимизируя потенциальные уязвимости и предотвращая атаки до их эскалации. В этой статье рассматривается пошаговое руководство по интеграции этих двух решений для повышения безопасности.

Требования

Для демонстрации интеграции Wazuh и Criminal IP использовалась следующая инфраструктура.

  • Центральные компоненты последней доступной версии Wazuh (сервер Wazuh, индексатор Wazuh, дешборд Wazuh) установлены с помощью руководства быстрого старта на сервере Ubuntu 22.04.
  • Конечная точка Ubuntu 22.04 с установленным агентом Wazuh и зарегистрирована на сервере Wazuh.
  • Зарегистрированная учетная запись на Criminal IP.
  • Конечная точка Kali Linux в качестве атакующей стороны для имитации событий.

Конфигурация

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

Criminal IP

1. Войти в учетную запись Criminal IP и сгенерировать персонализированный ключ API.

criminal-ip-account

2. Перейти в раздел My Information в раскрывающемся меню в верхнем правом углу.

criminal-ip-information

3. Скопировать и сохранить сгенерированный ключ API, поскольку вам нужно будет использовать его далее в этой статье.

criminal-ip-api-key

Примечание: Бесплатная подписка на Criminal IP предоставляет только 50 бесплатных кредитов для поиска IP-адресов. Можно перейти на премиум-подписку для более широкого использования на основе активности конечных точек, за которыми ведется наблюдение.

Сервер Wazuh

Следует выполнить эти шаги, чтобы создать собственный скрипт Python и XML-правила для запроса IP-адресов, обнаруженных Wazuh.

1. Создать файл сценария /var/ossec/integrations/custom-criminalip.py с таким содержимым, чтобы запрашивать API Criminal IP и обрабатывать полученные данные:

#!/var/ossec/framework/python/bin/python3
# Shahidahktar@gmail.com
# Developed by Shahid Akhter
import sys
import os
import json
import ipaddress
import requests
from requests.exceptions import ConnectionError, HTTPError
from socket import socket, AF_UNIX, SOCK_DGRAM
import time

# Enable or disable debugging
debug_enabled = True  # Set to False to disable debug logging

# File and socket paths
pwd = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
socket_addr = f'{pwd}/queue/sockets/queue'

# Set paths for logging
now = time.strftime("%a %b %d %H:%M:%S %Z %Y")
log_file = f'{pwd}/logs/integrations.log'


def debug(msg):
    """Log debug messages."""
    if debug_enabled:
        timestamped_msg = f"{now}: {msg}\n"
        print(timestamped_msg)
        with open(log_file, "a") as f:
            f.write(timestamped_msg)


def send_event(msg, agent=None):
    """Send an event to the Wazuh Manager."""
    try:
        if not agent or agent["id"] == "000":
            string = f'1:criminalip:{json.dumps(msg)}'
        else:
            string = f'1:[{agent["id"]}] ({agent["name"]}) {agent["ip"] if "ip" in agent else "any"}->criminalip:{json.dumps(msg)}'
        
        debug(f"Sending Event: {string}")
        with socket(AF_UNIX, SOCK_DGRAM) as sock:
            sock.connect(socket_addr)
            sock.send(string.encode())
    except Exception as e:
        debug(f"Error sending event: {e}")


# Read configuration parameters
try:
    alert_file = open(sys.argv[1])
    alert = json.loads(alert_file.read())
    alert_file.close()
    debug("Alert loaded successfully")
except Exception as e:
    debug(f"Error reading alert file: {e}")
    sys.exit(1)

# New Alert Output for CriminalIP Alert or Error calling the API
alert_output = {}

# Criminal IP API AUTH KEY
criminalip_api_key = sys.argv[2]

# API - HTTP Headers
criminalip_apicall_headers = {
    "x-api-key": f"{criminalip_api_key}"
}

# Extract Event Source
try:
    event_source = alert["rule"]["groups"]
    debug(f"Event source: {event_source}")
except KeyError as e:
    debug(f"Missing expected key in alert: {e}")
    sys.exit(1)

if any(group in ['web', 'sshd', 'invalid_login', 'firewall', 'ids', 'system', 'database', 'application'] for group in event_source):
    try:
        client_ip = alert["data"]["srcip"]  # Extract client IP
        debug(f"Extracted Client IP: {client_ip}")
        if ipaddress.ip_address(client_ip).is_global:
            # Pass the client_ip value directly into the URL
            criminalip_search_url = f'https://api.criminalip.io/v1/asset/ip/report?ip={client_ip}&full=true'
            debug(f"CriminalIP API URL: {criminalip_search_url}")
            try:
                criminalip_api_response = requests.get(criminalip_search_url, headers=criminalip_apicall_headers)
                criminalip_api_response.raise_for_status()  # Raise HTTPError for bad responses
                debug("API request successful")
            except ConnectionError as conn_err:
                alert_output["criminalip"] = {"error": 'Connection Error to CriminalIP API'}
                alert_output["integration"] = "criminalip"
                debug(f"ConnectionError: {conn_err}")
                send_event(alert_output, alert.get("agent"))
            except HTTPError as http_err:
                alert_output["criminalip"] = {"error": f'HTTP Error: {http_err}'}
                alert_output["integration"] = "criminalip"
                debug(f"HTTPError: {http_err}")
                send_event(alert_output, alert.get("agent"))
            except Exception as e:
                alert_output["criminalip"] = {"error": f'Unexpected Error: {e}'}
                alert_output["integration"] = "criminalip"
                debug(f"Unexpected Error: {e}")
                send_event(alert_output, alert.get("agent"))
            else:
                try:
                    criminalip_api_response = criminalip_api_response.json()
                    debug(f"API Response Data: {criminalip_api_response}")
                    # Check if the response contains score information
                    if "score" in criminalip_api_response and criminalip_api_response["score"]:
                        # Generate Alert Output from CriminalIP Response
                        score = criminalip_api_response["score"]
                        issues = criminalip_api_response["issues"]
                        alert_output["criminalip"] = {
                            "ip": criminalip_api_response["ip"],
                            "score_inbound": score.get("inbound", "Unknown"),
                            "score_outbound": score.get("outbound", "Unknown"),
                            "is_vpn": issues.get("is_vpn", False),
                            "is_tor": issues.get("is_tor", False),
                            "is_proxy": issues.get("is_proxy", False),
                            "is_cloud": issues.get("is_cloud", False),
                            "is_hosting": issues.get("is_hosting", False),
                            "is_darkweb": issues.get("is_darkweb", False),
                            "is_scanner": issues.get("is_scanner", False),
                            "is_snort": issues.get("is_snort", False),
                            "is_anonymous_vpn": issues.get("is_anonymous_vpn", False)
                        }
                        alert_output["integration"] = "criminalip"
                        debug(f"Alert Output: {alert_output}")
                        send_event(alert_output, alert.get("agent"))
                    else:
                        alert_output["criminalip"] = {"error": 'No score information found in CriminalIP response'}
                        alert_output["integration"] = "criminalip"
                        debug("No score information found in CriminalIP response")
                        send_event(alert_output, alert.get("agent"))
                except Exception as e:
                    alert_output["criminalip"] = {"error": f"Error parsing JSON response: {e}"}
                    alert_output["integration"] = "criminalip"
                    debug(f"Error parsing JSON response: {e}")
                    send_event(alert_output, alert.get("agent"))
        else:
            debug(f"Client IP is not global: {client_ip}")
            sys.exit()
    except KeyError as e:
        alert_output["criminalip"] = {"error": f'Missing expected key: {e}'}
        alert_output["integration"] = "criminalip"
        debug(f"KeyError: {e}")
        send_event(alert_output, alert.get("agent"))
        sys.exit()
else:
    debug(f"Event source is not found : {event_source}")
    sys.exit()

2. Установить права собственности и разрешения на файл /var/ossec/integrations/custom-criminalip.py так, чтобы пользователь root и группа wazuh имели к нему доступ:

# chmod 750 /var/ossec/integrations/custom-criminalip.py
# chown root:wazuh /var/ossec/integrations/custom-criminalip.py

3. Добавить следующую конфигурацию в файл /var/ossec/etc/ossec.conf, чтобы позволить Wazuh запрашивать Criminal IP API и улучшать уведомления для указанных групп. Заменить <CRIMINALIP_API_KEY> на личный ключ Criminal IP API:

<ossec_config>
  <integration>
    <name>custom-criminalip.py</name>
    <api_key><CRIMINALIP_API_KEY></api_key> <!-- Replace with your Criminal IP API key -->
    <group>web, sshd, invalid_login, firewall, ids, system, database, application</group>
    <alert_format>json</alert_format>
  </integration>
</ossec_config>

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

4. Создать файл /var/ossec/etc/rules/criminal_ip_ruleset.xml со следующими правилами:

<group name="criminalip,">


  <!-- Main Criminal IP Rule -->

  <rule id="100623" level="2">
    <decoded_as>json</decoded_as>
    <field name="integration">criminalip</field>
    <description>Criminal IP Events</description>
  </rule>


  <!-- VPN Detection Rule -->

  <rule id="100624" level="6">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_vpn">true</field>
    <description>IP address associated with a VPN service detected: $(criminalip.ip)</description>
  </rule>


  <!-- TOR Detection Rule -->

  <rule id="100625" level="10">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_tor">true</field>
    <description>IP address associated with TOR network detected: $(criminalip.ip)</description>
  </rule>


  <!-- Proxy Detection Rule -->

  <rule id="100626" level="5">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_proxy">true</field>
    <description>IP address associated with a Proxy server detected: $(criminalip.ip)</description>
  </rule>


  <!-- Dark Web Activity Rule -->

  <rule id="100627" level="8">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_darkweb">true</field>
    <description>IP address associated with Dark web activity detected: $(criminalip.ip)</description>
  </rule>


  <!-- Critical Score Rule -->

  <rule id="100628" level="8">
    <if_sid>100623</if_sid>
    <field name="criminalip.score_inbound">Critical</field>
    <description>Critical risk score for IP address: $(criminalip.ip)</description>
  </rule>


  <!-- Dangerous Score Rule -->

  <rule id="100629" level="9">
    <if_sid>100623</if_sid>
    <field name="criminalip.score_inbound">Dangerous</field>
    <description>Dangerous risk score for IP address: $(criminalip.ip)</description>
  </rule>


  <!-- Moderate Score Rule -->

  <rule id="100630" level="6">
    <if_sid>100623</if_sid>
    <field name="criminalip.score_inbound">Moderate</field>
    <description>Moderate risk score for IP address: $(criminalip.ip)</description>
  </rule>


  <!-- Low Score Rule -->

  <rule id="100631" level="3">
    <if_sid>100623</if_sid>
    <field name="criminalip.score_inbound">Low</field>
    <description>Low risk score for IP address: $(criminalip.ip)</description>
  </rule>



  <!-- Hosting Detection Rule -->

  <rule id="100633" level="5">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_hosting">true</field>
    <description>IP address associated with a Hosting service detected: $(criminalip.ip)</description>
  </rule>


  <!-- Cloud Service Detection Rule -->

  <rule id="100634" level="4">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_cloud">true</field>
    <description>IP address associated with Cloud service detected : $(criminalip.ip)</description>
  </rule>


  <!-- Scanner Activity Detection Rule -->

  <rule id="100636" level="7">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_scanner">true</field>
    <description>IP address associated with scanner activity detected: $(criminalip.ip)</description>
  </rule>

<!-- Mobile Network Detection Rule, This rule may cause high false positives and can be uncommented based on user preference 

  <rule id="100637" level="4">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_mobile">true</field>
    <description>IP address associated with a Mobile network detected: $(criminalip.ip)</description>
  </rule>

 -->

  <!-- Anonymous VPN Detection Rule -->

  <rule id="100638" level="5">
    <if_sid>100623</if_sid>
    <field name="criminalip.is_anonymous_vpn">true</field>
    <description>IP address associated with an Anonymous VPN detected: $(criminalip.ip)</description>
  </rule>


  <!-- Error: Missing Parameter -->

  <rule id="100640" level="5">
    <if_sid>100623</if_sid>
    <field name="full_log">.*Missing Parameter.*</field>
    <description>CriminalIP API error: Missing parameter in request</description>
  </rule>


  <!-- Error: Invalid IP Address -->

  <rule id="100641" level="5">
    <if_sid>100623</if_sid>
    <field name="full_log">.*Invalid IP Address.*</field>
    <description>CriminalIP API error: Invalid IP address format</description>
  </rule>


  <!-- Error: Internal Server Error -->

  <rule id="100642" level="7">
    <if_sid>100623</if_sid>
    <field name="full_log">.*Internal Server Error.*</field>
    <description>CriminalIP API error: Internal server error encountered</description>
  </rule>


</group>

Где:

  • Правило с ID 100623 срабатывает при обнаружении событий, связанных с интеграцией Criminal IP, и фильтрует журналы, связанные с интеграцией Criminal IP, для дальнейшего анализа.
  • Правило с ID 100624 срабатывает при обнаружении IP-адресов, связанных с использованием VPN, что указывает на потенциальное сокрытие происхождения трафика.
  • Правило с ID 100625 срабатывает при обнаружении IP-адресов, связанных с использованием сети TOR, что часто связано с анонимной или злонамеренной деятельностью.
  • Правило с ID 100626 срабатывает при обнаружении IP-адресов, связанных с использованием прокси-серверов, что свидетельствует о попытках скрыть истинный источник трафика.
  • Правило с ID 100627 срабатывает при обнаружении IP-адресов, связанных с активностью в даркнете, что может свидетельствовать о злонамеренных или незаконных действиях.
  • Правило с ID 100628 срабатывает, когда наблюдается критический уровень риска, присвоенный Criminal IP, и выделяет IP-адреса, требующие немедленного внимания.
  • Правило с ID 100629 срабатывает, когда наблюдается опасный уровень риска от Criminal IP, обозначая IP-адреса как потенциальные угрозы, требующие более тщательного мониторинга.
  • Правило с ID 100630 срабатывает, когда наблюдается умеренный уровень риска от Criminal IP, что указывает на угрозы, которые заслуживают внимания, но не являются насущной необходимостью.
  • Правило с ID 100631 срабатывает, когда наблюдается низкий уровень риска от Criminal IP, что свидетельствует о минимальных угрозах, но все же заслуживает внимания.
  • Правило с ID 100633 срабатывает при обнаружении IP-адресов, связанных с хостингом.
  • Правило с ID 100634 срабатывает, когда наблюдается использование облачного сервиса, связанного с IP-адресом, который может быть использован для проведения атак или скомпрометированных действий.
  • Правило с ID 100636 срабатывает, когда наблюдается активность сканера, что может свидетельствовать о сканировании или разведке уязвимостей.
  • Правило с ID 100637 срабатывает при обнаружении IP-адреса, связанного с использованием мобильной сети, что часто связано со специфическими для мобильных устройств угрозами или целенаправленными атаками.
  • Правило с ID 100638 срабатывает, если обнаружены IP-адреса, связанные с анонимным использованием VPN, которое обычно используется для маскировки злонамеренных действий.
  • Правило с ID 100640 срабатывает при обнаружении отсутствующих параметров в запросах к Criminal IP API, что вызывает предупреждение об ошибках.
  • Правило с ID 100641 срабатывает, когда в Criminal IP API возникают ошибки формата недействительных IP-адресов.
  • Правило с ID 100642 срабатывает в случае обнаружения внутренних серверных ошибок в Criminal IP API, что может свидетельствовать о проблемах с возможностями обработки API.

5. Установить права собственности и разрешения на файл /var/ossec/etc/rules/criminal_ip_ruleset.xml:

# chmod 660 /var/ossec/etc/rules/criminal_ip_ruleset.xml 
# chown wazuh:wazuh /var/ossec/etc/rules/criminal_ip_ruleset.xml

6. Перезапустить менеджер Wazuh, чтобы применить изменения:

# systemctl restart wazuh-manager

Конечная точка Ubuntu

Чтобы установить веб-сервер Apache и отслеживать его логи с помощью агента Wazuh, выполните следующие шаги.

1. Обновить локальные пакеты и установить веб-сервер Apache:

# apt update
# apt install apache2

2. Если файервол включен, необходимо изменить его настройки, чтобы разрешить внешний доступ к вебпортам. Пропустить этот шаг, если файервол отключен:

# ufw status
# ufw app list
# ufw allow 'Apache'

3. Проверить состояние службы Apache, чтобы убедиться, что веб-сервер работает:

# systemctl status apache2

4. Воспользоваться командой curl или открыть http://<UBUNTU_IP> в браузере, чтобы просмотреть целевую страницу Apache и проверить установку:

# curl http://<UBUNTU_IP>

5. Добавить следующую конфигурацию в файл /var/ossec/etc/ossec.conf для мониторинга журналов доступа к Apache:

<ossec_config>
  <localfile>
    <log_format>syslog</log_format>
    <location>/var/log/apache2/access.log</location>
  </localfile>
</ossec_config>

6. Перезапустить агент Wazuh, чтобы применить изменения:

# systemctl restart wazuh-agent

Имитация активности Tor

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

Выполнить следующие шаги на конечной точке Kali Linux.

1. Установить Tor и прокси-цепи:

# apt update
# apt install tor proxychains4

2. Изменить конфигурационный файл proxychains /etc/proxychains4.conf и добавить или удалить комментарии Tor прокси socks4 127.0.0.1 9050.

3. Запустить службу Tor и убедиться, что Tor запущен:

# systemctl start tor
# systemctl status tor

4. Получить доступ к веб-серверу, используя соответствующий IP-адрес конечного устройства Ubuntu. Заменить <UBUNTU_IP> на IP-адрес конечной точки Ubuntu.

# proxychains curl "http://<UBUNTU_IP>/index.html?param=../../../../etc/passwd"

5. Wazuh запустит известное правило веб атаки с правилом с ID 31106, содержащим IP-адрес конечной точки Kali Linux, входящий в выбранную web группу. Затем этот IP-адрес посылается в модуль обнаружения преступных IP-адресов. Если запрашиваемый IP-адрес связан с сетью Tor, Wazuh сгенерирует предупреждение для этого IP-адреса, указав, что он связан с подозрительной или преступной деятельностью.

Просмотр уведомлений на дешборде Wazuh

Нижеследующие уведомления генерируются на дешборде Wazuh, когда Wazuh запрашивает IP-адреса в базе данных Criminal IP и находит известную злонамеренную активность и оценки рисков. Для просмотра уведомлений на дешборде Wazuh следует выполнить следующие действия.

1. Перейти к Threat intelligence > Threat Hunting.

2. Нажать + Add filter. Фильтр для rule.groups в поле Field.

3. Фильтр для is в поле Operator.

4. Фильтр для criminalip в поле Value.

5. Нажать Save, чтобы включить фильтр.

Criminal IP alerts on the Wazuh dashboard
Уведомление Criminal IP на дешборде Wazuh.
TOR network detected
Обнаружена сеть TOR

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

IP address detected with a dangerous risk score
Выявлен IP-адрес с высоким уровнем риска
IP address detected with a critical risk score
Выявлен IP-адрес с критическим уровнем риска
IP address detected with a moderate risk score
Выявлен IP-адрес с умеренным уровнем риска
Scanner activity detected
Выявлена ​​активность сканера

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

  • Входные и исходящие оценки. Определение приоритетности инцидентов на основе этих оценок. Высокий показатель исходящего трафика может свидетельствовать о взломе внутренней системы.
  • Threat Indicators:
  • Is VPN: указывает на то, что обнаружен VPN-трафик, что может свидетельствовать о попытке замаскировать источник соединения или происхождение пакетов.
  • Is TOR: указывает на то, что IP-адрес связан с сетью TOR и требует дальнейшего расследования, поскольку TOR часто связан с незаконной деятельностью.
  • Is Scanner: Указывает на потенциальную разведывательную деятельность, которая может предшествовать атаке.
  • Is Dark Web: указывает на то, что IP-адрес связан с даркнетом, обычно используемым для незаконной деятельности.

Вывод

Интеграция Wazuh с Criminal IP усиливает состояние кибербезопасности, сочетая мониторинг и анализ журналов Wazuh в режиме реального времени с детальной аналитикой угроз Criminal IP. Эта комбинация позволяет получить более четкое представление о потенциальных рисках, автоматизировать действия на основе данных о репутации IP и принимать более быстрые и обоснованные меры для защиты инфраструктуры от постоянно эволюционирующих угроз.

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