Le protocole FTP
09/02/2005
 Christian CALECA 
Liste des cours

Cadeau bonus

Accueil ] [ Pourquoi FTP ? ] [ Les bases de FTP ] [ Plus avant ] [ Cadeau bonus ]


Le transfert de serveur à serveur, via un client tiers

Je vous l'ai dit, ne reculant devant aucune difficulté, nous allons tout de même illustrer cet aspect du protocole FTP.

Ce qui est nécessaire

Pour que ça fonctionne, il nous faut disposer :

Pour illustrer l'opération, il faut pouvoir sniffer la totalité de la manipulation, c'est à dire que les trois protagonistes doivent être placés sur le même réseau IP, sans composants de type switch ou pont ; uniquement des hubs.

J'ai donc monté deux serveurs FTP sous GNU/Linux (ProFTPD), configurés pour "Allow foreign data transfers" . Dans la pratique, il faut utiliser la directive "AllowForeignAddress on" dans /etc/proftpd.conf, pour la zone où l'on désire accepter ce type d'opération. Voici ce que dit la documentation de ProFTPD :

AllowForeignAddress

Syntax: AllowForeignAddress on|off
Default: AllowForeignAddress off
Context: server config, <VirtualHost&, <Anonymous>, <Global>
Compatibility: 1.1.7 and later

Normally, proftpd disallows clients from using the ftp PORT command with anything other than their own address (the source address of the ftp control connection), as well as preventing the use of PORT to specify a low-numbered (< 1024) port. In either case, the client is sent an "Invalid port" error and a message is syslog'd indicating either "address mismatch" or "bounce attack". By enabling this directive, proftpd will allow clients to transmit foreign data connection addresses that do not match the client's address. This allows such tricks as permitting a client to transfer a file between two FTP servers without involving itself in the actual data connection. Generally it's considered a bad idea, security-wise, to permit this sort of thing.

AllowForeignAddress only affects data connection addresses; not tcp ports. There is no way (and no valid reason) to allow a client to use a low-numbered port in it's PORT command.

Pour ceux qui ne comprennent absolument pas l'anglais, disons qu'en gros, cette option est par défaut désactivée et que c'est une mauvaise idée que de l'activer, pour des raisons de sécurité.

Le client FTP est quant-à-lui installé sur une machine Windows, il s'agit du shareware FlashFXP, qui sait faire ça très bien, et beaucoup d'autres choses encore. C'est un très bon client FTP, mais c'est un shareware.

Si vous faites des recherches sur le Net à propos de cette opération, vous verrez souvent apparaître l'acronyme FXP (File eXchange Protocol). FXP est souvent présenté comme un protocole à part entière, ce n'est pas vrai, ce n'est qu'une fonctionnalité décrite dans FTP.

Mais passons à l'acte...

Pour vous aider à vous y retrouver :

Il n'y a aucun filtre sur le sniffeur, nous verrons donc aussi ARP et les requêtes DNS, DNS également placé sur gw1.maison.mrs. Pour alléger la lecture, j'ai supprimé ces traces inutiles pour la compréhension de FXP.

De même, ce client FTP utilise quelques commandes FTP non vues plus haut, et qui ne sont pas fondamentales pour comprendre FXP. Je les ai également ignorées.

 No. Time      Source            Destination       Protocol Info

Ouverture du canal de contrôle sur le premier serveur

   5 19.364106 192.168.0.10      192.168.0.250     TCP      1219 > ftp [SYN]
   6 19.364747 192.168.0.250     192.168.0.10      TCP      ftp > 1219 [SYN, ACK]
   7 19.364790 192.168.0.10      192.168.0.250     TCP      1219 > ftp [ACK]
  10 19.488677 192.168.0.250     192.168.0.10      FTP      Response: 220 ProFTPD 1.2.5 Server 
                                                                      (ProFTPD Default Installation) 
                                                                      [gw1.maison.mrs]
  11 19.495288 192.168.0.10      192.168.0.250     FTP      Request: USER chris
  12 19.495852 192.168.0.250     192.168.0.10      TCP      ftp > 1219 [ACK]
  13 19.543993 192.168.0.250     192.168.0.10      FTP      Response: 331 Password required for chris.
  14 19.544575 192.168.0.10      192.168.0.250     FTP      Request: PASS xxxxxxx
  15 19.545099 192.168.0.250     192.168.0.10      TCP      ftp > 1219 [ACK]
  16 19.989752 192.168.0.250     192.168.0.10      FTP      Response: 230 User chris logged in.

Voilà qui est fait. Nous n'utilisons pas ici de connexion anonyme, mais un identifiant de connexion d'un utilisateur. C'est nécessaire pour disposer (éventuellement) d'un accès en écriture.

...
  24 20.078321 192.168.0.10      192.168.0.250     FTP      Request: PWD
  25 20.080811 192.168.0.250     192.168.0.10      FTP      Response: 257 "/" is current directory.

Récupération du listing du répertoire

  26 20.090418 192.168.0.10      192.168.0.250     FTP      Request: TYPE A
  27 20.092416 192.168.0.250     192.168.0.10      FTP      Response: 200 Type set to A.
  28 20.099576 192.168.0.10      192.168.0.250     FTP      Request: PASV
  29 20.101994 192.168.0.250     192.168.0.10      FTP      Response: 227 Entering Passive Mode 
                                                                      (192,168,0,250,12,185).

Ouverture d'un canal de données pour la réception du listing

  30 20.102720 192.168.0.10      192.168.0.250     TCP      1220 > 3257 [SYN]
  31 20.103284 192.168.0.250     192.168.0.10      TCP      3257 > 1220 [SYN, ACK]
  32 20.103327 192.168.0.10      192.168.0.250     TCP      1220 > 3257 [ACK]
  33 20.109338 192.168.0.10      192.168.0.250     FTP      Request: LIST
  34 20.112077 192.168.0.250     192.168.0.10      FTP      Response: 150 Opening ASCII 
                                                                      mode data connection for file list
  35 20.196803 192.168.0.250     192.168.0.10      FTP-DATA FTP Data: 83 bytes
  36 20.203187 192.168.0.250     192.168.0.10      FTP-DATA FTP Data: 1460 bytes
  37 20.203223 192.168.0.10      192.168.0.250     TCP      1220 > 3257 [ACK]
  38 20.204008 192.168.0.250     192.168.0.10      FTP-DATA FTP Data: 393 bytes
  39 20.204043 192.168.0.10      192.168.0.250     TCP      1220 > 3257 [ACK]
  40 20.205736 192.168.0.250     192.168.0.10      FTP      Response: 226-Transfer complete.
  41 20.205758 192.168.0.10      192.168.0.250     TCP      1219 > ftp [ACK]
  42 20.206247 192.168.0.250     192.168.0.10      FTP      Response: 226 Quotas off
  43 20.214397 192.168.0.10      192.168.0.250     TCP      1220 > 3257 [FIN, ACK]
  44 20.214872 192.168.0.250     192.168.0.10      TCP      3257 > 1220 [ACK]
  45 20.363982 192.168.0.10      192.168.0.250     TCP      1219 > ftp [ACK]

Le listing est transmis et le canal de données est fermé.

Nous allons faire maintenant exactement la même chose avec l'autre serveur FTP

  50 39.613933 192.168.0.10      192.168.0.254     TCP      1221 > ftp [SYN]
  51 39.614229 192.168.0.254     192.168.0.10      TCP      ftp > 1221 [SYN, ACK]
  52 39.614272 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
  55 39.636550 192.168.0.254     192.168.0.10      FTP      Response: 220 ProFTPD 1.2.5 Server 
                                                                      (ProFTPD Default Installation)
                                                                      [pchris2.maison.mrs]
  56 39.642774 192.168.0.10      192.168.0.254     FTP      Request: USER chris
  57 39.643003 192.168.0.254     192.168.0.10      TCP      ftp > 1221 [ACK]
  58 39.644690 192.168.0.254     192.168.0.10      FTP      Response: 331 Password required for chris.
  59 39.645224 192.168.0.10      192.168.0.254     FTP      Request: PASS xxxxxxx
  60 39.676795 192.168.0.254     192.168.0.10      TCP      ftp > 1221 [ACK]
  61 39.743052 192.168.0.254     192.168.0.10      FTP      Response: 230 User chris logged in.
  69 39.774644 192.168.0.10      192.168.0.254     FTP      Request: PWD
  70 39.775221 192.168.0.254     192.168.0.10      FTP      Response: 257 "/" is current directory.
  71 39.784746 192.168.0.10      192.168.0.254     FTP      Request: TYPE A
  72 39.785222 192.168.0.254     192.168.0.10      FTP      Response: 200 Type set to A.
  73 39.791956 192.168.0.10      192.168.0.254     FTP      Request: PASV
  74 39.792560 192.168.0.254     192.168.0.10      FTP      Response: 227 Entering Passive Mode
                                                                      (192,168,0,254,128,12).
  75 39.793291 192.168.0.10      192.168.0.254     TCP      1222 > 32780 [SYN]
  76 39.793518 192.168.0.254     192.168.0.10      TCP      32780 > 1222 [SYN, ACK]
  77 39.793549 192.168.0.10      192.168.0.254     TCP      1222 > 32780 [ACK]
  78 39.800533 192.168.0.10      192.168.0.254     FTP      Request: LIST
  79 39.801169 192.168.0.254     192.168.0.10      FTP      Response: 150 Opening ASCII mode data
                                                                      connection for file list
  80 39.978200 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
  81 40.059200 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 83 bytes
  82 40.061438 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 1460 bytes
  83 40.061471 192.168.0.10      192.168.0.254     TCP      1222 > 32780 [ACK]
  84 40.062869 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 1460 bytes
  85 40.063016 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 110 bytes
  86 40.063049 192.168.0.10      192.168.0.254     TCP      1222 > 32780 [ACK]
  87 40.063095 192.168.0.254     192.168.0.10      FTP      Response: 226-Transfer complete.
  88 40.063169 192.168.0.254     192.168.0.10      FTP      Response: 226 Quotas off
  89 40.063182 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
  90 40.076529 192.168.0.10      192.168.0.254     TCP      1222 > 32780 [FIN, ACK]
  91 40.076735 192.168.0.254     192.168.0.10      TCP      32780 > 1222 [ACK]

A ce niveau, le client FTP a fait les choses suivantes :

Rappelons pour la suite, que l'objectif est de transférer un fichier depuis 192.168.0.250 vers 192.168.0.254

  92 49.440572 192.168.0.10      192.168.0.254     FTP      Request: SIZE UsersGuide.pdf
  93 49.441478 192.168.0.254     192.168.0.10      FTP      Response: 550 UsersGuide.pdf: 
                                                                          No such file or directory

Un moyen de savoir si le fichier existe déjà sur la cible. Tout va bien, il n'y est pas.

  94 49.453420 192.168.0.10      192.168.0.250     FTP      Request: TYPE I
  95 49.455704 192.168.0.250     192.168.0.10      FTP      Response: 200 Type set to I.
  96 49.462042 192.168.0.10      192.168.0.254     FTP      Request: TYPE I
  97 49.462533 192.168.0.254     192.168.0.10      FTP      Response: 200 Type set to I.

Le client demande aux deux serveurs de faire le transfert en mode Image (binaire)

  98 49.474530 192.168.0.10      192.168.0.250     FTP      Request: PASV
  99 49.476988 192.168.0.250     192.168.0.10      FTP      Response: 227 Entering Passive Mode 
                                                                      (192,168,0,250,12,186).

Le serveur source est placé en mode passif.

 100 49.483559 192.168.0.10      192.168.0.254     FTP      Request: PORT 192,168,0,250,12,186
 101 49.484082 192.168.0.254     192.168.0.10      FTP      Response: 200 PORT command successful.

Le serveur cible va utiliser le port 3258 de la source. 
Mais avez-vous bien remarqué la commande PORT ? Le client (192.168.0.10) envoie au serveur cible (192.168.0.254) la commande PORT avec, comme adresse, celle du serveur source (192.168.0.250).
Dans la pratique, le serveur cible est donc invité à ouvrir un canal de données directement sur le serveur source, sans passer par le client, ce que nous allons vérifier très prochainement.

 102 49.490373 192.168.0.10      192.168.0.254     FTP      Request: STOR UsersGuide.pdf

Le client demande à la cible de récupérer le fichier.

 103 49.504530 192.168.0.254     192.168.0.250     TCP      ftp-data > 3258 [SYN]
 104 49.505090 192.168.0.250     192.168.0.254     TCP      3258 > ftp-data [SYN, ACK]
 105 49.505220 192.168.0.254     192.168.0.250     TCP      ftp-data > 3258 [ACK]

La cible (192.168.0.254) ouvre donc un canal de données depuis son port 20 (ftp-data) vers la source (192.168.0.250) sur le canal indiqué précédemment : 3258.

 106 49.507460 192.168.0.254     192.168.0.10      FTP      Response: 150 Opening BINARY mode data connection
                                                                      for UsersGuide.pdf.

La cible est maintenant prête à recevoir les données.

 107 49.513809 192.168.0.10      192.168.0.250     FTP      Request: RETR UsersGuide.pdf

Le client demande maintenant à la source d'envoyer les données.

 108 49.525033 192.168.0.250     192.168.0.10      FTP      Response: 150 Opening BINARY mode data connection
                                                                      for UsersGuide.pdf (511748 bytes).

La source est prête à envoyer les données.

 109 49.541114 192.168.0.250     192.168.0.254     FTP-DATA FTP Data: 1448 bytes
 110 49.542353 192.168.0.250     192.168.0.254     FTP-DATA FTP Data: 1448 bytes
 111 49.542423 192.168.0.254     192.168.0.250     TCP      ftp-data > 3258 [ACK]
 112 49.542494 192.168.0.254     192.168.0.250     TCP      ftp-data > 3258 [ACK]

Et le transfert commence...

Laissons le faire tranquillement jusqu'à la fin.

...
 652 49.993346 192.168.0.254     192.168.0.250     TCP      ftp-data > 3258 [ACK]
 653 49.993429 192.168.0.250     192.168.0.10      FTP      Response: 226 Transfer complete.

La source a fini son transfert, elle le signale au client (pas à la cible).

 654 49.993629 192.168.0.254     192.168.0.250     TCP      ftp-data > 3258 [FIN, ACK]
 655 49.994016 192.168.0.250     192.168.0.254     TCP      3258 > ftp-data [ACK]

La cible ferme le canal de données.
Comment fait donc la cible pour savoir que la totalité des données a été transférée, alors que la réponse 226 a été envoyée au client FTP, qui ne l'a pas répercuté à la cible ?
Vous le saurez en lisant la rfc :-)

 656 49.998088 192.168.0.254     192.168.0.10      FTP      Response: 226 Transfer complete.

La cible signale également au client que le transfert est fini.

Et voilà. Pour le reste, il n'y a rien de bien nouveau, le client va rafraîchir l'affichage des contenus des dossiers des deux serveurs. Comme nous n'avons plus rien à faire, nous fermons les canaux de commandes sur les deux serveurs.

Je vous laisse la suite sniff, pour que vous puissiez vérifier par vous-même.

 657 50.031721 192.168.0.10      192.168.0.250     FTP      Request: TYPE A
 658 50.033904 192.168.0.250     192.168.0.10      FTP      Response: 200 Type set to A.
 659 50.040995 192.168.0.10      192.168.0.250     FTP      Request: PASV
 660 50.043551 192.168.0.250     192.168.0.10      FTP      Response: 227 Entering Passive Mode 
                                                                      (192,168,0,250,12,187).
 661 50.044240 192.168.0.10      192.168.0.250     TCP      1223 > 3259 [SYN]
 662 50.044848 192.168.0.250     192.168.0.10      TCP      3259 > 1223 [SYN,ACK]
 663 50.044896 192.168.0.10      192.168.0.250     TCP      1223 > 3259 [ACK]
 664 50.051654 192.168.0.10      192.168.0.250     FTP      Request: LIST
 665 50.061709 192.168.0.250     192.168.0.10      FTP      Response: 150 Opening ASCII mode data connection 
                                                                      for file list
 666 50.097847 192.168.0.250     192.168.0.10      FTP-DATA FTP Data: 83 bytes
 667 50.104583 192.168.0.250     192.168.0.10      FTP-DATA FTP Data: 1460 bytes
 668 50.104617 192.168.0.10      192.168.0.250     TCP      1223 > 3259 [ACK]
 669 50.105386 192.168.0.250     192.168.0.10      FTP-DATA FTP Data: 393 bytes
 670 50.105419 192.168.0.10      192.168.0.250     TCP      1223 > 3259 [ACK]
 671 50.107014 192.168.0.250     192.168.0.10      FTP      Response: 226-Transfer complete.
 672 50.107031 192.168.0.10      192.168.0.250     TCP      1219 > ftp [ACK]
 673 50.107533 192.168.0.250     192.168.0.10      FTP      Response: 226 Quotas off
 674 50.115291 192.168.0.10      192.168.0.250     TCP      1223 > 3259 [FIN, ACK]
 675 50.115737 192.168.0.250     192.168.0.10      TCP      3259 > 1223 [ACK]
 676 50.155919 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
 677 50.163703 192.168.0.10      192.168.0.254     FTP      Request: TYPE A
 678 50.164199 192.168.0.254     192.168.0.10      FTP      Response: 200 Type set to A.
 679 50.171900 192.168.0.10      192.168.0.254     FTP      Request: PASV
 680 50.172516 192.168.0.254     192.168.0.10      FTP      Response: 227 Entering Passive Mode
                                                                      (192,168,0,254,128,13).
 681 50.173205 192.168.0.10      192.168.0.254     TCP      1224 > 32781 [SYN]
 682 50.173433 192.168.0.254     192.168.0.10      TCP      32781 > 1224 [SYN, ACK]
 683 50.173470 192.168.0.10      192.168.0.254     TCP      1224 > 32781 [ACK]
 684 50.180336 192.168.0.10      192.168.0.254     FTP      Request: LIST
 685 50.183052 192.168.0.254     192.168.0.10      FTP      Response: 150 Opening ASCII mode data connection 
                                                                      for file list
 686 50.192934 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 83 bytes
 687 50.195151 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 1460 bytes
 688 50.195183 192.168.0.10      192.168.0.254     TCP      1224 > 32781 [ACK]
 689 50.196585 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 1460 bytes
 690 50.196787 192.168.0.254     192.168.0.10      FTP-DATA FTP Data: 181 bytes
 691 50.196822 192.168.0.10      192.168.0.254     TCP      1224 > 32781 [ACK]
 692 50.196866 192.168.0.254     192.168.0.10      FTP      Response: 226-Transfer complete.
 693 50.196883 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
 694 50.197117 192.168.0.254     192.168.0.10      FTP      Response: 226 Quotas off
 695 50.210196 192.168.0.10      192.168.0.254     TCP      1224 > 32781 [FIN, ACK]
 696 50.210395 192.168.0.254     192.168.0.10      TCP      32781 > 1224 [ACK]
 697 50.256503 192.168.0.10      192.168.0.250     TCP      1219 > ftp [ACK]
 698 50.357064 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
 699 55.592433 192.168.0.10      192.168.0.254     FTP      Request: QUIT
 700 55.592873 192.168.0.254     192.168.0.10      FTP      Response: 221 Goodbye.
 701 55.593249 192.168.0.10      192.168.0.254     TCP      1221 > ftp [FIN, ACK]
 702 55.594302 192.168.0.254     192.168.0.10      TCP      ftp > 1221 [FIN, ACK]
 703 55.594334 192.168.0.10      192.168.0.254     TCP      1221 > ftp [ACK]
 704 56.783780 192.168.0.10      192.168.0.250     FTP      Request: QUIT
 705 56.785470 192.168.0.250     192.168.0.10      FTP      Response: 221 Goodbye.
 706 56.785846 192.168.0.10      192.168.0.250     TCP      1219 > ftp [FIN, ACK]
 707 56.789903 192.168.0.250     192.168.0.10      TCP      ftp > 1219 [FIN, ACK]
 708 56.789942 192.168.0.10      192.168.0.250     TCP      1219 > ftp [ACK]

Précédente ] [ Accueil ]