Загрузить файлы в «/»

This commit is contained in:
2026-04-21 00:39:52 +03:00
commit c7d2dfc9e4
5 changed files with 140 additions and 0 deletions

22
Dockerfile Normal file
View File

@@ -0,0 +1,22 @@
FROM python:3.10-slim
# Устанавливаем зависимости для scapy (libpcap)
RUN apt-get update && apt-get install -y \
libpcap-dev \
gcc \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Копируем и устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копируем исходный код
COPY src/ ./src/
# Открываем порт для netcat (хотя мы будем использовать stdin через docker exec)
EXPOSE 1234
# Запуск анализатора
ENTRYPOINT ["python", "src/main.py"]

64
README.md Normal file
View File

@@ -0,0 +1,64 @@
# Wi-Fi Traffic Analyzer
## Описание
Приложение для анализа трафика Wi-Fi с использованием машинного обучения и векторных баз данных. Проект позволяет обнаруживать аномалии и потенциальные уязвимости в беспроводных сетях.
## Состав
- `src/parser.py` - Парсинг пакетов Wi-Fi
- `src/embedder.py` - Генерация векторных представлений с использованием Ollama
- `src/vector_store.py` - Хранение и поиск векторов в Qdrant
- `src/ai_analyser.py` - Анализ аномалий с помощью AI
- `src/main.py` - Основной модуль анализа
## Особенности
- Анализ трафика в реальном времени
- Обнаружение аномалий с использованием векторных баз данных
- Интеграция с Ollama для генерации векторных представлений
- Интеграция с Qdrant для хранения и поиска векторов
- Поддержка переменных окружения для конфигурации внешних сервисов
## Запуск
1. Установите Docker и Docker Compose
2. Настройте переменные окружения в `docker-compose.yml`:
- `QDRANT_HOST` - IP-адрес вашего Qdrant
- `QDRANT_PORT` - Порт Qdrant (по умолчанию 6333)
- `OLLAMA_URL` - URL сервиса Ollama (по умолчанию http://localhost:11434)
3. Запустите контейнер:
```bash
docker-compose up -d
```
4. Для отправки трафика с устройства Ubiquiti:
```bash
tcpdump -i ath0 -y ieee802_11_radio -w - | nc 127.0.0.1 9999
```
5. Для просмотра логов:
```bash
docker logs -f analyzer
```
6. Для остановки контейнера:
```bash
docker-compose down
```
## Настройка переменных окружения
Все переменные окружения можно настроить в `docker-compose.yml`:
- `QDRANT_HOST` - IP-адрес сервера Qdrant
- `QDRANT_PORT` - Порт сервера Qdrant
- `OLLAMA_URL` - URL сервиса Ollama для генерации эмбеддингов
## Требования
- Docker и Docker Compose
- Система с поддержкой контейнеров
- Подключение к Qdrant и Ollama сервисам
## Поддерживаемые атаки
- Deauthentication Flood (уязвимость 802.11w)
- Rogue AP / Evil Twin (несоответствие RSSI/MAC)
- WPA Handshake sniffing (EAPOL flow)
- WPS Pixie Dust / Brute Force
## Лицензия
MIT

14
docker-compose.yml Normal file
View File

@@ -0,0 +1,14 @@
version: '3.8'
services:
analyzer:
build: .
ports:
- "9999:9999" # Порт для приема дампа трафика
environment:
- QDRANT_HOST=192.168.1.70 # Укажите IP вашего внешнего Qdrant
- QDRANT_PORT=6333
- OLLAMA_URL=http://192.168.1.70:11434
extra_hosts:
- "host.docker.internal:host-gateway"
restart: unless-stopped

4
requirements.txt Normal file
View File

@@ -0,0 +1,4 @@
scapy==2.5.0
qdrant-client==1.7.0
requests==2.31.0
numpy

36
vector_store.py Normal file
View File

@@ -0,0 +1,36 @@
import os
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
class VectorDB:
def __init__(self, collection_name="wifi_lab", vector_size=4096):
host = os.getenv("QDRANT_HOST", "localhost")
port = int(os.getenv("QDRANT_PORT", 6333))
self.client = QdrantClient(host=host, port=port)
self.collection_name = collection_name
# Создаем коллекцию, если её нет (размерность 4096 для Qwen 8B Embedding)
self.client.recreate_collection(
collection_name=self.collection_name,
vectors_config=VectorParams(size=vector_size, distance=Distance.COSINE),
)
def add_packet(self, pkt_id, vector, metadata, text):
self.client.upsert(
collection_name=self.collection_name,
points=[
PointStruct(
id=pkt_id,
vector=vector,
payload={"metadata": metadata, "text": text}
)
]
)
def find_similar(self, vector):
return self.client.search(
collection_name=self.collection_name,
query_vector=vector,
limit=3,
with_payload=True
)