pull down to refresh

While innocently surfing the web, you stumbled upon this encrypted SSH private key:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,353B80CD6D6AE8B97C9489F71E12DA0A

NU5iL4TPOyNHc5CD/wEEEl2HVv8NLQ6Gk+Ez4Ay8rKpGTWXwogtyhNxaaJBmAC4v
UnWwdErjHkD7XtrKqFUdQ5U/G0aMAXVk4gzSX49AW6Z2haUBP9Q0h4JilSvpnoJ8
kIAZr7vdgjdw+mAgphaJeWQkvvbExOhA2k/g514+WDMeWeuNeqknEfuN9uXXfc/e
xLF5axl/VfVNW1cS3tXNPJ3s19DPobJw5xjNh0bN0CKBDu0H62fw0XxxQMJoi9wC
p6HBKQPK/y2r/UrjeCBunS/MRdJxsb99NBNoEPdGuEwLWJgIXchtKSsp6SQ/gWG4
EuH/esk9LmfhHXZftPc4iMsh4HQ8ispbn4XDl/VhOP9DNdmT3EtrHfkPlo9QvAKq
3pADA1tzzYIjMDo4UdRIFCACP5eTptOJaApPNMMd6v+pQVbyGCQ6YQWomtBLekQg
Cs1LWl45NbuKQm5w4ZP1cca2W0Riv+YKa8ITFkwE4esD8UeGxkhcTy/M82lLWxii
vwZPLIpmbUhHxmJeniMdMEkfVWOFbsmt2vjdD56dJfrYBAkAbS1vaQdJQFdpgGZx
Z7J6CZcQhzxjyEbX8Xu7WSu7pwdT2Jorrx3YtXvVnysq0+YMoNdzMbfZYrSbsrxF
nGfeIOYM9XwjHnzEwCAzhgmg+eDYd6tALzN+uu/mDCa51RoI9UL6Xl2kn7w6+QQQ
HCG1zmYn+AtONdI5tMPM7OaPNNdrNI0kg9jO+pgQpvsBfD9dxbRzKcpCzgld1arL
MucniUiQ5+0d1mqNba3PmN/5VreSHwXGALuRoC3bF8+FfUkkWJacvp+cuJUnCIkM
Vh9SrRE+XKFZI3ty0dZQS27z4K/W6A1I9ZaZyo7/S0Mzy+/TOH+/EAF7IrKANlzh
c+LhpGY1L/tUOv8g7ljURqyYMnHOFyMhk1sioi1EDB8vjfFPcvHWzOW5ls8FOK+x
1NnC4s1KybvG4N2vg+QP07AFJjEEIziaZHrwHb37jJEACYqSYTw5zTkwZx7Ki5iq
aa0MUZGoq0SCxVSnfbd1tWj3KwALsUzdI/pir4uK55+KT2ym7BffeAEHfVAdaT6n
pqT1qab6ba/YcNx/n8k0nXYOtJH99zt+4wf1q1dn4P/ZZ8F4lYjoaC91SagkM2te
sAQTPagFnYF7YY+TkvyZYP2z7FDxaFEr+p5tWWNev1RuWYrXWJGjF+rf6Fq6IaqB
1vaNTZhLEONkgM4KGYy7sHSLDruRH0yrsvb96EMNEJh8RTKQUYnjW8IWQgWTVibq
9OsplFe9EZF9PJajEc00TS5KdP2J5rHITIzYnk17NLZYPa9cI1NlSh6QizlcUJYW
Mwe22NjF0K7CfKLUVv1CFfCtfW8LY/iIAQ860AaruU8Mk/wwqssd2j8MOsG5E1uO
KB03k66umHEoV0KormAC47O9yxDgvGY22zEniFmO9Qc2KfGGAw0O/dxO7tQMuDvU
/d2t1+UekJ5FRZ9pj07zGZNYqNesZilvxBUXTZKXfbl/D4Xg8YXhJPd+RHe1j7o3
0T3co1gPnUZsPtOuh+ZyMoUyOqSWy4HUKyYbErlHCFi/5I/zuhRMnfoGex5jxJvt
-----END RSA PRIVATE KEY-----

Curiosity got the better of you, and you wondered if you can crack the password...

Well, can you?

1,337 sats bounty

Don't know anything but I try to figure out on my instincts and it has 'Stay Humble, Stack Sats'

reply

Nice bounty choice lol

reply

Another bruteforce challenge.

reply

Another?

reply

Oh! Meant to say "bounty challenge" on SN

reply
16 sats \ 1 reply \ @OT 28 Sep 2024

How much is in there?

reply

Just the bounty, it's an SSH key from a pentesting lab

reply

No. I don't even know what any of that means.

reply

This private key is encrypted with AES-256-CBC, as indicated by the DEK-Info header:

DEK-Info: AES-256-CBC,353B80CD6D6AE8B97C9489F71E12DA0A

Here’s how you can decrypt it using Python and the cryptography library.

Key Information Found in the FileKey Information Found in the File

  • AES-256-CBC: This tells us the file is encrypted with AES-256 in CBC (Cipher Block Chaining) mode.
  • Initialization Vector (IV): Based on the DEK-Info section, the IV used during encryption is 353B80CD6D6AE8B97C9489F71E12DA0A, which is a 16-byte (128-bit) value, represented in hexadecimal format. You’ll need to convert it from hex to bytes to use it in your script.

What You’ll NeedWhat You’ll Need

You’ll need the following items to decrypt this RSA private key:

  1. The encrypted key data.
  2. The passphrase that was used to encrypt the private key.
  3. The initialization vector (IV) derived from DEK-Info.

For this example, I’ll assume you have the passphrase needed to decrypt the key.

Python Decryption StepsPython Decryption Steps

Here’s how you can decrypt the key, using this information, with step-by-step instructions updated for your specific case:

  1. Install the Python cryptography library (if it’s not installed yet):
    pip install cryptography
  2. Code to decrypt the provided key:

    The following Python code demonstrates how to use the cryptography library to decrypt the key. You'll be prompted to enter your passphrase during execution.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

import os
import base64

# Step 1: Define base64-encoded encrypted key block (replace this with your own encrypted key)
encrypted_key_base64 = '''NU5iL4TPOyNHc5CD/wEEEl2HVv8NLQ6Gk...Your encrypted key here...'''

# Step 2: Convert the base64-encoded key to bytes and AES IV (from DEK-Info)
encrypted_rsa_key = base64.b64decode(encrypted_key_base64)
aes_iv_hex = '353B80CD6D6AE8B97C9489F71E12DA0A'
aes_iv = bytes.fromhex(aes_iv_hex)

# Step 3: Prompt user for the passphrase (this would have been used to encrypt the key)
passphrase = input("Enter the passphrase: ").encode('utf-8')

# Step 4: Derive the AES key from the passphrase using PBKDF2
# AES key derivation uses a key derivation function, typically with PBKDF2 in OpenSSL. Below, we assume that:
# - Salt = IV (we’re treating the IV as the salt for this example)

kdf = PBKDF2HMAC(
    algorithm=hashes.SHA1(),  # OpenSSL often uses SHA-1 for PBKDF2 in these scenarios
    length=32,  # AES-256 requires a 32-byte key
    salt=aes_iv,  # In this simplified example, we use the IV from DEK-Info as the salt
    iterations=2048,  # This is typical for OpenSSL-encrypted RSA private keys
    backend=default_backend()
)

# Step 5: Derive the encryption key using passphrase
aes_key = kdf.derive(passphrase)

# Step 6: Set up the AES cipher in CBC mode
cipher = Cipher(algorithms.AES(aes_key), modes.CBC(aes_iv), backend=default_backend())
decryptor = cipher.decryptor()

# Step 7: Decrypt the encrypted RSA private key
decrypted_rsa_key = decryptor.update(encrypted_rsa_key) + decryptor.finalize()

# Step 8: Load decrypted data as a private key object
try:
    rsa_private_key = serialization.load_der_private_key(decrypted_rsa_key, password=None, backend=default_backend())
    print("RSA private key successfully decrypted.")
except ValueError as e:
    print(f"Error loading private key: {e}. Check your passphrase and IV.")
    exit(1)

# Step 9: (Optional) Save the decrypted key to a PEM file
pem_private_key = rsa_private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption()
)

# Step 10: Write the decrypted key to a file
with open('decrypted_rsa_private_key.pem', 'wb') as pem_file:
    pem_file.write(pem_private_key)

print("Decrypted RSA private key saved to 'decrypted_rsa_private_key.pem'")

Important Notes:Important Notes:

  1. Passphrase: The code assumes you will enter the correct passphrase when prompted. This passphrase is used to derive the AES-256 key through PBKDF2 (Password-Based Key Derivation Function 2). The IV from DEK-Info is used here as the “salt” for key derivation, which is typical for OpenSSL-encrypted private keys.
  2. AES-256 Decryption: The key derivation scheme matches the approach commonly used by OpenSSL for AES-256-CBC encrypted private keys. Specifically, it applies PBKDF2 hashed with SHA-1 and 2048 iterations to derive the AES key from the provided passphrase and IV.
  3. File Output: Once the key has been decrypted successfully, it is saved as decrypted_rsa_private_key.pem in PEM format. You can adjust the filename if needed.

The above code decrypts an AES-256-CBC encrypted RSA private key, commonly seen when working with OpenSSL-generated keys. The key derivation leverages PBKDF2 with a passphrase and the IV from the DEK-Info section of the encrypted key block. The decrypted RSA private key is then saved in PEM format for easy access and further cryptographic operations.

deleted by author

reply

I don't think you understood the assignment

reply