内容紹介
ハッキング例題プログラムの挙動、メモリの状態を丁寧に解説
1946年に発表されたENIAC以降、情報通信技術は急速に発展し、いまではコンピュータは世界中に広まり、インターネットに接続されています。しかし、これら発展にともない、サイバー攻撃やマルウェア、インターネット犯罪の手口もより巧妙さが増しています。そのため、情報セキュリティの脅威は日に日に増しているといえます。
本書は、64ビット版Kali Linux、C言語、アセンブリ言語、gdb、gcc、nasmを主に用い、実験としてスタックガードも外すなどし、コードの動きやメモリ上のスタックやデータの状態などを丁寧に解説を行い、プログラムがハッキングされる様を具体的に見える解説としています。さらに、できるだけセキュアなプログラムコードとする方法も記していますので、安全なプログラムを目指す多くの方々の参考になります。ただし、内容的に、ある程度コンピュータアーキテクチャに精通している方々を対象にしています。
このような方におすすめ
コンピュータプログラマー、システム管理者
目次
主要目次
第1章 不正アクセス概要
第2章 準備
第3章 基礎知識
第4章 シェルコード
第5章 バッファオーバーフロー
第6章 コントロールハイジャッキング
第7章 リモートコード実行
第8章 ファイアウォールの突破
付録 コントロールハイジャッキング関連の技術ほか
コードインジェクション/権限昇格/Pythonを用いたエクスプロイト/ダウンロードサービスファイル
各章の概要
第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 ダウンロードサービスファイル
索引
続きを見る