« NOD32 Antivirus 3.0のメールフィルタリングのメールヘッダ処理 | メイン | 風邪で耳まで痛いっす »

2008年7月16日

Proftpdで存在しないディレクトリへのLIST 処理 >>FTPd 

訳あって、Proftpdで存在しないディレクトリへのLIST 処理について調べてました。
ホゲ実装のFTPクライアントがあったもんだから。

ExtendedLogを取って、FTPのログを取ってみていたのですが、1.3.1において存在しないディレクトリをLISTした後にも、ログにはステータスコード226が記載されている。

IP... UNKNOWN user [15/Jul/2008:xx:xx:xx +0900]
"LIST /cgi-bin/noexists" 226 0

ユーザにはエラーコード450を返しているのに、ログでは226。

うーん、なんか怪しいということでいくつか遡って調べてみた。

Proftpd 1.2.10
Net::FTP>>> Net::FTP(2.75)
Net::FTP>>> Exporter(5.58)
Net::FTP>>> Net::Cmd(2.26)
Net::FTP>>> IO::Socket::INET(1.28)
Net::FTP>>> IO::Socket(1.28)
Net::FTP>>> IO::Handle(1.24)
Net::FTP=GLOB(0x1bad1ac)<<< 220 ProFTPD 1.2.10 Server
Net::FTP=GLOB(0x1bad1ac)>>> user hoge
Net::FTP=GLOB(0x1bad1ac)<<< 331 Password required for hoge.
Net::FTP=GLOB(0x1bad1ac)>>> PASS ....
Net::FTP=GLOB(0x1bad1ac)<<< 230 User hoge logged in.
Net::FTP=GLOB(0x1bad1ac)>>> PORT 192,168,220,2,141,253
Net::FTP=GLOB(0x1bad1ac)<<< 200 PORT command successful
Net::FTP=GLOB(0x1bad1ac)>>> LIST /cgi-bin/nodir
Net::FTP=GLOB(0x1bad1ac)<<< 150 Opening ASCII mode data connection for file list
Net::FTP=GLOB(0x1bad1ac)<<< 226 Transfer complete.
Net::FTP=GLOB(0x1bad1ac)>>> QUIT
Net::FTP=GLOB(0x1bad1ac)<<< 221 Goodbye.

ステータスコードはエラーを返さない(!)

Proftpd 1.3.1
Net::FTP>>> Net::FTP(2.75)
Net::FTP>>> Exporter(5.58)
Net::FTP>>> Net::Cmd(2.26)
Net::FTP>>> IO::Socket::INET(1.28)
Net::FTP>>> IO::Socket(1.28)
Net::FTP>>> IO::Handle(1.24)
Net::FTP=GLOB(0x1bad1ac)<<< 220 ProFTPD 1.3.1 Server
Net::FTP=GLOB(0x1bad1ac)>>> user hoge
Net::FTP=GLOB(0x1bad1ac)<<< 331 Password required for hoge
Net::FTP=GLOB(0x1bad1ac)>>> PASS ....
Net::FTP=GLOB(0x1bad1ac)<<< 230 User hoge logged in
Net::FTP=GLOB(0x1bad1ac)>>> PORT 192,168,220,2,141,255
Net::FTP=GLOB(0x1bad1ac)<<< 200 PORT command successful
Net::FTP=GLOB(0x1bad1ac)>>> LIST /cgi-bin/nodir
Net::FTP=GLOB(0x1bad1ac)<<< 150 Opening ASCII mode data connection for file list
Net::FTP=GLOB(0x1bad1ac)<<< 450 /cgi-bin/nodir: No such file or directory
Net::FTP=GLOB(0x1bad1ac)>>> QUIT
Net::FTP=GLOB(0x1bad1ac)<<< 221 Goodbye.

ステータスコードはエラーを返す。但し、Proftpdのログには226 0 と記載される。

Proftpd 1.3.0
Net::FTP>>> Net::FTP(2.75)
Net::FTP>>> Exporter(5.58)
Net::FTP>>> Net::Cmd(2.26)
Net::FTP>>> IO::Socket::INET(1.28)
Net::FTP>>> IO::Socket(1.28)
Net::FTP>>> IO::Handle(1.24)
Net::FTP=GLOB(0x1baa530)<<< 220 ProFTPD 1.3.0 Server ready.
Net::FTP=GLOB(0x1baa530)>>> user hoge
Net::FTP=GLOB(0x1baa530)<<< 331 Password required for webmaster.
Net::FTP=GLOB(0x1baa530)>>> PASS ....
Net::FTP=GLOB(0x1baa530)<<< 230 User hoge logged in.
Net::FTP=GLOB(0x1baa530)>>> PORT 192,168,220,2,142,73
Net::FTP=GLOB(0x1baa530)<<< 200 PORT command successful
Net::FTP=GLOB(0x1baa530)>>> LIST /cgi-bin/nodir
Net::FTP=GLOB(0x1baa530)<<< 450 /cgi-bin/nodir: No such file or directory

ステータスコードはエラーを返す。但し、Proftpdのログには226 0 と記載される。

データコネクションの処理としては226かもしれないけど、Userには450Errorを返してるわけだし
んー、ちょっとmod_ls の処理に問題あるんじゃないの。
1.2.10の処理は更によくないけどさ。

Net::FTP使って、ちょっとテストするためのPerlScript

use Net::FTP;

$host = "dokoka";
$user ="user";
$pass ='passwd';

$ftp = Net::FTP->new($host, Debug => 1);
$ftp->login($user,$pass);
$dataconn = $ftp->list("/cgi-bin/nodir");

while( $dataconn->read( $buf , 1024)){
print $buf;
}
$dataconn->close();
$ftp->quit;

print "done\n";

twitterこの記事をTwitterでみんなに教える。

投稿者 debizoh : 2008年7月16日 18:02



トラックバック

現在、この記事はトラックバックを受け付けておりません。


コメント

現在、この記事はコメントを受け付けておりません。