Hace poco, mis cofundadores dieron una charla en DerbyCon 7.0 sobre cómo evadir las herramientas comunes de enumeración de persistencia. La evasión mediante aplicaciones confiables ha sido un tema de mucho debate en la comunidad de seguridad informática, y es una de las técnicas que abordaron en su presentación. Sin embargo, casi no se habla de por qué esto importa ni de los pasos que siguen los investigadores para encontrar aplicaciones de "hospedaje". Este blog ofrece algo de contexto sobre el cómo y el porqué.
Mientras revisábamos un elemento sospechoso que Huntress detectó en uno de los endpoints de un partner, notamos un grupo de servicios desconocidos (sin relación alguna con el elemento sospechoso):
Cada servicio tenía un nombre único, pero todos compartían el mismo ejecutable. Aunque no es raro que servicios compartidos usen el mismo binario (ver svchost.exe), este servicio en particular se vuelve un poco más interesante por dentro:
En la imagen de arriba, observa que un ejecutable llama a otro como argumento. WseClientSvc.exe es un binario firmado de Microsoft. ¿Podemos hacer que ejecute algo arbitrario como calc.exe?
Obviamente no tuvimos suerte ahí, pero el error es interesante: "Could not load file or assembly 'file:///c:\windows\system32\calc.exe'…". Parece que intentó cargar/llamar a calc.exe. Con un descompilador de .NET podemos ver qué está pasando.
Efectivamente, solo está invocando el nombre del archivo especificado como argumento. Ahora volvamos al mensaje de error que obtuvimos con calc.exe: "The module was expected to contain an assembly manifest". Esto parece indicar que espera un ejecutable de .NET. Hagamos el nuestro.
Ahora podemos intentarlo de nuevo, esta vez llamando a "WseClientSvc.exe passthru.exe calc.exe":
El WseClientSvc.exe y los servicios que encontramos están instalados como parte del Windows Server Essentials Connector for Windows Server 2012 R2. El registro del MSI muestra una instalación estándar de servicio.
Los servicios mismos usan la ProviderServiceBase Class que ofrece un entorno genérico de servicio de Windows para alojar objetos ProviderHost. Todo esto viene incluido con el Windows Server 2012 Essentials SDK. ¿Parece que alguien podría crear un servicio intermediario usando el SDK que utilice el WseClientSvc.exe firmado (haciéndolo parecer un servicio legítimo de Windows) para llamar a cualquier ejecutable arbitrario?