Com esta ferramenta você poderá detectar:
Controle de acesso incorreto a um objeto COM (LaunchPermission , AccessPermission) - LPE por meio de métodos COM abusivos, retransmissão de autenticação DCOM. Isso é PermissionHunter
.
Direitos de registro incorretos para um objeto COM - LPE por meio de COM Hijacking. Esse é ComDiver
.
Encontre o novo moniker de elevação - UAC Bypass. Esse é MonikerHound
.
Obtenha informações detalhadas sobre um CLSID específico - Inspecione o objeto COM para encontrar métodos COM abusivos. Isso é ClsidExplorer
.
Verifique a ativação entre sessões em nome de um usuário com poucos privilégios - Tentativa de instanciar um objeto na sessão de outra pessoa para LPE. Esse é ComTraveller
.
Se tivéssemos publicado esta ferramenta há alguns meses (por exemplo, primavera de 2024), você teria descoberto CVE-2024-38100 (FakePotato) e CVE-2024-38061 (SilverPotato).
Comece a usar esta ferramenta e você encontrará mais maneiras de elevar privilégios em sistemas Windows. É como um OleViewDotnet automatizado :)
PermissionHunter é uma ferramenta que permite examinar LaunchPermission e ActivatePermission em todos os objetos COM no sistema.
PS R:mzhmo> .PermissionHunter.exe -h , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. ` PermissionHunter - procure por LaunchPermission e ActivatePermission incorretos Equipe de pesquisa CICADA8 De Michael Zhmaylo (MzHmO)PermissionHunter.exeFerramenta pequena que permite encontrar objetos COM vulneráveis com LaunchPermission e ActivatePermission[OPTIONS]-outfile incorretos: nome do arquivo de saída-outformat: formato de saída. Aceito 'csv' e 'xlsx'-h/--help: mostra esta janela
Existem apenas dois argumentos aqui:
-outfile
- nome do arquivo com o relatório de direitos;
-outformat
- formato do arquivo com o relatório, você pode gerar tanto em csv quanto em xlsx. É melhor produzir em csv, pois se você não tiver Excel, não conseguirá produzir em formato xlsx.
Exemplo:
PS R:mzhmo> .PermissionHunter -outfile resultado -outformat xlsx , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. ` PermissionHunter - busca por LaunchPermission e ActivatePermission incorretos Equipe de pesquisa CICADA8 De Michael Zhmaylo (MzHmO)[+] O resultado será em resultado, formato xlsx[+] Sucesso
Depois disso, você obterá um arquivo result.xlsx, que listará todos os direitos dos objetos COM existentes.
Eu produzo as seguintes colunas:
ApplicationID
- ApplicationID de um objeto COM específico. Ex: {69AD4AEE-51BE-439b-A92C-86AE490E8B30}
;
ApplicationName
- ApplicationName de um objeto COM específico. Ex: Background Intelligent Transfer Service
;
RunAs
- Chave de registro RunAs de um objeto COM. Ex: Interactive User
;
LaunchAccess
, LaunchType
, LaunchPrincipal
, LaunchSid
- chave de registro LaunchPermission. LaunchPrincipal especifica o usuário que possui direitos LaunchAccess para o objeto COM. LaunchType - tipo de ACE: habilitando ou desabilitando. LaunchSID - SID do LaunchPrincipal. Ex:
Lançamento local. Lançamento remoto. Ativação Local. Acesso de ativação remota permitido NT AUTHORITYSYSTEM S-1-5-18
Isso significa que o sistema possui permissões LocalLaunch, RemoteLaunch, LocalActivation, RemoteActivation neste objeto COM;
AccessAccess
, AccessType
, AccessPrincipal
, AccessSID
- os campos têm o mesmo significado que LaunchPermissions, apenas no contexto de AccessPermission;
AuthLevel
, ImpLevel
- Nível de autenticação e nível de representação. Por padrão, eles são definidos como RPC_C_AUTHN_LEVEL_CONNECT
e RPC_C_IMP_LEVEL_IDENTIFY
;
CLSIDs
- CLSIDs de objetos COM.
Se você encontrar um objeto COM que possa acessar em nome de um usuário com poucos privilégios, por exemplo, poderá abusar dele da seguinte maneira:
Crie uma instância e chame os métodos desse objeto COM para, por exemplo, escrever um arquivo arbitrário em nome do sistema. Por exemplo, você encontrou um objeto COM com um método DeployCmdShell()
executado em nome da conta NT AUTHORITYSYSTEM
e possui LaunchPermissions
e AccessPermissions
. Você pode iniciar este objeto COM, chamar o método DeployCmdShell()
e obter a execução do código em nome do sistema. Você pode visualizar os métodos disponíveis usando ClsidExplorer
.
Abuse da autenticação DCOM. Para isso, veja RemoteKrbRelay
Todas as informações sobre objetos COM estão no registro. Mas e se o registro estiver incorreto? Nesse caso, temos a possibilidade de substituir as configurações COM, por exemplo, para sequestrar o arquivo executável.
Esta ferramenta permite detectar tais vulnerabilidades e verifica o registro de acordo com a prioridade das chaves que são visualizadas ao procurar objetos COM. Dessa forma, você pode até encontrar Shadow COM Hijacking. A prioridade é a seguinte:
1. HKCUSoftwareClasses(GUID)TreatAs 2. HKLMSoftwareClasses(GUID)TreatAs 3. HKCUSoftwareClasses(GUID)InprocServer32 4. HKLMSoftwareClasses(GUID)InprocServer32 5. HKCUSoftwareClasses(GUID)LocalServer32 6. HKLMSoftwareClasses(GUID)LocalServer32
Assim emergem pelo menos dois vetores de escalada de privilégios:
Se tivermos permissões de gravação em HKCU...TreatAs
, e o executável COM original estiver em HKCU...LocalServer32
, então podemos fazer Shadow COM Hijacking gravando nosso executável em HKCU..TreatAs
.
Se o objeto COM estiver em HKCU..LocalServer32
e pudermos escrever em HKCU..LocalServer32
, então poderemos fazer COM Hijacking
Vamos dar uma olhada mais de perto na ferramenta:
PS A:ssdgitrepoCOMThanasiaComDiverx64Debug> .ComDiver.exe -h / o ^ o / ( ) / ____________(%%%%%%%)____________ ( / / )%%%%%%%( ) (___/___/__/ ________) ( / /(%%%%%%%) ) (__/___/(%%%%%%%) _____) /( ) /(%%%%%) (%%%) !---------- COM DIVER -------------- [?] Pequena ferramenta para verificar registros inseguros e permissões de disco em objetos COM [?] ARGS -h/--help <- mostra esta mensagem --from<- analisa CLSIDs deste clsid --target <- analisa um clsid de destino --no-context <- não verifique outro contexto do servidor COM. Apenas análise de registro. --no-create <- não cria objeto COM de destino. Este é o modo mais rápido
Aceita os seguintes argumentos:
--from
- existem muitos CLSIDs em um sistema Windows. Se não quiser que a ferramenta examine todos os CLSIDs começando pelo primeiro, você pode especificar o CLSID para começar, por exemplo, --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--target
- analisa clsid específico;
--no-context
- não verifica o nome do usuário em cujo nome o objeto COM é iniciado;
--no-create
- para não criar um objeto COM que foi detectado. Isso limita as informações que você pode obter sobre isso. No entanto, esta é a maneira mais rápida de examinar apenas os direitos de registro.
Exemplo:
.ComDiver.exe --no-create
Neste caso podemos ver que não há chaves dentro do HKCU e temos permissões de gravação para essas chaves. Conseqüentemente, se escrevermos nosso próprio valor nesse caminho, faremos COM Hijacking.
Se você vir linhas vermelhas na saída da ferramenta, esta é uma forma potencial de abusar de um objeto COM! Você pode executar o COM Hijacking (falsificar um executável existente) ou Shadow COM Hijacking (falsificar um executável ausente). Leia mais sobre sequestro de COM aqui
Existe uma maneira integrada de ignorar o UAC em um sistema Windows, isso é feito por meio do Elevation Moniker. Você pode ler mais sobre isso aqui. Esse tipo de UAC Bypass requer uma forma não padrão de registrar o objeto COM no registro, que é bastante fácil de rastrear. Portanto, você pode usar minha ferramenta para encontrar novas formas de ignorar o UAC.
Exemplo:
PS R:ssdgitrepoCOMThanasiaMonikerHoundx64Debug> .MonikerHound.exe ,_ _ _, oo/ ,(.-.), _/ |) (| _ /=-=/ ,| =/ |, _/ | / _ _!_/ MonikerHound - encontre seu próprio desvio UAC! Equipe de Pesquisa CICADA8 De Michael Zhmaylo (MzHmO) [+] Potencial servidor COM para moniker de elevação encontrado!Nome: CEIPLuaElevationHelper CLSID: {01D0A625-782D-4777-8D4E-547E6457FAD5} LocalizedString: @%systemroot%system32werconcpl.dll,-351 Habilitado: 1 Referência de ícone: @%systemroot%system32werconcpl.dll,-6 Ativar: Sucesso PID: 15800 DllHost.exe [+]........................[+] [+] Potencial servidor COM para moniker de elevação encontrado!Nome: Classe CTapiLuaLib CLSID: {03e15b2e-cca6-451c-8fb0-1e2ee37a27dd} LocalizedString: @%systemroot%system32tapiui.dll,-1 Habilitado: 1 Referência de ícone: @%systemroot%system32tapiui.dll,-201 Ativar: Sucesso PID: 440 DllHost.exe [+]........................[+]
Depois de descobrir possíveis candidatos para o UAC Bypass, você pode começar a verificá-los. Como um ótimo modelo para executar o Elevation Moniker, você pode usar esta função ou este programa.
ClsidExplorer permite recuperar informações sobre um CLSID específico. O programa gera os seguintes dados:
AppID
- ApplicationID de um objeto COM específico;
ProgID
- ProgID de um objeto COM específico;
PID
- PID no qual este Objeto COM está rodando;
Process Name
- o nome do processo PID;
Username
- nome do usuário em cujo nome o processo está sendo executado;
Methods
- métodos disponíveis do objeto COM. Feito analisando TypeLib.
PS A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe -h CLSIDExplorer.exe - identifique todas as informações por clsid Uso: .CLSIExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"
O programa aceita apenas um argumento:
--clsid
- alvo CLSID para analisar
PS R:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"[{00000618-0000-0010-8000-00aa006d2ea4}] ID do aplicativo: desconhecido ProgID: Desconhecido ID: 1572 Nome do processo: CLSIExplorer.exe Nome de usuário: WINPCMichael Métodos: [0] __stdcall void QueryInterface(IN GUID*, OUT void**) [1] __stdcall não assinado longo AddRef() [2] __stdcall Release longo não assinado() [3] __stdcall void GetTypeInfoCount(OUT unsigned int*) [4] __stdcall void GetTypeInfo(IN unsigned int, IN unsigned long, 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 Nome BSTR() [8] __stdcall nome vazio (IN BSTR) [9] __stdcall RightsEnum GetPermissions(IN VARIANT, IN ObjectTypeEnum, IN VARIANT) [10] __stdcall void SetPermissions(IN VARIANT, IN ObjectTypeEnum, IN ActionEnum, IN RightsEnum, IN InheritTypeEnum, IN VARIANT) [11] __stdcall void ChangePassword(IN BSTR, IN BSTR) [12] __stdcall Grupos* Grupos() [13] Propriedades __stdcall* Propriedades() [14] __stdcall _Catalog* ParentCatalog() [15] __stdcall void ParentCatalog(IN _Catalog*) [16] __stdcall void ParentCatalog(IN _Catalog*) [FIM]
Este programa é ótimo para verificar uma classe COM descoberta com ComTraveller
ou PermissionHunter
ou MonikerHound
em busca de métodos interessantes que possam ser abusados.
ComTraveller - esta ferramenta permite explorar todos os objetos COM disponíveis. Primeiro, ele permite identificar rapidamente objetos COM com valores interessantes (usuário interativo RunAs), disponibilidade de TypeLib e recursos de ativação entre sessões. Assim, você pode detectar rapidamente objetos que podem ser instanciados em outra sessão de usuário, levando ao escalonamento de privilégios.
PS R: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 - pequena ferramenta para analisar e extrair informações sobre todos os CLSIDs registrados no systemUsage:--file
--file
- nome do arquivo para o qual serão geradas as informações sobre os objetos COM;
--from
- existem muitos CLSIDs em um sistema Windows. Se não quiser que a ferramenta examine todos os CLSIDs começando pelo primeiro, você pode especificar o CLSID para começar, por exemplo, --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--session
- tenta instanciar um objeto na sessão de outra pessoa
--target
- analisa apenas um clsid de destino
Exemplo:
.ComTraveller.exe --file rep.csv --sessão 1
Depois disso você encontrará um arquivo rep.csv com informações sobre objetos COM. Existem várias colunas aqui:
CLSID
- CLSID do objeto COM;
AppId
- APPID do objeto COM;
ProgId
- APPID do objeto COM;
RunAs
– valor no registro RunAs. Se o valor for The Interactive User
ou NT AUTHORITYSYSTEM
, você pode tentar fazer LPE;
Username
- nome do usuário em cujo nome o objeto COM é executado;
PID
- o PID no qual o objeto COM está rodando;
ProcessName
- nome do processo no qual o objeto COM está sendo executado;
HasTypeLib
- se o objeto COM possui TypeLib. Nesse caso, você pode fornecer esse objeto ao ClsidExplorer
para ver os métodos disponíveis;
canCrossSessionActivate
- se é possível abusar desta classe COM para LPE através da ativação na sessão de outra pessoa. Se o valor for +
ou o erro for ACCESS DENIED
, este poderá ser um candidato potencial para LPE.
Por exemplo, se você aplicar filtros, encontrará imediatamente classes COM interessantes :) Uau, essa é uma classe COM que pode ser ativada entre sessões e funciona em nome do sistema?
Deve-se observar que o programa pode travar devido à abundância de objetos COM. Neste caso, você pode reiniciá-lo assim:
.ComTraveller.exe --file rep.csv --sessão 1 --from "{0006F071-0000-0000-C000-000000000046}"