Disclosure report Zyxel CVE-2024-7203

In questo articolo verrà illustrato il disclosure report della CVE-2024-7203 rilasciata recentemente da Zyxel. Alessandro Sgreccia e Manuel Roccon del team Hackerhood hanno identificato questa vulnerabilità nei prodotti Zyxel e il 15/07/2024 è stato inviato il disclosure a Zyxel.

Zyxel in seguito ha assegnato la CVE-2024-7203 con severity 7.2 classificata come post-authenticated RCE; Zyxel poi ha rilasciato la patch il 02/09/2024.

https://nvd.nist.gov/vuln/detail/CVE-2024-7203

Chi siamo
All’interno della comunità Red Hot Cyber, prende forma l’iniziativa “HackerHood”. Si tratta di un gruppo di hacker etici appassionati di divulgazione e condivisione, che hanno accettato di aumentare la consapevolezza del rischio informatico, attraverso una serie di iniziative pratiche.
Hackerhood, svolge attività di bug hunting su una serie eterogenea di prodotti IT al fine di aumentare la consapevolezza del rischio e migliorare l’ecosistema in cui viviamo.

Il report seguente è una versione più semplificata rispetto al report inviato a Zyxel, nella parte sottostante è possibile scaricare il report originale.

CWE-78: Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’)

Product Line: ZYWALL
Versione vulnerabile: from 4.60 (EBL) to 5.38 (Tested)
Riepilogo: Remote Command Execution by ZYSH CLI injection
Prerequisiti: Utente con permessi di admin

Introduzione
Durante la nostra valutazione di routine di ZLD, abbiamo identificato una funzionalità vulnerabile a OS Command Injection. Questa vulnerabilità consente di compromettere l’intero dispositivo tramite iniezione di codice.

Le seguenti funzionalità sono interessate da questa vulnerabilità:

  • IP Reputation: questa funzione valuta la reputazione degli indirizzi IP, identificando e bloccando quelli associati ad attività dannose per migliorare la sicurezza della rete.
  • Filtro minacce URL: questo filtro analizza e blocca gli URL noti pericolosi o sospetti, salvaguardando gli utenti dai siti Web dannosi.

Sia IP Reputation che URL Threat Filter permettono di caricare elenchi da fonti esterne via http/https.

In che modo è vulnerabile l’External Block List?
Nel tentativo di comprendere meglio come sfruttare questa funzionalità, abbiamo provato sia la configurazione GUI che quella CLI.

Configurazione GUI
Questo è un esempio di come l’EBL dovrebbe essere configurato tramite la GUI.

I valori “name” e “description” devono essere stringhe, mentre source deve contenere l’URL in cui si trova il potenziale file contenente gli URL da caricare.

CLI Configuration

Analisi vulnerabilità

Salvando la configurazione compilata precedentemente, viene avviato lo script responsabile del caricamento del file dal potenziale server esterno.
Come ce ne siamo accorti? Configurando un server locale per ascoltare e osservare la richiesta in tempo reale arrivate.

Ciò che ci ha portato alla scoperta della vulnerabilità è stata l’analisi di ciò che il sistema eseguiva in background.
Questa analisi è stata resa possibile dal comando “ps” integrato in ZYSH, che può essere richiamato tramite:

debug system ps

Utilizzando il filtro “match”, integrato anche in ZYSH, abbiamo filtrato l’output:

Output:

python /etc/reputation-ebl/extbl_sig_update.pyc http://12.12.12.12/file.txt tAK98UoTtH5ttzm test ip 94

Injection del codice

L’idea era di aggiungere un carattere di “escape” al parametro sorgente con obbiettivo di accodare un secondo comando, pratica comune di exploiting quando i parametri inseriti vengono utilizzati per lanciare comandi shell locali dal sistema.

Il primo tentativo tramite GUI non ha avuto successo a causa di controlli sul input da parte di Javascript.

Tuttavia, tramite CLI, non abbiamo riscontrato lo stesso controllo e il comando è stato accettato correttamente:

Come si può vedere nello screenshot seguente, il comando viene eseguito con “;” seguito da “test”.

RCE (Remote Code Execution)

Il primo tentativo è stato quello di lanciare comandi di sistema. Nello specifico:

  • id
  • pwd
  • ls

Tutti sono stati eseguiti con successo.

Poiché lo script python viene eseguito come utente root, anche i comandi accodati vengono eseguiti con gli stessi privilegi.

Reverse Shell via Uploaded File
Ottenere una reverse shell non è stato difficile.

Avendo l’account di admin, come requisito per questo exploit, è stato sufficiente caricare un file shell tramite FTP ed eseguirlo tramite l’iniezione.

Il file FTP viene caricato automaticamente con permessi di esecuzione (“x”), quindi è stato sufficiente lanciare il seguente comando accodato al url tramite i caratteri di escape visti in precendenza per ottenere la reverse shell.

Inoltre, da un analisi successiva, è possibile sfruttare una richiesta diretta POST a ZYSH-CGI per poter ottenere lo stesso risultato, bypassando i controlli javascript nel frontend.

Ovviamente dopo aver effettuato il login o recuperare il cookie di autenticazione. (di seguito un estratto dello script)

Script Python PoC che invia una richiesta POST a https://redacted/cgi-bin/zysh-cgi con il payload creato:

Scarica il report completo

References
ZYXEL External Block List: V4.60 External Black List — Zyxel Community
ZYXEL IP Reputation/URL Threat filter Overview : Zyxel Online Web Help

Tags:

No responses yet

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *