ftp のパスワードを取り出す方法

[戻る]

仕事柄、いろいろな人とファイルのやり取りを行うのですが、 メール添付だとでかいし、WEB サーバに貼ると他人にアクセスされるかもと いうことで、今後ファイルのやりとりが多いだろうなと思う人やプロジェクトの場合、 FTP サーバにアカウントを作って、 「FTP で取ってね。サーバはここ、アカウントはこれ、パスワードは後で電話するね」 というメールを送る時があります。

当然と言ってしまうのもなんですが、そうやって作った FTP アカウントの中には、 時間と共に使われなくなったり、期待はずれで 2,3 回使われただけという アカウントも発生します。 まぁそうなってしまうとアカウントを削除してしまえばいいんですが、中には 1 年程たって、相手から「パスワード何だったっけ」と問い合わせが来る時があります。

ところがこれが困ります。だいたい作る時は適当に思いつくまま作っているので、 たしかこんなフレーズを加工したなぁということは覚えているのですが、どの文字を 大文字にしたかとか、どの文字を記号にしたかとかは忘れてしまうものです。

また、Windows だと適当なクライアントソフトを使っているのですが、 パスワードが暗号化されて保存されているし表示もされないので、 自分はアクセスはできるけどパスワードが取り出せないといった自体が発生します。 だいたい、こういう時はあきらめてパスワードを再発行してしまうのですが、 あるとき安直にパスワードを取り出す方法を思いつきました。

それは以前、 メーラがサーバとどのような通信を行っているのか観察するために作ったプログラムを 流用することです。 簡単に言えば、メーラのサーバ設定を変更し、 互いに送信した通信を受け取り、本来の受信者に転送する前に画面に内容 表示するというものです。メインループはこんな感じ...

for (;;) {
  FD_ZERO(&rfds);
  FD_SET(ClientSocket, &rfds);
  FD_SET(ServerSocket, &rfds);

  int max = ServerSocket > ClientSocket ? ServerSocket : ClientSocket;

  select(max+1,&rfds,NULL,NULL,NULL);
	
  if (FD_ISSET(ServerSocket, &rfds)){
    int n=recv(ServerSocket, buf, sizeof(buf), 0);
    if (n<=0){
      printf ("[System]: ServerSocket ReadError\n");
      break;
    }
    buf[n]=0;
    printf ("[S to C]: %s\n", buf);
    send(ClientSocket, buf, n, 0);
  }
  if (FD_ISSET(ClientSocket, &rfds)){
    int n=recv(ClientSocket, buf, sizeof(buf), 0);
    if (n<=0){
      printf ("[System]: ClientSocket ReadError\n");
      break;
    }
    buf[n]=0;
    printf ("[C to S]: %s\n", buf);
    send(ServerSocket, buf, n, 0);
  }
}
110 (POP) や 25 (SMTP) の代わりに 21 番ポートを監視すれば、 安直にパスワードが見えるようになります。

せっかくなんで、ここ に Windows 用の実行形式を 置いておきましょう (おそらく類似のツールは多々あるでしょうが)。使い方は

  1. > tcppeep ftp.server 21

    とローカル PC で実行 (ftp.server は本来の FTP サーバ名)

  2. ローカル PC で FTP クライアントソフトを起動

  3. サーバ設定でサーバをローカルマシンの IP アドレスに変更

  4. FTP サーバに接続

といった感じです。用が済んだら設定を元に戻すのを忘れなく。

なお、

本文を読んで FTP の利用は止めて SFTP に移行しようと思った貴方、 いい心掛けだと思います。 と言いつつ SFTP だと対応クライアントが限定されるし、 LAN 内で使うだからいいやと、今後も私は ftp を使うんでしょうが... こりゃこりゃ


2004.10