Con esta herramienta podrás detectar:
Control de acceso incorrecto a un objeto COM (LaunchPermission, AccessPermission): LPE a través de métodos COM abusables, retransmisión de autenticación DCOM. Eso es PermissionHunter
.
Derechos de registro incorrectos para un objeto COM: LPE mediante secuestro de COM. Ese es ComDiver
.
Encuentre un nuevo apodo de elevación: derivación de UAC. Ese es MonikerHound
.
Obtenga información detallada sobre un CLSID específico: inspeccione el objeto COM para encontrar métodos COM de los que se pueda abusar. Ese es ClsidExplorer
.
Verifique la activación entre sesiones en nombre de un usuario con pocos privilegios: intentar crear una instancia de un objeto en la sesión de otra persona para LPE. Ese es ComTraveller
.
Si hubiéramos publicado esta herramienta hace un par de meses (por ejemplo, en la primavera de 2024), habría descubierto CVE-2024-38100 (FakePotato) y CVE-2024-38061 (SilverPotato).
Comience a usar esta herramienta y podrá encontrar más formas de elevar los privilegios en los sistemas Windows. Es como un OleViewDotnet automatizado :)
PermissionHunter es una herramienta que le permite examinar LaunchPermission y ActivatePermission en todos los objetos COM del sistema.
PD A:mzhmo> .PermissionHunter.exe -h , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. ` PermissionHunter: busque LaunchPermission y ActivatePermission incorrectos Equipo de investigación CICADA8 De Michael Zhmaylo (MzHmO)PermissionHunter.exePequeña herramienta que le permite encontrar objetos COM vulnerables con LaunchPermission y ActivatePermission incorrectos[OPCIONES]-outfile: nombre de archivo de salida-outformat: formato de salida. Se aceptan 'csv' y 'xlsx'-h/--help: muestra esta ventana
Aquí sólo hay dos argumentos:
-outfile
- nombre del archivo con el informe de derechos;
-outformat
: formato del archivo con el informe, puede generarse tanto en csv como en xlsx. Es mejor generar en csv, porque si no tiene Excel, no podrá generar en formato xlsx.
Ejemplo:
PD A:mzhmo> .PermissionHunter -resultado del archivo de salida -formato de salida xlsx , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. ` PermissionHunter - búsqueda de LaunchPermission y ActivatePermission incorrectos Equipo de investigación de CICADA8 De Michael Zhmaylo (MzHmO)[+] El resultado estará en formato xlsx[+] Éxito
Después de eso, obtendrá un archivo result.xlsx, que enumerará todos los derechos de los objetos COM existentes.
Saco las siguientes columnas:
ApplicationID
: ID de aplicación de un objeto COM específico. Ej: {69AD4AEE-51BE-439b-A92C-86AE490E8B30}
;
ApplicationName
: nombre de aplicación de un objeto COM específico. Ej: Background Intelligent Transfer Service
;
RunAs
: clave de registro RunAs de un objeto COM. Ej: Interactive User
;
LaunchAccess
, LaunchType
, LaunchPrincipal
, LaunchSid
: clave de registro LaunchPermission. LaunchPrincipal especifica el usuario que tiene derechos de LaunchAccess sobre el objeto COM. LaunchType: tipo de ACE: habilitar o deshabilitar. LaunchSID: SID de LaunchPrincipal. Ex:
Lanzamiento local. Lanzamiento remoto. Activación local. Acceso por activación remota Permitido NT AUTHORITYSYSTEM S-1-5-18
Esto significa que el sistema tiene permisos LocalLaunch, RemoteLaunch, LocalActivation, RemoteActivation en este objeto COM;
AccessAccess
, AccessType
, AccessPrincipal
, AccessSID
: los campos tienen el mismo significado que LaunchPermissions, solo en el contexto de AccessPermission;
AuthLevel
, ImpLevel
: nivel de autenticación y nivel de suplantación. De forma predeterminada, están configurados en RPC_C_AUTHN_LEVEL_CONNECT
y RPC_C_IMP_LEVEL_IDENTIFY
;
CLSIDs
: CLSID de objetos COM.
Si encuentra un objeto COM al que puede acceder en nombre de un usuario con pocos privilegios, por ejemplo, puede abusar de él de la siguiente manera:
Cree una instancia y llame a los métodos de ese objeto COM para, por ejemplo, escribir un archivo arbitrario en nombre del sistema. Por ejemplo, encontró un objeto COM con un método DeployCmdShell()
que se ejecuta en nombre de la cuenta NT AUTHORITYSYSTEM
y tiene LaunchPermissions
y AccessPermissions
. Puede iniciar este objeto COM, llamar al método DeployCmdShell()
y obtener la ejecución del código en nombre del sistema. Puede ver los métodos disponibles utilizando ClsidExplorer
.
Abusar de la autenticación DCOM. Para esto, consulte RemoteKrbRelay
Toda la información sobre los objetos COM está en el registro. ¿Pero qué pasa si el registro fue incorrecto? En tal caso, tenemos la posibilidad de anular la configuración COM, por ejemplo, para secuestrar el archivo ejecutable.
Esta herramienta le permite detectar dichas vulnerabilidades y escanea el registro de acuerdo con la prioridad de las claves que se ven al buscar objetos COM. De esta manera, incluso puedes encontrar Shadow COM Hijacking. La prioridad es la siguiente:
1. Clases de software HKCU (GUID) Tratar como 2. Clases de software HKLM (GUID) Tratar como 3. Clases de software HKCU (GUID) InprocServer32 4. Clases de software HKLM (GUID) InprocServer32 5. HKCUSoftwareClasses(GUID)LocalServer32 6. HKLMSoftwareClasses(GUID)LocalServer32
Así surgen al menos dos vectores de escalada de privilegios:
Si tenemos permisos de escritura para HKCU...TreatAs
y el ejecutable COM original está en HKCU...LocalServer32
, entonces podemos realizar Shadow COM Hijacking escribiendo nuestro ejecutable en HKCU..TreatAs
.
Si el objeto COM se encuentra en HKCU..LocalServer32
y podemos escribir en HKCU..LocalServer32
, entonces podemos realizar el secuestro de COM.
Echemos un vistazo más de cerca a la herramienta:
PD A:ssdgitrepoCOMThanasiaComDiverx64Debug> .ComDiver.exe -h / o ^ o / () / ____________(%%%%%%%)____________ ( / / )%%%%%%%( ) (___/___/__/ ________) ( / /(%%%%%%%) ) (__/___/ (%%%%%%%) _____) /( ) / (%%%%%) (%%%) !----------- COM DIVER -------------- [?] Pequeña herramienta para verificar permisos de registro y disco inseguros en objetos com [?] ARGS -h/--ayuda <- mostrar este mensaje --from<- analiza los CLSID de este clsid --target <- analiza un clsid objetivo --no-context <- no verifique otro contexto de servidor COM. Sólo análisis de registro. --no-create <- no crear el objeto COM de destino. Este es el modo más rápido.
Acepta los siguientes argumentos:
--from
: hay muchos CLSID en un sistema Windows. Si no desea que la herramienta busque todos los CLSID comenzando desde el primero, puede especificar el CLSID con el que comenzar, por ejemplo, --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--target
: analiza clsid específico;
--no-context
: no verifica el nombre del usuario en cuyo nombre se inicia el objeto COM;
--no-create
: no crear un objeto COM que haya sido detectado. Esto limita la información que puede obtener al respecto. Sin embargo, esta es la forma más rápida de examinar sólo los derechos de registro.
Ejemplo:
.ComDiver.exe --no-crear
En este caso podemos ver que no hay claves dentro de HKCU y tenemos permisos de escritura para esas claves. En consecuencia, si escribimos nuestro propio valor en esta ruta, realizaremos un secuestro de COM.
Si ve líneas rojas en la salida de la herramienta, ¡esta es una forma potencial de abusar de un objeto COM! Puede realizar un secuestro COM (suplantar un ejecutable existente) o un secuestro COM oculto (suplantar un ejecutable faltante). Lea más sobre el secuestro de COM aquí
Existe una forma integrada de omitir UAC en un sistema Windows, esto se hace a través de Elevation Moniker. Puedes leer más sobre esto aquí. Este tipo de UAC Bypass requiere una forma no estándar de registrar el objeto COM en el registro, que es bastante fácil de rastrear. Entonces puedes usar mi herramienta para encontrar nuevas formas de derivación de UAC.
Ejemplo:
PD A:ssdgitrepoCOMThanasiaMonikerHoundx64Debug> .MonikerHound.exe ,_ _ _,oo/ ,(.-.), _/ |) (| _ /=-=/ ,| =/ |, _/ | / _ _!_/ MonikerHound: ¡encuentre su propia derivación UAC! Equipo de investigación CICAD8 Por Michael Zhmaylo (MzHmO) [+] ¡Se encontró un servidor COM potencial para el apodo de elevación! Nombre: CEIPLuaElevationHelper CLSID: {01D0A625-782D-4777-8D4E-547E6457FAD5} Cadena localizada: @%systemroot%system32werconcpl.dll,-351 Habilitado: 1 Referencia de icono: @%systemroot%system32werconcpl.dll,-6 Activar: Éxito PID: 15800 DllHost.exe [+]........................[+] [+] ¡Se encontró un servidor COM potencial para el apodo de elevación! Nombre: Clase CTapiLuaLib CLSID: {03e15b2e-cca6-451c-8fb0-1e2ee37a27dd} Cadena localizada: @%systemroot%system32tapiui.dll,-1 Habilitado: 1 Referencia de icono: @%systemroot%system32tapiui.dll,-201 Activar: Éxito PID: 440 DllHost.exe [+]........................[+]
Una vez que haya descubierto candidatos potenciales para UAC Bypass, puede comenzar a investigarlos. Como excelente plantilla para ejecutar Elevation Moniker, puede utilizar esta función o este programa.
ClsidExplorer le permite recuperar información sobre un CLSID específico. El programa genera los siguientes datos:
AppID
: ID de aplicación de un objeto COM específico;
ProgID
: ProgID de un objeto COM específico;
PID
: PID en el que se ejecuta este objeto COM;
Process Name
: el nombre del proceso PID;
Nombre de Username
: nombre del usuario en cuyo nombre se ejecuta el proceso;
Methods
: métodos disponibles del objeto COM. Hecho analizando TypeLib.
PD A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe -h CLSIDExplorer.exe: identifica toda la información por clsid Uso: .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"
El programa acepta sólo un argumento:
--clsid
- objetivo CLSID para analizar
PD A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"[{00000618-0000-0010-8000-00aa006d2ea4}] ID de aplicación: Desconocido ID de programa: Desconocido PID: 1572 Nombre del proceso: CLSIDExplorer.exe Nombre de usuario: WINPCMichael Métodos: [0] __stdcall void QueryInterface(EN GUID*, FUERA void**) [1] __stdcall AddRef largo sin firmar() [2] __stdcall Lanzamiento largo sin firmar() [3] __stdcall void GetTypeInfoCount(OUT int sin firmar*) [4] __stdcall void GetTypeInfo(IN int sin firmar, IN sin firmar largo, OUT void**) [5] __stdcall void GetIDsOfNames(IN GUID*, IN char**, IN unsigned int, IN unsigned long, OUT long*) [6] __stdcall void Invoke(IN long, IN GUID*, IN unsigned long, IN unsigned short, IN DISPPARAMS*, OUT VARIANT*, OUT EXCEPINFO*, OUT unsigned int*) [7] __stdcall Nombre BSTR() [8] __stdcall void Nombre (EN BSTR) [9] __stdcall RightsEnum GetPermissions(EN VARIANTE, EN ObjectTypeEnum, EN VARIANTE) [10] __stdcall void SetPermissions(EN VARIANTE, EN ObjectTypeEnum, EN ActionEnum, EN RightsEnum, EN InheritTypeEnum, EN VARIANTE) [11] __stdcall void Cambiar contraseña (EN BSTR, EN BSTR) [12] __stdcall Grupos* Grupos() [13] __stdcall Propiedades* Propiedades() [14] __stdcall _Catalog* ParentCatalog() [15] __stdcall void ParentCatalog(EN _Catalog*) [16] __stdcall void ParentCatalog (EN _Catalog*) [FIN]
Este programa es excelente para verificar una clase COM descubierta con ComTraveller
, PermissionHunter
o MonikerHound
en busca de métodos interesantes de los que se pueda abusar.
ComTraveller: esta herramienta le permite explorar todos los objetos COM disponibles. En primer lugar, le permite identificar rápidamente objetos COM con valores interesantes (RunAs Interactive User), disponibilidad de TypeLib y capacidades de activación entre sesiones. Por lo tanto, puede detectar rápidamente objetos de los que se pueden crear instancias en otra sesión de usuario, lo que lleva a una escalada de privilegios.
PD A:SSDgitrepoCOMThanasiaComTravellerx64Debug> .ComTraveller.exe -h ,,_ zd$$??= z$$P? F:`c, _ d$$, `c'cc$$i ,cd$?R $$$$ cud$,?$$$i ,=P"2?z " $" " ?$$$, ?$$$. ,-''`>, bzP 'cLdb,?$$,?$$$ ,h' "I$'J$P ... `?$$$,"$$,`$$h $$PxrF'd$"d$PP""?-,"?$$,?$h`$$,,$$'$F44 "?,,_`=4c,?=,"?hu?$`?L4$'? ' `""?==""=-"" `""-`'_,,,, .ccu?m?e?JC,-,"=? """=='?"ComTraveller: pequeña herramienta para analizar y extraer información sobre todos los CLSID registrados en el sistemaUso:--archivo: nombre del archivo de salida. Valor predeterminado: salida.csv--de : comience a explorar clsids desde este clsid. (por ejemplo, enumeración predeterminada del 1 al 9. con --de 4 será del 4 al 9)--session : úselo si desea verificar la activación entre sesiones en una sesión específica. Útil solo con 'Ejecutar como objetos COM de usuario interactivos'--objetivo - analiza este CLSID-h/--ayuda - muestra esta pantalla
--file
: nombre del archivo al que se enviará la información sobre los objetos COM;
--from
: hay muchos CLSID en un sistema Windows. Si no desea que la herramienta busque todos los CLSID comenzando desde el primero, puede especificar el CLSID con el que comenzar, por ejemplo, --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--session
- intenta crear una instancia de un objeto en la sesión de otra persona
--target
: analiza solo un clsid objetivo
Ejemplo:
.ComTraveller.exe --archivo rep.csv --sesión 1
Después de eso, encontrará un archivo rep.csv con información sobre los objetos COM. Hay varias columnas aquí:
CLSID
: CLSID del objeto COM;
AppId
: APPID del objeto COM;
ProgId
: APPID del objeto COM;
RunAs
: valor en el registro RunAs. Si el valor es The Interactive User
o NT AUTHORITYSYSTEM
, puede intentar crear LPE;
Nombre de Username
: nombre del usuario en cuyo nombre se ejecuta el objeto COM;
PID
: el PID en el que se ejecuta el objeto COM;
ProcessName
: nombre del proceso en el que se ejecuta el objeto COM;
HasTypeLib
: si el objeto COM tiene TypeLib. Si es así, puede entregar este objeto a ClsidExplorer
para ver los métodos disponibles;
canCrossSessionActivate
: si es posible abusar de esta clase COM para LPE mediante la activación en la sesión de otra persona. Si el valor es +
o el error es ACCESS DENIED
, este podría ser un candidato potencial para LPE.
Por ejemplo, si aplica filtros, inmediatamente encontrará clases COM interesantes :) Vaya, ¿es esta una clase COM que se puede activar entre sesiones y funciona en nombre del sistema?
Cabe señalar que el programa puede fallar debido a la abundancia de objetos COM. En este caso, puedes reiniciarlo así:
.ComTraveller.exe --archivo rep.csv --sesión 1 --de "{0006F071-0000-0000-C000-000000000046}"