ネットワークプロトコルハッカーズガイド キャプチャ、解析、エクスプロイトの理論と実践


ネットワークプロトコルハッカーズガイド キャプチャ、解析、エクスプロイトの理論と実践


アスキードワンゴ


著者:James Forshaw
訳者:株式会社クイープ、遠藤美代子


著者紹介
テクニカルレビューアー紹介
まえがき
謝辞
はじめに
本書を読むのはなぜか
本書の内容
本書の使い方

第1章 ネットワーキングの基礎
ネットワークアーキテクチャとネットワークプロトコル
インターネットプロトコルスイート
データのカプセル化
 ヘッダー、フッター、アドレス
 データ伝送
ネットワークルーティング
本書のネットワークプロトコル解析モデル
まとめ

第2章 アプリケーショントラフィックのキャプチャ
ネットワークトラフィックのパッシブキャプチャ
速習:Wireshark
その他のパッシブキャプチャ手法
 システムコールをトレースする
 Linuxのstraceユーティリティ
 DTraceを使ってネットワーク接続を監視する
 WindowsのProcess Monitor
パッシブキャプチャの長所と短所
ネットワークトラフィックのアクティブキャプチャ
ネットワークプロキシ
 ポートフォワーディングプロキシ
 SOCKSプロキシ
 HTTPプロキシ
 フォワードHTTPプロキシ
 リバースHTTPプロキシ
まとめ

第3章 ネットワープロトコルの構造
バイナリプロトコルの構造
 数値データ
 ブール値
 ビットフラグ
 バイナリのバイトオーダー
 テキストデータとヒューマンリーダブルデータ
 可変長のバイナリデータ
日付と時刻
 POSIX/Unix時間
 Windows FILETIME
TLVパターン
多重化とフラグメンテーション
ネットワークアドレス情報
構造化されたバイナリフォーマット
テキストプロトコルの構造
 数値データ
 テキストのブール値
 日付と時刻
 可変長のデータ
 構造化されたテキストフォーマット
バイナリデータのエンコーディング
 16進数エンコーディング
 Base64
まとめ

第4章 アプリケーショントラフィックの高度なキャプチャ
トラフィックの再ルーティング
 トレースルートを使う
 ルーティングテーブル
ルーターを設定する
 Windowsでのルーティングの有効化
 Unix/Linuxでのルーティングの有効化
NAT
 SNATの有効化
 LinuxでのSNATの設定
 DNATの有効化
トラフィックをゲートウェイに転送する
 DHCPスプーフィング
 ARPポイズニング
まとめ

第5章 ネットワークからのプロトコルの解析
トラフィックを生成するアプリケーション:SuperFunkyChat
 サーバーを起動する
 クライアントを起動する
 クライアント間の通信
速習:Wiresharkを使って解析する
 ネットワークトラフィックの生成とパケットのキャプチャ
 基本的な解析
 TCPセッションの内容を読み取る
16進数ダンプを使ってパケットの構造を突き止める
 個々のパケットを表示する
 プロトコルの構造を突き止める
 仮説を検証する
 Pythonでプロトコルを解析する
WiresharkディセクタをLuaで開発する
 ディセクタを作成する
 Luaディセクタを実行する
 メッセージパケットを解析する
プロキシを使ってトラフィックをアクティブに解析する
 プロキシのセットアップ
 プロキシを使ったプロトコル解析
 基本的なプロトコル解析を追加する
 プロトコルの振る舞いを変更する
まとめ

第6章 アプリケーションのリバースエンジニアリング
コンパイラ、インタープリタ、アセンブラ
 インタープリタ型言語
 コンパイラ型言語
 静的リンクと動的リンク
x86アーキテクチャ
 ISA
 CPUレジスタ
 プログラムフロー
OSの基礎
 実行ファイルのフォーマット
 セクション
 プロセスとスレッド
 OSのネットワークインターフェイス
 ABI
静的リバースエンジニアリング
 速習:IDA Freeware
 スタック変数と引数を解析する
 重要な機能を特定する
動的リバースエンジニアリング
 ブレークポイントを設定する
 デバッガのウィンドウ
 ブレークポイントはどこに設定するか
マネージド言語のリバースエンジニアリング
 .NETアプリケーション
 ILSpyを使う
 Javaアプリケーション
 難読化に対処する
リバースエンジニアリングに関する参考資料
まとめ

第7章 ネットワークプロトコルのセキュリティ
暗号化アルゴリズム
 換字式暗号
 XOR暗号
乱数生成器
対称鍵暗号法
 ブロック暗号
 ブロック暗号の利用モード
 ブロック暗号のパディング
 パディングオラクル攻撃
 ストリーム暗号
非対称鍵暗号法
 RSAアルゴリズム
 RSAパディング
 Diffie-Hellman鍵交換
署名アルゴリズム
 暗号学的ハッシュアルゴリズム
 非対称署名アルゴリズム
 メッセージ認証コード
公開鍵基盤
 X証明書
 証明書チェーンの検証
ケーススタディ:TLS
 TLS ハンドシェイク
 最初のネゴシエーション
 エンドポイント認証
 暗号化を開始する
 セキュリティ要件を満たす
 まとめ

第8章 ネットワークプロトコルの実装
キャプチャした既存のネットワークトラフィックをリプレイする
 Netcatを使ってトラフィックをキャプチャする
 キャプチャしたUDPトラフィックをPythonで再送信する
 解析プロキシを再利用する
既存の実行可能コードを再利用する
 .NETアプリケーションのコードを再利用する
 Javaアプリケーションのコードを再利用する
 アンマネージドプラットフォームの実行ファイル
暗号化とTLSへの対処
 プロトコルで使われている暗号化を確認する
 TLSトラフィックを解読する
まとめ

第9章 脆弱性の根本原因
脆弱性の種類
 リモートコード実行
 DoS
 情報漏洩
 認証バイパス
 認可バイパス
メモリ破壊の脆弱性
 プログラミング言語のメモリ安全性
 メモリバッファオーバーフロー
 範囲外のバッファインデックス
 データ展開攻撃
 動的なメモリ確保の失敗
デフォルトのクレデンシャルとハードコーディングされたクレデンシャル
ユーザーの列挙
リソースに対する不正アクセス
 正規化
 冗長なエラー情報
メモリ枯渇攻撃
ストレージ枯渇攻撃
CPU枯渇攻撃
 アルゴリズムの複雑さ
 設定可能な暗号法
フォーマット文字列の脆弱性
コマンドインジェクション
SQLインジェクション
テキストエンコーディング文字の置換
まとめ

第10章 セキュリティの脆弱性の検知とエクスプロイト
ファズテスト
 最も単純なファズテスト
 ミューテーションファジング
 テストケースを作成する
脆弱性のトリアージ
 アプリケーションをデバッグする
 クラッシュの根本原因の究明率を高める
一般的な脆弱性のエクスプロイト
 メモリ破壊の脆弱性のエクスプロイト
 任意のメモリ書き込みの脆弱性
シェルコードを記述する
 シェルコードを記述するための準備
 単純なデバッグ手法
 システムコールを呼び出す
 他のプログラムを実行する
 Metasploitでシェルコードを生成する
メモリ破壊のエクスプロイト対策
 データ実行防止
 リターン指向プログラミングによる対抗エクスプロイト
 ASLR
 メモリカナリアを使ってスタックオーバーフローを検出する
まとめ

付録 ネットワークプロトコル解析ツールキット
ネットワークプロトコルのパッシブキャプチャと解析
 TCPDump とLibPCAP
 Wireshark
ネットワークプロトコルのアクティブキャプチャと解析
 Canape
 Canape.Core
 Mallory
ネットワーク接続とプロトコルのテスト
 Hping
 Netcat
 Nmap
 Webアプリケーションのテスト
 Burp Suite
 ZAP
 Mitmproxy
ファジング、パケット生成、脆弱性エクスプロイト
 AFL
 Kali Linux
 Metasploit Framework
 Scapy
 Sulley
ネットワークのスプーフィングとリダイレクト
 Dnsmasq
 Ettercap
実行ファイルのリバースエンジニアリング
 JD
 IDA Pro
 Hopper
 ILSpy
 .NET Reflector

索引
訳者紹介