コンテンツにスキップ

8. 暗号の解読と解析

8.1. 暗号化の基礎

暗号化は機密性を保護し、整合性を確保し、信頼性を確保するために使用される。

8.1.1. 暗号化の種類

対称暗号化

対称暗号化では同じキーを使用してデータの暗号化と復号化が行われる暗号。 対称暗号化の例としてはDESやAESがある。 このアルゴリズムは非対称暗号化よりも高速である傾向があり、それより小さなキーを使用する

非対称暗号化

非対称暗号化では2つのキーペアを利用して暗号化と復号化が行われる暗号。 キーのペアの1つは暗号化に使用され、もう1つは復号化に使用される。 例としては、RSA や楕円曲線暗号がある。

通常これらのキーは公開鍵秘密鍵と呼ばれる。 秘密キーで暗号化されたデータは公開キーで復号化でき、その逆も可能となる。 秘密キーは非公開に保つ必要がある。

非対称暗号化は速度が遅くなり、より大きなキーを使用する傾向がある。 また RSA は通常 2048 ~ 4096 ビットのキーを使用する。

8.1.2. RSA

RSAの仕組みは大きな数の因数を計算するという数学的な性質に基づいている。 2つの素数を掛け合わせると、たとえば 17*23 = 391 となりますが、2 つの素数を掛け合わせて 14351 (参考までに 113x127) を作るのは非常に困難となる。

RSAの解析ツールは以下の通り。

8.1.4. デジタル署名と証明書

デジタル署名

デジタル署名はファイルの信頼性を証明し誰が作成または変更したかを証明する方法のこと。 電子的な文書やデータに対して、送信者の認証やデータの改ざんの有無を確認するための手段といえる。

非対称暗号化を使用すると、秘密キーで署名を生成し、公開キーを使用して署名を検証できる。

デジタル証明書

デジタル証明書は公開鍵暗号システムで使用される公開鍵を含み、その公開鍵が本物のものであることを証明する電子的な文書のこと。 デジタル証明書は信頼できる第三者機関(証明書機関、Certificate Authority:CA)によって署名され、信頼性を提供する。

8.1.5. SSH認証

SSH認証はユーザーがサーバーにアクセスする際にそのユーザーが誰であるかをSSHを利用して確認するための仕組み

8.1.6. DH法

DH法(Diffie-Hellman鍵共有法)は共通鍵暗号方式における鍵の共有方法の1つ。 DH法は自身で設定した秘密鍵と、他者に知られてもいい公開鍵を設定し、それらを組み合わせて計算した数値の余りの値を共有して共通鍵を生み出す仕組みといえる。

他者に傍受される危険のある通信経路でも使えるのが特徴の1つ。

8.1.7. PGP/GPG

PGP

PGP(Pretty Good Privacy)はファイルの暗号化やデジタル署名の実行などの暗号化を実装するソフトウェアのこと。

GPG

GNUプロジェクトによるPGPのオープンソース実装のこと。 PGP/GPG を使用すると、SSH 秘密キーと同様の方法で秘密キーをパスフレーズで保護できる。

8.2. ハッシュ

8.2.1. ハッシュ関数

ハッシュ関数はある値からダイジェストを作成するアルゴリズムのこと。 出力されるダイジェストは固定サイズとなる。

ハッシュ関数から出力した値から入力した値に戻すことはできない。 ハッシュはパスワードの検証などに頻繁に使用される。

ハッシュの衝突

ハッシュの衝突は2つの異なる入力が同じ出力を与える場合に発生する。 現在、MD5(16Byte)とSHA1(20Byte)はハッシュの衝突が多いハッシュ化アルゴリズムのため安全ではない。 (SHA1に関してはGPUを使用して非常に高速に計算できてしまう問題)

8.2.2. ハッシュ化の用途

ハッシュはセキュリティにおける2つの主な目的に使用される。 1つ目はデータの整合性を検証するため(詳細は後述)、2つ目はパスワードを検証するために使用される。

レインボーテーブル

レインボーテーブルはハッシュから平文へのルックアップを行うためのテーブルソルトを付加していないハッシュのパスワード解析などに使用される

crackstationのようなサービスは巨大なレインボーテーブルを保持している。

レインボーテーブルによる攻撃を防ぐにはハッシュ化される前にパスワードの先頭または末尾にソルトを追加する。

8.2.3. パスワードハッシュの解析

それぞれのパスワードハッシュの特徴は以下の通り。 プレフィックスはハッシュの生成に使用されるハッシュアルゴリズムを示す。

  • Unix形式のパスワードハッシュ
    • プレフィックスが付いている
    • 標準形式:$format$rounds$salt$hash
  • Windowsパスワードハッシュ
    • md4の一種であるNTLMを使用してハッシュされる
    • パスワードハッシュはSAMに保存される

NLTM(Windows New Technology LAN Manager):ユーザのIDを認証し、ユーザーのアクティビティの整合性と機密性を保護するためにMicrosoftが提供する一連のセキュリティプロトコル

なおUnixで使用されるパスワードのプレフィックスは以下の通り。

プレフィックス アルゴリズム
$1$ md5crypt、Cisco のものおよび古い Linux/Unix システムで使用される
$2$、$2a$、$2b$、$2x$、$2y$ Bcrypt (Web アプリケーションで人気)
$6$ sha512crypt (ほとんどの Linux/Unix システムのデフォルト)

多くのハッシュ形式とパスワード プレフィックスを見つけるのにコチラのサイトが役に立つ。

8.2.4. パスワードのクラッキング

ソルトのないハッシュの解読はレインボーテーブルの利用で可能である。 ソルトが含まれている場合は、ソルトを追加しターゲット ハッシュと比較することによって、ハッシュを解読する必要がある。

Hashcat やJohn the Ripperなどのツールで解析を行う。

Hashの解析にはHash AnalayzerHashcatなどが役に立つ。

8.2.5. 整合性チェックのハッシュ化

整合性チェック

ハッシュを使用するとファイルが変更されていないことを確認できる。 ファイルが変更されていないことを確認したり、ファイルが正しくダウンロードされたことを確認したりするために使用できる。

HMAC

HMACは暗号化ハッシュ関数を使用してデータの信頼性と整合性を検証する方法

8.3. パスワードの解析

8.3.1. パスワード解析の種類

パスワード解析には大きく分けて2種類がある。

オンラインパスワード解析

パスワード認証を備えたサービスに直接アクセスしてパスワード解析を行うタイプのパスワードクラックのこと。 Hydraなどのツールでのパスワードクラックがこれにあたる。

オフラインパスワード解析

ネットワークを介さずローカルのマシン内でパスワード解析を試みるタイプのパスワードクラックのこと。 John the ripperなどのパスワードクラックがこれにあたる。

なお解析には暗号化されたパスワードが記されたファイル暗号化した認証場を含むパケットファイルを用意する必要がある。 無線LANのパスワード解析にもこのタイプのツールが役に立つ。

8.3.2. パスワード解析の分類

パスワード解析の代表的な方法は以下の通りとなる。

  • 総当たり攻撃
  • 辞書攻撃
    • リスト攻撃
    • コンビネーション攻撃
    • ハイブリッド辞書攻撃
    • ルールベース辞書攻撃

8.3.3. 辞書ファイル

Kali Linux搭載辞書ファイル

パス 説明
/usr/share/wordlists/rockyou.txt 定番パスワード

辞書ファイル提供サイト

URL 説明
https://www.openwall.com/wordlists/ Openwallワードリストコレクション
https:/github.com/danielmiessler/SecLists SecLists

8.4. 暗号/パスワードの解析

8.4.1. Hashcat

パスワードハッシュのクラックや解析に特化したツール。 ブルートフォース(総当たり)攻撃、辞書攻撃、マスク攻撃に対応している。

リカバリに成功したハッシュとパスワードはhashcat.potfileに記録される。

hashcat [オプション]... <ハッシュファイル> <ワードリストファイル>
-oオプション(モード) 説明
0 Straight ←辞書攻撃
1 Combination
3 Brute-force ←ブルートフォース
6 Hybrid Wordlist + Mask
7 Hybrid Mask + Wordlist
ハッシュアルゴリズム オプション
MD5 -m 0
SHA1 -m 100
SHA-256 -m 1400
SHA-512 -m 1700
bcrypt -m 3200
DES -m 1500

アルゴリズムの検索は以下で行うと良い

hashcat -h | grep "アルゴリズム"

マスクの使用

マスクを使うと文字列+数字のようなパスワードフォーマットを指定することができる。

マスクを指定する際にシングルクォートが必要かどうかはOSによって異なり、Unix系OSでは 「?」 をエスケープするためにシングルクォートで囲む必要がある。

マスク形式 マスクの意味 マスクに適用される内容
?l アルファベット小文字 abcdefghijklmnopqrstuvwxyz
?u アルファベット大文字 ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d 数字 123456789
?s 記号 !"#$%&'()*+,-./:;<=>?@[]^_`{
?a ?l?u?d?sと同じ すべての文字列
?b 16進数 0x00 - 0xff

マスクの長さを指定する(-i, --increment)

マスクの長さを指定したい場合に使う。

hashcat -m 1500 -a 3 hash.txt --increment '?d?d?d?d'

hashcat -m 1500 -a 3 hash.txt --increment --increment-min 2 --increment-max 4 '?d?d?d?d'

hashcat -m 1500 -a 3 hash.txt --increment --increment-min 7 --increment-max 8 '?a?a?a?a?a?a?a?a'

8.4.2. John The Ripper

John the Ripperはパスワードクラックツール。非常に多種多様なパスワードクラックに対応している。

john [オプション] [ファイルパス]

john --wordlist=[ワードリスト] [ファイルパス]

# 使用できるフォーマットの確認
john --list=formats | grep -iF "フォーマット"
オプション 説明
--format= 特定の形式のハッシュを与えていること、およびそれを解読するために次の形式を使用する

Johnには、与えられているハッシュの種類を検出し、それを解読するための適切なルールと形式を選択する機能が組み込まれている。 なおハッシュの種類を検出できない場合は他のツールを使用してハッシュを識別し、特定の形式を使用するように john を設定できる。

Windowsハッシュのクラッキング

NThashは最新のWindowsOSがユーザーパスワードとサービスパスワードを保存するハッシュ形式のこと。 一般に「NTLM」とも呼ばれる。

NTHash/NTLMハッシュは、Mimikatzなどのツールを使用してWindowsマシン上のSAMデータベースをダンプするか、Active Directory データベース NTDS.dit から取得できる。

/etc/shadowからのハッシュのクラッキング

/etc/shadowファイルはパスワードハッシュが保存されるLinuxマシン上のファイルのこと。 最後のパスワード変更日やパスワードの有効期限情報など、他の情報も保存される。

システムのユーザーまたはユーザーアカウントごとに、1 行に 1 つのエントリが含まれており、通常、このファイルには root ユーザーのみがアクセスできる。 そのたmハッシュを入手するには十分な権限が必要となるが、権限を持っている場合は、一部のハッシュを解読できる可能性がある。

Johnで/etc/shadowパスワードを解読するには/etc/passwdファイルと結合する必要がある。 これを行うには、John ツール スイートに組み込まれているunshadowというツールを使用する。

unshadow [ターゲットマシンから取得した /etc/passwd ファイルのコピーを含むファイル] [ターゲットマシンから取得した /etc/shadow ファイルのコピーを含むファイル]

上記のunshadowからの出力は John に直接フィードすることができる。

john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt

シングルクラックモード

シングルクラックモードではJohn はユーザー名で提供された情報のみを使用して、ユーザー名に含まれる文字と数字をわずかに変更することで、可能なパスワードを発見的に見つけ出す。

john --single --format=[format] [path to file]

なおシングルクラックモードでハッシュをクラックしている場合は、どのデータからワードリストを作成するかを理解できるように、john に供給するハッシュのファイル形式を変更する必要がある。

# 例
1efee03cdcb96d90ad48ccc7b8666033

# 上記を下記に
mike:1efee03cdcb96d90ad48ccc7b8666033