Làm thế nào để trích xuất mật khẩu đã lưu từ Remmina?


32

Tôi không nhớ mật khẩu của mình cho một trong các máy chủ của mình. Tôi có một kết nối làm việc được lưu và muốn lấy mật khẩu từ nó.

Từ fam Remmina:

Q: Mật khẩu của tôi được lưu trữ như thế nào? Họ có an toàn không?
Trả lời: Chúng được mã hóa bằng 3DES với khóa được tạo ngẫu nhiên 256 bit. Bạn nên giữ chìa khóa của bạn an toàn.

Vậy tôi lấy chìa khóa ở đâu và mật khẩu sẽ được lưu ở đâu?

EDIT: Ok thấy rằng chúng chỉ nằm trong thư mục nhà của người dùng của bạn dưới .remmina. cả khóa riêng đều ở cơ sở64 và dường như tôi không thể lấy được mật khẩu ngay khi giải mã ......

Câu trả lời:


51

Tôi đã có thể sử dụng giải pháp Go của @michaelcochez để giải mã nó bằng 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)

3
Vì những lý do khiến tôi ghét bản thân mình, tôi cần một lớp lót: / : python -c "import base64,sys;from Crypto.Cipher import DES3;pc=open('/home/admalledd/.remmina/remmina.pref').read();pci=pc.index('secret=');secret=pc[pci:pc.index('\n',pci)].split('=',1)[1];cc=open(sys.argv[1]).read();cci=cc.index('password');password=cc[cci:cc.index('\n',cci)].split('=',1)[1];secret,password=base64.decodestring(secret),base64.decodestring(password); print DES3.new(secret[:24], DES3.MODE_CBC, secret[24:]).decrypt(password)" .remmina/1474332312568.remmina. Còn lại ở đây cho lần tiếp theo tôi có thể cần nó.
admalledd

Đẹp một .. Hoạt động tốt
dùng169015

4
Phiên bản mới nhất của remmina đã thay đổi vị trí của các tệp này. Tệp pref hiện có tại: $ HOME / .config / remmina / và tệp kết nối được liệt kê ở dưới cùng trong remmina khi bạn nhấp vào kết nối (ví dụ: ~ / .local / share / remmina / 4823893432523.remmina)
Đổ chuông

3
Cảm ơn bạn quá khứ, cập nhật một chút mà có hai đối số cho các tập tin. python -c "import base64,sys;from Crypto.Cipher import DES3;pc=open(sys.argv[1]).read();pci=pc.index('secret=');secret=pc[pci:pc.index('\n',pci)].split('=',1)[1];cc=open(sys.argv[2]).read();cci=cc.index('password');password=cc[cci:cc.index('\n',cci)].split('=',1)[1];secret,password=base64.decodestring(secret),base64.decodestring(password); print DES3.new(secret[:24], DES3.MODE_CBC, secret[24:]).decrypt(password)" /tmp/remmina/remmina.pref /tmp/remmina/00000000000.remmina
admalledd

@admalledd Bạn thực sự nên đăng nó như một câu trả lời!
Michael

20

Tôi tìm thấy khóa trong một tệp được gọi ~/.remmina/remmina.prefsvà mật khẩu được mã hóa ~/.remmina/nnnnnnnnnnn.remmina.

Tôi đã viết một (trong Go) có thể được sử dụng để giải mã:

//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))

}

Mã này có thể được chạy trực tuyến, nhưng sau đó bạn đang tin tưởng golang.org.


14

Chúng được lưu trữ trong Gnome-key.

Dấu gạch ngang-> gõ "khóa" -> Mật khẩu & Khóa.

Trong các phiên bản mới hơn của cá ngựa (còn gọi là "Mật khẩu và Khóa"), người ta phải chọn "Xem" -> "Hiển thị bất kỳ" để xem các phím. Tìm kiếm "remmina".


1
đã thử rồi ..... tôi cũng đang sử dụng
lxde

2
Điều này đúng trong một số trường hợp. Hãy thử điều này nếu mật khẩu được liệt kê trong ~/.remmina/nnnnnnnnnnn.remminachỉ là ..
Kupiakos

11

Tôi đã tạo một tập lệnh tự động giải mã các tập tin mật khẩu của bạn. Phiên bản gần đây nhất là tại https://github.com/peppelinux/remmina_password_exposeer .

#!/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]

2

Tôi đã tạo một tập lệnh perl để giải mã mật khẩu remmina. Nó trích xuất khóa của bạn và giải mã tất cả mật khẩu đã lưu của bạn (cục bộ).

https://github.com/lepe/scripts/blob/master/decode_remmina.pl (kiểm tra phiên bản cập nhật)

#!/usr/bin/perl

use strict;
use warnings;
use Crypt::CBC; #Crypt::DES_EDE3
use MIME::Base64;
use File::Slurp;

my $remmina_dir = $ENV{"HOME"} . "/.remmina";
my $remmina_cfg = $remmina_dir . "/remmina.pref";

my $content = read_file($remmina_cfg);
if($content) {
    my ($secret) = $content =~ /^secret=(.*)/m;
    if($secret) {
        my $secret_bin = decode_base64($secret);
        my ($key, $iv) = ( $secret_bin =~ /.{0,24}/gs );
        my @files = <$remmina_dir/*.remmina>;

        my $des = Crypt::CBC->new( 
                -cipher=>'DES_EDE3', 
                -key=>$key, 
                -iv=>$iv,
                -header=>'none', 
                -literal_key=>1,
                -padding=>'null'
        ); 
        if(@files > 0) {
            foreach my $file (@files) {
                my $config = read_file($file);
                my ($password) = $config =~ /^password=(.*)/m;
                my ($name) = $config =~ /^name=(.*)/m;
                my ($host) = $config =~ /^server=(.*)/m;
                my ($user) = $config =~ /^username=(.*)/m;
                my $pass_bin = decode_base64($password);
                my $pass_plain = $des->decrypt( $pass_bin );
                if($pass_plain) {
                    print "$name    $host   $user   $pass_plain\n";
                }
            }
        } else {
            print "Unable to find *.remmina files \n";
        }
    } else {
        print "No secret key found...\n";
    }
} else {
    print "Unable to read content from remmina.pref\n";
}

Bạn sẽ cần phải cài đặt các gói (ví dụ, sử dụng cpan <PACKAGE>): Crypt::CBC, Crypt::DES_EDE3, MIME::Base64,File::Slurp

Đầu ra mẫu:

(Tên, máy chủ, người dùng, mật khẩu: tách tab)

Server1 192.168.1.25    administrator   jM822Azss2fake
Server2 192.168.1.88:2899   admin   JaxHaxFakez90

1

Tôi cần phải làm ngược lại và mã hóa mật khẩu cho Remmina bằng tập lệnh Python. Trong trường hợp bất cứ ai cần nó đây là mã:

import base64    
from Crypto.Cipher import DES3

REMMINAPREF_SECRET_B64=b'G5XKhImmX+3MaRAWU920B31AtQLDcWEq+Geq4L+7sES='

def encryptRemminaPass(plain):
    plain = plain.encode('utf-8')
    secret = base64.b64decode(REMMINAPREF_SECRET_B64)
    key = secret[:24]
    iv = secret[24:]
    plain = plain + b"\0" * (8 - len(plain) % 8)
    cipher = DES3.new(key, DES3.MODE_CBC, iv)
    result = cipher.encrypt(plain)
    result = base64.b64encode(result)
    result = result.decode('utf-8')
    return result
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.