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. Ця комбінація дозволяє отримати більш чітке уявлення про потенційні ризики, автоматизувати дії на основі даних про репутацію ІР і вживати швидших і обґрунтованих заходів для захисту інфраструктури від загроз, що постійно еволюціонують.







