Типы, принципы работы, развертывание, мониторинг, анализ атак
Honeypots (ловушки): типы, принципы работы, развертывание, мониторинг и анализ атак. Активная защита, обнаружение угроз и анализ поведения злоумышленников.
Honeypots - Ловушки для злоумышленников
Что такое Honeypots?
Honeypots — это системы или сервисы, специально созданные для привлечения и обнаружения злоумышленников. Они имитируют реальные системы, но не содержат ценных данных, что позволяет безопасно изучать методы атак и собирать информацию о угрозах.
Ключевые принципы
- Deception — обман злоумышленников
- Detection — обнаружение атак
- Analysis — анализ методов атак
- Learning — изучение угроз
Типы Honeypots
1. По уровню взаимодействия
Low-Interaction Honeypots
Низкоуровневые ловушки
- Простая имитация сервисов
- Ограниченное взаимодействие
- Низкий риск компрометации
- Легкое развертывание
High-Interaction Honeypots
Высокоуровневые ловушки
- Полная имитация систем
- Полное взаимодействие
- Высокий риск компрометации
- Сложное развертывание
2. По назначению
Production Honeypots
Продуктивные ловушки
- Защита реальных систем
- Обнаружение атак
- Сбор информации об угрозах
Research Honeypots
Исследовательские ловушки
- Изучение методов атак
- Анализ поведения злоумышленников
- Разработка защитных мер
Примеры реализации
1. Web Honeypot
Веб-ловушка
// Простой веб-хoneypot
const express = require("express");
const app = express();
class WebHoneypot {
constructor() {
this.attacks = [];
this.suspiciousIPs = new Set();
this.attackPatterns = new Map();
}
// Создание веб-хoneypot
createWebHoneypot() {
// Ловушка для сканеров уязвимостей
app.get("/admin", (req, res) => {
this.logAttack(req, "ADMIN_ACCESS_ATTEMPT");
res.json({ message: "Admin panel found" });
});
// Ловушка для SQL инъекций
app.get("/search", (req, res) => {
const query = req.query.q;
if (this.isSQLInjection(query)) {
this.logAttack(req, "SQL_INJECTION_ATTEMPT");
res.json({ error: "SQL injection detected" });
} else {
res.json({ results: [] });
}
});
// Ловушка для XSS
app.get("/comment", (req, res) => {
const comment = req.query.comment;
if (this.isXSS(comment)) {
this.logAttack(req, "XSS_ATTEMPT");
res.json({ error: "XSS detected" });
} else {
res.json({ message: "Comment posted" });
}
});
// Ловушка для файловых загрузок
app.post("/upload", (req, res) => {
this.logAttack(req, "FILE_UPLOAD_ATTEMPT");
res.json({ message: "File upload endpoint" });
});
// Ловушка для API ключей
app.get("/api", (req, res) => {
const apiKey = req.query.key;
if (apiKey) {
this.logAttack(req, "API_KEY_ATTEMPT");
res.json({ error: "Invalid API key" });
} else {
res.json({ message: "API endpoint" });
}
});
}
// Логирование атаки
logAttack(req, attackType) {
const attack = {
timestamp: new Date(),
ip: req.ip,
userAgent: req.get("User-Agent"),
attackType: attackType,
url: req.url,
method: req.method,
headers: req.headers,
query: req.query,
body: req.body,
};
this.attacks.push(attack);
this.suspiciousIPs.add(req.ip);
// Анализ паттернов атак
this.analyzeAttackPattern(attack);
console.log(`Attack detected: ${attackType} from ${req.ip}`);
}
// Проверка на SQL инъекцию
isSQLInjection(query) {
const sqlPatterns = [
/union\s+select/i,
/drop\s+table/i,
/insert\s+into/i,
/delete\s+from/i,
/update\s+set/i,
/or\s+1=1/i,
/and\s+1=1/i,
/'\s*or\s*'/i,
/"\s*or\s*"/i,
];
return sqlPatterns.some((pattern) => pattern.test(query));
}
// Проверка на XSS
isXSS(input) {
const xssPatterns = [
/<script/i,
/javascript:/i,
/on\w+\s*=/i,
/<iframe/i,
/<object/i,
/<embed/i,
/<link/i,
/<meta/i,
];
return xssPatterns.some((pattern) => pattern.test(input));
}
// Анализ паттернов атак
analyzeAttackPattern(attack) {
const ip = attack.ip;
const attackType = attack.attackType;
if (!this.attackPatterns.has(ip)) {
this.attackPatterns.set(ip, {
totalAttacks: 0,
attackTypes: new Set(),
firstSeen: attack.timestamp,
lastSeen: attack.timestamp,
});
}
const pattern = this.attackPatterns.get(ip);
pattern.totalAttacks++;
pattern.attackTypes.add(attackType);
pattern.lastSeen = attack.timestamp;
// Проверка на подозрительную активность
if (pattern.totalAttacks > 10) {
this.alertSuspiciousActivity(ip, pattern);
}
}
// Оповещение о подозрительной активности
alertSuspiciousActivity(ip, pattern) {
console.log(`Suspicious activity detected from ${ip}:`);
console.log(`- Total attacks: ${pattern.totalAttacks}`);
console.log(
`- Attack types: ${Array.from(pattern.attackTypes).join(", ")}`
);
console.log(`- Time span: ${pattern.lastSeen - pattern.firstSeen} ms`);
}
// Получение статистики
getStatistics() {
return {
totalAttacks: this.attacks.length,
uniqueIPs: this.suspiciousIPs.size,
attackTypes: this.getAttackTypeStats(),
topAttackers: this.getTopAttackers(),
recentAttacks: this.attacks.slice(-10),
};
}
// Статистика по типам атак
getAttackTypeStats() {
const stats = {};
for (const attack of this.attacks) {
stats[attack.attackType] = (stats[attack.attackType] || 0) + 1;
}
return stats;
}
// Топ атакующих IP
getTopAttackers() {
const ipStats = {};
for (const attack of this.attacks) {
ipStats[attack.ip] = (ipStats[attack.ip] || 0) + 1;
}
return Object.entries(ipStats)
.sort(([, a], [, b]) => b - a)
.slice(0, 10)
.map(([ip, count]) => ({ ip, count }));
}
}
// Запуск веб-хoneypot
const honeypot = new WebHoneypot();
honeypot.createWebHoneypot();
app.listen(3000, () => {
console.log("Web honeypot running on port 3000");
});
2. SSH Honeypot
SSH-ловушка
// SSH honeypot
const net = require("net");
const crypto = require("crypto");
class SSHHoneypot {
constructor(port = 22) {
this.port = port;
this.connections = new Map();
this.attacks = [];
this.credentials = new Map();
}
// Запуск SSH honeypot
start() {
const server = net.createServer((socket) => {
this.handleConnection(socket);
});
server.listen(this.port, () => {
console.log(`SSH honeypot running on port ${this.port}`);
});
server.on("error", (err) => {
console.error("Server error:", err);
});
}
// Обработка подключения
handleConnection(socket) {
const connectionId = this.generateConnectionId();
const connection = {
id: connectionId,
ip: socket.remoteAddress,
port: socket.remotePort,
startTime: new Date(),
attempts: [],
status: "CONNECTED",
};
this.connections.set(connectionId, connection);
// Отправка SSH banner
socket.write("SSH-2.0-OpenSSH_7.4\r\n");
// Обработка данных
socket.on("data", (data) => {
this.handleSSHData(socket, connectionId, data);
});
// Обработка отключения
socket.on("close", () => {
this.handleDisconnection(connectionId);
});
// Обработка ошибок
socket.on("error", (err) => {
console.error(`Connection error: ${err.message}`);
this.handleDisconnection(connectionId);
});
}
// Обработка SSH данных
handleSSHData(socket, connectionId, data) {
const connection = this.connections.get(connectionId);
if (!connection) return;
try {
const packet = this.parseSSHPacket(data);
switch (packet.type) {
case "SSH_MSG_KEXINIT":
this.handleKeyExchange(socket, connectionId, packet);
break;
case "SSH_MSG_USERAUTH_REQUEST":
this.handleAuthentication(socket, connectionId, packet);
break;
case "SSH_MSG_CHANNEL_OPEN":
this.handleChannelOpen(socket, connectionId, packet);
break;
default:
this.handleUnknownPacket(socket, connectionId, packet);
}
} catch (error) {
console.error(`Error parsing SSH packet: ${error.message}`);
}
}
// Обработка аутентификации
handleAuthentication(socket, connectionId, packet) {
const connection = this.connections.get(connectionId);
const username = packet.username;
const password = packet.password;
// Логирование попытки аутентификации
const attempt = {
timestamp: new Date(),
username: username,
password: password,
method: packet.method,
};
connection.attempts.push(attempt);
// Анализ учетных данных
this.analyzeCredentials(username, password);
// Отправка отказа в аутентификации
this.sendAuthFailure(socket);
console.log(
`Authentication attempt: ${username}:${password} from ${connection.ip}`
);
}
// Анализ учетных данных
analyzeCredentials(username, password) {
const key = `${username}:${password}`;
if (!this.credentials.has(key)) {
this.credentials.set(key, {
username: username,
password: password,
count: 0,
firstSeen: new Date(),
lastSeen: new Date(),
});
}
const cred = this.credentials.get(key);
cred.count++;
cred.lastSeen = new Date();
// Проверка на популярные пароли
if (this.isCommonPassword(password)) {
console.log(`Common password detected: ${password}`);
}
// Проверка на словарные атаки
if (this.isDictionaryAttack(username, password)) {
console.log(`Dictionary attack detected: ${username}:${password}`);
}
}
// Проверка на популярные пароли
isCommonPassword(password) {
const commonPasswords = [
"admin",
"password",
"123456",
"root",
"toor",
"guest",
"user",
"test",
"demo",
"default",
];
return commonPasswords.includes(password.toLowerCase());
}
// Проверка на словарную атаку
isDictionaryAttack(username, password) {
// Простая проверка на словарную атаку
return (
password.length < 6 ||
password === username ||
password === username + "123"
);
}
// Отправка отказа в аутентификации
sendAuthFailure(socket) {
const packet = Buffer.from([
0x00,
0x00,
0x00,
0x1c, // Length
0x05, // SSH_MSG_USERAUTH_FAILURE
0x00,
0x00,
0x00,
0x0b, // Length of "publickey"
0x70,
0x75,
0x62,
0x6c,
0x69,
0x63,
0x6b,
0x65,
0x79, // "publickey"
0x00,
0x00,
0x00,
0x00, // Partial success
]);
socket.write(packet);
}
// Обработка отключения
handleDisconnection(connectionId) {
const connection = this.connections.get(connectionId);
if (!connection) return;
connection.status = "DISCONNECTED";
connection.endTime = new Date();
// Анализ сессии
this.analyzeSession(connection);
this.connections.delete(connectionId);
}
// Анализ сессии
analyzeSession(connection) {
const duration = connection.endTime - connection.startTime;
const attemptCount = connection.attempts.length;
if (attemptCount > 5) {
console.log(`Brute force attack detected from ${connection.ip}:`);
console.log(`- Duration: ${duration} ms`);
console.log(`- Attempts: ${attemptCount}`);
console.log(
`- Usernames: ${[
...new Set(connection.attempts.map((a) => a.username)),
].join(", ")}`
);
}
}
// Парсинг SSH пакета
parseSSHPacket(data) {
// Упрощенный парсинг SSH пакета
const length = data.readUInt32BE(0);
const type = data.readUInt8(4);
return {
length: length,
type: type,
data: data.slice(5),
};
}
// Генерация ID подключения
generateConnectionId() {
return crypto.randomBytes(16).toString("hex");
}
// Получение статистики
getStatistics() {
return {
totalConnections: this.connections.size,
totalAttempts: this.attacks.length,
uniqueCredentials: this.credentials.size,
topUsernames: this.getTopUsernames(),
topPasswords: this.getTopPasswords(),
recentConnections: Array.from(this.connections.values()).slice(-10),
};
}
// Топ имен пользователей
getTopUsernames() {
const usernameStats = {};
for (const [key, cred] of this.credentials) {
usernameStats[cred.username] =
(usernameStats[cred.username] || 0) + cred.count;
}
return Object.entries(usernameStats)
.sort(([, a], [, b]) => b - a)
.slice(0, 10)
.map(([username, count]) => ({ username, count }));
}
// Топ паролей
getTopPasswords() {
const passwordStats = {};
for (const [key, cred] of this.credentials) {
passwordStats[cred.password] =
(passwordStats[cred.password] || 0) + cred.count;
}
return Object.entries(passwordStats)
.sort(([, a], [, b]) => b - a)
.slice(0, 10)
.map(([password, count]) => ({ password, count }));
}
}
// Запуск SSH honeypot
const sshHoneypot = new SSHHoneypot();
sshHoneypot.start();
3. Database Honeypot
База данных-ловушка
// Database honeypot
class DatabaseHoneypot {
constructor() {
this.connections = new Map();
this.queries = [];
this.attacks = [];
}
// Создание базы данных-ловушки
createDatabaseHoneypot() {
const net = require("net");
const server = net.createServer((socket) => {
this.handleDatabaseConnection(socket);
});
server.listen(3306, () => {
console.log("Database honeypot running on port 3306");
});
}
// Обработка подключения к базе данных
handleDatabaseConnection(socket) {
const connectionId = this.generateConnectionId();
const connection = {
id: connectionId,
ip: socket.remoteAddress,
port: socket.remotePort,
startTime: new Date(),
queries: [],
status: "CONNECTED",
};
this.connections.set(connectionId, connection);
// Отправка приветственного сообщения MySQL
socket.write(
Buffer.from([
0x4a, 0x00, 0x00, 0x00, 0x0a, 0x35, 0x2e, 0x37, 0x2e, 0x32, 0x30, 0x00,
])
);
socket.on("data", (data) => {
this.handleDatabaseData(socket, connectionId, data);
});
socket.on("close", () => {
this.handleDatabaseDisconnection(connectionId);
});
}
// Обработка данных базы данных
handleDatabaseData(socket, connectionId, data) {
const connection = this.connections.get(connectionId);
if (!connection) return;
try {
const query = this.parseMySQLQuery(data);
if (query) {
this.handleDatabaseQuery(socket, connectionId, query);
}
} catch (error) {
console.error(`Error parsing database query: ${error.message}`);
}
}
// Обработка запроса к базе данных
handleDatabaseQuery(socket, connectionId, query) {
const connection = this.connections.get(connectionId);
// Логирование запроса
const queryLog = {
timestamp: new Date(),
query: query,
ip: connection.ip,
connectionId: connectionId,
};
connection.queries.push(queryLog);
this.queries.push(queryLog);
// Анализ запроса
this.analyzeQuery(query, connection);
// Отправка ответа
this.sendQueryResponse(socket, query);
console.log(`Database query from ${connection.ip}: ${query}`);
}
// Анализ запроса
analyzeQuery(query, connection) {
const upperQuery = query.toUpperCase();
// Проверка на SQL инъекцию
if (this.isSQLInjection(query)) {
this.logAttack(connection, "SQL_INJECTION", query);
}
// Проверка на попытку доступа к системным таблицам
if (this.isSystemTableAccess(query)) {
this.logAttack(connection, "SYSTEM_TABLE_ACCESS", query);
}
// Проверка на попытку создания пользователя
if (this.isUserCreation(query)) {
this.logAttack(connection, "USER_CREATION", query);
}
// Проверка на попытку изменения привилегий
if (this.isPrivilegeEscalation(query)) {
this.logAttack(connection, "PRIVILEGE_ESCALATION", query);
}
}
// Проверка на SQL инъекцию
isSQLInjection(query) {
const sqlInjectionPatterns = [
/union\s+select/i,
/drop\s+table/i,
/insert\s+into/i,
/delete\s+from/i,
/update\s+set/i,
/or\s+1=1/i,
/and\s+1=1/i,
/'\s*or\s*'/i,
/"\s*or\s*"/i,
/sleep\s*\(/i,
/benchmark\s*\(/i,
/load_file\s*\(/i,
];
return sqlInjectionPatterns.some((pattern) => pattern.test(query));
}
// Проверка на доступ к системным таблицам
isSystemTableAccess(query) {
const systemTables = [
"information_schema",
"mysql",
"performance_schema",
"sys",
];
return systemTables.some((table) => query.toLowerCase().includes(table));
}
// Проверка на создание пользователя
isUserCreation(query) {
return /create\s+user/i.test(query) || /grant\s+.*\s+to/i.test(query);
}
// Проверка на повышение привилегий
isPrivilegeEscalation(query) {
return (
/grant\s+all\s+privileges/i.test(query) ||
/grant\s+super/i.test(query) ||
/grant\s+root/i.test(query)
);
}
// Логирование атаки
logAttack(connection, attackType, query) {
const attack = {
timestamp: new Date(),
ip: connection.ip,
attackType: attackType,
query: query,
connectionId: connection.id,
};
this.attacks.push(attack);
console.log(
`Database attack detected: ${attackType} from ${connection.ip}`
);
console.log(`Query: ${query}`);
}
// Отправка ответа на запрос
sendQueryResponse(socket, query) {
// Упрощенный ответ MySQL
const response = Buffer.from([0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00]);
socket.write(response);
}
// Обработка отключения
handleDatabaseDisconnection(connectionId) {
const connection = this.connections.get(connectionId);
if (!connection) return;
connection.status = "DISCONNECTED";
connection.endTime = new Date();
// Анализ сессии
this.analyzeDatabaseSession(connection);
this.connections.delete(connectionId);
}
// Анализ сессии базы данных
analyzeDatabaseSession(connection) {
const duration = connection.endTime - connection.startTime;
const queryCount = connection.queries.length;
if (queryCount > 10) {
console.log(`Suspicious database activity from ${connection.ip}:`);
console.log(`- Duration: ${duration} ms`);
console.log(`- Queries: ${queryCount}`);
}
}
// Парсинг MySQL запроса
parseMySQLQuery(data) {
// Упрощенный парсинг MySQL запроса
if (data.length < 5) return null;
const length = data.readUInt24LE(0);
const sequence = data.readUInt8(3);
const type = data.readUInt8(4);
if (type === 0x03) {
// COM_QUERY
return data.slice(5).toString("utf8");
}
return null;
}
// Генерация ID подключения
generateConnectionId() {
return Math.random().toString(36).substr(2, 9);
}
// Получение статистики
getStatistics() {
return {
totalConnections: this.connections.size,
totalQueries: this.queries.length,
totalAttacks: this.attacks.length,
attackTypes: this.getAttackTypeStats(),
topQueries: this.getTopQueries(),
recentAttacks: this.attacks.slice(-10),
};
}
// Статистика по типам атак
getAttackTypeStats() {
const stats = {};
for (const attack of this.attacks) {
stats[attack.attackType] = (stats[attack.attackType] || 0) + 1;
}
return stats;
}
// Топ запросов
getTopQueries() {
const queryStats = {};
for (const query of this.queries) {
const normalizedQuery = this.normalizeQuery(query.query);
queryStats[normalizedQuery] = (queryStats[normalizedQuery] || 0) + 1;
}
return Object.entries(queryStats)
.sort(([, a], [, b]) => b - a)
.slice(0, 10)
.map(([query, count]) => ({ query, count }));
}
// Нормализация запроса
normalizeQuery(query) {
return query
.replace(/\d+/g, "N")
.replace(/'[^']*'/g, "'S'")
.replace(/"[^"]*"/g, '"S"')
.toLowerCase();
}
}
// Запуск базы данных-ловушки
const dbHoneypot = new DatabaseHoneypot();
dbHoneypot.createDatabaseHoneypot();
Мониторинг и анализ
1. Система мониторинга
// Система мониторинга honeypots
class HoneypotMonitor {
constructor() {
this.honeypots = new Map();
this.alerts = [];
this.metrics = {
totalAttacks: 0,
uniqueIPs: new Set(),
attackTypes: new Map(),
topAttackers: new Map(),
};
}
// Регистрация honeypot
registerHoneypot(honeypotId, honeypot) {
this.honeypots.set(honeypotId, honeypot);
}
// Мониторинг атак
monitorAttacks() {
setInterval(() => {
for (const [honeypotId, honeypot] of this.honeypots) {
const stats = honeypot.getStatistics();
this.updateMetrics(stats, honeypotId);
this.checkForAlerts(stats, honeypotId);
}
}, 60000); // Каждую минуту
}
// Обновление метрик
updateMetrics(stats, honeypotId) {
this.metrics.totalAttacks += stats.totalAttacks || 0;
if (stats.uniqueIPs) {
stats.uniqueIPs.forEach((ip) => this.metrics.uniqueIPs.add(ip));
}
if (stats.attackTypes) {
for (const [type, count] of Object.entries(stats.attackTypes)) {
const current = this.metrics.attackTypes.get(type) || 0;
this.metrics.attackTypes.set(type, current + count);
}
}
}
// Проверка на алерты
checkForAlerts(stats, honeypotId) {
// Алерт при большом количестве атак
if (stats.totalAttacks > 100) {
this.createAlert("HIGH_ATTACK_VOLUME", {
honeypotId: honeypotId,
attacks: stats.totalAttacks,
message: "High volume of attacks detected",
});
}
// Алерт при новых типах атак
if (stats.attackTypes) {
for (const [type, count] of Object.entries(stats.attackTypes)) {
if (count > 10 && !this.metrics.attackTypes.has(type)) {
this.createAlert("NEW_ATTACK_TYPE", {
honeypotId: honeypotId,
attackType: type,
count: count,
message: "New attack type detected",
});
}
}
}
}
// Создание алерта
createAlert(type, data) {
const alert = {
id: this.generateAlertId(),
type: type,
timestamp: new Date(),
data: data,
status: "ACTIVE",
};
this.alerts.push(alert);
console.log(`Alert: ${type} - ${data.message}`);
}
// Генерация ID алерта
generateAlertId() {
return "alert-" + Math.random().toString(36).substr(2, 9);
}
// Получение отчета
getReport() {
return {
metrics: {
totalAttacks: this.metrics.totalAttacks,
uniqueIPs: this.metrics.uniqueIPs.size,
attackTypes: Object.fromEntries(this.metrics.attackTypes),
honeypots: this.honeypots.size,
},
alerts: this.alerts.slice(-20),
topAttackers: this.getTopAttackers(),
};
}
// Топ атакующих
getTopAttackers() {
const attackerStats = {};
for (const [honeypotId, honeypot] of this.honeypots) {
const stats = honeypot.getStatistics();
if (stats.topAttackers) {
for (const attacker of stats.topAttackers) {
attackerStats[attacker.ip] =
(attackerStats[attacker.ip] || 0) + attacker.count;
}
}
}
return Object.entries(attackerStats)
.sort(([, a], [, b]) => b - a)
.slice(0, 10)
.map(([ip, count]) => ({ ip, count }));
}
}
Best Practices
1. Развертывание
- Изолированная среда — honeypots должны быть изолированы
- Мониторинг — постоянное наблюдение за активностью
- Логирование — детальное логирование всех событий
- Обновление — регулярное обновление honeypots
2. Безопасность
- Изоляция — honeypots не должны иметь доступ к реальным системам
- Шифрование — шифрование логов и данных
- Контроль доступа — ограничение доступа к honeypots
- Резервное копирование — регулярное резервное копирование данных
3. Анализ
- Автоматизация — автоматический анализ данных
- Корреляция — связывание данных из разных источников
- Визуализация — наглядное представление данных
- Отчетность — регулярные отчеты о результатах
Заключение
Honeypots — это мощный инструмент для обнаружения и анализа киберугроз, который позволяет:
- Обнаруживать атаки на раннем этапе
- Изучать методы злоумышленников
- Собирать информацию об угрозах
- Улучшать защиту реальных систем
Помните: honeypots — это не замена традиционным мерам безопасности, а дополнение к ним. Успех зависит от правильного развертывания, мониторинга и анализа данных.
Совет: Начните с простых honeypots для изучения основ, затем постепенно переходите к более сложным системам. Не забывайте о безопасности и изоляции honeypots от реальных систем!