martes, julio 03, 2018

Windows 10: Cómo extraer las Claves Privadas SSH desde el propio Registry

La fase de post-explotación es una de las más amplias, ya que las posibilidades son infinitas. En Windows 10 se introduce OpenSSH y las posibilidades de utilizar SSH Agent para las conexiones a través del protocolo SSH (incluso ponerle Latch y configurar SSH in parnoid mode para mejorar la seguridad). En este artículo mostraré como se puede, con el privilegio adecuado, extraer las claves privadas que estén almacenadas en el registro de Windows 10. Para ello, solamente hay que hacer uso de Powershell y un poco de conceptos básicos de .NET.

Figura 1: Windows 10: Cómo extraer las Claves Privadas SSH desde el propio Registry

Sobre la temática de extracción de claves privadas de SSH en Windows se puede leer un artículo muy interesante aquí. Existe un artículo más antiguo sobre la extracción de claves SSH de memoria que también es muy recomendable. Ambos, más que recomendables para completar las técnicas de Hacking Windows.


Figura 2: My SSH in Paranoid Mode

Lo primero es entender cómo trabaja el SSH Agent y de dónde recoge las claves privadas. Si se utiliza ProcMon para monitorizar las acciones que realiza el binario ssh-agent.exe, se puede descubrir fácilmente las operaciones que realiza el binario en el registro. En este caso, parece sencillo, se hace una serie de consultas a una ruta que se encuentra en HKCU. La ruta es HKCU:\Software\OpenSSH\Agent\Keys.

Lo curioso es que para poder manipular la ruta de OpenSSH no se tiene permiso. Es decir, se requiere tener un mayor privilegio que el del usuario normal. Cuando uno utiliza el binario ssh-add.exe y le pasa como argumento una Clave Privada, dicha identidad queda almacenada en el registro. En la ruta anteriormente comentada. Si se accede al registro, podemos ver algo similar a esto:

Figura 3: Almacenamiento de Clave Privada en regisro

La clave con el nombre ‘comment’ indica el nombre del fichero desde el que se importó la clave privada. Además, el valor del campo ‘comment’ está en ASCII directamente, por lo que es trivial obtener esa información. La clave ‘(Default)’ es nuestro objetivo. Ésta es distinta, no está en ASCII, está cifrada. El binario SSH-Agent utiliza la protección de datos de Microsoft, también conocida como DPAPI. DPAPI es parte de la CryptoAPI.

Figura 4: CNG DPAPI

Para sacar el valor del comment se puede utilizar la clase [System.Text.Encoding] de .NET. Al final, como se comentaba anteriormente, es solo ASCII. Tal y como se puede ver en la imagen, se obtiene el nombre del fichero original desde el que se importó la clave privada.

Figura 5: Accediendo al nombre del fichero original

El abuso de DPAPI ha sido constante a lo largo de los años. El objetivo en la post-explotación  en un proyecto de Ethical Hacking siempre ha sido obtener credenciales y secretos. Este es de nuevo un ejemplo de ello. Para desproteger la clave se podía hacer uso de la clase ProtectionData en Security.Cryptography.ProtectedData y el método Unprotect. En la imagen se puede ver el proceso seguido en Powershell, como se puede ver con pocas líneas se puede hacer un gran trabajo.

Figura 6: Desprotegiendo la clave con PowerShell

En la variable $key se almacena el valor de la clave ‘(Default)’ que es la clave privada protegida. Después, gracias a System.Security, se puede desproteger la clave y se almacena en $bytesUnProtect. Por último, se convierte a Base64. Si decodificamos el Base64 podemos observar una especie de binario que comienza con un texto claro ssh-rsa.

Para poder observar esto, se puede hacer uso de las instrucciones que se ejecutan en la consola, como se puede ver en la imagen. En resumen, primero se convierte los bytes desprotegidos anteriormente en Base64. Posteriormente, se muestran en ASCII. En el binario se puede ver el “ssh-rsa”.

Figura 7: En el binario se puede leer ssh-rsa

Ahora toca hacer uso del script parse_mem.py, el cual se puede encontrar en el siguiente repositorio de Github. Este script permite parsear de un binario una clave privada de SSH. Por ello, hay que coger la salida binaria anterior y almacenar en un fichero. Es muy importante que siempre se haya respetado en encoding en ASCII.

Figura 8: parse_mem.py

Ahora almacenamos el Base64 en un fichero y lo subimos a la máquina con distribución de ataque Kali Linux. Una vez tenemos el archivo en la máquina Kali Linux podemos decodificar el Base64 y obtener el binario y hacer uso del script parse_mem.py. La instrucción en Powershell para almacenar el Base64 en un fichero es:
$base | Out-File –Encoding ASCII –FilePath [ruta]
Hay que tener en cuenta que la variable $base dispone del contenido en Base64. Una vez se tiene el fichero en la máquina Kali Linux se puede hacer lo siguiente:
 cat [fichero] | base64 –d > binary
Después, simplemente, ejecutar usando el motor de Python:
Python parse_mem.py binary [nombreClaveRSA].
Figura 9:  Obteniendo la clave privada con Python en Kali Linux

Para el pentesting y la fase de post-explotación es una técnica a tener en cuenta, ya que puede permitirnos acceder a otras máquinas gracias al uso de esa clave privada exfiltrada de la máquina Windows 10. Pronto más novedades con esta técnica.

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advance Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

No hay comentarios:

Entrada destacada

Cupón Verano 10 % descuento en @0xWord

Como todos los veranos, tenemos que cerrar la editorial de 0xWord durante el mes de Agosto , pero antes de que llegue ese días os vamos a ...

Entradas populares