[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 |
블로그의 정보
정윤상이다.
담배맛구마