コンピュータハイジャッキング株式会社 オーム社, 2018/10/15 - 256 ページ 1946年に発表されたENIAC以降、 本書は、64ビット版Kali Linux、C言語、アセンブリ言語、gdb、gcc、 各章の概要 まえがき
各章の概要
第1章 不正アクセス概要
1.1 情報セキュリティ大脅威
1.1.1 情報セキュリティ10大脅威とは
1.2 不正アクセス
1.2.1 サイバー空間への不正アクセスとは
1.2.2 ハッカーに関する用語
1.2.3 サイバーセキュリティ
1.2.4 攻撃ベクトル
1.2.5 ハッカーになるための知識と技術
1.3 不正アクセスのキルチェーン
1.3.1 サイバーキルチェーンとは
1.3.2 標的ホストの情報収集
1.3.3 脆弱性の調査
1.3.4 制御権の剥奪(コントロールハイジャッキング)
1.3.5 侵入後の処理
1.4 潜在的脅威
1.4.1 なぜセキュリティホールはなくならないのか?
1.4.2 ネットワーク管理コマンド
1.4.3 Windowsネットワーク
1.4.4 マルウェア技術の本来の機能
第2章 準備
2.1 必要な開発環境
2.1.1 オペレーティングシステム
2.1.2 コンパイラ
2.1.3 アセンブラ
2.1.4 デバッガ
2.1.5 仮想マシンソフト
2.2 Kali Linuxのダウンロードとインストール
2.2.1 Kali Linuxのダウンロード
2.2.2 Kali Linuxのインストール
2.2.3 仮想マシンのエクステンション
2.2.4 本書での環境
2.2.5 今後のKali Linuxのバージョンアップへの対応
2.3 gccとgdbの基本
2.3.1 セキュリティ機能の無効化
2.3.2 配列の中身を表示するC言語プログラムとgccとgdb
2.3.3 デバッガ(gdb)によるプログラム制御
第3章 基礎知識
3.1 プログラムの動作原理
3.1.1 コンピュータの構成
3.1.2 メモリの物理アドレス
3.1.3 仮想アドレス空間
3.1.4 カーネル空間とユーザ空間
3.1.5 プログラムが利用するメモリ領域
3.1.6 仮想アドレスの確認
3.1.7 スタック領域の使い方
3.1.8 スタックフレームの中身
3.1.9 リトルエンディアン
3.2 アセンブリの基礎
3.2.1 機械語とアセンブリ言語
3.2.2 汎用レジスタ
3.2.3 アセンブリ言語で「Hello World.」
第4章 シェルコード
4.1 不都合な文字
4.1.1 NULLバイトの排除
4.1.2 相対アドレスとジャンプ命令
4.2 シェルコマンドの実行
4.2.1 execveシステムコール
4.2.2 識別子の調べ方
4.2.3 コマンドの文字列
4.2.4 終了文字と引数のNULL
4.2.5 execveによるpwdコマンド実行
4.2.6 push命令の使い方
4.2.7 アセンブリ言語ソースコードの記述
4.2.8 実行コードの確認
4.2.9 コマンド実行
4.3 引数付きコマンドの実行
4.3.1 文字列のバイト列
4.3.2 execveによるlsコマンド実行
4.3.3 アセンブリ言語ソースコードの記述
4.3.4 実行コードの確認
4.3.5 コマンド実行
第5章 バッファオーバーフロー
5.1 バッファオーバーフローの概要
5.1.1 コントロールハイジャッキング
5.2 脆弱性が存在するプログラム
5.2.1 プログラムの概要
5.2.2 脆弱性のあるプログラム「bypass.c」
5.2.3 bypass.cのコンパイル
5.2.4 bypassプログラムの実行
5.2.5 bypass.cの脆弱性
5.2.6 check_serial()関数のスタックフレーム
5.2.7 strcpy()関数によるバッファオーバーフロー
5.3 変数の上書き
5.3.1 デバッガでメモリの中身を見る
5.3.2 スタックフレームの確認
5.3.3 スタックを破壊して変数を上書きする
5.4 戻り番地の変更
5.4.1 戻り番地の書き換えによる制御フローの変更
5.4.2 デバッガで静的領域の中身を見る
5.4.3 戻り番地の書き換え実行
第6章 コントロールハイジャッキング
6.1 コード実行
6.1.1 戻り番地をバッファ領域の先頭アドレスへ変更
6.1.2 脆弱性のあるプログラム「bypass2.c」
6.1.3 シェルコード生成
6.1.4 デバッガでbypass2.cの中身を見る
6.1.5 バッファ領域に注入するバイト列であるペイロードの生成
6.1.6 うまく動かないときの対処法
6.2 シェルスパウン
6.2.1 シェルスパウンの準備
6.2.2 コントロールハイジャッキングの実行
6.3 NOPスレッド
6.3.1 戻り番地の書き換え時に標的アドレスの範囲を広くする
6.3.2 NOPスレッドの仕組み
6.3.3 NOPスレッドを用いたシェルコード実行
6.3.4 これまでの作業を効率よく行うために
6.4 スタック保護技術
6.4.1 カナリアの仕組み
6.4.2 データ実行防止DEP
6.4.3 アドレス空間配置のランダム化
6.4.4 その他のバッファオーバーフロー回避方法
6.5 セキュアなC言語ソースコード
6.5.1 strcpy()関数からstrncpy()関数への変更
6.5.2 strncpy()関数の問題点
6.5.3 セキュアなbypassソースコード例
資料:アスキーコード表
第7章 リモートコード実行
7.1 リモートシェル
7.1.1 リモートシェルとは
7.2 ネットワークの設定
7.2.1 仮想マシン上のネットワーク設定
7.2.2 ネットワークの準備
7.3 脆弱性のあるTCPサーバプログラム
7.3.1 ネットワーク越しのシリアル番号の確認
7.3.2 bypass_serverの脆弱性と侵入口
7.4 C言語によるTCPバインドシェル
7.4.1 リモートシェルの仕組み
7.4.2 TCPバインドシェルのC言語
7.4.3 C言語によるTCPバインドシェルの実行
7.5 アセンブリ言語によるTCPバインドシェル
7.5.1 必要なシステムコール群
7.5.2 TCPバインドシェルのアセンブリ言語
7.5.3 機械語の確認
7.5.4 C言語によるシェルコードの確認
7.6 TCPバインドの実行
7.6.1 テスト用のネットワーク環境
7.6.2 TCPサーバプログラムのデバッグ
7.6.3 スタックフレームの確認
7.6.4 リモートシェルへのアクセス
7.7 別のコンピュータからの標的ホストのハイジャック
7.7.1 環境構築と設定
7.7.2 ローカルエリアネットワークでの実験
第8章 ファイアウォールの突破
8.1 ファイアウォールとは
8.1.1 ファイアウォールの種類
8.2 パケットフィルタリングとは
8.2.1 パケットフィルタリングによるTCP接続要求の遮断
8.3 リバースTCPとは
8.3.1 リバースTCPによるファイアウォールのバイパス
8.4 C言語によるリバースTCPバインドシェル
8.4.1 リバースTCPバインドシェルのソースコード
8.4.2 リバースTCPバインドシェルの実行
8.5 アセンブリ言語によるリバースTCPバインドシェル
8.5.1 リバースTCPバインドシェルが利用するシステムコール群
8.5.2 リバースTCPバインドシェルのアセンブリ言語
8.5.3 機械語の確認
8.5.4 C言語によるシェルコードの確認
8.6 リバースTCPバインドの実行
8.6.1 テスト用のネットワーク環境
8.6.2 ペイロードの生成
8.6.3 リバースTCPバインドによるリモートシェルへのアクセス
8.7 別のコンピュータからの標的ホストのハイジャック
8.7.1 環境構築と設定
8.7.2 ローカルエリアネットワークでの実験
8.7.3 ウィルス対策ソフトによるスキャン
8.8 最後に
付録 コントロールハイジャッキング関連の技術ほか
A.1 コードインジェクション
A.2 権限昇格
A.3 Pythonを用いたエクスプロイト
A.4 ダウンロードサービスファイル
索引 |
目次
543 戻り番地の書き換え実行 | 117 |
第6章コントロールハイジャッキング | 121 |
61 コード実行 | 122 |
613 シェルコード生成 | 123 |
614 デバッガでbypass2cの中身を見る | 125 |
615 バッファ領域に注入するバイト列であるペイロードの生成 | 127 |
616 うまく動かないときの対処法 | 129 |
62 シェルスパウン | 131 |
16 | |
134 制御権の剥奪コントロールハイジャッキング | 18 |
135 侵入後の処理 | 20 |
14 潜在的脅威 | 22 |
142 ネットワーク管理コマンド | 23 |
144 マルウェア技術の本来の機能 | 24 |
第2章準備 | 27 |
21 必要な開発環境 | 28 |
214 デバッガ | 29 |
22 Kali Linuxのダウンロードとインストール | 30 |
222 Kali Linuxのインストール | 31 |
223 仮想マシンのエクステンション | 34 |
224 本書での環境 | 35 |
225 今後のKali Linuxのバージョンアップへの対応 | 36 |
232 配列の中身を表示するC言語プログラムとgccとgdb | 37 |
233 デバッガgdbによるプログラム制御 | 38 |
第3章基礎知識 | 49 |
31 プログラムの動作原理 | 50 |
312 メモリの物理アドレス | 51 |
313 仮想アドレス空間 | 52 |
314 カーネル空間とユーザ空間 | 53 |
316 仮想アドレスの確認 | 54 |
317 スタック領域の使い方 | 57 |
318 スタックフレームの中身 | 60 |
319 リトルエンディアン | 64 |
32 アセンブリの基礎 | 66 |
322 汎用レジスタ | 67 |
323 アセンブリ言語でHello World | 69 |
第4章シェルコード | 79 |
41 不都合な文字 | 80 |
412 相対アドレスとジャンプ命令 | 83 |
42 シェルコマンドの実行 | 87 |
422 識別子の調べ方 | 88 |
423 コマンドの文字列 | 89 |
425 execveによるpwdコマンド実行 | 90 |
427 アセンブリ言語ソースコードの記述 | 91 |
428 実行コードの確認 | 93 |
429 コマンド実行 | 94 |
432 execveによるlsコマンド実行 | 95 |
434 実行コードの確認 | 98 |
435 コマンド実行 | 99 |
第5章バッファオーバーフロー | 101 |
51 バッファオーバーフローの概要 | 102 |
52 脆弱性が存在するプログラム | 103 |
523 bypasscのコンパイル | 105 |
524 bypassプログラムの実行 | 106 |
526 check_serial関数のスタックフレーム | 107 |
53 変数の上書き | 108 |
532 スタックフレームの確認 | 111 |
54 戻り番地の変更 | 113 |
622 コントロールハイジャッキングの実行 | 135 |
63 NOPスレッド | 136 |
632 NOPスレッドの仕組み | 137 |
634 これまでの作業を効率よく行うために | 138 |
64 スタック保護技術 | 139 |
642 データ実行防止DEP | 141 |
643 アドレス空間配置のランダム化 | 143 |
644 その他のバッファオーバーフロー回避方法 | 147 |
652 strncpy関数の問題点 | 149 |
653 セキュアなbypassソースコード例 | 152 |
アスキーコード表 | 154 |
第7章リモートコード実行 | 155 |
71 リモートシェル | 156 |
722 ネットワークの準備 | 157 |
73 脆弱性のあるTCPサーバプログラム | 159 |
732 bypass_serverの脆弱性と侵入口 | 169 |
74 C言語によるTCPバインドシェル | 170 |
742 TCPバインドシェルのC言語 | 171 |
743 C言語によるTCPバインドシェルの実行 | 173 |
75 アセンブリ言語によるTCPバインドシェル | 175 |
752 TCPバインドシェルのアセンブリ言語 | 176 |
753 機械語の確認 | 184 |
76 TCPバインドの実行 | 186 |
762 TCPサーバプログラムのデバッグ | 187 |
763 スタックフレームの確認 | 188 |
764 リモートシェルへのアクセス | 191 |
77 別のコンピュータからの標的ホストのハイジャック | 193 |
772 ローカルエリアネットワークでの実験 | 194 |
第8章ファイアウォールの突破 | 197 |
81 ファイアウォールとは | 198 |
821 パケットフィルタリングによるTCP接続要求の遮断 | 199 |
83 リバースTCPとは | 200 |
84 C 言語によるリバースTCPバインドシェル | 201 |
842 リバースTCPバインドシェルの実行 | 203 |
85 アセンブリ言語によるリバースTCPバインドシェル | 205 |
853 機械語の確認 | 208 |
854 C言語によるシェルコードの確認 | 209 |
86 リバースTCPバインドの実行 | 210 |
862 ペイロードの生成 | 211 |
87 別のコンピュータからの標的ホストのハイジャック | 213 |
872 ローカルエリアネットワークでの実験 | 215 |
873 ウィルス対策ソフトによるスキャン | 216 |
88 最後に | 217 |
付録コントロールハイジャッキング関連の技術ほか | 219 |
A1 コードインジェクション | 220 |
A2 権限昇格 | 225 |
A3 Pythonを用いたエクスプロイト | 231 |
A4 ダウンロードサービスファイル | 233 |
240 | |
奥付 | 243 |