Загрузка данных
Windows хранит приватные ключи зашифрованными через систему DPAPI (Data Protection API). Чтобы восстановить ключ, нужно зайти в реестр SYSTEM/SECURITY, получить Mchine Key (мастер-секрет машины), получить ключ шифрования DPAPI MasterKey, найти зашифрованный приватный ключ, расшифровать его и получить сертификат.
Для получения MachineKey я использую утилиту Mimikatz
Эта технология позволяет извлекать из памяти пароли в открытом виде, хеши, PIN-коды и билеты Kerberos. Она также может выполнять операции pass-the-hash, pass-the-ticket или создавать золотые билеты.
Извлекаю MachineKey из реестра:
lsadump::secrets /system:"C:\Users\machine-cert-dump\machine-cert-dump\Windows\System32\config\SYSTEM" /security:"C:\Users\machine-cert-dump\machine-cert-dump\Windows\System32\config\SECURITY"
В выводе ищу:
Secret : DPAPI_SYSTEM
m/u : a0e9a91ca5fd7a82473c11e002ab613bad8c906e (MachineKey) /39bf9ba8af68b32aba14b83eb5b093b551f5bb56 (UserKey)
На данный момент мне нужен MachineKey, а также
SysKey : bdf6c5f63552d94ff7cd4e791263906b
Расшифровывю:
mimikatz # dpapi::masterkey /in:"C:\Users\machine-cert-dump\machine-cert-dump\Windows\System32\Microsoft\Protect\S-1-5-18\c6859e4a-bfd8-46bf-86e7-2574c4b59eb2" /system:a0e9a91ca5fd7a82473c11e002ab613bad8c906e
В выводе получаю значение:
[masterkey] with DPAPI_SYSTEM: a0e9a91ca5fd7a82473c11e002ab613bad8c906e
key : 43d0f1e158b63d8e5e992cb886a142bdce9f7c0404417f39699e7f53e73183f7bbf090a918bde8cb1c9821dac4094f5a2c2ad18e0642d4c0667a7f5c9b2d81a7
sha1: fd6f2caca06b207c4c56272d9c47a66a7c44b1c4
Далее расшифровываю приватный ключ:
dpapi::cng /in:"C:\Users\machine-cert-dump\machine-cert-dump\ProgramData\Microsoft\Crypto\RSA\MachineKeys\fc58e716dd94cece30c087d4db914620_e1d345bd-ebc1-4d50-8b78-3f3e787e0953" /masterkey:43d0f1e158b63d8e5e992cb886a142bdce9f7c0404417f39699e7f53e73183f7bbf090a918bde8cb1c9821dac4094f5a2c2ad18e0642d4c0667a7f5c9b2d81a7
Mimikatz обычно сохраняет расшифрованный ключ рядом с исходным файлом, но мне не повезло, потому указываю сохранение явно:
dpapi::cng /in:"C:\Users\machine-cert-dump\machine-cert-dump\ProgramData\Microsoft\Crypto\RSA\MachineKeys\fc58e716dd94cece30c087d4db914620_e1d345bd-ebc1-4d50-8b78-3f3e787e0953" /masterkey:43d0f1e158b63d8e5e992cb886a142bdce9f7c0404417f39699e7f53e73183f7bbf090a918bde8cb1c9821dac4094f5a2c2ad18e0642d4c0667a7f5c9b2d81a7 /export
мне опять не повезло
Пошла следующим путем. Нашла сертификат через реестр:
reg load HKLM\TEMPSOFTWARE "C:\Users\machine-cert-dump\machine-cert-dump\Windows\System32\config\SOFTWARE"
Get-ChildItem "HKLM:\TEMPSOFTWARE\Microsoft\SystemCertificates\MY\Certificates\"
Нашла имя этого сертификата:
DB74D352754B27D58F8DA91B772F223718922619
Экспортировала его:
$cert = (Get-ItemProperty "HKLM:\TEMPSOFTWARE\Microsoft\SystemCertificates\MY\Certificates\DB74D352754B27D58F8DA91B772F223718922619").Blob
$certBytes = $cert | Where-Object { $_ -ne 0 }
Находим DER данные внутри Blob
Blob содержит служебные данные + сам сертификат
[System.IO.File]::WriteAllBytes("C:\Users\machine-cert-dump\cert.blob", [byte[]]$cert)
Извлекла сертификат из blob:
python C:\Users\Public\cert_cert.py
Содержимое cert_cert.py:
data = open(r"C:\Users\machine-cert-dump\cert.blob", 'rb').read()
Нашла начало DER сертификата (0x30 0x82)
for i in range(len(data)):
if data[i] == 0x30 and data[i+1] == 0x82:
cert_der = data[i:]
print(f"Сертификат найден на offset {i}")
with open(r"C:\Users\machine-cert-dump\cert.der", 'wb') as f:
f.write(cert_der)
print("Saved: cert.der")
break
и наконец-то получила cert.der
Перевела его в .pem:
openssl x509 -inform DER -in "C:\Users\machine-cert-dump\cert.der" -out "C:\Users\machine-cert-dump\cert.pem"
c с приватным ключом так же просто не получилось
Написала скрипт на python, чтобы получить decrypted _key.bin
Но bin-формат Openssl не понимает ☹
Далее необходимо было пересчитать d что б получить .pem- формат
В файле decrypted_key.bin d хранилось в нестандартном месте, найти перебором не получится, но это и не нужно, потому что d полностью определяется через p, q и e математически (математика RSA-шифрования).
В python присутствуют строки:
phi = (p-1) * (q-1)
d = pow(e, -1, phi)
pow(e, -1, phi) — это встроенная функция Python которая вычисляет модульное обратное число. Результат тот же самый d который был создан при генерации ключа — математика однозначна
таким образом, я получила восстановленный сертификат и private_key.pem
проверила совпадение модулей ключа:
Saved: private_key.pem
PS C:\> openssl x509 -in "C:\Users\machine-cert-dump\cert.pem" -noout -modulus | openssl md5
MD5(stdin)= 9f925f9af8406894bff5d232744feb77
PS C:\> openssl rsa -in "C:\Users\machine-cert-dump\private_key.pem" -noout -modulus | openssl md5
MD5(stdin)= 9f925f9af8406894bff5d232744feb77
Ответ:
Сертификат:
-----BEGIN CERTIFICATE-----
MIIFUTCCAzkCFCl/h76wv/zF2+BDk5d2yBs0G1K5MA0GCSqGSIb3DQEBCwUAMGcx
CzAJBgNVBAYTAlJVMRcwFQYDVQQIDA5TdC4gUGV0ZXJzYnVyZzEXMBUGA1UEBwwO
U3QuIFBldGVyc2J1cmcxDjAMBgNVBAoMBU1PWUtBMRYwFAYDVQQDDA1NT1lLQSBS
T09UIENBMB4XDTI2MDQwMTAyMDIwMFoXDTI3MDQwMTAyMDIwMFowYzELMAkGA1UE
BhMCUlUxFzAVBgNVBAgMDlN0LiBQZXRlcnNidXJnMRcwFQYDVQQHDA5TdC4gUGV0
ZXJzYnVyZzEOMAwGA1UECgwFTU9ZS0ExEjAQBgNVBAMMCUlWQU5PVi1OQjCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANYGhIjnROymnT9O534afYhk0gq5
8/RAR2f/X7WLE4BdARnCrCy1SNWwqbLfjkNyLM8cLUEjYKl11kjPeHlfO6CLNMVG
3M8M6P4emz6frYPXJnEDcJQ3BsuMPH0zhIBK9N9gqvwxtyRWNSkcw9GqTQqofLQ2
e3sxGxat2TM1+giI818mgaZ97mrxAyo1r9OFlZKOwRBMEPgQcPXuoBZYE0WxSwwP
KzN3cz3pgzfCGzUdFCIhNY6z9+F0X773g2ccIMRASCFQ9YtJC9mYu4MATPUyr6+s
EEdZ0qD53s7jmwfVTZYAiwdu7vMnb8J+RZ2nU7MVM4rXsf6wlt/UuKipbq4SW6ZD
UaoX8Owjge0a/bT4KK3eqGobQRq+TkD78SjncdVOksibcKR439UkbKT6pPGTDcC3
EslK7XHayAIUf+IzT/I18QFM5bOayT5TsUUAEUzV3sg8HrH+J0PZybi/FWskqnRe
QWJHxjwmpE0mxTnoOEQgrEj0Txg0NuOml2dqNgpp3S550efKXB6YA4UG2+jEVU7A
bGLFVliqFdOWlWgphiYsF3W6In4B6mlcnCuFz7DAtAOObhTQ8D1knnPig3p09izr
NLqbO/vtZZ1bU7o00CtfQC1k1ibzN7ipTJlaa479fnkAPoHr+I1E1OW/rprIwcPJ
2ILyGvkZAviz7L9/AgMBAAEwDQYJKoZIhvcNAQELBQADggIBADvL15FUWQfYnVqG
YocnafnOL/A9l8vorwgHVeOFMTh1nAfCQniKQrrlsOLM8vcvcE0QuBJVavoPt4Fi
/smvFQlAs23Y8EuRvSDqBuU9mDgJdejGmfVbFgcCll5PtCysja7sXSSSGFtfe9Iw
3JT5iMpuOV8NFP7JkhQHG1iVyxh9l3BSeeKKNlDLmMwmrPtExzoWsBwwK6hjrGPp
jRTCpTyTYL9+JynCj+rKI0jcu2TSH6rRx41nPGZwHB5j+OxU0uFlFcWHtOXoH998
PW3CimQDLey8CR+ujJr1l+QJNTWrAu6fg4fEeveMirR+8M5661ujGnPT/X7zIIVN
a42JW3zktanHrib1+xqVmmpUzdux665+H02YL7HxP5SyKZr/JD3u0oTRJN0j2Yqh
oDWWLZYLKkytGJdyxBV0Kh83+kHoFQ4Zkgej2XtWZ7shKpgIAQ6tUffI0OGXdJ0P
FmlHHCRW1ZEF8IA71lUVkVpIjW76OwD5Edts0GK1e8FuO1LLNNojV5liJnWyhxLd
86/0m0AF/8muyKxuQ/swQby1DvoSmlA/XodfnB72+Se90rUVxk/mEEXQ0DimvQ3p
qQY/cudMklmhqExGclWOjY8CuljPaNVxY5UXe8ztwgJ2vT/tjGTGIXUhLnSW9XkI
DtrDNyYck03iwRvwNPa9SQ1TgGfj
-----END CERTIFICATE-----
Ключ:
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----