セキュリティについて

This commit is contained in:
ry.yamafuji 2025-12-13 06:10:02 +09:00
parent 93792f4d54
commit b9442a4171
5 changed files with 394 additions and 0 deletions

View File

@ -0,0 +1,72 @@
# ファイル解析について
CTFの初級問題には、よくファイルの中にFlagが隠されています
## ファイル操作に活用するコマンド
### 一般的に使われるコマンド
| コマンド名 | 内容 | サンプル |
| ---------- | -------------------------------------------------------- | ---------------------------------------- |
| `cat` | 複数のファイルの内容を連結して標準出力に表示 | `cat file1.txt file2.txt > combined.txt` |
| `ls` | ファイルの権限、所有者、サイズ、タイムスタンプなどを表示 | `ls -la` |
| `chmod` | ファイルの権限を設定する | `chmod -x <ファイル名>` |
| `less` | ファイルの内容を安全に閲覧できる | `less <ファイル名>` |
### 解析に用いるコマンド
| コマンド名 | 内容 | サンプル |
| ---------- | ---------------------------------------------------- | ------------------------- |
| `file` | ファイルの種類を確認する。(バイナリ・テキスト判定) | `file <ファイル名>` |
| `hexdump` | 16進ダンプで表示する(バイナリの場合は安全です) | `hexdump -C <ファイル名>` |
| `strings` | バイナリファイルでも、文字列だけを抽出して表示する | `strings <ファイル名>` |
| `od` | ファイルの内容を8進数、16進数、またはASCIIとして表示 | `od -tx1 -c <ファイル名>` |
| | | |
* `od`は、`hexdump`に似ていますが、より細かいオプションがあります。
* `strings`によりバイナリデータに含まれているテキスト情報やメタデータを抽出できます
**解析のコツ**
* file でファイルタイプを確認。
* テキストファイルなら less や vim を使用。
* バイナリファイルなら hexdump や strings を使用。
* これらの手順を使えば、Linuxで不明なファイルの内容を安全に確認できます。
### ファイルの中身を安全に見るためのポイント
**実行しないこと**:
ウイルスが仕込まれたファイルであっても、cat や less、hexdump、strings などで「内容を表示するだけ」では、ファイルは実行されません。
バイナリファイルを`hexdump``strings`で表示しても、ファイルは実行されません。
ただ表示するだけなら感染のリスクは低いです。
**仮想マシンやコンテナ内で確認する**:
ウイルスやマルウェアの可能性があるファイルは、実際のシステムではなく、
仮想マシンを使えば、ファイルが実行されても
仮想環境内で被害がとどまり、実システムには影響を与えません。
**ファイルのパーミッションを確認する**:
不明なファイルを扱う際は、chmod コマンドでファイルのパーミッションを確認し、実行権限 (x) がついている場合は実行されないように権限を変更しておくと良いでしょう。
```sh
chmod -x <ファイル名>
```
**ウイルススキャンを行う**
ファイルを表示する前に、アンチウイルスソフトを使ってファイルをスキャンし、マルウェアが含まれていないか確認することも重要です。
LinuxでもClamAVなどのウイルス対策ソフトを使ってスキャンできます。
```sh
clamscan <ファイル名>
```

View File

@ -0,0 +1,18 @@
# Common Modulus Attackとは
[RSA](./RSAとは.md)の代表的な攻撃です
同じモジュラスNを使い回している状態で
```
C1 = M^e1 mod N
C2 = M^e2 mod N
```
のように異なる公開指数 e1, e2 で同じ平文Mを暗号化すると危険です。
### 成り立つ前提条件
* 同じNを使っている
* 公開指数 e1 と e2 が異なる
* 同じ平文Mを暗号化している
* gcd(e1, e2) = 1

View File

@ -0,0 +1,98 @@
# RSAとは
RSAは公開鍵暗号(非対称鍵暗号)の代表例です。
RSAでは以下の3つの値が重要です。
| 名前 | 記号 | 役割 |
| ---------- | ---- | ---------------------------- |
| モジュラス | N | 公開鍵・秘密鍵で共通 |
| 公開指数 | e | 公開鍵側(暗号化・署名検証) |
| 秘密指数 | d | 秘密鍵側(復号・署名生成) |
## RSAの基本的な使い方
### 機密情報の暗号化
```
暗号化: C = M^e mod N
復号: M = C^d mod N
```
* 公開鍵(e, N)で暗号化
* 秘密鍵(d, N)で復号
第三者は復号できない
```plantuml
@startuml
title RSA Encryption (Confidentiality)
actor Sender
actor Receiver
participant "Public Key\n(e, N)" as Pub
participant "Private Key\n(d, N)" as Priv
note over Sender,Receiver
公開鍵で暗号化し\n秘密鍵で復号する
end note
Sender -> Pub : Encrypt M\nC = M^e mod N
Pub --> Sender : Ciphertext C
Sender -> Receiver : Send C
Receiver -> Priv : Decrypt C\nM = C^d mod N
Priv --> Receiver : Plaintext M
@enduml
```
### デジタル署名
```
署名生成: S = M^d mod N
署名検証: M = S^e mod N
```
秘密鍵で「暗号化」して公開鍵で「復号」
→ 本人が署名したことを証明。
```plantuml
@startuml
title RSA Digital Signature
actor Sender
actor Receiver
participant "Private Key\n(d, N)" as Priv
participant "Public Key\n(e, N)" as Pub
note over Sender,Receiver
秘密鍵で署名し\n公開鍵で検証する
end note
Sender -> Priv : Sign H(M)\nSig = H(M)^d mod N
Priv --> Sender : Signature Sig
Sender -> Receiver : Send (M, Sig)
Receiver -> Pub : Verify Sig\nH'(M) = Sig^e mod N
Pub --> Receiver : Recovered hash H'(M)
Receiver -> Receiver : Compare\nH'(M) == H(M)
@enduml
```
デジタル署名は「暗号化(秘匿)」ではなく、
「正しさ・本人性の保証」なので
中身は隠し手おらず読めます。
### ビット数
| Nのビット長 | 現実的な安全性 |
| ----------- | -------------- |
| 256bit | 一瞬で破られる |
| 512bit | 数日〜数週間 |
| 1024bit | もはや危険 |
| 2048bit | 現在の標準 |
| 3072bit | 長期利用向け |

View File

@ -0,0 +1,179 @@
# ハッシュ値とは?
**一方向性**
元のデータからハッシュ値を簡単に計算できますが、
ハッシュ値から元のデータを再構築するのは非常に難しい(ほぼ不可能)です。
**固定長出力**
どんなサイズの入力データでも、ハッシュ関数は固定長の出力を生成します。
たとえば、SHA-1は160ビットのハッシュ値を生成します。
**衝突耐性**
異なる入力データが同じハッシュ値になる(衝突する)確率をできるだけ低くするように設計されています。
## ハッシュ値の基礎知識
* ソルト: ハッシュ化する前にパスワードに付け足す「ランダムな値」
* SHA-1でもSHA-256でも存在する
* レインボーテーブル: 事前に計算されたハッシュ値と対応するプレーンテキストのテーブルです。
* 「よく使われるパスワード」と「そのハッシュ値」をあらかじめ大量に計算して保存した表
* SHA-1でもSHA-256でも存在する
## セキュリティについて
### SHA-1は非推奨
SHA-1は現在脆弱性が指摘されているため、推奨されていません。
SHA-256や他のより安全なハッシュ関数を使うことが推奨されています。
**ハッシュ値の確認**
* SHA-1 Centerというサイトにより確認できる
* https://sha1.gromweb.com/?hash=e4c6bced9edff99746401bd077afa92860f83de3
### パスワード処理では
現在ではSHA256+ソルトでも、パスワード保存では、GPUの搭載したPCでは秒間で何億個も試せます。
メリットである「速く大量に計算する」ことがパスワード保存では致命的な欠陥になります
パスワード保存には`bcrypt / Argon2`といったパスワードハッシュのアルゴリズムを利用しましょう。
#### ハッシュ関係の代表的な攻撃一覧
| 攻撃名 | 概要 | 主な影響 |
| --------------------------- | ------------------------ | --------------------- |
| 総当たり攻撃Brute Force | 全パターン試行 | 弱いPWは即破られる |
| 辞書攻撃 | よくあるPWを試す | 人間由来PWに有効 |
| レインボーテーブル | 事前計算表で逆引き | ソルトなしで致命的 |
| 衝突攻撃 | 異なる入力で同一ハッシュ | 署名・証明書破壊 |
| 長さ拡張攻撃 | ハッシュ構造の欠陥利用 | MACの偽造 |
| ハッシュ再利用 | 同一PW判定 | ユーザー特定 |
| 高速ハッシュ悪用 | GPU大量試行 | SHA系PW保存破壊 |
| パラメータ弱体化 | cost等が低すぎ | bcrypt/Argon2でも危険 |
#### CVEの対応表
**総当たり・辞書攻撃系**
| 攻撃 | 対象 | CVE / 事例 |
| ----------- | ------------- | ------------------------------- |
| 総当たり | SHA-1 / MD5 | CVE-2012-2122弱ハッシュ比較 |
| 辞書攻撃 | unsalted hash | LinkedIn 2012 パスワード流出 |
| GPU総当たり | SHA-256 | Adobe 2013高速ハッシュ使用 |
* CVEより「設計ミス」扱いが多い
* ハッシュ自体ではなく「使い方の問題」
**レインボーテーブル攻撃**
| 攻撃 | 条件 | CVE / 事例 |
| ------------------ | ---------- | ----------------------- |
| レインボーテーブル | ソルトなし | CVE-2016-6316Drupal |
| 同一ソルト | 固定ソルト | 複数CMS事例あり |
```
hash = SHA256(password + "fixed_salt")
→ 全ユーザーで同じ → 無意味
```
**衝突攻撃(非常に重要)**
| アルゴリズム | CVE / 事例 | 内容 |
| ------------ | ---------------- | ---------- |
| MD5 | CVE-2008-0166 | 証明書偽造 |
| SHA-1 | SHAttered (2017) | 実衝突生成 |
| SHA-1 | CVE-2017-15361 | Git影響 |
* 電子署名
* 証明書
* ソフト配布の信頼性
**長さ拡張攻撃**
| 対象 | CVE / 事例 |
| ------- | -------------------------- |
| MD5 | CVE-2011-3389BEAST派生 |
| SHA-1 | Web API署名偽造 |
| SHA-256 | 独自MAC実装 |
脆弱な設計
```ini
MAC = SHA256(secret + message)
```
正しい設計
```ini
MAC = HMAC-SHA256(secret, message)
```
**crypt / Argon2 関係の攻撃・CVE**
bcrypt
| CVE | 内容 |
| ------------- | -------------- |
| CVE-2011-2483 | bcrypt実装バグ |
| CVE-2019-9193 | cost低設定問題 |
※アルゴリズム破壊ではなく 実装 or 設定ミス
Argon2
| CVE | 内容 |
| -------------- | ------------------- |
| CVE-2020-28928 | Argon2ライブラリDoS |
| CVE-2023-29491 | メモリ設定不備 |
**ハッシュ比較のミス(地味だが致命的)**
| 攻撃 | CVE |
| -------------- | ------------- |
| タイミング攻撃 | CVE-2009-4487 |
| strcmp比較 | PHP系で多数 |
悪い例
```php
if ($hash1 == $hash2)
```
正しい実装
```php
hash_equals($hash1, $hash2)
```
理由: 比較処理の「実行時間」が情報になる
```
1文字目一致 → 次へ
2文字目一致 → 次へ
違った時点で終了
...
上記を狙ってレスポンス時間を測定して正解文字を探していく
#### 実務でよくあるパターン
| ミス | 結果 |
| --------------- | ------------ |
| SHA-256でPW保存 | GPU総当たり |
| ソルト固定 | 全滅 |
| cost低すぎ | 実質無防備 |
| 独自ハッシュ | 高確率で破綻 |
| MAC自作 | 署名偽造 |
costとは: ハッシュ計算を「どれだけ重く・遅くするか」を決めるパラメータです。
```sh
cost = 10 → 約 2^10 = 1,024 回
cost = 12 → 約 2^12 = 4,096 回
cost = 14 → 約 2^14 = 16,384 回
```

View File

@ -0,0 +1,27 @@
# 暗号ツールについて
## openssl
OpenSSLはRSA鍵の生成や公開鍵の内容を確認できる最も一般的なツールです。
### 使い方
RSA鍵ペアの生成
```sh
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
```
公開鍵の内容を表示
```sh
openssl rsa -pubin -in public_key.pem -text -noout
```
公開キーで暗号化をする
```sh
echo -n "message" | openssl rsautl -encrypt -inkey public_key.pem -pubin -out encrypted_message.bin
```