
Инструмент сетевого мониторинга, который сопоставляет сетевые соединения с процессами, определяет облачных провайдеров и обнаруживает активность биконнинга.
Инструмент сетевого мониторинга, который сопоставляет процессы с сетевыми соединениями, определяет облачных провайдеров и генерирует правила брандмауэра. Лёгкий агент для сбора данных, сервер для агрегации, парсер для анализа.
Обзор по всем машинам — сравнение версий ОС, обнаружение общих IP-адресов, кандидаты на биконинг (beaconing) на всех хостах:

Детализация по хосту — критические оповещения (EOL ОС, nc.exe выполняет биконинг на неизвестный IP):

Детализация по хосту — предупреждение (отмечен кандидат на биконинг):

Детализация по хосту — чисто (аномалий нет):

cargo build --release
# Simple collection
cargo run --release -- collect --duration-seconds 300
# With DNS lookups
cargo run --release -- collect --duration-seconds 300 --enable-dns
# With compression and encryption
cargo run --release -- collect \
--duration-seconds 300 \
--compress \
--encrypt-key "your-secret-password"
# Generate all reports
cargo run --release -- parse \
--input connections.jsonl \
--process-summary processes.json \
--cloud-analysis cloud.json \
--firewall-rules-iptables firewall.sh \
--database-export network.sql
# Offline ownership lookup with local ASN DB (no network calls)
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud.json \
--asn-db ip2asn-v4.tsv
# Live ARIN lookup with persistent cache (re-run skips already-queried IPs)
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud.json \
--arin-lookup \
--arin-cache arin_cache.json
# Quick 5-minute analysis
cargo run --release -- monitor \
--duration-seconds 300 \
--output-dir ./analysis \
--full-analysis
Бинарный файл agent — это минимальная цель развёртывания без единого флага. Вся конфигурация зашивается в бинарный файл на этапе компиляции через переменные окружения — скопируйте его на целевую машину и запустите без аргументов.
AGENT_SERVER="http://10.0.1.5:8080/upload" \
AGENT_KEY="labkey123" \
AGENT_INTERVAL="5" \
AGENT_BATCH="200" \
AGENT_DURATION="0" \
AGENT_DNS="false" \
AGENT_ENCRYPT_KEY="mysecretpassword" \
cargo build --release --bin agent
Полученный бинарный файл target/release/agent не имеет внешних зависимостей и не требует флагов:
./agent
| Переменная | По умолчанию | Описание |
|---|---|---|
AGENT_SERVER | http://localhost:8080/upload | URL конечной точки загрузки |
AGENT_KEY | (нет) | Значение заголовка X-API-Key |
AGENT_INTERVAL | 5 | Интервал опроса сокетов в секундах |
AGENT_BATCH | 200 | Записей на один пакет загрузки |
AGENT_DURATION | 0 | Продолжительность работы в секундах (0 = работать бесконечно) |
AGENT_DNS | false | Разрешать IP-адреса в имена хостов |
AGENT_ESTABLISHED | true | Только установленные (ESTABLISHED) соединения |
AGENT_LOCAL_COPY | false | Хранить локальную копию .jsonl вместе с загрузками |
AGENT_COMPRESS | false | Сжимать gzip перед загрузкой |
AGENT_ENCRYPT_KEY | (нет) | Шифрование полезной нагрузки AES-256-GCM (пароль или 64-символьный hex-ключ) |
AGENT_UA | (по умолчанию reqwest) | HTTP-заголовок User-Agent |
AGENT_SERVER="https://collector.internal/upload" \
AGENT_KEY="prod-api-key" \
AGENT_DURATION="0" \
AGENT_INTERVAL="30" \
AGENT_COMPRESS="true" \
AGENT_ENCRYPT_KEY="$(cat /etc/gibson/key)" \
cargo build --release --bin agent
cargo run --release -- collect \
--duration-seconds 3600 \
--interval-seconds 10 \
--compress \
--encrypt-key "your-32-char-hex-key-or-password" \
--upload-url "https://your-server.com/api/upload" \
--api-key "your-api-key" \
--batch-size 50 \
--delete-after-upload
cargo run --release -- collect \
--duration-seconds 86400 \
--interval-seconds 30 \
--output connections_daily.jsonl \
--enable-dns \
--compress
Парсер поддерживает два взаимоисключающих способа определения того, кому принадлежат нераспознанные IP-адреса:
| Метод | Флаг | Скорость | Сеть | Лучше всего подходит для |
|---|---|---|---|---|
| Локальная ASN-база | --asn-db | Мгновенно | Нет | Повторного анализа, изолированных сред |
| Живой запрос ARIN RDAP | --arin-lookup | Медленно (на каждый IP) | Да | Разовых запросов, когда нет локальной базы |
Скачайте базу ip2asn (обновляйте еженедельно):
curl -O https://iptoasn.com/data/ip2asn-v4.tsv.gz && gunzip ip2asn-v4.tsv.gz
Если указан --asn-db, флаг --arin-lookup игнорируется. Используйте --arin-cache, чтобы сохранять результаты ARIN на диск, — тогда при повторных запусках уже запрошенные IP-адреса будут пропускаться.
# Parse with cloud detection focus
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud_report.json \
--min-connections 5 \
--whitelist-processes "chrome,firefox,safari,edge"
Создайте collector_server.py:
from flask import Flask, request, jsonify
import os
import json
import base64
from datetime import datetime
from Crypto.Cipher import AES
import gzip
app = Flask(__name__)
# Configuration
UPLOAD_DIR = "./collected_data"
API_KEY = "your-secure-api-key"
ENCRYPTION_KEY = bytes.fromhex("your-32-byte-hex-key") # Optional
os.makedirs(UPLOAD_DIR, exist_ok=True)
def decrypt_data(encrypted_data, key):
"""Decrypt AES-256-GCM encrypted data"""
decoded = base64.b64decode(encrypted_data)
nonce = decoded[:12]
ciphertext = decoded[12:]
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
plaintext = cipher.decrypt_and_verify(ciphertext[:-16], ciphertext[-16:])
return plaintext