
Detectar si un servicio está instalado (a ciegas) y/o en ejecución (si expone named pipes) en una máquina remota sin usar privilegios de administrador local.
Detectar si un servicio está instalado (a ciegas) y/o en ejecución (si expone named pipes) en una máquina remota sin utilizar privilegios administrativos locales.
En más detalle, ejecutar este script se conecta al servicio SMB del objetivo (445/tcp) de forma remota y hace lo siguiente:
Comprueba si el servicio especificado está instalado mediante la llamada RPC [MS-LSAT] LsarLookupNames(). No es necesario usar una cuenta privilegiada, pero solo es posible una consulta "a ciegas" (no se pueden listar los servicios, solo podemos preguntar el estado de un servicio específico).
Comprueba si el Named Pipe especificado existe en el objetivo. Los servicios (procesos) pueden exponer un named pipe característico del servicio, que puede ser visto por un usuario sin privilegios. Por lo tanto, comprobar named pipes específicos característicos de los servicios puede permitirnos deducir si el servicio específico está en ejecución o no.
Este es un script Python independiente que usa Impacket, no es necesario instalar nada. Probado en Kali y Arch Linux actualizados usando las últimas versiones oficiales de Impacket (0.10.0 y 0.9.24) y Python (3.9 y 3.10).
Los servicios, los nombres de servicio a comprobar y los named pipes característicos del servicio se especifican en archivos de configuración JSON (o archivos CSV si es más cómodo, lo cual descubrí más tarde :), por lo que también hay disponible un convertidor csv2json personalizado) en la carpeta conf. Para entender el formato, consulta los ejemplos incluidos.
Archivos de configuración incluidos:
Los casos de uso pueden ampliarse con más servicios / named pipes, la configuración de EDR es bastante incompleta, siéntete libre de añadir más.
El script usa el formato de configuración JSON, pero luego me di cuenta de que escribir CSV es mucho más cómodo, así que incluí el script csv2json.py para convertir el CSV a JSON.
Ejecutar contra un solo objetivo para enumerar servicios AV/EDR (o cualquier otra cosa) es sencillo:
./serviceDetector.py -conf conf/edr.json evil.corp/johndoe:[email protected]
La autenticación Kerberos también es compatible (la variable de entorno KRB5CCNAME apunta al archivo ccache):
./serviceDetector.py -conf conf/edr.json -k -no-pass server.ecorp.local
Para ejecutar contra múltiples objetivos de forma efectiva, GNU parallel es súper útil:
cat targets.txt | parallel -j 50 ./serviceDetector.py evil.corp/johndoe:Passw0rd1@{}
Ten en cuenta que antes de ejecutar contra un montón de objetivos, prueba contra uno para evitar el bloqueo de cuenta (p. ej., en caso de una contraseña mal escrita).
Nota de Opsec: ten en cuenta que los inicios de sesión masivos concurrentes contra diferentes objetivos pueden activar alertas del SOC.
Las dos técnicas utilizadas aquí no son nuevas.
La llamada RPC [MS-LSAT] LsarLookupNames() fue utilizada anteriormente por Vincent Le Toux (@mysmartlogon) en el módulo Antivirusscanner de la increíble herramienta PingCastle.
La idea del named pipe para detectar servicios en ejecución se inspiró en este tweet de Lee Christensen (@tifkin_) cuando lo usó para la detección del servicio WebClient. Esta técnica para la detección de AV/EDR también fue utilizada por la herramienta NamedPipeTouch de la NSA (filtrada por el grupo The Shadow Brokers).