1gの勇気

奥手な人の思考と試行

[情報SEC]第5回 バッファオーバーフロー攻撃

2006-02-22 23:58:19 | 1gの情報セキュリティ
第5回 バッファオーバーフロー攻撃

略してBOF。...って一般的なんかの。
3文字略語はあまり好きでない水神です。
この本は図解で説明してますが、水神は文章しか書けないので文章で書いときます。

古き良き時代。
C言語(C++はまだない。)がまだ一般的だった頃。
バグはプログラマの責任であった。

バッファオーバーフローなんて起こすプログラム書く方が悪い。
というか、そんなやつプログラマなんて名乗る資格ない。
そんな雰囲気すらあった時代。

それまでのマシン語(アセンブラ)に比べて極めて書きやすいので、
高級言語(死語)と言われたくらい。
で、何が言いたいかというと、アセンブラの精神をひきずっとるのです。

C言語は。(C++も。)
なので、メモリアクセスし放題。
自爆も容易です。

C言語はメモリ領域を明示的に確保することが可能です。
例えば100バイト。
データ用のメモリもプログラム用のメモリも同じものを使ってます。

では、この確保した領域を超えるデータを入れたらどうなるか。
例えば200バイト。
100バイトははみ出ます。C言語は気にしません。プログラマが悪いのですから。

で、はみ出した分が、運悪くプログラム領域まで食い込むと、プログラムが破壊されます。
通常はそこで、core(メモリダンプ)吐いてとまります。(unix系。)
windowsはどうなんかの。メモリリークしそうだけど。

まあ、止まるだけならよいのです。まだましです。
プログラム領域までデータで上書きできるということは、
データにプログラム埋め込んでおけば、別なプログラムに置き換えることが可能です。

そのプログラムは当然ハッキングに都合のよい、プログラム。
で、めでたく置き換わったら、ハッキングし放題。
これがバッファオーバーフローです。

C++もメモリいじり放題なので、同じ問題があります。
多少Cよりはましんなっているようですが、それもプログラマ次第でしょう。
ちなみにJavaはプログラマからメモリいじり権限を奪った言語なので、起こりにくいです。

それでもまだCやC++は使われています。
古いプログラムがまだ現役というのもありますが、Javaやインタプリタ系の言語(perl,php等々)
に比べて格段に自由度が高く、なんと言っても速いのです。実行速度が。

というわけで、まだまだこの問題はなくならない。
さて、バッファオーバーフロー対策は。というと。
この本(翔泳社)にはいろいろ書いてありますが、IDSで検知とか。

なんと言っても、パッチ当てです。
バグ取り(パッチ当て)が確実かつ唯一の対応方法。
ファイアウォールだとか、IDSだとか、そんなんやるくらいなら、サービス止めとくのだ。

バグのないソフトに乗り換えるのだ。
メールサーバもsendmailではなく、qmailに変えればそれだけで安全性は高まる。
...というのは言い過ぎか?比喩としては分かってもらえると思うのだが。

しかし、この試験どこまで実務に添ってるんだろう。
ちと不安になってきた。
理論だけで設問と解答作られたら、実務者は落とされるな。きっと。

いらいら

2006-02-22 22:24:31 | 1gの思いつき
こんばんは。
水神です。
なんかいらいらしている今日この頃です。

まあ、単調な作業をひたすらやらされたあとなんてこんなもんか。
ちとしたっぱにあたってしまったのは失敗か。
明日謝っとこう。

今日は暖かかったね。
喫茶店も暑かった。
それでも頑固な私は飲むと決めたホットココア飲んできました。

こんな日はいつまでも起きてても、何を考えててもいらいらするだけなので、
とっとと寝てしまおう。
明日は...どうだろ。

[情報SEC]第4回 ポートスキャン

2006-02-22 00:59:13 | 1gの情報セキュリティ
第4回 ポートスキャン

ポートスキャンとは、文字通りポートをスキャンすること。
ポートとは、受け口のこと。
例えば、Webで使われてるHTTP(というプロトコル...通信手順)なら80番という番号のポート(口)だ。

IPアドレス+ポート番号で特定のサービスにつなげる。
21番ならFTPだし、25番ならSMTPだ。
で、用もないのに接続してみる。

接続できれば、そのポートが開いているということ。
これがポートスキャン。
ポートが開いていれば、そこからハッキングをがんばるのだ。

昨日(第3回)説明したスタックフィンガープリンティングは、
どうもうそだったようです。すみません。
接続した時にサーバが返してくるバナー情報からOSやサービスの種類やバージョンを読みとることだそうです。

最近ではハッキング対策として、こうしたバナー情報を出さないものも多いです。
出すか出さないかは大概設定で変えられますが。
うそ情報を出すこともできますが...そこまでせんでもね。

このポートスキャンは、telnetでできます。
水神もよくやります。(仕事です。自分の管理サーバです。クラッキングではありません。)
telnet www.goo.ne.jp 80 と打てば、gooにつながります。

今試しにwindowsのtelnetでやってみた。
ふむふむ。gooはapacheらしい。ふつーだの。
繋いだだけでは真っ暗な画面ですが、おまじないを打つと返事が返ってきます。

ポートスキャンを手動でやるのは面倒なので、
自動的にやってくれるポートスキャンツールが使われます。
ポートスキャンといえば、codered。数年前に流行ったワームです。

未だに外に出ているwebサーバのログにはこいつのアクセス形跡が載ってます。
迷惑な話だ。おかげでログが汚れる。
さて。次行きます。

TCPコネクトスキャン。というのは、今説明したやつです。(なので割愛)
TCPハーフスキャン。
これは、SYNパケットを送って、SYN/ACKならポートが開いてる。

RST/ACKならポートが閉じてる。
というのを調べる方法です。
これだと、SYN/ACKが帰ってきても、RSTを返して接続を切れば接続が確立しません。

なので、相手方のサーバにログも残りません。
パケットキャプチャでもしてれば別ですが。
SYNとかACKとかはTCPの制御パケットです。

このくらいは基本情報処理にも出てくると思うので(そうだっけ?)説明しません。
ちなみに、SYNはシン、ACKはアックと呼んでました。(一般的かどうかはしらん。)
SYNはたぶんシンクロナス(同期)の略で、ACKはアクノレッジ(???)の略です。

RSTはリセットでしょう。
そんなん、どうでもいいでうすが、こういうのをステルススキャンいいます。
ログに残らんからでしょう。

次行きます。UDPスキャン。
UDPは送りっぱなしプロトコルです。
でもポートが死んでる場合はICMP port unreachableが帰ってくるそうです。

これはしらんかった。
ICMPはpingで使われるプロトコルで、IPプロトコルです。(UDPやTCPではなく。)
unreachableはping打っても帰ってくることがあります。

ポートスキャンへの対抗策の第一は、不要なポートを閉じることです。
サーバ屋なら常識ですな。
ネットワーク屋ならファイアウォールかませて、ポートをネットワーク的に閉じます。

水神はnetscreenが好きです。(どうでもよいね。)
検知するのに一番お手軽なのは、ログ解析です。
けど、これはステルススキャンは見えません。

ステルススキャンまで検知するにはポート監視型のハード・ソフトが必要でしょう。
IDSと言います。この本にはIPSなるものも載ってる。(ぼくはしらん。)
IPSはIDSにファイアウォールのような機能を持たせたものということ。

んー、でもそれではIDSにならんと思うのだが。
パケットを通す(ルータみたいなもん)ので負荷も高そうだし。
値段も高そうだ。

でも、IDSは入れただけではダメで、管理(ログチェック)せねばならん。
めんどくさいので、業者に頼むという手もあります。
それなりの値段しますし、いちいち報告してくるので対応が面倒。(本末転倒だの。)