|
Message-ID: <BN8PR20MB2529615AE8AAB2D5809AE1CDDE829@BN8PR20MB2529.namprd20.prod.outlook.com> Date: Sat, 18 Mar 2023 16:09:09 +0000 From: Gonn Zerg <gonnzerg@...look.com> To: "john-users@...ts.openwall.com" <john-users@...ts.openwall.com> Subject: Cracking 1Password8 iOS password. How to use JTR if 1password2john isn't suited for my case? Hi all, I’m trying to format this as best as I can for the mailing list, I apologize in advance if it doesn’t meet standards. I’m looking for advice on how to achieve this using JTR. I have tried passing my .sqlite file to 1password2john but it doesn’t appear to be compatible. The account only exists in iOS so I can’t obtain a macOS or Windows database. So, I’ve written a script in Python that goes through the same process 1Password goes through to generate the AUK. I do this for each password in a dictionary. I would like to know how the following process could be achieved using JTR. Or maybe this method is the wrong way to go about this. I relied heavily on this repository https://github.com/dschuetz/1password. So these things I know or have from a backup of the device: - secret Key (version, account id, secret) - email - algorithm - iterations - salt - encrypted sqlite database (keysets, account, vaults, etc.) 1. With this I then get the HKDF salt: hkdf_salt = HKDF(ikm=p2s, len=32, salt=email, hash=SHA256, count=1, info=algorithm) 2. Then the derived password key using the HKDF salt: password_key = PBKDF2(sha256, password, salt=hkdf_salt, iterations=p2c, 32 bytes) 3. Then the HKDF secret key: hkdf_key = HKDF(ikm=secret, len=32, salt=AcctID, hash=SHA256, count=1, info=version) 4. Then XOR the password key and the HKDF secret key: auk = bytes(a ^ b for a, b in zip(password_key, hkdf_key)) 5. Then I check if the resulting auk is valid by trying to decrypt and verify the data in the symmetric key: C = AES.new(auk, AES.MODE_GCM, enc_sym_key_iv, mac_len=16) try: PT_enc_sym_key = C.decrypt_and_verify(enc_sym_key_data[:-16], enc_sym_key_data[-16:]) if PT_enc_sym_key is not None: jwk_loaded = json.loads(jwk_json) decrypted_kid = jwk_loaded['kid'] if(decrypted_kid == keyset_uuid): # Found password! except ValueError: continue I did manage to divide the dictionary into chunks and divide it into 12 processes which was better than my first copy/paste Apple Shortcut. After attempting this with a new 1Password account on another iOS device, getting the data needed from the backup and going through a wordlist that contained the correct password I managed to confirm that this works and it's very likely that it will work on the main device. So, how can I do better? I tried to optimize the code bit by bit and I understand there's plenty more to improve in it. However, I'd like to move to doing something like this on an environment that would make this a lot faster or more efficient. I know I won't be able to code more efficient solutions than the ones already out there by experts, even if I wanted to reinvent the wheel. I started to feel the lack of optimization in my solution when John The Ripper output a wordlist in the almost hundreds of millions of lines from a set of rules I thought could contain the right password but no luck yet. I know I have to grow the list even more but optimize my approach even more. I would appreciate any help pointing me in the right direction. Thank you for reading me!
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.