 jouons avec ftp suite à une discussion sur irc je me suis remis à m amuser avec le protocole ftp j en profite pour faire un topo rapide c est quoi ftp comme son nom l indique ftp file transfer protocol est un protocole de transport de fichiers il fonctionne en tcp contrairement à d autres protocoles comme le tftp qui fonctionnent en udp mais ftp outre d être difficile à administrer pour le firewall notamment est peu sécurisé nous verrons par la suite les limites de ce protocole il est a noter que la plupart des serveurs ftp actuels et heureusement permettent de limiter les problèmes comment fonctionne ftp ftp fonctionne sur deux canaux un canal pour les commandes et l autre canal pour les données nous supposons que nous avons un serveur ftp avec comme ip 19216801 sur le port 21 le nom d utilisateur est gnunux avec comme mot de passe motdepasse le premier client appelé victime a pour ip 19216802 le deuxième client appelé attaquant a pour ip 19216803 sur le client nous allons nous connecter sur le serveur ftp avec telnet victime telnet 19216801 21 trying 19216801 connected to 19216801 escape character is 220 proftpd 128 server proftpd default installation gnunuxgnunuxinfo commençons pour nous identifier user gnunux 331 password required for gnunux comme indiqué il faut mettre son mot de passe pass motdepasse 230 user gnunux logged in nous voilà connecté sur le serveur nous pouvons maintenant découvrir les commandes de base en faisant help par exemple pwd nous donne le répertoire courant syst nous donne le type de système maintenant passons aux choses sérieuses pour l instant nous sommes restés dans le canal commande ftp fonctionne en mode passif ou en mode actif dans le premier cas le serveur ouvre un port non privilégié supérieur à 1023 en attendant que le client se connecte sur le canal de donnée dans le deuxième cas le client ouvre un port en attendant que le serveur se connecte depuis le port 20 etudions dans la pratique ce que cela donne mode passif en mode passif faisons pasv 227 entering passive mode 192168016130 ici nous avons l ip du serveur 19216801 et le port 6130 c est bien des et non des pour calculer le port il faut faire 6x256 130 donc 1666 depuis une autre console victime telnet 19216801 1666 trying 19216801 connected to 19216801 escape character is le telnet est en attente il faut demander au serveur de transmettre des données depuis le canal de commande list 150 opening ascii mode data connection for file list 226 transfer complete dans la fenêtre du canal de donnée nous avons la liste des fichiers des répertoires courant qui s affiche drwx 2 gnunux users 4096 nov 13 2002 amis rw 1 gnunux users 37035 nov 24 1128 autre drwx 4 gnunux users 4096 nov 13 1935 contact drwx 4 gnunux users 4096 jan 1 2305 lettre drwx 4 gnunux users 4096 jan 1 2305 liste drwx 2 gnunux users 4096 jan 1 2305 travail connection closed by foreign host mode actif choisissons un port supérieur à 1023 au hazard disons 1867 sur le client écoutons sur ce port avec netcat victime nc l p 1867 enfin calculons les valeurs utilisées pour définir le port victime echo 1867256 bc 7 victime echo 1867256 bc 75 le port 1867 est donc 775 passons donc en mode actif port 19216802775 200 port command successful list 150 opening ascii mode data connection for file list vous pouvez voir que la liste des répertoires est affichée dans la console contenant netcat usurpation du canal de donnée il est facile de constater qu aucun mécanisme ne permet de s identifier sur le canal des données le serveur se contente de répondre à la première personne qui s y connecte il est facile de récuperer des données d une session d une autre personne pour la suite nous allons utiliser un petit script que j ai écrit  ftppassifpygz script python de ma composition à décompresser gunzip ftppassifpygz et à rendre exécutable chmod x ftppassifpy victime ftppassifpy dans une autre console tape telnet 19216801 1818 comme indiqué dans une autre console il suffit de taper telnet 19216801 1818 pour voir le contenu du répertoire refaire l expérience mais en faisant le telnet sur le deuxième client attaquant telnet 19216801 1818 trying 19216801 connected to 19216801 escape character is drwx 2 gnunux users 4096 nov 13 2002 amis rw 1 gnunux users 37035 nov 24 1128 autre drwx 4 gnunux users 4096 nov 13 1935 contact drwx 4 gnunux users 4096 jan 1 2305 lettre drwx 4 gnunux users 4096 jan 1 2305 liste drwx 2 gnunux users 4096 jan 1 2305 travail le rebond ftp ou bounce ftp  le rebond ftp est une technique de test de port d une machine tiers en utilisant le protocole ftp le principe est d ouvrir en mode actif une connexion sur un port spécifique d un autre machine avec la commande port si le port est ouvert le serveur ftp considérera que les données ont été transmis sinon une erreur sera retournée pour la suite nous allons utiliser un petit script que j ai écrit  ftpactifpygz script python de ma composition à décompresser gunzip ftpactifpygz et à rendre exécutable chmod x ftpactifpy sur le premier client faire victime nc l p 1982 et dans une autre console victime ftpactifpy 19216802 1982 port ouvert sur un port fermé nous aurons victime ftpactifpy 19216802 1983 port ferme attention il est très rare que les serveurs ftp acceptent des ports privilégiés inférieur a 1024 comme port de destination maintenant si nous modifions l ip il est possible de s assurer qu un port est ouvert ou non sur le premier client faire victime nc l p 1672 et sur le deuxième client ftpactifpy 19216803 1672 port ouvert se protéger avec proftpd il suffit de mettre l option allowforeignaddress à off fichier attaché taille ftpactifpygz 659 octets ftppassifpygz 709 octets  jouons avec ftp il serait bien si on pouvait mettre en attachement de fichier python   jouons avec ftp j ai résolu le problème avec gzip   ftp  