コンピュータハイジャッキング

前表紙
株式会社 オーム社, 2018/10/15 - 256 ページ

  1946年に発表されたENIAC以降、情報通信技術は急速に発展し、いまではコンピュータは世界中に広まり、インターネットに接続されています。しかし、これら発展にともない、サイバー攻撃やマルウェア、インターネット犯罪の手口もより巧妙さが増しています。そのため、情報セキュリティの脅威は日に日に増しているといえます。

 本書は、64ビット版Kali Linux、C言語、アセンブリ言語、gdb、gcc、nasmを主に用い、実験としてスタックガードも外すなどし、コードの動きやメモリ上のスタックやデータの状態などを丁寧に解説を行い、プログラムがハッキングされる様を具体的に見える解説としています。さらに、できるだけセキュアなプログラムコードとする方法も記していますので、安全なプログラムを目指す多くの方々の参考になります。ただし、内容的に、ある程度コンピュータアーキテクチャに精通している方々を対象にしています。


 各章の概要
第1章 不正アクセス概要
 不正アクセス・セキュリティの現状についておさらいをします。

第2章 準備
 本書で用いるKali Linux OS、仮想環境、gcc、gdbなどについて、本書に必要なポイントを押さえて解説します。

第3章 基礎知識
 プログラムの動作原理、メモリの使われ方、アセンブリについて、本書に必要な事柄を解説します。

第4章 シェルコード
 脆弱性を利用して標的ホスト内で実行可能なコードの作り方について解説します。

第5章 バッファオーバーフロー
 ここでは、バッファオーバーフローによるメモリの書き換えを行います。
 脆弱性を含むシリアル番号チェックプログラム(bypass)を用意し、スタックガードを外してコンパイルします。特殊な文字列をbypassプログラムに引数として入力することにより、bypassプログラム中のシリアル番号のチェックのコード部分が実行されないように戻り番地を書き換えます。なお、戻り番地の書き換えには、バッファオーバーフローを利用します。

第6章 コントロールハイジャッキング
 ここでは、標的ホストのシェルを実行し、自由にアクセスできるようにします。
 第5章のシリアル番号のチェックプログラム内のバッファ領域を大きくしたプログラム(bypass2)を用意し、スタックガードを外してコンパイルします。また、シェルを起動する実行コード(シェルコード)を作ります。そして、シェルコードを含むバイト列を引数としてbypass2プログラムに入力することにより、bypass2プログラム内の戻り番地を、入力したシェルコードが格納されている番地に書き換え、シェルコードを実行させます。また、書き換えは、バッファオーバーフローを利用します。なお、2つのターミナルを利用し、片方を標的ホスト、もう一方を攻撃者とします。
 バッファオーバーフロー回避策も解説し、bypass2プログラムをセキュアにする例も解説します。

第7章 リモートコード実行
 ここでは、標的ホストのリモートシェルにアクセスし、自由に操作できるようにします。
 まず、ネットワーク越し(例として、1 つのKali Linux 内でIPアドレス指定)でもバッファオーバーフローを行え、シリアル番号のチェックを回避できることを確認します。このとき、サーバ側(標的ホスト)はスタックガードを外してコンパイルしたbypass_serverプログラム、クライアント(攻撃側)はbypass_clientプログラムを使い、それぞれタ―ミナルで実行します。
 次に、TCP接続によって、攻撃者側から標的ホストのリモートシェルにアクセスするためのシェルコード(TCPバインドシェル)を作ります。
 そしてbypass_clientプログラムからTCPバインドシェルを含むバイト列をbypass_serverプログラムに入力することにより、標的ホスト上でTCPバインドシェルを実行させ、攻撃者側から標的ホストのリモートシェルにアクセスします。なお、bypass_serverプログラム内の戻り番地を、TCPバインドシェルが格納されている番地に書き換えますが、これもバッファオーバーフローを利用します。
 さらに、標的ホストと攻撃者を異なるコンピュータとし、同じように標的ホストのリモートシェルにアクセスします。

第8章 ファイアウォールの突破
 ここでは、第7章と同様のプログラムを用いて、標的ホストの前に立ちはだかるファイアウォールを突破し、標的ホストのリモートシェルにアクセスし、自由に操作できるようにします。
 具体的には、上記を実現するシェルコード(リバースTCPバインドシェル)を作ります。そして、標的ホストで稼働中のbypass_serverプログラムに、攻撃者側からbypass_clientプログラムを用いリバースTCPバインドシェルを含む文字列を入力します。この入力により、bypass_serverプログラム内の戻り番地を、リバースTCPバインドシェルが格納されている番地に書き換えます(バッファオーバーフロー利用)。
 また、攻撃者は自身のコンピュータ上の特定のポート番号で、標的ホストに実行させたリバースTCPバインドシェルからの接続を待ち受けます。
 なお、実行されたリバースTCPバインドシェルは、ファイアウォールの中から外へのアクセスの制限が緩いことを利用し、標的ホストから、攻撃者のコンピュータへ接続します。これにより、ファイアウォールを突破し、標的ホストを自由に操作できます。

付録
 関連技術およびダウンロードサービスファイルの説明をしています



まえがき

 

各章の概要

 

 

第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

133 脆弱性の調査
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

多く使われている語句

書誌情報