侵入テスト概要

侵入テスト概要
侵入テストには
対象システムを管理するシステム部門に通知して行われる
OvertTest 公開テスト
そして、一部の関係者以外には秘密にした
Covert Test 秘密テスト
の2種類がある
システム管理部門が社内システムに対して侵入テストを実施する場合にも
セキュリティサービスベンダーが実行する場合と同様に検査の目的を明確にする必要がある
診断時には対象システム管理者にも立ち会ってもらい
不測の事態にも対処できるようにしておくこと
診断を実施するときには
どこから診断を実施するかという診断ポイントの
検討も必要
もしFWの外からDMZのサーバーに対して診断を実施するにはFWによるフィルタリング込みの評価となる
が同一セグメントのDMZからmならサーバー単体への評価となる
会社にネットワークが複数存在し
各ネットワークで
セキュリティレベルが異なる場合
社内の別ネットワークから対象サーバーへの診断を実施することもある
FWの内側、外側両方からの検証することもある
Nessus による診断は侵入テスト実施のプロセスの1つにすぎない
侵入テストの実施には
ネットワーク脆弱性検査より多くの情報収集を必要とする
あと Nessus のプラグインは2種類あり
サーバーをダウンさせる可能性のあるものと
そうでないものになる
サーバーをダウンさせる可能性のあるものは
サービス不能攻撃 Denial of Service
と言われる
これは、他のプラグインとはわけて実行する
理由は
検査結果を保証するため
こうしないと検証中にサーバーがダウンしていることがあるため
ポリシー作成画面に
safe check というチェックボックスがあり
これをOn にしておけば回避できる

Nessus の設定

Nessus の設定
Nessus 4 だと設定ファイルを直接編集することになるので
cp /opt/nessus/etc/nessus/nessus.conf nessus.conf.org
というようにバックアップをとってから編集する
auto_update
プラグインを自動更新するかどうかの設定
デフォルトでは yes
自分でプラグインアップデートを制御したいのなら
no
にする
プラグインのアップデートは
端末を開いて
nessusupdate-plugins
を実行するとできる
port_range
ポリシーを新規作成したときに
デフォルトで作成されるポートレンジ指定
default は nessus が精査するデフォルトポート番号で
全てのポートレンジではないので注意
全てのポートレンジを指定するなら
0-65535
とする
xmlrpc_idle_session_timeout
Web UI のセッションタイムアウトの時間設定
デフォルトでは30分
これを変更することで長くすることができる
listen_address
デフォルトでは0.0.0.0
このためBT5R3 が起動している全てのホストの
全IPアドレスで Listen してしまう
他のPCから BT5R3 へアクセスする予定がないのなら
127.0.0.1
としておく
これらの設定が完了したら
service nessusd restart
で再起動して
Nessus にログインして
Metasploitable2 へスキャン実行
ちなみに、Nessus と Nmap では
ポートスキャンの結果が異なる
nmap -A -PO -p0-65535 -oN 192.168.10.151_tcp_full_txt 192.168.10.151
と実行して
フルポートレンジに対して
TCP SYNスキャンを実施

bluetooth イヤホンの購入

ドットインストールの動画を電車で移動中にみたり
音声ファイルを再生させるのに
以前は付属のイヤホンを使っていましたが
本体とコードが引っかかっていて
ポケットの中にいれたり、バッグからだし入れするときに
コードが邪魔になるので
bluetooth イヤホンを購入してみました
今回購入したのは

初めての bluetooth イヤホンでしたが
使いごこちはよいものでした
なにより、ipod touch を購入した時に最初についていたイヤホンだと
1時間程度使っていると私の場合形があわないのか
耳がいたくなるので、こちらの方が問題なく使えるので
この bluethooth イヤホンを使っています
スピーカーも bluetooth だと配線がいらなくて便利なので

も購入してみました
以前、初めて無線LAN設定したときに便利だと思いましたが
やはり今回もいろいろと試してみた甲斐がありました
もうひとつ検討中なのが kindle fire HD です
もともと nexus7 があるので使わないと思っていたのですが
最近は電子書籍が普及してきたので
購入して読む時に使えそうということ
そして、音楽関連として iTunes で購入したものは ipod では再生できても
nexus 7 などでは再生できません
なので、音楽関連も Amazon で購入すれば
ほかのデバイスなどでも聞けるのでは?
ということで、今後検討してみます

Nessus による脆弱性の検査(

Nessus による脆弱性の検査
以前、VirtualBox へBT5R3を入れて
Nessus を使えるようにしたので
今回は
VirtualBox と Metasploit Linux2 を使ってみた
CTF の問題は今の自分のスキルでは足りない為
その前にできそうなものから取り組むことにした
ということで、同時掲載されていた Nessus 超入門をみながら
ローカル環境で実践
Nessus は脆弱性検査ツール
Nessus には2つのライセンスがあり
商用ライセンスは
Professional Feed
個人使用に該当するのが
Home Feed
Home Feed のほうは診断可能なIPアドレスは15という制限がある
Professional Feed のライセンス料は
年間1500ドルで
3年単位にするとディスカウントされるようだ
また、Nessus はインストールしただけでは使えず
アクティベーションコードが必要
すでにここまで完了している状態にしてあるので
今回は Nessus の起動からスタート
Application > backtrack > Vulnerability Assessment > Network Assessment >
Vulnerability Assessment >
Vulnerability Scanners > Nessus > nessus start
で起動する
端末から起動するともっと楽で
service nessusd star
とすればOK
起動しているか確認するには
ps -ef | grep nessusd
で確認できる
起動したら、ブラウザで
https://127.0.0.1:8834/
へアクセス
自己証明書なので警告がでるけどそのまま続行
すると
ログイン画面がでるので
Username には hjuser
Password には 設定した任意のものを入力してログイン
中のメニューで
Reports
レポートの表示
Scans で診断実行
Policies で診断ポリシー管理
Users でユーザ管理
Browse でレポート表示
Compare で診断結果の比較
Upload でレポートのアップロード
Download でレポートのエクスポート
Delete でレポート削除
とりあえず Nessus の起動とログインの確認ができたので
次にターゲットサーバーの準備
これは
Metasploitable2 を使う
Metasploitable2 は
Metasploit チームにより作られた
Ubuntu 8.04 ベースのVMイメージで
脆弱性が存在するサービスが多数動いている
名前の通り、
Metasploit Framework を使って
Exploit を実行することが可能な実験用のサーバー
今回は、付録DVDに収録されているのを使っているけど
SourceForge からもダウンロードできる

http://sourceforge.net/projects/metasploitable/

からダウンロード可能
XSS
SQLインジェクションなどの脆弱性のあるWebアプリも
インストールされているので検証には最適
付録DVDからの場合だと
3/tools/metasploitable
の中に
metasploitable-linux-2.0.0.zip
があるので、これを解凍して使う
unzip metasploitable-linux-2.0.0.zip
で解凍すると
Metasploitable2-Linux
というディレクトリができるので
VirtualBox でこの中にある
Metasploitable.vmdk
から起動する仮想マシンを作成する
ただし、作成直後はネットワークがNATなので
bridge などに変更しないと
マシンにアクセスできないので注意
ネットワークを変更したら、仮想マシンを起動
metasploitable login :
と表示されたら
ユーザ名 msfadmin
パスワード msfadmin
でログイン
IPがわからないと実験できないので
ログイン後に ifconfig で調べるか
もしくは BT5R3 側で
nmap -n -sP 192.168.10.0/24
というように nmap でLAN内部の
IP一覧を表示させることで表示する
今回確認できたのは
nmap -n -sP 192.168.10.0/24
の結果から
192.168.10.214
であることが判明
仮想マシンの metasploitable2 を終了したいときには
sudo init 0
としてmetasploit のパスワード
デフォルトのままなら
msfadmin
を実行すればOK
ちなみに、今回の参考にしたのは

PHPでログアウト処理の実装

ログアウト処理の実装
#19 ログアウト処理を実装しよう
http://dotinstall.com/lessons/sns_php_v2/9619
を参考に
PHPでのログアウト処理の実装
vim logout.php
でファイルを作成
最初のPHPの部分
require_once() によるファイル読み込み
そして、セッションの開始は
そのままコピペでOK
require_once(‘config.php’);
require_once(‘functions.php’);
session_start();
そして、セッションの中身を空の配列にする
$_SESSION =array();
次に、セッションクッキーの削除
これは、空の値と有効期限を過去の時間にすることで
実現できる
86400は一日の秒数
if(isset($_COOKIE[session_name()])){
setcookie(session_name(),”,time()-86400,’/sns_php/’);
}
そして、セッション情報の破棄するので
session_destroy();
ここまでできたら、ログイン画面に戻すので
header(‘Location: ‘.SITE_URL.’login.php’);
とする
これで実行すると
ログイン機能が実装されているのが実感できる

ユーザプロフィールの表示

ユーザプロフィールの表示
#18 ユーザープロフィールを表示する
http://dotinstall.com/lessons/sns_php_v2/9618
を参考に
ユーザーの詳細情報を表示するためのプロフィールページを実装
編集するのは profile.php
一覧表示はいらないので
<ul>
<?php foreach($users as $user) : ?>
<li><a href=”profile.php?id=<?php echo h($user[‘id’]); ?>”><?php echo h($user[‘name’]); ?></a></li>
<?php endforeach; ?>
</ul>
は削除
代わりに、プロフィールを表示するコードを記述
<h1>user profile</h1>
<p>name: <?php echo h($user[‘name’]); ?></p>
<p>email : <?php echo h($user[‘email’]); ?></p>
そして、index.php に戻るためのリンクもつくる
<p><a href=”index.php”>一覧へ</a></p>
あと、SQL実行のため
php ソース部分に
$sql =”select * from users where id = :id limit 1″;
$stmt=$dbh->prepare($sql);
$stmt->execute(array(“:id”=>(int)$_GET[‘id’]));
これで、実行してユーザ名をクリックすると
プロフィール画面になる
このとき
http://192.168.10.151/sns_php/profile.php?id=1
というように、profile.php?=ユーザIDとなっている
この番号を存在しないIDにすると
そのユーザは存在しないというエラーもでる

PHP+MySQL でユーザ情報表示

PHP+MySQL でユーザ情報表示
#16 ユーザー情報を表示しよう
http://dotinstall.com/lessons/sns_php_v2/9616
を参考に
ログインしているユーザ情報の表示をする
編集するファイルは index.php
まずは php部分の編集
セッションに me が入っているので
$me =$_SESSION[‘me’];
として $me に格納
次に、どのユーザでログインしているか表示するので
HTML部分に
Logged in as <?php echo h($me[‘name’]); ?> (<?php echo h($me[‘email’]); ?>)
としてDBから
ユーザ名とメールアドレスを取得して表示
また、ログアウト機能も作っておく
<a href=”logout.php”>log out</a>
ここまでが個人ユーザ情報の取得と表示
ユーザ一覧を取得して表示するには
PHP部分で
$dbh = connectDb();
$users = array();
$sql =”select * from users order by created desc”;
foreach($dbh->query($sql) as $row){
array_push($users,$row);
}
これで、次にHTML部分にリスト表示するための準備
<h1>ユーザ一覧</h1>
の下に
<ul>
<?php foreach($users as $user) : ?>
<li></li>
<?php endforeach; ?>
<ul>
とする
次に
一覧を表示したいので
<li></li>
の間に
<php echo h($user[‘name’]); ?>
とする
さらに各ユーザ情報を作成して
そこにリンクさせるなら
<a href=”profile.php?id=<?php echo h($user[‘id’]); ?>”><php echo h($user[‘name’]); ?></a>
というようにする
これで、ユーザ一覧に名前がでればOK
そして、profile.php に関しては index.php に近いソースなので
cp index.php profile.php
でコピーして編集する
プロフィール情報なので、一覧のところのSQLを変える
$sql =”select * from users where id = :id limit 1″;
として
編な値が入らないのように
(int )というように型を指定しておく
$stmt = $dbh->execute(array(“:id”=>$_GET[‘id’]));
とすれば、現在ログインしているユーザIDが取得できる
$user = $stmt->fetch();
としてSQLの実行結果を $user へ格納
そして
if(!$user){
echo “no such user !”;
exit;
}
とすれば、ユーザが検出できないときには
エラーメッセージがでるようになる

PHPでログイン処理の実装

#15 ログイン処理を完成させよう
http://dotinstall.com/lessons/sns_php_v2/9615
を参考に、ログイン処理の実装
エラーメッセージの表示と動作確認する
変更するのは
login.php
<?php echo h($err[‘email’]); ?>
<?php echo h($err[‘password’]); ?>
を input 要素のところに追記して
それぞれ空白とかのエラー対応メッセージを表示する
また、メールアドレスに関しては
value=””に
<?php echo h($email); ?>
を追記してメールアドレスを表示したままにできるようにする
ここまでできたら、動作確認
ログインできたのを確認したら
if (empty($err)) {
}
の中にセッションハイジャック対策をする
session_regenerate_id(true);
を追記する
$_SESSION[‘me’]=$me;
header(‘Location: ‘.SITE_URL);
exit;
でindex.php に飛ぶようにする
これで、ログイン画面からアクセスして
メールアドレス
パスワードを入力して
ログインして
ユーザ一覧
と表示されていたら成功
これで、次は index.php のページの作り込みになる

メールアドレスの登録チェック

メールアドレスの登録チェック
まずメールアドレスの形式チェック
メールアドレスが空でないか
メールアドレスとパスワードか正しいか
パスワードが空でないか
これらをチェックするようにする
メールアドレスが空の場合
パスワードが空の場合
これらは、signu.phpからコードをコピペ
メールアドレスが空なのか判定するには
signu.phpにあった
ユーザー関数の
emailExists()を使う
ただ、これは、存在しているか調べるので
否定形式て
if(!emailExists($email,$dbh)){
$err[‘email’]=”このメールアドレスは登録されていません”;
}
とすればok
メールアドレスの形式が不正か調べるには
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$err[‘email’]=”メールアドレスの形式が正しくありません”;
}
とする
メールアドレスとパスワードがただしくない場合の処理は
まず、そういったユーザーがいるか調べる
$me = getUser($email,$password, $dbh);
で結果を変数へ格納
ちなみにgetUser()は
ユーザー関数
function getUser(){
}
て実装していく
また、エラーのチェックの場所が違うため
$err = array();
の下へ切り取って貼り付ける
そして、ユーザー関数
getUser()は
function getUser($email,$password,$dbh){
$sql=”select * from users where email = :email and :password = $password limit 1″;
$stmt = $dbh->prepare($sql);
$stmt->execute(array(“:email”=>$email,”:password”=>getSha1Password($password)));
$user = $stmt->fetch();
で取得した結果を $userへ格納
あとは、データの有無を
return $user ? $user :false;
として、データがあるなら
ユーザーを返し、ないならfalseを返す
これで、あとはifて判定する
if(!$me){
$err[‘password’]=”パスワードとメールアドレスが正しくありません”;
}
と表示する
$meは、getUser()て取得した内容が格納されている
また、もっと短くコードを書くには
if(!$me = getUser($email,$password,$dbh)){
$err[‘password’]=”メールアドレスとパスワードが正しくありません”;
}
というように
ifの条件式をまとめることもできる