学籍番号:055725B 氏名:自念政司 提出日2006/12/26課題1
課題2
課題3
課題4
課題5
課題6
課題1:telnetコマンドによるWWWサーバへのアクセス
telnetコマンドを使って任意のWWWサーバにアクセスし、任意のURLのページデータ(htmlソースプログラム)を 画面に表示せよ。
telnetを行ったサイト:コナミオフィシャルホームページhttp://www.konami.jp
実行結果------------------------------------------------------------------ nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025>telnet www.konami.jp 80 Trying 211.132.7.225... Connected to www.konami.jp. Escape character is '^]'. GET /index.html HTTP/1.0 HTTP/1.1 200 OK Date: Sat, 16 Dec 2006 13:26:10 GMT Server: Apache Last-Modified: Sat, 16 Dec 2006 06:36:52 GMT ETag: "1fd31a-5712-458cce84" Accept-Ranges: bytes Content-Length: 22290 Connection: close Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="imagetoolbar" content="no"> <meta name="author" content="KONAMI"> ------------------------------------------------------------------
課題2:inetdを使用するサーバプログラムの作成
サンプルプログラム(1)はサーバ(server.c)をinetdから起動することで、サーバはクライアント(client.c)の標準入力から入力された 文字に対応するキーワードをクライアントに返すというプログラムである。サンプルプログラム(1)を自分の実験環境で動作するよう にし、実行結果を示すとともに、プログラム中の関数(Connect,Disconnect, Send Data, Recv Dataなど)の動作を説明し、サーバ・ クライアント動作全体をフローを示しながら説明せよ。
実行結果
--------------------------------------------------------------- 0:14:00:tcpip client Connected. Input Keyword = warning: this program uses gets(), which is unsafe. yama Keyword = [yama] / Data = [kawa] Input Keyword = 123 Keyword = [123] / Data = [456] Input Keyword = xyz Keyword = [xyz] / Data = [XYZ] Input Keyword = Disocnnected. ---------------------------------------------------------------
フローチャート
Connect:ソケットを作成し、サーバに接続を要求する SendData:サーバにデータを送る RecvData:サーバから送信されたデータを受信する GetLineFromPeer:クライアントからデータを受信し、バッファに読み込む GetKetbordData:バッファに読み込んだデータを照合し、適合したデータを送信する Disconnest:接続を切断する
課題3:inetdを使用しないサーバプログラムの作成
サンプルプログラム(1)のサーバプログラム(server.c)はinetdから起動するものであるが、inetdを使用せずに同じ動作をする デーモン型のサーバプログラムを作成し、実行結果を示すとともに、inetdを使用するサーバプログラムとそうでないものとの実装 上の違いを説明せよ。
使用したプログラムのソース server00.c client00.c
実行結果
---------------------------------------------------------------- nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp>server00 now waiting for client connect Connected from 127.0.0.1 nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp>client00 Connected. Input Keyword = warning: this program uses gets(), which is unsafe. yama Keyword = [yama] / Data = [kawa] Input Keyword = shiro Keyword = [shiro] / Data = [kuro] Input Keyword = 123 Keyword = [123] / Data = [456] Input Keyword = xxxx Keyword = [xxxx] / Data = [yyyy] Input Keyword = Disocnnected. ----------------------------------------------------------------
inetd使用/未使用時における違い
inetd使用時は、接続がある毎にサーバを起動してクライアントと接続するので起動する時間がかかってしまうかわりに、資源の節約ができ る。それとは反対にinted未使用時は、サーバーが常時起動しているため、起動時間はかからないが、資源を常に消費してしまう。
課題4:HTTPクライアントの作成
ソケットおよびHTMLを使ってWWWサーバから任意のURLのページを取得し、標準出力に出力するプログラムを作成せよ。
プログラムのソース http_gtr.c
実行結果
------------------------------------------------------------------------------------ nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp> gcc -o http-gtr http-gtr.c nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp>./http-gtr http://www.ie.u-ryukyu.ac.jp http://www.ie.u-ryukyu.ac.jp/ を取得します。 HTTP/1.1 400 Bad Request Date: Sat, 16 Dec 2006 01:43:03 GMT Server: Apache/2.0.55 (Unix) mod_ssl/2.0.55 OpenSSL/0.9.7i PHP/5.1.2 Content-Length: 356 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> <hr> <address>Apache/2.0.55 (Unix) mod_ssl/2.0.55 OpenSSL/0.9.7i PHP/5.1.2 Server at www.ie.u-ryukyu.ac.jp:0 Port 16080</address> </body></html> ------------------------------------------------------------------------------------
課題5:ポートスキャンの実験
自分の実験環境(端末)の使用/未使用ポート(ウェルノウンポートのみでok)を確認するポートスキャンプログラムを作成せよ。さらに、 任意のリモート端末の使用/未使用ポートを確認するように改良せよ(加点ポイント)。なお、スクリプトを使って内部で'netstat -l'コマ ンドを実行し、その結果を利用するのは不可とする(ソケットプログラムを作成すること)。
プログラムのソース pt_scan.c
実行結果
---------------------------------------------------------------------- nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp> gcc -o pt_scan pt_scan.c nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp> ./pt_scan warning: this program uses gets(), which is unsafe. Input address : 133.13.59.25 Port number = 427 : use Port number = 548 : use Port Scan end Disocnnected. ----------------------------------------------------------------------
課題6:バッファオーバーフローの実験
サンプルプログラム(2)を実行せよ。このプログラムはgets()関数を用いて、標準入力からの入力をバッファにデータを読み込むもの であるが、結果を見ると、プログラム中で操作していないバッファdmy[]に値が入ることがある。この原因を考察し、解決策を示せ。 また、この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか、具体例を挙げて述べよ。
実行結果〜変更前〜
-------------------------------------------------------------------------------- nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp> gcc -o bufovf bufovf.c nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp> ./bufovf before buf(Len:0) = dmy(Len:0) = warning: this program uses gets(), which is unsafe. 5766104760512736409164908726104765104760517264098576140576340675 01276509746597649576923016590431265946590265962495690236590460596 41905763219569365965962319056741236542675972659958729185901265091 78598729582190512975691785987598759182791823900260596032917659026 49018754982375973295890234875903260954863905832908570493285903 after buf(Len:322) = 57661047605127364091649087261047651047605172640985761 405763406750127650974659764957692301659043126594659026596249569023 659046059641905763219569365965962319056741236542675972659958729185 901265091785987295821905129756917859875987591827918239002605960329 176590264901875498237597329589023487590326095486390583290857049328 5903 dmy(Len:0) = Segmentation fault --------------------------------------------------------------------------------
変更したソースコード bufovf_00.c
実行結果〜変更後〜
-------------------------------------------------------------------------------- nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp> gcc -o bufovf_00 bufovf_00.c nw0525.st.ie.u-ryukyu.ac.jp:/Users/j05025/tcp>./bufovf_00 before buf(Len:0) = dmy(Len:0) = abcdefghijklmnopqrstuvwxyz after buf(Len:6) = abcdef dmy(Len:0) = --------------------------------------------------------------------------------考察
このプログラムでは、バッファの長さを指定することができない「gets()」を用いて書き込まれているため、 許容量を超えるデータ入力を防ぐことができない。よってバッファのサイズを指定することができる「fgets()」 を用いることで、問題を解決することができる。また変更したプログラムでは指定バッファサイズを7に変更した。 実行結果から、バッファサイズが7を超えて書き込まれていないことが分かる。
セキュリティ上の欠陥
オーバーフローが起こってしまった場合、バッファサイズを超えてしまったデータは他のデータを書き換えることが可能になるため、第三 者によるプログラムの上書きが可能になってしまう。よって権限の高いプログラムが書き換えられてしまった場合、権限が乗っ取られてし まうので非常に危険が生じてしまう。