.

[AWS] How to get EC2 Windows instance password

by 담배맛구마

AWS에서 윈도우 인스턴스를 만들고 접속 패스워드를 얻기 위해서 웹 콘솔에 들어가서 Ker-pair를 주입해야된다. 근데 귀찮다.

 

1. 어떻게 윈도우 인스턴스 패스워드를 가져올까.

EC2에서 인스턴스가 구성될때, Administrator 계정의 패스워드를 Key-pair로 암호화해서 콘솔로 전송한다. 그래서 그걸 Key-pair로 복호화하면된다. 콘솔에서는 Get System Log를 통해서 확인할 수 있다.

정규표현식으로 <Password>\s+?(.+?)\s+?</Password> 뽑아내면될 것 같다. 값이 ==으로 끝나는걸 보니 Base64 디코드하고 Key-pair로 복호화하면 될 것 같다.

 

2. 뽀또3

ec2 클라이언트에서 get_console_output 메소드로 확인해야하는데 파라미터로 인스턴스 ID를 필요로한다. 

import re
import boto3
import base64

def get_instance_information(cli):
    filters = [
        {'Name': 'platform', 'Values': ['windows']}, 
        {'Name': 'instance-state-name', 'Values': ['running']}
    ]
    if resp := cli.describe_instances(Filters=filters):
        for instance in resp['Reservations']:
            ins = instance['Instances'][0]
            info = {
                'instance_id': ins['InstanceId'],
                'private_ip': ins['PrivateIpAddress'],
                'public_ip': ins['PublicIpAddress']
            }
            if 'Tags' in ins:
                for tags in ins['Tags']:
                    if 'Name' in tags['Key']:
                        info.update({'name_tag': tags['Value']})
            yield info

def get_instance_password(cli, instance_id):
    resp = cli.get_console_output(InstanceId=instance_id)
    encryptd_password = re.search(r'<Password>\s+?(.+?)\s+?</Password>', resp['Output'])
    if encryptd_password:
        return base64.b64decode(encryptd_password.group(1))
    else:
        return False

바이너리로 패스워드가 떨어진다. 이제 keypair로 복호화 하면된다. 모듈로는 pycryptodome를 사용했다.

import pathlib
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

def get_decrypt_password(encrypted_password, keypair):
    if pathlib.Path(keypair).exists():
        key = RSA.importKey(open(keypair, 'rb').read())
        decryptor = PKCS1_v1_5.new(key)
        return decryptor.decrypt(encrypted_password, None)
    else:
        return False

띠용. 이 정보를 토대로 rdp파일을 만들어서, 활용한다면 좋을것 같다.

cli = boto3.client('ec2')
for instance in get_instance_information(cli):
    if encryptd_password := get_instance_password(cli, instance['instance_id']):
        if decrypt_password := get_decrypt_password(encryptd_password, 'key.pem'):
            if 'name_tag' not in instance:
                print('{} / '.format(instance['name_tag']), end='')
            print('{}'.format(instance['instance_id']))
            print(' └ Private IP : {}'.format(instance['private_ip']))
            print(' └ Public IP  : {}'.format(instance['public_ip']))
            print(' └ Password   : {}\n'.format(decrypt_password.decode()))

 

RDP 파일의 스펙을 보면 패스워드를 기입할 수는 있으나 Mac에서 Microsoft Remote Desktop 앱에서는 그걸 읽어들이지는 않는 것 같다. 다른 RDP 앱을 찾아서 Config에 기입한다면 가능할 것 같다.

 

반응형

'Cloud' 카테고리의 다른 글

[AWS] AWS Code Series  (6) 2020.06.22
[AWS] AWS Transfer Family  (0) 2020.06.22
[AWS] SSH connect to bastion host by name tag  (0) 2020.05.10

블로그의 정보

정윤상이다.

담배맛구마

활동하기