47 votes

Comment extraire le mot de passe sauvegardé de Remmina ?

Je ne me souviens plus du mot de passe d'un de mes serveurs. J'ai sauvegardé une connexion qui fonctionne et je veux en extraire le mot de passe.

Extrait de la FAQ de Remmina :

Q : Comment mes mots de passe sont-ils stockés ? Sont-ils sécurisés ?
R : Ils sont cryptés à l'aide de 3DES avec une clé de 256 bits générée de manière aléatoire. Vous devez conserver votre clé en lieu sûr.

Où puis-je obtenir la clé et où les mots de passe sont-ils stockés ?

EDIT : J'ai trouvé qu'elles se trouvaient dans le dossier personnel de l'utilisateur sous .remmina. les deux clés privées sont en base64 et je n'arrive pas à obtenir le bon mot de passe lors du décryptage de .......

60voto

J'ai pu utiliser la solution Go de @michaelcochez pour le décrypter avec Python :

import base64
from Crypto.Cipher import DES3

secret = base64.decodestring('<STRING FROM remmina.prefs>')
password = base64.decodestring('<STRING FROM XXXXXXX.remmina>')

print DES3.new(secret[:24], DES3.MODE_CBC, secret[24:]).decrypt(password)

38voto

Rinzwind Points 270388

Ils sont stockés dans Gnome-Keyring.

Dash->type "keys"->Passwords&Keys.

Dans les versions plus récentes de l'hippocampe (alias "Mots de passe et clés"), il faut sélectionner "View" -> "Show any" pour voir les clés. Recherchez "remmina".

20voto

somethingrandom Points 11

J'ai trouvé la clé dans un fichier appelé ~/.remmina/remmina.prefs et les mots de passe cryptés sont dans ~/.remmina/nnnnnnnnnnn.remmina .

J'ai écrit un code (en Go) qui peut être utilisé pour le décryptage :

//Decrypts obfuscated passwords by Remmina - The GTK+ Remote Desktop Client
//written by Michael Cochez
package main

import (
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
    "fmt"
    "log"
)

//set the variables here

var base64secret = "yoursecret"
var base64password = "theconnectionpassword"

//The secret is used for encrypting the passwords. This can typically be found from ~/.remmina/remmina.pref on the line containing 'secret='.
//"The encrypted password used for the connection. This can typically be found from /.remmina/dddddddddddd.remmina " on the line containing 'password='.
//Copy everything after the '=' sign. Also include final '=' signs if they happen to be there.

//returns a function which can be used for decrypting passwords
func makeRemminaDecrypter(base64secret string) func(string) string {
    //decode the secret
    secret, err := base64.StdEncoding.DecodeString(base64secret)
    if err != nil {
        log.Fatal("Base 64 decoding failed:", err)
    }
    if len(secret) != 32 {
        log.Fatal("the secret is not 32 bytes long")
    }
    //the key is the 24 first bits of the secret
    key := secret[:24]
    //3DES cipher
    block, err := des.NewTripleDESCipher(key)
    if err != nil {
        log.Fatal("Failed creating the 3Des cipher block", err)
    }
    //the rest of the secret is the iv
    iv := secret[24:]
    decrypter := cipher.NewCBCDecrypter(block, iv)

    return func(encodedEncryptedPassword string) string {
        encryptedPassword, err := base64.StdEncoding.DecodeString(encodedEncryptedPassword)
        if err != nil {
            log.Fatal("Base 64 decoding failed:", err)
        }
        //in place decryption
        decrypter.CryptBlocks(encryptedPassword, encryptedPassword)
        return string(encryptedPassword)
    }
}

func main() {

    if base64secret == "yoursecret" || base64password == "theconnectionpassword" {

        log.Fatal("both base64secret and base64password variables must be set")
    }

    decrypter := makeRemminaDecrypter(base64secret)

    fmt.Printf("Passwd : %v\n", decrypter(base64password))

}

Le code peut être exécuté en ligne, mais il faut alors faire confiance à golang.org.

13voto

user105907 Points 113

J'ai créé un script qui décrypte automatiquement vos fichiers de mots de passe. La version la plus récente se trouve à https://github.com/peppelinux/remmina_password_exposer .

#!/usr/bin/python
from Crypto.Cipher import DES3
import base64
import os
import re

from os.path import expanduser
home = expanduser("~")

# costanti :)
REMMINA_FOLDER = os.getenv('REMMINA_FOLDER', home+'/'+'.remmina/')
REMMINA_PREF   = 'remmina.pref'

REGEXP_ACCOUNTS = r'[0-9]{13}\.remmina(.swp)?'
REGEXP_PREF     = r'remmina.pref'

diz = {}

fs = open(REMMINA_FOLDER+REMMINA_PREF)
fso = fs.readlines()
fs.close()

for i in fso:
    if re.findall(r'secret=', i):
        r_secret = i[len(r'secret='):][:-1]
        print 'found secret', r_secret

for f in os.listdir(REMMINA_FOLDER):
    if re.findall(REGEXP_ACCOUNTS, f): 

        o = open( REMMINA_FOLDER+f, 'r')
        fo = o.readlines()
        o.close()

        for i in fo:
            if re.findall(r'password=', i):
                r_password = i[len(r'password='):][:-1]
            if re.findall(r'^name=', i):
                r_name = i.split('=')[1][:-1]
            if re.findall(r'username=', i):
                r_username = i.split('=')[1][:-1]
        #~ print fo
        #~ print 'found', f

        password = base64.decodestring(r_password)
        secret = base64.decodestring(r_secret)

        diz[r_name] = DES3.new(secret[:24], DES3.MODE_CBC, secret[24:]).decrypt(password)
        # print the username and password of the last decryption
        print r_name, r_username, diz[r_name]

6voto

Remmina (1.3.3) stocke les mots de passe grâce à libsecret , le libsecret-tools peut vous aider à retrouver le mot de passe enregistré.

Je cherchais le mot de passe d'une connexion RDP Windows avec mot de passe utilisateur enregistré ; j'ai trouvé le mot de passe avec la commande

secret-tool search key password

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X