[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에 기입한다면 가능할 것 같다.
블로그의 정보
정윤상이다.
담배맛구마활동하기
정윤상이다.담배맛구마 님의 블로그입니다.