SecureCRTパスワードを取り戻す


前言


S社の歴史上、数百台のサーバのパスワードがSecureCRTに保存されていますが、このソフトウェアは本当に使いにくいので、元のアカウントのパスワードを抽出してXshellに移行します

パスワード保存先


Windowsは「ユーザー名AppDataRoamingVanDykeConfigSessions」で、マシン名ごとに1つのiniファイルTested with version 7.2.6(build 606)for Windowsに対応し、その他のバージョンはテストされていません(場所が変更される場合があります)

使用


後のインストールを見て、PythonスクリプトはSecurecCRTDecryptとして保存されます.py用法python SecureCRTDecrypt.py [filename...]
[@bx_5_219 /tmp]# python SecureCRTDecrypt.py 10.10.123.123.ini   
10.10.123.123.ini
ssh root@10.10.70.30 # I'mpassword

依存パッケージ


復号依存パッケージpycryptoダウンロードのインストール
https://pypi.python.org/pypi/pycrypto
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz

インストールの解凍
tar -zxvf pycrypto-2.6.1.tar.gz
cd pycrtyto-2.6.1
python setup.py build
python setup.py install

暗号解読プログラム


SecureCRTDecryptとして保存する.py
from Crypto.Cipher import Blowfish
import argparse
import re

def decrypt(password) :
    c1 = Blowfish.new('5F B0 45 A2 94 17 D9 16 C6 C6 A2 FF 06 41 82 B7'.replace(' ','').decode('hex'), Blowfish.MODE_CBC, '\x00'*8)
    c2 = Blowfish.new('24 A6 3D DE 5B D3 B3 82 9C 7E 06 F4 08 16 AA 07'.replace(' ','').decode('hex'), Blowfish.MODE_CBC, '\x00'*8)
    padded = c1.decrypt(c2.decrypt(password.decode('hex'))[4:-4])
    p = ''
    while padded[:2] != '\x00\x00' :
        p += padded[:2]
        padded = padded[2:]
    return p.decode('UTF-16')

REGEX_HOSTNAME = re.compile(ur'S:"Hostname"=([^\r
]*)'
) REGEX_PASWORD = re.compile(ur'S:"Password"=u([0-9a-f]+)') REGEX_PORT = re.compile(ur'D:"\[SSH2\] Port"=([0-9a-f]{8})') REGEX_USERNAME = re.compile(ur'S:"Username"=([^\r
]*)'
) def hostname(x) : m = REGEX_HOSTNAME.search(x) if m : return m.group(1) return '???' def password(x) : m = REGEX_PASWORD.search(x) if m : return decrypt(m.group(1)) return '???' def port(x) : m = REGEX_PORT.search(x) if m : return '-p %d '%(int(m.group(1), 16)) return '' def username(x) : m = REGEX_USERNAME.search(x) if m : return m.group(1) + '@' return '' parser = argparse.ArgumentParser(description='Tool to decrypt SSHv2 passwords in VanDyke Secure CRT session files') parser.add_argument('files', type=argparse.FileType('r'), nargs='+', help='session file(s)') args = parser.parse_args() for f in args.files : c = f.read().replace('\x00', '') print f.name print "ssh %s%s%s # %s"%(port(c), username(c), hostname(c), password(c))

リファレンス


[1]SecureCRTパスワードを取り戻す方法[2]GitHub上のgitPoc 32の項目