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