31 jul 2018

Extraer claves privadas SSH en Windows 10

La fase de post-explotaciónes una de las más amplias, ya que las posibilidades son infinitas. En Windows 10 se introduce OpenSSHy las posibilidades de utilizar SSH Agentpara las conexiones a través del protocolo SSH. 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 Powershelly un poco de conceptos básicos de .NET

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. Lo primero es entender cómo trabaja el SSH Agenty de dónde recoge las claves privadas. Si se utiliza ProcMonpara 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 OpenSSHno se tiene permiso. Es decir, se requiere tener un mayor privilegio que el del usuario normal. Cuando uno utiliza el binario ssh-add.exey 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: 


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-Agentutiliza la protección de datos de Microsofttambién conocida como DPAPIDPAPIes parte de la CryptoAPI

Para sacar el valor del commentse 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.  


El abuso de DPAPIha sido constante a lo largo de los años. El objetivo en la post-explotación 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 ProtectionDataen Security.Cryptography.ProtectedDatay 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. 


En la variable $keyse 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 base64podemos 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”.


Ahora toca hacer uso del script parse_mem.py, el cual se puede encontrar en el siguiente repositorio de Github. Este scriptpermite parsearde 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. 


Ahora almacenamos el base64 en un fichero y lo subimos a la máquina Kali Linux. Una vez tenemos el fichero en la máquina Kali Linuxpodemos decodificar el base64y obtener el binario y hacer uso del scriptparse_mem.py

La instrucción en Powershell para almacenar el base64en un fichero es $base | Out-File –Encoding ASCII –FilePath [ruta]. Hay que tener en cuenta que la variable $basedispone del contenido en base64

Una vez se tiene el fichero en la máquina Kali Linuxse puede hacer lo siguiente cat [fichero] | base64 –d > binary. Después, simplemenete, ejecutar python parse_mem.py binary [nombreClaveRSA]


Para el pentestingy 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.

No hay comentarios:

Publicar un comentario