web-dev-qa-db-ja.com

WindowsのExcelパスワードをクラック

パスワードで保護されたMicrosoft Excelワークシートがたくさんあり、それを編集できるようにする必要があります。パスワードを忘れてしまいました。ファイルを編集してパスワードチェックを行うことができることはわかっていますが、これを行うために必要なワークシートがかなりあります。それらはすべて同じパスワードを持っているので、パスワードを解読したいと思います。私はすでにsheetProtection要素を取得しています:

<sheetProtection algorithmName="SHA-512" hashValue="exBYsHJhLjU2iumFwDs7uFdq6WBWwAyJj3DqKQg85bmTocK4dNrqCpPePQC23Rikd5QSY5WyREknFGhRxKcB2w==" saltValue="DdJzMvZ9KqpGuTrabHJ1eg==" spinCount="100000" sheet="1" objects="1" scenarios="1"/>

リッパージョンを使用してこのパスワードを解読しようとしましたが、no password hash loadedエラー、そしてoffice2john(Microsoft OfficeファイルのハッシュをJohnが使用できるものに変換するツール https://github.com/magnumripper/JohnTheRipper/blob/bleeding-jumbo/run/office2john)を使用すると.py )ですが、同じエラーが発生します。
このパスワードを破るにはどうすればよいですか(この例では、ここに投稿されたパスワードは「john」です)?

1
Ethan

office2johnは暗号化されたファイル用に設計されており、簡単に取り外し可能なヘビ油保護フィールドを備えたファイルではありません。とにかく、ここに彼らが使用するアルゴリズムの簡単な実装があります:

#!/usr/bin/env python3

from base64 import b64encode, b64decode
from hashlib import sha512
import struct

def hash_password(password, salt, spincount, hash):
    result = hash(b64decode(salt) + password.encode('utf_16_le')).digest()
    for i in range(spincount):
        result = hash(result + struct.pack('<I', i)).digest()
    return b64encode(result)

print(hash_password('pwd', '876MLoKTq42+/DLp415iZQ==', 100000, sha512))
# 5l3mgNHXpWiFaBPv5Yso1Xd/UifWvQWmlDnl/hsCYbFT2sJCzorjRmBCQ/3qeDu6Q/4+GIE8a1DsdaTwYh1q2g==

私はそのテストケースを取った LibreOfficeから

しかし、これはあなたが投稿したものに対して正しい答えを生み出しません:

print(hash_password('john', 'DdJzMvZ9KqpGuTrabHJ1eg==', 100000, sha512))
# L69ms0LAD5mz5M8RdRtcn1UTSXWSfX9YI9hK9mPW1n4eW6I8ilTLi6el6LafMj2RVsxjg2aumqSeIfFk25drVw==
print(hash_password('**john**', 'DdJzMvZ9KqpGuTrabHJ1eg==', 100000, sha512))
# 7YpVVKy6la5CEYWmfbUbF6BFgeopeT/Uh52as+I+NVYqFRqVFvSUWfdCP1J5dUGeWBy3cJHan+i/IZieabrGGw==

hashValueのOOXML仕様では、「この値は、前述の属性と親XML要素で指定されたアルゴリズムを使用してユーザー指定のパスワードをハッシュした後のハッシュ値と比較される」と「9oN7nWkCAyEZib1RomSJTjmPpCY=のhashValue属性値ユーザー提供のパスワードは、親要素(存在する場合)によって定義された前処理とそれに続くSHA-1アルゴリズム(SHA-1のalgorithmName属性値で指定)を使用してハッシュする必要があり、結果のハッシュ値は保護を無効にするには、9oN7nWkCAyEZib1RomSJTjmPpCY=にしてください。 "

この違いは、アルゴリズムを指定する親XML要素にあるのではないかと思います。パスワードを削除するだけでなく、解読したい場合は、次の2つのことを行う必要があります。

  1. 追加の前処理アルゴリズムがある場合は、それを考慮します。
  2. John the Ripperに機能を追加して、シート保護パスワード(既存のOffice暗号化機能とは別に保持する必要があります)をサポートするか、アルゴリズムに基づいて独自のクラッカーを記述します。