Secuestro de objetos COM para persistencia

Cuando hablamos de intentar obtener persistencia en equipo comprometido siempre se nos viene a la cabeza añadir una tarea programada, un enlace directo en la carpeta de inicio, entradas en el registro de AutoRun... ¡¡pero qué pasa con los objetos COM!! ¡Paul pónmelo!

Para, para... ¿pero qué son los objetos COM?

Los objetos COM (Component Object Model) en Windows son una tecnología de programación desarrollada por Microsoft que se utiliza para permitir la comunicación y la interoperabilidad entre componentes de software en un entorno de sistema operativo Windows. Los objetos COM son una forma de encapsular la funcionalidad de un programa en un objeto que puede ser utilizado por otros programas de manera eficiente y consistente.

¿Me podrías dar un ejemplo de cómo se usan?

Claro, aquí tienes un ejemplo simple de cómo se crea y utiliza un objeto COM en un lenguaje de programación como C++ en un entorno Windows:

Supongamos que deseas crear un objeto COM que proporcione una funcionalidad matemática básica, como la suma de dos números. Primero, debes definir una interfaz COM que describa los métodos y propiedades que el objeto va a exponer. Luego, implementar una clase que cumpla con esa interfaz y registra el objeto COM en el Registro de Windows. 

A continuación, se muestra un ejemplo de cómo podrías hacerlo:

  1. Define la interfaz COM (por ejemplo, en un archivo de lenguaje de definición de componentes, .idl):
import "oaidl.idl"; import "ocidl.idl"; [uuid(12345678-1234-1234-1234-1234567890AB)] interface ICalculator : IUnknown { HRESULT Add([in] int a, [in] int b, [out, retval] int* result); };
  1. Implementa la interfaz en una clase C++:
class CCalculator : public ICalculator { public: // Implementación del método Add STDMETHOD(Add)(int a, int b, int* result) { *result = a + b; return S_OK; } // Implementación de las funciones de gestión de la interfaz COM (QueryInterface, AddRef, Release) STDMETHOD(QueryInterface)(REFIID riid, void** ppv); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); };
  1. Registra el objeto COM en el Registro de Windows utilizando herramientas como regsvr32.

  2. Ahora, puedes utilizar este objeto COM desde una aplicación cliente (por ejemplo, en C++):

ICalculator* pCalculator = nullptr; HRESULT hr = CoCreateInstance(CLSID_MiObjetoCOM, nullptr, CLSCTX_INPROC_SERVER, IID_ICalculator, (void**)&pCalculator); if (SUCCEEDED(hr)) { int result; pCalculator->Add(5, 3, &result); // El valor de 'result' ahora contiene 8 pCalculator->Release(); }

En este ejemplo, CoCreateInstance se utiliza para crear una instancia del objeto COM, y luego puedes llamar al método Add de la interfaz ICalculator para realizar la suma. Después de utilizar el objeto, debes llamar al método Release para liberar los recursos.

Este es un ejemplo simplificado para ilustrar el concepto de objetos COM. La implementación real de objetos COM puede ser más compleja y puede implicar un manejo adecuado de la administración de memoria y la gestión de errores.

¿Y cuáles son los objetos COM más típicos de Windows?

Windows ha utilizado y sigue utilizando una amplia variedad de objetos COM en su infraestructura y aplicaciones. Algunos de los objetos COM más típicos y ampliamente utilizados en el entorno de Windows incluyen:

  1. ActiveX: Los controles ActiveX son objetos COM utilizados en aplicaciones web y de escritorio para proporcionar funcionalidades específicas, como reproductores multimedia, controles de formularios, visualizadores de documentos, etc.

  2. ADO (ActiveX Data Objects): ADO es una biblioteca de objetos COM utilizada para acceder a bases de datos y realizar operaciones relacionadas con datos. Se utiliza comúnmente en aplicaciones de bases de datos y scripting.

  3. COM Automation: Se utiliza para automatizar aplicaciones de Windows y permite la comunicación entre aplicaciones a través de objetos COM. Esto es esencial para la automatización de aplicaciones como Microsoft Office.

  4. DirectX: DirectX es un conjunto de APIs para multimedia y gráficos en Windows. Muchas de sus API están basadas en objetos COM, y se utilizan en el desarrollo de juegos y aplicaciones multimedia.

  5. Shell Namespace Extension: Estos objetos COM permiten extender el Explorador de Windows y proporcionar vistas personalizadas y operaciones específicas para carpetas y archivos. Se utilizan para crear extensiones de shell como los iconos de Google Drive o Dropbox en el Explorador de Windows.

  6. OLE (Object Linking and Embedding): OLE es una tecnología que permite la inserción y vinculación de objetos en documentos de aplicaciones de productividad, como Microsoft Word y Excel. Los objetos OLE son objetos COM.

  7. Windows Management Instrumentation (WMI): WMI es una infraestructura de administración de Windows que utiliza objetos COM para proporcionar información y configuración del sistema. Es ampliamente utilizado en administración de sistemas y monitoreo.

  8. Active Directory Services Interface (ADSI): ADSI es una interfaz de objetos COM que se utiliza para administrar y consultar directorios de servicios de directorio, como Active Directory en entornos de red de Windows.

  9. Windows Script Host (WSH): WSH es un entorno de ejecución de scripts en Windows que utiliza objetos COM para proporcionar acceso a una variedad de recursos del sistema, como el Registro de Windows y la red.

Estos son solo algunos ejemplos de objetos COM típicos en Windows. La tecnología COM ha sido fundamental en el desarrollo de aplicaciones Windows y la interoperabilidad entre componentes de software en el sistema operativo. Sin embargo, en los últimos años, se han introducido enfoques más modernos y simplificados, como .NET y UWP, que han reducido la necesidad de trabajar directamente con objetos COM en el desarrollo de aplicaciones modernas.

Ok, ok.. como te enrollas.... vamos al turrón. ¿Cómo puedo usar objetos COM para conseguir persistencia en un host comprometido?

En lugar de secuestrar objetos COM que están en uso y romper aplicaciones que dependen de ellos, una estrategia más segura es encontrar instancias de aplicaciones que intentan cargar objetos que en realidad no existen (las llamadas keys "abandonadas").  
 
Para encontrarlas, viene al rescate Process Monitor de la excelente suite de Sysinternals. Ya sabéis, un programita que nos puede mostrar la actividad del proceso, el registro y el sistema de archivos en tiempo real y es muy útil para encontrar diferentes tipos de primitivas de escalada de privilegios.  
 
Si ejecutamos procmon64.exe en la máquina, debido a la gran cantidad de eventos generados, lo mejor es filtrar para no volvernos locos:
 
 
Como veis, un filtro para ver las keys con una referencia a "InProcServer" en el path de una operación, que se refiere a un servidor COM que se carga en el proceso actual.
 
Antes de elegir nuestro objeto COM, un aspecto a tener en cuenta es la cantidad de veces que se carga un CLSID (Component Object Model (COM) Class IDentifier) en particular. ¿Por qué? Porque si secuestramos uno que se carga cada dos segundos, lo pasaremos mal, por lo que se recomienda intentar encontrar uno que se cargue con poca frecuencia o que se cargue cuando sea una aplicación de uso común ( Se abre Word, Excel, Outlook, etc.). 
 
En nuestro caso veamos abriendo el navegador Edge:
 

Ahora mediante Powershell observamos que esa entrada existe en HKLM pero no en HKCU:

Así que nos la han dejado botando....Para explotar esto, podemos crear las entradas de registro necesarias en HKCU y apuntarlas a una DLL de nuestro beacon, en el ejemplo en C:\Payloads\http_x64.dll.



Como veis creamos la entrada y asignamos el valor "Both" a la propiedad "ThreadingModel", indicando que el objeto COM puede ser utilizado en hilos de un solo subproceso (STA, Single-Threaded Apartment) o en hilos multiproceso (MTA, Multi-Threaded Apartment).
 
 
Cuando abramos de nuevo Edge e intente cargar el objeto COM recién creado recibiremos nuestro beacon:
 
 
Y ya volvemos a tener party time ;)


Comentarios

Publicar un comentario