エクセルのPWをhashcatでクラックする!+セキュリティの話
エクセルのパスワードを忘れること、ありますよね!?
色々試したのですが思い出せないためGPUを使って力業でこじ開けます。
当然ですが今回の記事の内容は悪用厳禁です。
・技術的知的好奇心を満たすため
・自分で作ったエクセルファイルのパスワードを忘れた
上記理由の場合のみに使用ください。
エクセルPWセキュリティ
まずはパスワード認証をどのように行っているのかを調べました。
パスワードの管理方法
パスワード付きエクセルを開く際には当たり前ですがパスワードを求められます。
入力されたパスワードと設定されているパスワードが一致しているとブックの中身を見れます。
つまり、どこかに設定したパスワードが保存されているわけです。
しかし平文で保存していたらセキュリティを成していないですよね。
そこでパスワードをハッシュ化します。
ハッシュ化はその特性上、ハッシュ値から元のデータを算出することは非常に困難です。
なので、パスワードはハッシュ値で保存されています。
今回解くものはExcel2013で作られたエクセルファイルになります。
バージョンによりパスワード保存形式が違います。
Excel2013だとSHA512というハッシュ関数を使っています。
パスワードをハッシュ化しただけでは問題がある!
ハッシュ値から元のデータを算出することは非常に困難と言いましたが、攻撃者はそう簡単に諦めません。
ハッシュアルゴリズムさえ分かっていれば、エクセルファイルに保存されているパスワードのハッシュ値と一致するものを総当たり等で片っ端から探せばいずれは突破できます。
また、予めすべてのキーワードとそのハッシュの組み合わせ(レインボーテーブル)を作っておけば、
そのテーブルにあるハッシュ値と一致するキーワードがパスワードということになるので一瞬で突破できます。(レインボーテーブル攻撃)
そこでsaltという仕組みを用意します。
saltというのは、パスワードをハッシュ化して保存する際に使用する乱数です。
パスワードにsaltを付加したうえでハッシュ化すればレインボーテーブルは使い物になりません。
saltを付加していないハッシュ値とは全く異なるハッシュ値となるからです。
もっとセキュリティを!
saltを付加することで一瞬でパスワードが突破されるレインボーテーブル攻撃は防げます。
しかし近年は演算装置の進化が早いので総当たりでも現実的な時間で解けてしまいます。
そこで、さらにセキュリティを強化をする仕組みがあります。
鍵ストレッチングという方法です。
パスワードにsaltを加えたものをハッシュ化し、さらにそのハッシュ値をハッシュ化します。
これを例えば10万回繰り返します。これで総当たりの攻撃力は10万分の1になるわけです。
単純ですがかなり効果の高い方法です。
Excel2013では上記に沿っており、
・SHA512によるハッシュ
・saltによるレインボーテーブル攻撃の予防
・鍵ストレッチング(10万回)
をすべて行っています。
実際に解いてみる
GPUはグラフィックス専用の演算装置です。
その実態は単純な演算を大量に行う、超並列演算ができるようなものです。
PWクラックするに当たって、多数のキーワードを同時に演算するためGPUが向いています。
(CPUは1コア当たりの処理自体はGPUより速いですが、並列処理は圧倒的にGPUが有利です。)
今は流行っていないですが、ビットコインマイニングも似た用途なのでGPUが使われていますよね!
インプットファイルの準備
今回はhashcatというGPUベースのパスワードクラックソフトを使います。
そのための準備をしていきます。
エクセルのファイルを適当なバイナリエディタで開くと下記のような感じです。
~~省略~~
何やらxml形式で何か書かれていますね。
xmlの部分だけ取り出して整形するとこんな感じになります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<encryption xmlns="http://schemas.microsoft.com/office/2006/encryption" xmlns:p="http://schemas.microsoft.com/office/2006/keyEncryptor/password" xmlns:c="http://schemas.microsoft.com/office/2006/keyEncryptor/certificate">
<keyData
saltSize="16"
blockSize="16"
keyBits="256"
hashSize="64"
cipherAlgorithm="AES"
cipherChaining="ChainingModeCBC"
hashAlgorithm="SHA512"
saltValue="k6gPEQ+oWWDHqZPWvVcPvA=="/>
<dataIntegrity
encryptedHmacKey="EeYmbIgLHRlLTSEcp0gvtMYgBwUb9ZIcW+Bja8faeYe3P4DEGEBo+18MNtXk0TZFOZXZqdGXkdA5j8F8fsjRWQ=="
encryptedHmacValue="Qx9vrf9wF+xEyx2k5KAuJqWYoj22wPXKg9RLL6ACp4y3B1lTDNVWwsuyyj4V2qWOGTQbkDlFCCMyCXY3AWB8ug=="/>
<keyEncryptors>
<keyEncryptor uri="http://schemas.microsoft.com/office/2006/keyEncryptor/password">
<p:encryptedKey
spinCount="100000"
saltSize="16"
blockSize="16"
keyBits="256"
hashSize="64"
cipherAlgorithm="AES"
cipherChaining="ChainingModeCBC"
hashAlgorithm="SHA512"
saltValue="xtitw8P1aA6GK9yKYx+y8w=="
encryptedVerifierHashInput="PAe0cEfoG8WGNpgq74fXdQ=="
encryptedVerifierHashValue="OChrvea5SJn9MNNYUtnV3MkMQV+2PCkREcNro5d+bw4PV+ddPrvsY6abtxdeuRCdya1P8uMVXxZi0q+hqXUq2g=="
encryptedKeyValue="SvEzSTaHodQbFxRifHGkIT3aX3pUEtrXwOoVN1S78cM="/>
</keyEncryptor>
</keyEncryptors>
</encryption>
PWを解くにあたって必要となるのがsaltValue, encryptedVerifierHashInput, encryptedVerifierHashValueの三つです。
base64でエンコードされているため、デコードします。(Webサービス)
saltValue
→c6d8adc3c3f5680e862bdc8a631fb2f3
encryptedVerifierHashInput
→3c07b47047e81bc58636982aef87d775
encryptedVerifierHashValue
→38286bbde6b94899fd30d35852d9d5dcc90c415fb63c291111c36ba3977e6f0e
これらをhashcatに読ませるための形式に合わせると下記のようになります
$office$*2013*100000*256*16*c6d8adc3c3f5680e862bdc8a631fb2f3*3c07b47047e81bc58636982aef87d775*38286bbde6b94899fd30d35852d9d5dcc90c415fb63c291111c36ba3977e6f0e
適当な名前を付けて保存してhashcatに喰わせるための準備は完了です。
辞書ファイルの準備
今回は良く使われる単語を総当たりして攻撃する辞書アタックという方法をとります。
任意の文字種×文字数を組み合わせてアタックする、ブルートフォースアタック という方法もありますが時間がかかるため辞書アタックで開かなかったときの最終手段です。
そのためには色んな単語が記載されたファイルが必要になるのですが、流石に自分で作るわけにはいかないので適当にダウンロードしてきます。
↑が有名所だと思います。
今回はrockyou.txtのみダウンロードしました。1400万語あります。
Openwallの有料版($27)は4000万語あるそうです。
任意の場所に保存しておいてください。
クラック開始
hashcatをダウンロードしたら下記コマンドを叩くだけでクラック開始します。
hashcat64.exe -m 9600 -a 0 [インプットファイルの準備で保存したファイル名] [辞書ファイル]
私の使っているGPU,Radeon RX470 8GB だとOffice 2013のハッシュレートは3500H/sほど。
1時間ちょっとでrockyou.txtを全部調べることができます。
ちなみにOffice 2010だと30000H/sほど出ます。単純に10倍くらいの速度で解けちゃうってことです。
おわりに
結果ですが、今回は運良くrockyou.txtの辞書に書いてあるパスワードだったので呆気なく解けてしまいました。
パスワードの管理方法、セキュリティ強化の手法等、調べていて面白かったです。
最近は量子コンピュータの話題が多くなってきましたよね。
量子コンピュータ時代のセキュリティがどうなっていくのか、いまから楽しみですね!
暗号技術に関する本と言えば数学ガールの著者、結城 浩さんの「暗号技術入門」がおすすめです。
分かりやすい例え話を交えながら、暗号技術の概念が学べます。
暗号技術に対する考えられる攻撃手段、攻撃への対抗策など…興味を引く内容が多く書かれています。
ディスカッション
コメント一覧
興味深く試してみたのですが、
>base64でエンコードされているため、デコードします。(Webサービス)
…
>encryptedVerifierHashInput
>→3c07b47047e81bc58636982aef87d775
とありますが、デコードしても上記の値になりません。
PAe0cEfoG8WGNpgq74fXdQ==をデコードするのですよね?
そもそも設定が違うのかもしれませんが、可能であれば、リンク先の設定を教えてもらえますか?
> PAe0cEfoG8WGNpgq74fXdQ==をデコードするのですよね?
その通りです。
リンク先の設定は下記のようになります。
1.BASE64
2.変換不要
3.未指定
4.HEX(16進数小文字)
返信、遅くなり、申し訳ありません。
ありがとうございます。
その先も試してみます。
お世話になります。
非常に勉強になりました。
一点質問させてください。
encryptedVerifierHashValueの変換元は以下でしょうか。
encryptedVerifierHashValue=”OChrvea5SJn9MNNYUtnV3MkMQV+2PCkREcNro5d+bw4PV+ddPrvsY6abtxdeuRCdya1P8uMVXxZi0q+hqXUq2g==”
リンク先で下記の設定で実施しましたが、変換結果の文字列が長いです。
一部を切り捨てする必要でしょうか。
1.BASE64
2.変換不要
3.未指定
4.HEX(16進数小文字)
→38286bbde6b94899fd30d35852d9d5dcc90c415fb63c291111c36ba3977e6f0e0f57e75d3ebbec63a69bb7175eb9109dc9ad4ff2e3155f1662d2afa1a9752ada