Parent : [[INDEX-CYBERSECU]]
Détection d'applications honeypot et services de débridage
Problème
L'archive Ygg contient une application honeypot (02h_honey_app) et un service de débridage (02g_debrideur). Comment détecter ces services pour comprendre l'infrastructure adverse ou protéger son propre système contre des usages similaires ?
Contexte archive Ygg
- Dossier :
02_SERVEUR_PRE_PROD/projets_dev/debrideur/(61 fichiers) - Dossier :
02_SERVEUR_PRE_PROD/honey_app/(fichiers honeypot) - Stack : Node.js, Express, EJS, Tailwind CSS, Alpine.js
- Base de données : MariaDB avec schéma spécifique (users, torrents, files, downloads)
Signatures de détection
1. Signatures réseau
# detect_debrid_network.py — Détection réseau
import re
from scapy.all import sniff
class DebridNetworkDetector:
# Ports caractéristiques
DEBRID_PORTS = {
3000, # Express par défaut
8080, # qBittorrent WebUI
6881, # BitTorrent peer port
3306, # MariaDB
6379, # Redis
}
# Patterns de trafic
PATTERNS = {
'magnet_submission': re.compile(r'GET /torrents/add\?magnet='),
'sse_progress': re.compile(r'GET /sse/'),
'qbittorrent_api': re.compile(r'GET /api/v2/'),
'download_token': re.compile(r'GET /downloads/[a-zA-Z0-9_-]{20,40}'),
}
def analyze_traffic(self, packet):
if packet.haslayer('TCP'):
src_port = packet['TCP'].sport
dst_port = packet['TCP'].dport
if dst_port in self.DEBRID_PORTS or src_port in self.DEBRID_PORTS:
payload = str(packet.payload)
for name, pattern in self.PATTERNS.items():
if pattern.search(payload):
print(f"[ALERT] {name} detected on port {dst_port}")
return True
return False
2. Signatures applicatives
// detect_debrid_app.js — Détection applicative
function detectDebridApp() {
const indicators = {
// Formulaires magnet
magnetForm: () => document.querySelector('input[name="magnet"]') !== null,
// Progress bars SSE
sseProgress: () => document.querySelector('[data-sse-url]') !== null,
// Liens de téléchargement avec tokens courts
downloadTokens: () => {
const links = document.querySelectorAll('a[href*="/downloads/"]');
return links.length > 0 && links[0].href.match(/\/downloads\/[a-zA-Z0-9_-]{20,40}/);
},
// UI Alpine.js avec torrents
alpineTorrents: () => {
const scripts = document.querySelectorAll('script');
return Array.from(scripts).some(s =>
s.src.includes('alpine') &&
document.querySelector('[x-data*="torrent"]') !== null
);
},
// Endpoints API suspects
apiEndpoints: async () => {
try {
const response = await fetch('/api/realtime/stats');
return response.ok;
} catch {
return false;
}
}
};
const detected = Object.entries(indicators)
.filter(([name, check]) => {
try {
return typeof check === 'function' ? check() : false;
} catch {
return false;
}
})
.map(([name]) => name);
return detected.length >= 2; // Au moins 2 indicateurs
}
3. Signatures de base de données
-- detect_debrid_schema.sql — Schéma MariaDB caractéristique
-- Un service de débridage a typiquement ces tables :
SELECT table_name
FROM information_schema.tables
WHERE table_name IN ('users', 'torrents', 'files', 'downloads')
AND table_schema = 'debrid';
-- Colonnes caractéristiques
SELECT column_name
FROM information_schema.columns
WHERE column_name IN ('info_hash', 'magnet_uri', 'token', 'expires_at')
AND table_schema = 'debrid';
4. Signatures Docker
# detect_debrid_docker.sh — Conteneurs Docker caractéristiques
docker ps --format "table {{.Names}}\t{{.Ports}}\t{{.Image}}" | grep -E "(qbittorrent|redis|mariadb|node|express)"
# Images caractéristiques
docker images | grep -E "(qbittorrent|redis|mariadb|node)"
Détection d'un honeypot
Signaux d'un honeypot
# detect_honeypot.py — Détection de honeypot
class HoneypotDetector:
def analyze(self, response, behavior_log):
signals = []
# 1. Temps de réponse trop rapide pour une vraie opération
if response.elapsed.total_seconds() < 0.1:
signals.append("Response too fast for real operation")
# 2. Réponses toujours positives
if behavior_log['success_rate'] > 0.99:
signals.append("Suspiciously high success rate")
# 3. Données de réponse trop parfaites
if response.json() and all(v is not None for v in response.json().values()):
signals.append("No null values in response (suspicious)")
# 4. Headers de sécurité manquants sur une app "sérieuse"
security_headers = ['X-Frame-Options', 'X-Content-Type-Options', 'CSP']
missing = [h for h in security_headers if h not in response.headers]
if len(missing) == len(security_headers):
signals.append("No security headers (honeypot indicator)")
# 5. Strings caractéristiques dans le HTML
honeypot_strings = ['honeypot', 'trap', 'decoy', 'sandbox']
html = response.text.lower()
for s in honeypot_strings:
if s in html:
signals.append(f"Honeypot string found: {s}")
return signals
Checklist de validation
- Ports caractéristiques ouverts (3000, 8080, 6881, 3306, 6379)
- Endpoints
/torrents/add,/downloads/,/sse/ - Formulaire de soumission magnet
- Progress bars avec SSE
- Schéma MariaDB avec tables
torrents,files,downloads - Conteneurs Docker qBittorrent + Redis + MariaDB
- Headers de sécurité absents (indicateur honeypot)
- Temps de réponse anormalement rapide
- Taux de succès de 100%
Comment se prot[ée]ger
- Monitoring des patterns d'usage anormaux (burst, parallel)
- Rate limiting adaptatif
- D[ée]tection des honey accounts (honeypot detection)
- Audit logs des acc[è]s et t[ée]l[ée]chargements
Références
- Archive Ygg :
02_SERVEUR_PRE_PROD/projets_dev/debrideur/,02h_honey_app/ - Honeynet Project : https://www.honeynet.org
- OWASP : Honeypot Detection