「TCP/IPプログラミング」
<作成者>
学籍番号:055752J
2班 氏名:比嘉安史
提出日:12月15日(金)
- 課題1:telnetコマンドによるWWWサーバへのアクセス
- 解答
- telnetコマンドによって取得したページデータ
- 課題2:inetdを使用するサーバプログラムの作成
- 実行結果
- 関数の説明と動作全体のフロー
- 課題3:inetdを使用しないサーバプログラムの作成
- 作成したプログラム
- 実行結果
- 実装上の違い
- 課題4:HTTPクライアントの作成
- 作成したプログラム
- 実行結果
- 課題5:ポートスキャンの実験
- 作成したプログラム
- 実行結果
- 課題6:バッファオーバーフローの実験
- 解決策
- 具体例
- 参考サイト
- telnetコマンドを使って任意のWWWサーバにアクセスし、任意のURLのページデータ(htmlソースプログラム)を画面に表示せよ。(報告書にはそのURLとページデータの先頭の20行程度を添付せよ)
課題1では@IT - アットマーク・アイティというサイト内の「telnetでWebサーバに接続してみよう」というコンテンツを参考にして,http://www.atmarkit.co.jp/fnetwork/accesstest/at.htmlというURLのページデータを取得した.
[nw0552:~] j05052% telnet www.atmarkit.co.jp 80
Trying 210.155.152.132...
Connected to www.atmarkit.co.jp.
Escape character is '^]'.
GET http://www.atmarkit.co.jp/fnetwork/accesstest/at.html
<html>
<head>
<title>Access Test</title>
</head>
<body>
<center>
<hr>
<h1>Welcome to AtmarkIT Access Test Page.</h1>
<hr>
</center>
</body>
</html>
Connection closed by foreign host.
[nw0552:~] j05052%
- サンプルプログラム(1)はサーバ(server.c)をinetdから起動することで、サーバはクライアント(client.c)の標準入力から入力された文字に対応するキーワードをクライアントに返すプログラムである。サンプルプログラム(1)を自分の実験環境で動作するようにし、実行結果を示すとともに、プログラムの中で使われている関数(Connect,Disconnect, Send Data, Recv Dataなど)の動作を説明し、サーバ・クライアント動作全体をフローを示して説明せよ。
[nw0552:~/jikken2/tcp-ip] j05052% sudo xinetd -inetd_compat
[nw0552:~/jikken2/tcp-ip] j05052% ./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 =
Disocnnected.
[nw0552:~/jikken2/tcp-ip] j05052%
関数 |
説明 |
Connect |
ホストやソケットの確認をし,ソケット番号を返す |
Disconnect |
コネクションを破棄する |
Send Data |
指定したファイル(SocketNumber)に"line"から始まるバッファのデータを格納する(最大strlen(line)バイト) |
Recv Data |
指定したファイル(SocketNumber)から"line"から始まるバッファのデータを読み込む(最大strlen(line)バイト) |
- サンプルプログラム(1)のサーバプログラム(server.c)はinetdから起動するものであるが、inetdを使用せずに同じ動作をするデーモン型のサーバプログラムを作成し、実行結果を示すとともに、inetdを使用するサーバプログラムとそうでないものとの実装上の違いを説明せよ。
[nw0552:~] j05052% ./client-daemon
Connected.
Input Keyword = warning: this program uses gets(), which is unsafe.
yama
Keyword = [yama] / Data = [kawa]
Input Keyword = xxxx
Keyword = [xxxx] / Data = [yyyy]
Input Keyword = xxx
Keyword = [xxx] / Data = [ ]
[nw0552:~] j05052%
デーモン型のサーバプログラムではinetdが行っている,
- socket()を使ってソケットを生成する.
- blind()を使って生成したソケットにポートに番号を割り当てる
- lisen()で接続するまでの準備をする
- accept()を使いクライアントからの接続を待つ
といった処理を追加しなければならない.
inetdを使うと,要求があった時だけサーバを実行するので資源を節約できる.そのためレスポンスは遅くなる.デーモン型のサーバプログラムでは常にシステムに常駐しているのでレスポンスは速くなる.しかし,常にシステムに常駐しているので資源の消費してしまう.
- ソケットおよびHTMLを使ってWWWサーバから任意のURLのページを取得し、標準出力に出力するプログラムを作成せよ。
[nw0552:~/jikken2/tcp-ip] j05052% ./htmlgetter
warning: this program uses gets(), which is unsafe.
Input www server = www.u-ryukyu.ac.jp
Connected.
Input Path = /index.html
HTTP/1.1 200 OK
Date: Fri, 15 Dec 2006 13:11:28 GMT
Server: Apache/2.2.2 (Fedora)
Last-Modified: Thu, 14 Dec 2006 02:55:47 GMT
ETag: "122b27d-24df-a6f372c0"
Accept-Ranges: bytes
Content-Length: 9439
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>〓〓〓〓〓〓〓w〓〓ョ〓z〓[〓〓〓y〓[〓W</title>
<style type="text/css">
<!--
td {
font-size: smaller;
}
-->
</style>
<!-- <script language="javascript" src="preview/rollover.js"></script> -->
<style type="text/css">
</style>
<link href="preview/ryudai2.css" rel="stylesheet" type="text/css">
</head>
中略
Copyright(C)1997-2006,UNIVERSITY OF THE RYUKYUS
</div>
</td>
</tr>
<tr align="right">
<td colspan="4">
<img src="http://inet1.osn.u-ryukyu.ac.jp/cgi-bin/counter/Count.cgi?md=8|dd=D|ft=3|df=preview.dat" align=absmiddle>
</td>
</tr>
</table>
</center>
</body>
</html>
Disocnnected.
[nw0552:~/jikken2/tcp-ip] j05052%
- 自分の実験環境(端末)の使用/未使用ポート(ウェルノウンポートのみでok)を確認するポートスキャンプログラムを作成せよ。さらに、任意のリモート端末の使用/未使用ポートを確認するように改良せよ(加点ポイント)。なお、スクリプトを使って内部で'netstat -l'コマンドを実行し、その結果を利用するのは不可とする(ソケットプログラムを作成すること)。
[nw0552:~/jikken2/tcp-ip] j05052% ./portscan
warning: this program uses gets(), which is unsafe.
Input address : 133.13.59.52
Port number = 80 : use
Port number = 548 : use
Port Scan end
Disocnnected.
[nw0552:~/jikken2/tcp-ip] j05052%
- サンプルプログラム(2)を実行せよ。このプログラムはgets()関数を用いて、標準入力からの入力をバッファにデータを読み込むものであるが、結果を見ると、プログラム中で操作していないバッファdmy[]に値が入ることがある。この原因を考察し、解決策を示せ。また、この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか、具体例を挙げて述べよ。
gets()が持つこのような問題をバッファオーバーランや,バッファオーバーフローという.この問題を解決するにはgets()の変わりにfgets()を使えばよい.fgets()はバッファ長のチェックを行うのでバッファオーバーランは起らない.
その他の対応としては,適切なメモリ保護機能を持ったOSやCPUを使用するか,プログラム実行時に常にバッファオーバーランを検知する機能や仕組みを利用するか,自らがバッファ長を常に意識したプログラミングを意識することが必要である.
バッファオーバーラン攻撃を行う時は,送信データに不正なプログラムを挿入して,相手のコンピュータに実行させることにより,OS上の管理者権限を不正に奪取するなど様々な攻撃を行うことができる.具体的な事件には,2003年8月に世界規模で発生したWindowsのRPCサブシステムにおけるバッファオーバーランを悪用したMSBlastウイルスによる攻撃がある.