TCP/IPプログラミング

TCP/IPプログラミング

055756B 松川梓



課題1:telnetコマンドによるWWWサーバへのアクセス


telnetコマンドによるWWWサーバへのアクセス telnetコマンドを使って任意のWWWサーバにアクセスし、任意のURLのページデータ(htmlソースプログラム)を画面に表示せよ。(報告書にはそのURLとページデータの先頭の20行程度を添付せよ)

実行結果

[nw0556:~] j05056% telnet www.1pondo.tv 80
Trying 38.118.195.186...
Connected to 1pondo.tv.
Escape character is '^]'.
GET/index.html HTTP/1.0
<html><head><title>Error 501 Not Implemented
</title></head><body bgcolor=#ffffff><h2>Error 501 Not Implemented
</h2><p><i>Powered by <a href="http://errors.zeus.com/">Zeus Technology</a></i></body></html>
Connection closed by foreign host.

課題2:inetdを使用するサーバプログラムの作成


サンプルプログラム(1)はサーバ(server.c)をinetdから起動することで、サーバはクライアント(client.c)の標準入力から入力された文字に対応するキーワードをクライアントに返すプログラムである。サンプルプログラム(1)を自分の実験環境で動作するようにし、実行結果を示すとともに、プログラムの中で使われている関数(Connect,Disconnect, Send Data, Recv Dataなど)の動作を説明し、サーバ・クライアント動作全体をフローを示して説明せよ。

変更点

server.c
・"#include <stdlib.h>"を追加
・DATAFILEを"/Users/j05056/jikken2/tcpip/data/data.txt"に変更
client.c
・"#include <stdlib.h>"を追加
・HOST_NAMEを"nw0556.st.ie.u-ryukyu.ac.jp"に変更

実行結果

[nw0556:~/jikken2/report6/sample1] j05056% client
Connected.
Input Keyword = warning: this program uses gets(), which is unsafe.
yama
Keyword = [yama] / Data = [kawa]

Input Keyword = abc
Keyword = [abc] / Data = [ABC]

Input Keyword = 123
Keyword = [123] / Data = [456]

Input Keyword = xxx
Keyword = [xxx] / Data = [yyy]

Input Keyword = shiro
Keyword = [shiro] / Data = [kuro]

関数解説

 Connect socket生成、host nameやhost addressの設定をし、接続の準備をする
 Disconnect 接続を閉じる
 Send Data  データ送信
 Recv Data データ受信
 

課題3:inetdを使用しないサーバプログラムの作成


サンプルプログラム(1)のサーバプログラム(server.c)はinetdから起動するものであるが、inetdを使用せずに同じ動作をするデーモン型のサーバプログラムを作成し、実行結果を示すとともに、inetdを使用するサーバプログラムとそうでないものとの実装上の違いを説明せよ。

serverプログラムのソース
clientプログラムのソース

実行結果

[nw0556:~/jikken2/report6/tcpip] j05056% ./client_noinetd
yama
kawa
123
456
xyz
XYZ

課題4:HTTPクライアントの作成


ソケットおよびHTMLを使ってWWWサーバから任意のURLのページを取得し、標準出力に出力するプログラムを作成せよ。

kadai4.c

実行結果

[nw0556:~/jikken2/report6/tipip] j05056% ./htmlget
http://www.yahoo.co.jp/ を取得します。

GET / HTTP/1.0
Host: www.yahoo.co.jp:80

HTTP/1.1 200 OK
Date: Sun, 10 Dec 2006 13:21:55 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM
 DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI
 PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires: -1
Pragma: no-cache
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=euc-jp

< html >
< head >
< meta http-equiv="Content-Type" content="text/html; charset=euc-jp" >

               省略
 

課題5:ポートスキャンの実験


自分の実験環境(端末)の使用/未使用ポート(ウェルノウンポートのみでok)を確認するポートスキャンプログラムを作成せよ。さらに、任意のリモート端末の使用/未使用ポートを確認するように改良せ(加点ポイント)。なお、スクリプトを使って内部で'netstat -l'コマンドを実行し、その結果を利用するのは不可とする(ソケットプログラムを作成すること)。
kadai5.c

実行結果

[nw0556:~/jikken2/report6/tipip] j05056% ./portscan
"127.0.0.1" PortScan Start!!
  80
 427
 548
 631
There are using


課題6:バッファオーバーフローの実験


サンプルプログラム(2)を実行せよ。このプログラムはgets()関数を用いて、標準入力からの入力をバッファにデータを読み込むものであるが、結果を見ると、プログラム中で操作していないバッファdmy[]に値が入ることがある。この原因を考察し、解決策を示せ。また、この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか、具体例を挙げて述べよ。
サンプルプログラム(2)

実行結果

[nw0556:~/jikken2/report6/tipip] j05056% ./bufovf
before
buf(Len:0) = 
dmy(Len:0) = 
warning: this program uses gets(), which is unsafe.
1234567890123456789012345678901234567890
after
buf(Len:40) = 1234567890123456789012345678901234567890
dmy(Len:0) = 
Segmentation fault

考察

原因

gets()関数を使っているためだと考えられる。
gets()関数は配列の長さを指定することができないため、配列以上の文字が入力されるのを防ぐことができず、そのままdmy[]に値を書き込んでしまう。

解決方法

fgets()関数を使えばよい。
fgets()関数は指定した配列より長い値を入力すると、指定したバッファのサイズを超えないように書き込むという特徴があるからである。

バッファオーバーフローによって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥は、バッファオーバーフローを利用すると、引き起こしたプログラムが持っているアクセス権の範囲で任意の動作を行うことが可能となる。よってにwebサーバなどの管理者権限を奪われることもある。
このような危険をおさえるためにソフトウェアメーカー等から提供される修正プログラムをなるべく速やかに適用することが重要である。

参考URL


長田先生のページ(http://www.nn.osnr.jp/~nagayan/index.php?Tomokazu%20NAGATA)
簡単で正しいHTMLの書き方(http://homepage.mac.com/toda/html/)
HTMLリファレンス(http://www.tohoho-web.com/html/index.htm)