Le problème : des caméras muettes
Les mots de passe des caméras, je les avais saisis une fois dans Surveillance Station, et
jamais notés ailleurs. L’interface DSM les masque soigneusement derrière des •••••. Pas
moyen de les récupérer depuis l’UI.
L’enquête : où Synology stocke-t-il les credentials ?
Première étape : se connecter en SSH sur le NAS et inspecter ce que Surveillance Station laisse traîner sur le disque.
find /volume1/@surveillance -type f 2>/dev/null
La liste révèle plusieurs bases SQLite, dont des backups automatiques dans
/volume1/@surveillance/@SSDBBackup/. Le fichier le plus intéressant :
/volume1/@surveillance/@SSDBBackup/system.db.11880.0
Le suffixe .0 désigne le backup le plus récent. On ouvre avec sqlite3 :
sqlite3 /volume1/@surveillance/@SSDBBackup/system.db.11880.0 ".tables"
Parmi les tables listées : camera. On inspecte son schéma :
sqlite3 system.db.11880.0 "PRAGMA table_info(camera);"
On y trouve notamment :
| Colonne | Type | Description |
|---|---|---|
name |
varchar | Nom de la caméra |
hostname |
varchar | Adresse IP ou DNS |
port |
INTEGER | Port HTTP |
media_port |
INTEGER | Port RTSP |
path |
varchar | Chemin du flux principal |
live_path |
varchar | Chemin du flux live |
username |
varchar | Login |
password |
varchar | Mot de passe (encodé) |
connection_over_ssl |
boolean | HTTPS activé ? |
On extrait le tout :
sqlite3 system.db.11880.0 "SELECT name, username, password FROM camera;"
Résultat :
salon|admin|$UTBwWVZFTlg=
elviz garage|admin|$U2xCWFRrTlU=
dehors|admin|$VjA5UlJFTk4=
Les mots de passe sont là. Mais encodés.
L’algo de Synology : double base64
Le préfixe $ est un marqueur maison. En le retirant, on obtient une chaîne base64.
Premier réflexe : décoder.
echo "UTBwWVZFTlg=" | base64 -d
Résultat : P0pYVENX — encore du base64. Il s’agit donc d’un double encodage base64.
Un base64 d’un base64. Pas de chiffrement, pas de sel, pas de hash : juste deux passes
d’encodage successives.
echo "UTBwWVZFTlg=" | base64 -d | base64 -d
Et là : le mot de passe en clair. 🎉
Schématiquement, l’algo de Synology est :
password_clair
→ base64_encode → "P0pYVENX..."
→ base64_encode → "UTBwWVZFTlg="
→ préfixe "$" → "$UTBwWVZFTlg="
→ stocké en DB
C’est une obfuscation, pas un chiffrement. Cela protège contre un coup d’œil rapide, mais pas contre quelqu’un ayant accès SSH au NAS.
Le script final
Voici le script complet qui extrait nom, adresse, login, mot de passe et URLs de connexion pour toutes les caméras, le fichier system.db.11880.0 dépend évidemment de la configuration de votre Synology.
#!/bin/bash
# extract_cameras.sh — Surveillance Station credential extractor
DB="/volume1/@surveillance/@SSDBBackup/system.db.11880.0"
if [ ! -f "$DB" ]; then
echo "❌ Base de données introuvable : $DB"
exit 1
fi
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ Surveillance Station — Credentials caméras ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo ""
sqlite3 "$DB" \
"SELECT name, hostname, port, media_port, path, live_path, username, password, connection_over_ssl FROM camera;" \
| while IFS='|' read -r name hostname port media_port path live_path username password ssl; do
hash="${password#\$}"
decoded=$(echo "$hash" | base64 -d 2>/dev/null | base64 -d 2>/dev/null)
if [ "$ssl" = "1" ]; then
http_proto="https"
else
http_proto="http"
fi
echo "📷 Caméra : $name"
echo " Login : $username / $decoded"
echo " HTTP : ${http_proto}://${username}:${decoded}@${hostname}:${port}"
echo " RTSP main : rtsp://${username}:${decoded}@${hostname}:${media_port}${path}"
echo " RTSP live : rtsp://${username}:${decoded}@${hostname}:${media_port}${live_path}"
echo "──────────────────────────────────────────────────────────────"
done
La sécurité de Surveillance Station : les credentials des caméras ne sont pas chiffrés. Quiconque a un accès SSH root à votre NAS peut les récupérer en trente secondes.
BYE BYE