Remmina에서 저장된 비밀번호를 추출하는 방법?


32

서버 중 하나의 비밀번호가 기억 나지 않습니다. 연결이 작동 중이며 암호를 가져오고 싶습니다.

Remmina FAQ에서 :

Q : 비밀번호는 어떻게 저장됩니까? 그들은 안전합니까?
A : 임의로 생성 된 256 비트 키와 함께 3DES를 사용하여 암호화됩니다. 키를 안전하게 유지해야합니다.

그렇다면 키는 어디서 구할 수 있으며 암호는 어디에 저장됩니까?

편집 : Ok 그들은 .remmina 아래의 사용자 홈 폴더에 있음을 발견했습니다. 개인 키는 모두 base64에 있으며 해독 할 때 암호를 올바르게 얻을 수없는 것 같습니다 ...

답변:


51

@michaelcochez의 Go 솔루션을 사용하여 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
나를 미워하게 만드는 이유 때문에 하나의 라이너가 필요했습니다 : / : 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. 다음에 여기에 남겨 두어야 할 수도 있습니다.
적응

좋은 하나 .. 잘 작동합니다
user169015

4
remmina의 최신 버전은 이러한 파일의 위치를 ​​변경했습니다. pref 파일은 이제 $ HOME / .config / remmina /에 있으며 연결을 클릭하면 연결 파일이 remmina의 맨 아래에 나열됩니다 (예 : ~ / .local / share / remmina / 4823893432523.remmina)
반지

3
파일에 대해 두 개의 인수를 필요로하는 약간 업데이트 된 한 줄짜리 과거의 감사합니다. 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
1

@admalledd 답변으로 게시해야합니다!
마이클

20

파일에서 키를 찾았으며 ~/.remmina/remmina.prefs암호화 된 비밀번호는에 ~/.remmina/nnnnnnnnnnn.remmina있습니다.

암호 해독에 사용할 수 있는 코드 (Go)를 작성했습니다 .

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

}

코드는 온라인으로 실행할 수 있지만 golang.org를 신뢰하고 있습니다.


14

그것들은 그놈 키링에 저장됩니다.

대시-> 유형 "키"-> 비밀번호 및 키.

최신 버전의 해마 (일명 "비밀번호 및 키")에서는 키를 보려면 "보기"-> "모두 표시"를 선택해야합니다. "레미 나"를 검색하십시오.


1
이미 시도했습니다 ..... 또한 lxde를 사용하고 있습니다
linuxnewb

2
일부 경우에 해당됩니다. 에 표시된 비밀번호 ~/.remmina/nnnnnnnnnnn.remmina가 단지 이면 이것을 시도하십시오 ..
Kupiakos

11

비밀번호 파일을 자동으로 해독하는 스크립트를 만들었습니다. 최신 버전은 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]

2

remmina 비밀번호를 해독하기 위해 perl 스크립트를 작성했습니다. 키를 추출하고 저장된 모든 비밀번호를 로컬로 디코딩합니다.

https://github.com/lepe/scripts/blob/master/decode_remmina.pl (업데이트 된 버전 확인)

#!/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";
}

당신은 (사용 예를 들어,이 패키지를 설치해야합니다 cpan <PACKAGE>) : Crypt::CBC, Crypt::DES_EDE3, MIME::Base64,File::Slurp

샘플 출력 :

(이름, 호스트, 사용자, 비밀번호 : 탭으로 구분)

Server1 192.168.1.25    administrator   jM822Azss2fake
Server2 192.168.1.88:2899   admin   JaxHaxFakez90

1

파이썬 스크립트를 사용하여 Remmina의 암호를 반대로하고 암호화해야했습니다. 누구나 필요한 경우 여기 코드가 있습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.