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.

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

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

Примечание: Бесплатная подписка на 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, чтобы включить фильтр.


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




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







