ファイルの解析

ファイルの解析
http://www.byakuya-shobo.co.jp/hj/data/HJ2013_03_Q1.zip
から圧縮ファイルをダウンロード
Unzip HJ2013_03_Q1.zip
で解凍し
bin200
をだす
この拡張子もないファイルを解析していく
VMイメージのBT5R3 は
USキーボードなので
USキーボードと日本のキーボードの違い
http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm
を見ながら行う
一番わかりにくいのは
全角、半角の切り替えキーが
shift + 全角半角 で ~
全角半角は` というバッククオートになるということ
USキーボード形式は全角半角はたしかに使うことがないと思う
だって英語圏だし
今回のこの問題に必要なスキルは
バイナリ解析系
まず、どんなファイルかを調べるため
file コマンドで調べる
file bin200
すると
bin200: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
となる
この結果から読み取れるのは
ELF 32-bit LSB executable, Intel 80386,
ということなので
IA32アーキテクチャの32bit Linux 用ELFファイルであること
このファイルのバイナリを静的解析して処理のあたりをみつける
使うのは
IDA Pro free 5.0
とはいっても使い方がわからないので検索
http://ameblo.jp/a-f-s-g/entry-11476490443.html
によれば vim でもバイナリエディタ代わりになるとのこと
vim bin200
でファイルを開いて
:%! xxd でバイナリが表示
使い方いまいちわからないので後にして今後の参考に
backtrack ida
で検索したら
http://www.byakuya-shobo.co.jp/hj/moh2/bt5_tools_list.html#p6

Reverse Engineering のところに
install ida-pro free
と有ったので
仮想マシンのBT5R3 で
startx で GUI画面にして
Applications > BackTrack > Reverse Engineering > ida-pro free
で起動
ただ、時間がなかったので
途中でキャンセルしたらインストールできなくなったため
次回。新しく仮想マシンを作りなおして実験
今回は
gdb という動的解析用デバッガーで
スタックとプログラムカウンター(EIPレジスター)
をいじくり
ptrace を経由せずに直接 GeneratePassword を実行する
まず
apt-get install gdb
でインストールして
gdb ./bin200 を行う
この時点ではまだ実行されていないので
break main
でブレークポイントの設置
しかし、次の gdbの使い方がわからないので
とりあえず
これの使い方を調べるところからになりそう

実践CTF模擬訓練の準備

実践CTF模擬訓練の準備
CTFで出題された問題が
Hacker Japan のサイトに公開されたり
リンクが貼られているので
これと
Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
の掲載されている内容を参考に実践
hacker japan の過去問のリンクは
http://www.byakuya-shobo.co.jp/hj/backnumber.html

HackerJapan2013年3月号
Q1 謎 のファイルを解析する
Q2 バラバラ画像パズル
Q3 不 審な通信を見つけ出せ!
Q4 マウスポインターが勝手に動く謎
Q5 間 抜けな暗号解読
Q6 JPG 画像の秘密
Q7 見 えないファイルを探せ
Q8 USB デバイス通信を調査
Q9 プ ログラムに隠された文字
のところから行える
解析に使うのは
すでにダウンロード済みの
BT5R3 を使う
ものによっては、windows も使用する

ログイン処理の実装

ログイン処理の実装
#12 ログイン処理を作っていこう
http://dotinstall.com/lessons/sns_php_v2/9612
を参考に
新規登録処理のあとのログイン処理について学習
その前に登録処理の動作確認
適当に名前、メールアドレス、パスワードを入力し
エラーがないのを確認したら
開発環境のサーバーで
mysql -u root -p
でログインして
use dotinstall_sns_php;
でDBを指定
select * from users;
として
今回登録したユーザが入っているならOK
また、パスワードについては暗号化されているのが確認できる
ここまでエラーが起きなければ
次のログイン処理になるけど
もしエラーが起きているのなら
HTTPステータスコード
http://www5.plala.or.jp/vaio0630/mail/st_code.htm
も見ながらデバッグする
デバッグ完了したら
login.php の編集
ソースがそのままなら
singup.php の
32行目あたりの
if ($_SERVER[‘REQUEST_METHOD’] != ‘POST’) {
から
86行目の if の終了あたりまでをコピーし
login.php の
if (!empty($_SESSION[‘me’])) {
header(‘Location: ‘.SITE_URL);
exit;
}
のしたあたりにペースト
内容はその後編集して
if ($_SERVER[‘REQUEST_METHOD’] != ‘POST’) {
// CSRF対策
setToken();
} else {
checkToken();
$email = $_POST[’email’];
$password = $_POST[‘password’];
$dbh = connectDb();
$err = array();
if (empty($err)) {
}
}
となり、処理は新たに作成する
トークンチェックも行うので
singup.php から
<input type=”hidden” name=”token” value=”<?php echo h($_SESSION[‘token’]); ?>”>
をコピペし
login.php の
</form>
の上あたりに貼りつける
そして、signup.php で作ったユーザ関数は
今後も使うので
functions.php へコピーして
どのファイルからでも読み込んで使えるライブラリにする
書き込む場所は
function h($s){
}
のしたあたり

ユーザ登録の実装

ユーザ登録の実装
#11 ユーザーを登録しよう
http://dotinstall.com/lessons/sns_php_v2/9611
を参考にDBへユーザ情報を登録する方法を学習
singup.php を編集する
if(empty($err)){
}
の中に書いていく
登録はDBなので
$sql =”insert into users (name,email,passowrd,created,modified)
values(:name,:email,:password,now(),now())”;
としてSQLを変数へ格納する
$stmt =$dhb->prepare($sql);
として prepare() でSQLを実行
また、プレースホルダーを使うので、これにも prepare() を使う必要がある
$param = array(
“:name”=>$name,
“:email”=>$email,
“:password”=>getSha1Password($password)
);
password に関しては暗号化するので
getSha1Password($password)
としている
これは、セキュリティのことを考えてのこと
getSha1Password()
はユーザ関数
$stmt->execute($params);
でプレースホルダーにしたものを実行
終わったら、header() で指定した Location へ飛ばす
header(‘Location: ‘.SITE_URL.’.login.php’);
でログイン画面に飛ばす
ここまできたら、exit;
で正常終了
ユーザ関数の getSha1Password() は
function getSha1Password($s){
return sha1(PASSWORD_KEY.$s);
}
というようにして
config.php で指定している定数
PASSWORD_KEY と $s つまり
入力したパスワードをつなげて
sha1 で暗号化している

CTF 攻略ツール

CTF 攻略ツール
掲載されていたので。メモがわりにかいてみた
とりあえず、これだけは知っておいたほうがいいということなので
まず、ネットワーク解析として
wireshark
これはパケット解析の定番ツール
一般的にはIPパケットの解析につかう
wireshark でUSBのキャプチャーデータ解析などもある
コマンドライン系なら
tshark
次に、プログラム解析として
IDA
これは逆アセンブラソフト
フリーでも使えるけど
製品版になると複数のアーキテクチャ対応になる
ただし、かなり高額
製品版の IDA pro は使えそうにないので
objdump コマンドで逆アセンブル
デバッガーによるトレースができるようにしたいところ
objdump コマンドは linux のコマンドで
オブジェクトファイルの情報を表すけど
逆アセンブルにも使える
ただし、普通にインストールした状態だと
ネイティブアーキテクチャしか対応しないとのこと
複数アーキテクチャ対応にするには
binutils を使うことになる
次に、windows系のものだけど
WinDbj
これは MicroSoft製の windows 用デバッグツール
windows バイナリのメモりダンプするときに必要
あと、windows で使える無料デバッガとしてOllyDebg
ゲーム解析、改造するときの定番ツール
次にバイナリエディタ
これはプログラム海席次に必須ソフト
Bz
Stirling
HxD
などいろいろ
そして、仮想マシン環境
VMware
VirtualBox が結構有名
これは私も結構使っている
IA32ならこれだけで十分だけど
これ以外のアーキテクチャの ARMとかMIPSになると
QEMU が必要
そして、プログラミング言語環境
これはexploit を書いたり
簡単なデータパーサーをかくのに必要
そもそも開発環境がないとプログラミングできないし
国内外のCTF解説によれば pythonが多いらしい
これである程度のスクリプトが書ける程度のスキルは必須
また、PHPもマスターして環境の構築も必要
python ,PHP を開始するには
ドットインストールで無料で学習できるので
未経験の場合は参考にするとわかりやすい
そして、web 関連
javascript 実行環境
Paros などのデバッグ環境を用意しておく
web ブラウザーで
chromeとか firefox でアドオンとか
デベロッパーツールなどが使えるとやりやすいかもしれない
そして、Linux 環境
とりあえず、CTF関連を行うなら
backtrack 5 や kalilinux などを使えるようにしておく
Linux 未経験の場合、ubuntu あたりを
vmware や virtualbox など仮想マシンで体験するとよいかも
サーバー構築関連を学ぶなら
最近では ubuntu が多いけど
centOS が結構情報が多い
Linux 関連の雑誌で
日経Linux とか Ubuntu Magazine とか見ると
わかりやすい
あと、Linux100%などで、どんなものか使ってみるという方法もある
Linux でファイルの素性を知るために
file コマンドを使ったり
文字列抽出のために strings コマンドを使うこともある
そして、チーム参戦になるので
情報共有システムもほしいところ
wiki レンタルサービスをつかうか
wikiシステム構築になるけど
システムを構築してしまったほうがいいと思う
wiki 関連のシステムは
pukiwiki とか mediawiki などで
ローカルに wiki 環境の構築が可能なので
興味があれば構築すると面白いかもしれない
また、リアルタイム情報交換にはIRCなどのシステム構築が必要
事前準備などの場合は
掲示板とかグループウェアなどもよいらしい
また、インターネット接続環境については
普通に外部アクセスする環境と
課題を解くために必要なもう1つのネット環境が必要になる
これはDEFCON予選問題の中に
NAPTでない環境からの接続を前提とした問題があったため
このため普通にルータ経由でNAPTで接続する環境
そしてグローバルIPが使える環境
が必要になりそう

登録画面でエラーメッセージの表示方法

エラーメッセージの表示
#10 エラーメッセージを表示する
http://dotinstall.com/lessons/sns_php_v2/9610
を参考に
エラーがおきたときにエラーメッセージが表示されるようにする
signup.php の
HTML部分のform部分にある
<p>お名前:<input type=”text” name=”name” value=””></p>
の後ろへ
<?php echo h($err[‘name’]); ?>
を追記
<p>メールアドレス:<input type=”text” name=”email” value=””></p>
の後ろに
<?php echo h($err[’email’]); ?>
を追記
<p>パスワード:<input type=”password” name=”password” value=””></p>
の後ろに
<?php echo h($err[‘password’]); ?>
を追記
この状態で
ページで何も記入せずに送信するとエラーがでる
ただし、以前のものをコピペしていると
$_SERVER

$_SEVER
となっていることがあるので注意
これを修正しないとエラーが表示されない
ただ、このままだと入力した内容が消えて面倒なので
value=”” のところを
value=”<?php echo h($name); ?>”
というようにすれば
入力した内容がそのまま保存されている状態になる
ただ、パスワードに関しては
セキュリティのため毎度入力にしている
ソースにすると
<p>お名前:<input type=”text” name=”name” value=”<?php echo h($name); ?>”><?php echo h($err[‘name’]); ?></p>
<p>メールアドレス:<input type=”text” name=”email” value=”i<?php echo h($email); ?>”>
<?php echo h($err[’email’]); ?></p>
というように変わる

メールアドレスの形式および存在チェック

#09 エラーチェックを行おう (2)
http://dotinstall.com/lessons/sns_php_v2/9609
を参考に
メールアドレスの形式及び存在のチェック
変更するソースファイルは
signup.php のみ
メールアドレスが正しいかどうかは
filter_var()
を使う
filter_var($email,FILTER_VALIDATE_EMAIL)
で正しいか判定
正しくないか判定するには
if(!filter_var($email,FILTER_VALIDATE_EMAIL)){
}
となる
そして、もし正しくないならエラーを出す為
$err[’email’]=’メールアドレスの形式が正しくないです’;
とする
また、すでにメールアドレスが登録済みなら
ユーザ関数 emailExists() を使って
if(emailExists($email , $dbh)){
$err[’email’]=’このメールアドレスはすでに登録ずみです’;
}
というようにする
ユーザ関数
emailExists() は
function emailExists($email,$dbh){
}
としてDB接続して行う関数になる
この関数の中身は
$sql =”select * from users where email = :email limit 1″;
として
$sql にSQLで検索した内容を格納
$stmt =$dbh->prepare($sql);
というように
prepare() へ $sql を指定する
prepare() はデータの挿入とか削除などにつかう
次に、プレースホルダーを使うので
$stmt->execute(array(“:email”=>$email));
とexecute() 内部で配列を指定
$user =$stmt->fetch();
で$stmt からデータを fetch() でとりだして
$user へ格納
あとは return で
return $user ? true : false;
というように三項演算子で判定すればOK

CTF参考サイト(海外のがほとんど)

DEFCON CTF
http://ctftime.org/
でCTF開催予定、結果などがアーカイブされている
Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
をみて、今回興味深かったのは
CTFで戦うためにどんな準備が必要か
そして
何が必要なのかということがインタビューされていたこと
セキュリティカンファレンスが開かれているという
http://ja.avtokyo.org/projects
をみたけど、現在は
google グループ参加している人のみと言う状態のようだ
CTFはチームの最大人数はきまっているけど
最低人数はきまっていないので
1人で挑む事も可能
ただし、かなり苦戦すると思う
CTFに関係する勉強方法としては
受験や試験みたいに過去問による傾向と対策
そして
実践を通して学び、気づくことが重要とのこと
CTF TIME は twitter アカウントがあるので
フォローしてみると面白いかもしれない
今回 紹介されていたのは
ロシアチームのサイト
http://smokedchicken.org/
米CMUチームのPPPサイト
http://ppp.cylab.cmu.edu/wordpress/
オランダチームのサイト
http://eindbazen.net/
イギリスチームのサイト
http://0xbadf00d.co.uk/
shell-storm CTF repository
http://repo.shell-storm.org/repo/CTF/
CTF archive
http://captf.com/
CTF参加にあたり
英語とコミュニケーションスキルは必須で
英語ができれば海外チームとのコミュニケーションが取れるし
日本語化されていない技術情報へ
ダイレクトアクセスできるというメリットもある

日本国内で開催されているCTF

日本国内で開催されているCTF
Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
にてCTF特集があったので、しばらくはCTFの勉強
日本国内で開催されているCTFに限っても
セキュリティキャンプのCTF
SECCON
CTF-challenge
ksnctf
Flaggers
HackIT
といろいろ
CTFの問題の特徴としては
ツールに頼るだけではとけない
奇をてらった手法を使わずとける
複数分野を網羅する
問題作成者以外の人に何らかの形で解かれている
というもの
とくに、基礎として必要なものは参考になった
TCP/IP のパケットを読み解く場合でも
3ウェイハンドシェイクを知っておかないとダメだったり
wireshark でパケットデータを解析するには
解析結果からデータを正確に読み取れるようになったり
という基礎が必要になる
効率よくスキルアップするためには
CTF問題の解説サイトでいろいろ問題を解いていく
とよいようだ
読むだけでは覚えないので
仮想環境を構築し
実際にハンズオンでやってみたり
実験結果をブログに買いたりというようにすると
アウトプットもあり効率的に学習できる
ブログに書くのはちょっと…
というように公開するのは不安というなら
ローカル開発環境を構築し
そこにwordpress をインストール
そして
ここに日々の記録をつけていけば
世間に公開することなくスキルを上げることができる
また、基本的にCTFはチーム戦となるので
自分の得意分野を特化させるのも重要

CSRF対策

#07 CSRF対策を施そう
http://dotinstall.com/lessons/sns_php_v2/9607
を参考にCSRF対策を学習
今回、変更を加えるのは
signup.php になる
sha1はハッシュという技術で
暗号化とは異なる
暗号化は
鍵があれば元に戻せるけど
ハッシュは
元に戻せない
function setToken(){
}
function checkToken(){
}
というユーザー関数を作り
setToken() のほうは適当な文字列をつくり
それをセッションのほうにセットする
mt_rand()で適当な文字列を作成し
sha1() で暗号化する
これを$token に格納しておく
$token = sha1(uniqid(mt_rand(), true));
$_SESSION[‘token’]=$token;
というようになる
そしてHTML部分に
<input type=”hidden” name=”token” value=”<?php echo h($_SESSION[‘token’]); ?>”>
というように
hidden というタイプを設定することで
画面には見えないようにセットすることができる
こうしておけば php のほうで
token による判定ができるようになる
ソースをブラウザで見てみると
tokenの value が毎回変わるのを確認できる
次に、checkToken() で
セッションに入っているものが正しいか判定する
これには if を使う
if(empty($_SESSION[‘token’]) || ($_SESSION[‘token’] != $_POST[‘token’])){

token が空
もしくは token がPOSTされたものと一致しない場合
ときの処理になる
このときの処理は
echo “不正なPOSTが行われました”;
exit;
と表示して終了するようにする