FileZilla FTP Client guarda las contraseñas en plano

Hace tiempo que uso FileZilla FTP Client y lo cierto es que estoy bastante contento con él. Sin embargo ayer tuve que acceder desde otro ordenador a uno de mis FTPs habituales… y no recordaba la contraseña.

Se me ocurrió echar un vistazo al cifrado que usa FileZilla para las contraseñas almacenada y me llevé una gran sorpresa al descubrir ¡que no usaba ninguno!

El fichero en cuestión está en %APPDATA%\FileZilla\sitemanager.xml y por si estáis muy vagos, aquí os dejo el código que realiza un listado de todas las cuentas existentes y también un mandato PowerShell y Bash que hacen casi lo mismo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Linq;
 
namespace FileZillaPasswordRevealer
{
    class Revealer
    {
 
        private Revealer()
        {
            if (SiteManagerIsPresent())
                PrintResults(ParseSiteManager());
        }
 
        private void PrintResults(dynamic results)
        {
            foreach (var result in results)
                Console.WriteLine("**********************\n" +
                    "Host = {0}\n" +
                    "User = {1}\n" +
                    "Password = {2}\n" +
                    "**********************\n",
                    result.Host, result.User, result.Password);
        }
 
        private dynamic ParseSiteManager()
        {
            XDocument doc = XDocument.Load(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FileZilla\sitemanager.xml");
            return from x in doc.Descendants("Server")
                   select new
                   {
                       User = x.Descendants("User").SingleOrDefault().Value,
                       Password = x.Descendants("Pass").SingleOrDefault().Value,
                       Host = x.Descendants("Host").SingleOrDefault().Value
                   };
        }
 
        private bool SiteManagerIsPresent()
        {
            var folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            return File.Exists(folder + @"\FileZilla\sitemanager.xml");
        }
 
        static void Main(string[] args)
        {
            new Revealer();
        }
    }
}

PowerShell:

more $HOME\AppData\Roaming\FileZilla\sitemanager.xml | select-string "Host>|User>|Pass>"

Bash:

less $HOME/.filezilla/sitemanager.xml | egrep '(User>|Pass>|Host>)'

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P