Zum Inhalt springen
Kommendes Webinar: Entfesseln Sie die Kraft von Censys Search mit Em Averton | 27. Juni um 1PM ET | Jetzt anmelden
Blogs

Pulse Connect Secure: Ein Blick aus dem Internet

Einführung

Pulse Connect Secure ist eine kostengünstige und weit verbreitete SSL-VPN-Lösung für Remote- und mobile Benutzer. Im Laufe der Jahre haben Forscher mehrere erhebliche Schwachstellen in der Serversoftware gefunden, von denen einige sogar zur aktiven Ausnutzung kritischer Infrastrukturen durch böswillige Bedrohungsakteure führten. Im April 2021 veröffentlichte die CISA einen Bericht, in dem einige dieser Aktivitäten beschrieben wurden, darunter die Ausnutzung mehrerer (damals) unbekannter Schwachstellen, was zu einem raschen Handeln von Ivanti, dem Entwickler der Pulse Connect Secure-Software, führte.

In diesem Beitrag versuchen wir, ein Bild vom aktuellen Stand der anfälligen Pulse Connect Secure-Geräte zu zeichnen, die noch im Internet betrieben werden. Im ersten Abschnitt werden wir sieben verschiedene von Pulse Secure veröffentlichte Sicherheitshinweise behandeln, während wir im zweiten Teil des Artikels auf die Techniken eingehen, die wir zur Identifizierung und Versionierung dieser Dienste verwendet haben.

Pulse Connect-Sicherheitshinweise: Ein Blick ins Internet

Insgesamt hatCensys 30.266 Pulse Connect Secure-Hosts gefunden, die im Internet laufen. Eine der einfachsten Möglichkeiten, diese mit Censys zu finden, ist die Suche nach einer bestimmten URI, die im HTTP-Antwortkörper eines Pulse Connect Secure-Webdienstes gefunden werden kann.

services.http.response.body: `/dana-na/`

Von den betroffenen Rechnern wurden 4.460 als Rechner identifiziert, auf denen eine Softwareversion läuft, die durch einen oder mehrere der sieben von uns überprüften Sicherheitshinweise gefährdet ist. In diesem Beitrag werden die einzelnen Sicherheitshinweise, die entsprechenden Hosts und die zugehörigen Dienste beschrieben.

Aufschlüsselung nach Sicherheitshinweisen

Im Folgenden finden Sie eine Aufschlüsselung der einzelnen Sicherheitshinweise, die wir untersucht haben, und die Anzahl der Hosts, die für den jeweiligen Hinweis anfällig sind. Beachten Sie, dass diese Zahlen von der Gesamtzahl der gefährdeten Hosts abweichen, da ein einzelner Host für mehrere Sicherheitshinweise anfällig sein kann.

SA44858 hat zwar die höchste Anzahl von Hosts im Internet (3.528 Hosts), ist aber bei weitem nicht die schlimmste der Sicherheitslücken, da die mit SA44858 verbundenen CVEs ein gültiges Konto erfordern, um die Schwachstelle auszunutzen. Das größere Problem stellt SA44784 dar, die CVE-2021-22893 enthält, eine Sicherheitslücke zur Umgehung der Authentifizierung, die es einem nicht authentifizierten Benutzer ermöglicht, Remotecode auf Pulse Connect Secure-Geräten auszuführen. Censys hat anfällige Versionen auf 1.841 Hosts mit Internetanschluss beobachtet. Im April 2021 berichteten Rapid7 und Mandiant, dass diese Sicherheitslücke genutzt wurde, um aktiv Malware zu installieren, die Anmeldedaten von anfälligen Pulse Connect-Hosts abfing.

Pulse-Sicherheitshinweis (SA) Datum der Veröffentlichung Verwandte CVEs Gefährdete Hosts
SA43604 Januar 2018
CVE-2018-5299 KRITISCH
28
SA43877 August 2018
CVE-2018-0486 MEDIUM
CVE-2018-14366 MEDIUM
CVE-2018-6320 KRITISCH
770
SA44101 April 2019
CVE-2019-11507 MEDIUM
CVE-2019-11508 HOCH
CVE-2019-11509 HOCH
CVE-2019-11510 KRITISCH
CVE-2019-11538 HOCH
CVE-2019-11539 HOCH
CVE-2019-11540 KRITISCH
CVE-2019-11541 HOCH
CVE-2019-11542 HOCH
CVE-2019-11543 MEDIUM
890
SA44516 Juli 2020
CVE-2020-8206 HOCH
CVE-2020-8218 HOCH
CVE-2020-8221 MEDIUM
CVE-2020-8222 MEDIUM
CVE-2020-8219 HOCH
CVE-2020-8220 MEDIUM
CVE-2020-12880 MEDIUM
CVE-2019-11507 HOCH
CVE-2020-8204 MEDIUM
CVE-2018-19519 MEDIUM
CVE-2020-8217 MEDIUM
CVE-2020-8216 MEDIUM
CVE-2020-15408 MEDIUM
571
SA44588 September 2020
CVE-2020-8243 HOCH
CVE-2020-8238 MEDIUM
CVE-2020-8256 MEDIUM
571
SA44784 April 2021
CVE-2021-22893 KRITISCH
CVE-2021-22894 KRITISCH
CVE-2021-22899 KRITISCH
CVE-2021-22900 HOCH
1,841
SA44858 August 2021
CVE-2021-22937 HOCH
CVE-2021-22933 MEDIUM
CVE-2021-22934 HOCH
CVE-2021-22935 HOCH
CVE-2021-22936 MEDIUM
CVE-2021-22938 HOCH
3,528

 

Aufschlüsselung nach Ländern (Top 20)

Das folgende Diagramm zeigt das Verhältnis zwischen den von uns identifizierten Versionen, die durch einen Sicherheitshinweis gefährdet sind (grün), und den Versionen, die nicht gefährdet sind (blau). Die Vereinigten Staaten weisen mit 8.575 Hosts die größte Gesamtzahl an Pulse Connect-Installationen auf, aber nur 12 % haben eine Version, die für eine oder mehrere der sieben von uns analysierten Sicherheitsempfehlungen anfällig ist. In Frankreich gibt es dagegen nur 1.422 Pulse Connect-Geräte im Internet, aber auf etwas mehr als 30 % von ihnen läuft eine Version, die für eine der sieben von uns untersuchten Meldungen anfällig ist.

Land Nicht verwundbare Hosts Gefährdete Hosts Hosts insgesamt
Vereinigte Staaten 7,542 (87.95%) 1,033 (12.05%) 8,575
Japan 2,281 (75.63%) 735 (24.37%) 3,016
Vereinigtes Königreich 1,580 (91.07%) 155 (8.93%) 1,735
Deutschland 1,587 (92.21%) 134 (7.79%) 1,721
Frankreich 987 (69.41%) 435 (30.59%) 1,422
China 860 (72.39%) 328 (27.61%) 1,188
Südkorea 808 (77.99%) 228 (22.01%) 1,036
Taiwan 707 (78.99%) 188 (21.01%) 895
Niederlande 818 (93.7%) 55 (6.3%) 873
Spanien 710 (93.18%) 52 (6.82%) 762
Hongkong 484 (75.98%) 153 (24.02%) 637
Kanada 523 (85.32%) 90 (14.68%) 613
Schweden 509 (88.99%) 63 (11.01%) 572
Indien 524 (92.25%) 44 (7.75%) 568
Australien 501 (90.6%) 52 (9.4%) 553
Belgien 455 (85.85%) 75 (14.15%) 530
Singapur 477 (92.2%) 46 (8.8%) 523
Schweiz 444 (85.55%) 75 (14.45%) 519
Israel 423 (97.45%) 11 (2.53%) 434
Finnland 376 (95.43%) 18 (4.57%) 394

Aufschlüsselung nach autonomen Systemen (Top 20)

AS Nicht verwundbare Hosts Gefährdete Hosts Hosts insgesamt
France Telecom - Orange 334 (48.69%) 352 (51.31%) 686
AMAZON-O2 596 (91.55%) 55 (8.45%) 651
MICROSOFT-CORP-MSN-AS-BLOCK 604 (93.21%) 44 (6.79%) 648
OCN NTT Communications Corporation 491 (84.51%) 90 (15.45%) 581
AKAMAI-ASN1 575 (100%) 0 (0.0%) 575
TELEFONICA_DE_ESPANA 478 (97.55%) 12 (2.45%) 490
HINET Geschäftsgruppe Datenkommunikation 284 (71.36%) 114 (28.64%) 398
KDDI AKTIENGESELLSCHAFT 206 (54.93%) 169 (45.07%) 375
CLARANET-AS ClaraNET LTD 362 (96.53%) 13 (3.47%) 375
UUNET 318 (90.86%) 32 (9.14%) 350
UCOM ARTERIA Networks Gesellschaft 251 (72.33%) 96 (27.67%) 347
AS17054 75 (21.61%) 272 (78.39%) 347
IS 306 (96.23%) 12 (3.77%) 318
DTAG Internet Service Provider Betrieb 278 (88.25%) 37 (11.75%) 315
ATT-INTERNET4 238 (85.3%) 41 (14.7%) 279
KIXS-AS-KR Korea Telecom 214 (77.26%) 63 (22.74%) 277
PRUASN 259 (100%) 0 (0.0%) 259
COMCAST-7922 205 (83.67%) 40 (16.33%) 245
NETDEPON 236 (99.16%) 2 (0.84%) 238
LGDACOM LG DACOM Gesellschaft 167 (81.46%) 38 (18.54%) 205

Aufschlüsselung nach Version (Top 20)

Die meisten eingesetzten Pulse Connect-Versionen sind für keine der von uns untersuchten Sicherheitshinweise anfällig. Die am weitesten verbreitete Version ist 9.1.14.18105 (9.1R14) mit 3.177 Hosts, die diese Version verwenden, dicht gefolgt von 9.1.15.18393 (9.1R15) mit 2.319 Hosts, die beide nicht anfällig sind.

Version Hat Vulnerabilität? Hosts
9.1.14.18105 Nein 3,177
9.1.15.18393 Nein 2,319
9.1.12.14139 Nein 2,026
8.3.7.65025 Nein 1,699
9.1.13.15339 Nein 1,530
9.1.14.16847 Nein 923
9.1.11.12319 Ja (SA44784) 887
9.1.14.21347 Nein 857
9.1.15.21389 Nein 789
9.1.13.16253 Nein 701
9.1.13.18121 Nein 583
9.1.11.13127 Ja (SA44858) 573
8.1.15.59747 Nein 395
9.1.9.9701 Ja (SA44784, SA44858) 358
9.1.12.15299 Nein 352
9.1.8.8511 Ja (SA44784, SA44858) 211
9.0.5.64107 Ja (SA44784, SA44858) 166
8.2.12.64003 Nein 162
9.1.11.12173 Ja (SA44858) 145
9.1.4.4763 Ja (SA44516, SA44588, SA44784, SA44858) 108

Fingerabdrücke Pulse Connect Secure

Einführung

In der Vergangenheit haben wir bei der Aktualisierung und Freigabe von Software festgestellt, dass die neuen Versionen sichtbare Unterschiede zu den Vorgängerversionen aufweisen. Mit genügend Zeit und genügend Daten können diese (manchmal nuancierten) Unterschiede gefunden und (hoffentlich) genutzt werden, um mit Sicherheit zu sagen, welche Version der Software auf einem Server läuft.

Diese geringfügigen Unterschiede sind beispielsweise häufig im HTTP-Antwortkörper zu erkennen, wenn die Software über HTTP ausgeführt wird, auch wenn dies manchmal auf den ersten Blick nicht eindeutig ist. Meistens werden diese Unterschiede durch externe Tools eingeführt, die den Build- und Deployment-Prozess unterstützen (z. B. Continuous-Integration-Systeme (CI) oder Webpack für Javascript). Diese Systeme generieren automatisch Dateinamen in Formaten, die sich von einem Build zum nächsten ändern können, wenn der Inhalt geändert wurde, so dass letztendlich sichtbare Artefakte entstehen, die die Software eindeutig identifizieren.

In vielen Fällen können wir nur die rohen Hostdaten verwenden, die wir bei unseren Scans sammeln (Banner und Protokollantworten). Aus diesem Grund greifen wir häufig auf Techniken und Methoden zurück, mit denen wir die Software und Dienste, mit denen wir in Berührung kommen, selbst identifizieren können. Noch wichtiger ist, dass wir diese Techniken entwickeln, um unsere tatsächliche langfristige Interaktion mit einem laufenden Dienst auf ein Minimum zu beschränken.

Identifizierung

Im obigen Screenshot der Censys -Suche für einen Pulse Connect-Dienst wurden mehrere Segmente der HTTP-Antwort gelb hervorgehoben. Indikatoren wie diese sind in der Regel eine Kombination aus einem Dateinamen mit einer Reihe zufälliger Zeichen, die wahrscheinlich mit einem Programm wie "sha256sum" generiert werden, das einen SHA256 Message Digest des Dateiinhalts berechnet. Diese Informationen für nur einen Host sind nicht sehr nützlich, aber wenn man einen Schritt zurücktritt und sich die Gesamtheit aller Hosts im Internet ansieht, beginnen sich Muster zu bilden. Wie wir sehen können, enthält Pulse mehrere Beispiele für diese einzigartig gerenderten Artefakte.

Unser primäres Ziel ist es, diese zufällig aussehenden Dateinamen mit einer bestimmten Softwareversion in Verbindung zu bringen. Zunächst müssen wir jedoch feststellen, ob wir die oben genannten Daten überhaupt verwenden können, um bestimmte Versionen zu identifizieren, indem wir alle anderen Instanzen dieses Dienstes, die im Internet laufen, zum Vergleich der Daten aufsuchen. Im Fall von Pulse Connect ist ein gemeinsames Element in der HTTP-Antwort des Dienstes die Zeichenfolge "/dana-na/" (die sowohl im Textkörper als auch in der HTTP-Weiterleitungskette zu finden ist). Mit der folgenden Suchanfrage Censys sollten sich die meisten Pulse Connect-Dienste identifizieren lassen:

services.http.response.body: `/dana-na/`

Sobald dieses Hauptmerkmal gefunden ist, müssen wir herausfinden, wie viele eindeutige Dateinamenanordnungen dieser Daten im Internet existieren. Wenn jeder einzelne Host ein völlig anderes Dateinamensmuster enthält oder wenn jeder Host das gleiche Dateinamensmuster hat, dann ist es unwahrscheinlich, dass dieses Artefakt mit einer bestimmten Version in Verbindung gebracht werden kann. Wir suchen nach einer einigermaßen gleichmäßigen Verteilung von eindeutigen Dateinamen-"Hashes" über mehrere Hosts (je mehr Hosts, desto besser).

Censys Enterprise Data-Kunden sind vielleicht mit unserer BigQuery-Schnittstelle vertraut, mit der Benutzer SQL schreiben können, um Hosts und Services zu untersuchen. Dabei ist die Verwendung von BigQuery wahrscheinlich eine der einfachsten Möglichkeiten, die Frage nach dem Dateinamen zu beantworten. Die folgende Abfrage analysiert diese (scheinbar) zufälligen Dateinamen (file_hash) und zählt die Anzahl der mit ihnen verbundenen Hosts (host_count).


SELECT
  REGEXP_EXTRACT(SAFE_CONVERT_BYTES_TO_STRING(service.http.response.body),
    ".*/dana-na/css/ds_([a-f0-9]{64}.js).*") AS file_hash,
  COUNT(DISTINCT host_identifier.ipv4) AS host_count
FROM
  `censys-io.universal_Internet_dataset.current` main,
  UNNEST(dienste) service
WHERE
  SAFE_CONVERT_BYTES_TO_STRING(service.http.response.body) LIKE '%/dana-na/%'
GROUP BY
  datei_hash
ORDER BY
  host_count DESC

Zum Zeitpunkt der Erstellung dieses Dokuments fand diese Abfrage 159 eindeutige Instanzen des Dateinamens mit dem Präfix "/dana-na/css/ds_". Wir können dann die Ergebnisse dieser Abfrage exportieren und erhalten eine visuelle Darstellung der Verteilung der Dateinamen:

Im obigen Diagramm stellt die x-Achse den Dateinamen "hash" dar, der im HTTP-Antwortkörper gefunden wurde, und die y-Achse stellt die Anzahl der Hosts dar, die diese Zeichenfolge enthielten. Dies bedeutet, dass mehrere Geräte denselben Dateinamen enthalten, was darauf hindeutet, dass es ein Muster gibt, das zu bestimmten Versionen führen könnte.

Der nächste Schritt besteht darin festzustellen, ob es eine Möglichkeit gibt, die tatsächliche Softwareversion zu ermitteln, um sie mit diesen Dateinamen zu verknüpfen. Beim Fingerprinting von GitLab haben wir Skripte geschrieben, um jedes getaggte Image im öffentlichen Docker-Repository von GitLab abzurufen und diese Zuordnung vorzunehmen. Im Fall von Pulse war diese Aufgabe nicht so einfach.

Da VPN-Dienste (in der Regel) einen Zugriff auf administrativer Ebene auf einem Client-Host erfordern, um zu funktionieren, steht die VPN-Client-Software in den meisten Fällen zum Download vom Server zur Verfügung. Bei Pulse Connect ist das nicht anders. Nach einigem Googeln haben Benutzer herausgefunden, dass der Client durch die Anforderung des Pfads "/dana-cached/hc/HostCheckerInstaller.osx" heruntergeladen werden kann.

Bei der Datei "HostCheckerInstaller.osx" handelt es sich um eine ausführbare Datei, die die laufende Softwareversion in einer Konfigurationsdatei mit Voreinstellungen (PLIST) enthält. Wir müssen diese ausführbare Datei herunterladen und den Inhalt durchsuchen, um diese Informationen zu extrahieren. Der folgende Befehl ruft beispielsweise die Binärdatei von einem Pulse Connect-Server ab und gibt die eingebettete Versionszeichenfolge aus.


~$ curl -sk https://HOST:PORT/dana-cached/hc/HostCheckerInstaller.osx \
   -o HostCheckerInstaller.osx && strings HostCheckerInstaller.osx | \
   grep -A1 -m1 'Version'

Wir wollen diese Binärdatei von drei oder mehr Pulse Connect-Servern für jeden eindeutigen Hash herunterladen, den wir mit unserer SQL-Abfrage gefunden haben. Die Idee dabei ist, aus mehr als einer Quelle zu überprüfen, ob es eine direkte Korrelation zwischen diesen Dateinamen und der spezifischen Version von Pulse Connect gibt. Wenn mehrere Hosts dasselbe Dateinamensmuster aufweisen, aber die von jedem Host heruntergeladene Binärdatei eine andere Versionszeichenfolge liefert, wird dies als fehlgeschlagene Korrelation betrachtet.

Um dies zu erreichen, müssen wir die Daten, die wir bereits haben (eine Liste der eindeutigen Dateinamen-Hashes), das Befehlszeilen-Dienstprogramm Censys search und ein wenig Shell-Scripting kombinieren. Wenn wir zum Beispiel herausfinden wollen, welche Version mit dem Dateinamen "/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js">/font> verbunden ist

Wir nehmen einen zufälligen Host in Censys mit dem folgenden Suchbegriff:


services.http.response.body: "/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js"

Suchen Sie den Port und den Dienst, auf den dieses Muster zutrifft, und laden Sie den VPN-Client wie folgt vom Server herunter:

~$ curl -sk https:///dana-cached/hc/HostCheckerInstaller.osx \
  -o HostCheckerInstaller.osx

Finally, search through the downloaded binary by looking for the string “<key>version</key>”, the value of which will be the software version.


~$ strings HostCheckerInstaller.osx | grep -A1 '<key>version</key>'
<key>version</key>
<string>22.2.16.21349</string>

Nachdem wir dies über einige Hosts mit demselben Dateinamensmuster durchgeführt haben, können wir mit einiger Sicherheit sagen, dass es sich bei "ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8" um Pulse Connect Version 22.2.16 build 21349 handelt.

Wir haben dieses Shell-Skript erstellt, das jeden eindeutigen Dateinamen aus der Antwort auf unsere SQL-Abfrage durchläuft, eine Censys Search -Anfrage mit dem Befehlszeilendienstprogramm ausgibt, um nach dem Dateinamensmuster in einem HTTP-Antwortkörper zu suchen, dann vier zufällige Ergebnisse auswählt und die Binärdatei "HostCheckerInstaller.osx" von den Hosts herunterlädt. Der Trick besteht darin, die Ausgabedatei so zu formatieren, dass es einfach ist, den Dateinamen-Hash aus dem Antwortkörper dem Host zuzuordnen, von dem wir ihn heruntergeladen haben.

Sobald das Skript ausgeführt wurde, sollten wir ein Verzeichnis mit Dateien haben, denen das gesuchte Dateinamensmuster vorangestellt ist und denen die IP-Adresse angehängt ist, von der das Skript die Datei heruntergeladen hat. Wir können dann jede Datei durchlaufen und die eingebettete Versionszeichenfolge abrufen:


~$ for file in bins/*; do echo $file; strings $file | grep -A1 -m1 '<key>version</key>'; echo "" ;done
bins/00c5cc1ea977e9c13feb1f8853d034de26b4d079f85005ae990114345940095b__192.168.3.64
<key>version</key>
<string>9.1.5.5460</string>

bins/00c5cc1ea977e9c13feb1f8853d034de26b4d079f85005ae990114345940095b__192.168.100.4
<key>version</key>
<string>9.1.5.5460</string>

Mit diesen Informationen können wir dann einen Bericht über alle gefundenen Versionen erstellen und überprüfen, ob jedes eindeutige Dateinamensmuster, nach dem wir gesucht haben, eine eindeutige Versionszeichenfolge in der heruntergeladenen Datei hat. Zunächst erstellen wir ein kleines Skript, um eine CSV-Datei mit den Versionsdaten für jeden Host zu erzeugen:

#!/usr/bin/env bash
HASHFILE=$1
BINDIR=$2

echo "host,path,version"
while read line; do
    INPATH_STRIPPED=$(echo $line | sed 's/\/dana-na\/css\/ds_//g'| cut -d'.' -f1)
    files=$(find $BINDIR -type f -name "*${INPATH_STRIPPED}*")
    for file in $files; do
        ip=$(echo $file | awk -F'__' '{print $2}')
        v=$(strings $file | grep -A1 -m1 "<key>version</key>" | tail -n 1 | sed 's/<string>//g' | sed 's/<\/string>//g')
        echo "$ip,$line,$v"
    done
done < $HASHFILE

Ein Beispiellauf des obigen Skripts mit den von uns heruntergeladenen Daten sieht wie folgt aus:


~$ bash make_report.sh hashes.txt bins | tee versions.csv
Rechner,Pfad,Version
10.1.2.3,/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js,9.1.14.18105
10.6.1.1,/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js,9.1.14.18105
10.1.2.1,/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js,9.1.14.18105
10.1.1.5,/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js,9.1.14.18105
10.4.9.2,/dana-na/css/ds_d0208775377750cb7eeb6341e70188f7cd46d4fbd2c3e99aa4549d0890d28af8.js,9.1.14.18105

Dann können wir den aggregierten Bericht erstellen, der uns sagt, wie viele Hosts wir für einen einzelnen Pfad überprüft haben. Wie oben erwähnt, laden wir den Client von vier Hosts für jeden einzelnen Pfad herunter, so dass wir für jede Kombination aus Pfad und Version vier übereinstimmende Zeilen erwarten.


~$ cat versions.csv | awk -F, '{print $2","$3}' | sort | uniq -c | sort -nr 
      4 /dana-na/css/ds_fd9c25fc621eb26eb49c16c7028d1bd90cf5f7c1aab102ffc8b7659912a8b20a.js,9.1.9.9189
      4 /dana-na/css/ds_f92149ac6a768f91e748db511ab310d84e7f84512bb3f272c69c94d0d68757db.js,9.1.4.5035
      4 /dana-na/css/ds_f2aacd8bd5408b7c3c1d4633e178ad10de68367f03b366fd194c70a51fbd8621.js,8.1.14.59737

Nachdem wir manuell überprüft haben, dass jeder eindeutige Pfad direkt mit einer Version verknüpft ist (was der Fall ist), können wir eine Schwachstellenmatrix für die Sicherheitshinweise erstellen, an denen wir am meisten interessiert sind.

Um diesen Teil der Arbeit zu erledigen, müssen wir jede Schwachstelle verfolgen, über die wir berichten wollen. Für diesen Beitrag haben wir sieben prominente Pulse Connect-Sicherheitshinweise (SA) analysiert, die jeweils mit einer oder mehreren CVEs verbunden sind:

 

SA43604 Stapel-Pufferüberlauf-Schwachstelle (CVE-2018-5299)
SA43877 Mehrere Sicherheitslücken in Pulse Connect Secure 9.0R1/9.0R2 behoben
SA44101 Mehrere Sicherheitslücken in Pulse Connect Secure 9.0RX behoben
SA44516 Mehrere Sicherheitslücken in Pulse Connect Secure 9.1R8 behoben
SA44588 Mehrere Sicherheitslücken in Pulse Connect Secure 9.1R8.2 behoben
SA44784 Mehrere Sicherheitslücken in Pulse Connect Secure 9.1R11.4 behoben
SA44858 Mehrere Sicherheitslücken in Pulse Connect Secure 9.1R12 behoben

Bevor wir jedoch fortfahren, werden Sie feststellen, dass die Versionsnummern in den Pulse-Sicherheitshinweisen nicht genau mit den Versionsnummern auf den Geräten selbst übereinstimmen. Hier ist zum Beispiel ein Auszug aus einem Pulse Connect Sicherheitshinweis:

Hier sehen wir, dass "8.3R1" von einer bestimmten Schwachstelle betroffen ist; dieses Versionsformat muss zunächst in "8.3.1" umgewandelt werden, um dem Versionsformat zu entsprechen, das wir auf den Hosts finden. Bei näherer Betrachtung fehlt jedoch die letzte Ziffernfolge in unseren Daten, nämlich die "Build-Nummer". Um die Build-Nummer für eine bestimmte Pulse Connect-Version zu erhalten, nutzen wir unsere Google-Kenntnisse, um die Versionshinweise zu finden. Wenn wir zum Beispiel die Build-Nummer für die Version "8.3R1" herausfinden wollten, würden wir in Google nach "Pulse 8.3R1" suchen und nach den Versionshinweisen blättern.

 

Google-Ergebnisse für "Pulse 8.3R1" Anmerkungen zur Veröffentlichung

In diesem Beispiel kann man sagen, dass die anfällige Version "8.3R1" die Build-Nummer "55339" hat und als "8.3.1.55339" formatiert werden kann, um dem zu entsprechen, was auf den Hosts gefunden wird. Diese Build-Nummer ist für die Bestimmung der gepatchten Versionen der Pulse Connect-Software sehr wichtig.

Um eine Schwachstellenmatrix zu erstellen, haben wir ein kleines Python-Skript erstellt, das die "semver"-API verwendet, um Versionen für jede der sieben oben aufgeführten Sicherheitshinweise abzugleichen. Dieses Skript liest unsere CSV-Datei mit eindeutigen Dateipfaden und entdeckten Versionsnummern ein und fügt neue Spalten hinzu, die angeben, für welche Sicherheitshinweise diese Version anfällig ist.

Das obige Skript benötigt zwei Argumente, eine Eingabedatei und eine Ausgabedatei. Das folgende Beispiel zeigt, wie dieses Skript ausgeführt wird. Die Eingabe ist die CSV-Datei, die wir im letzten Abschnitt erstellt haben, und die Ausgabe ist standardmäßig, wird aber ebenfalls in die Datei "vulnerability_matrix.csv" umgeleitet.


~$ python3 parse_version.py path_version.csv /dev/stdout | tee vulnerability_matrix.csv
path,version,SA43604,SA43877,SA44101,SA44516,SA44588,SA44784,SA44858
/dana-na/css/ds_00c5cc1ea977e9c13feb1f8853d034de26b4d079f85005ae990114345940095b.js,9.1.5.5460,False,False,False,True,True,True,True
/dana-na/css/ds_065be83c9cf5a8d6da2a66a5b9c8f7d95d2f1a02815c7b2cebdeba0b7feaedea.js,9.1.10.12179,False,False,False,False,False,True,True
/dana-na/css/ds_10636a65bffaf6e64eba54360e47f389bd3c7d398af38ab052099bc167780d61.js,9.1.14.16847,False,False,False,False,False,False,False
/dana-na/css/ds_118434847ad133161d5a347570f89c743e30f402cc6235c24f90ae0110a03098.js,9.1.10.10119,False,False,False,False,False,True,True
/dana-na/css/ds_11954f0b01a1b777450dd7be52f5e31554cc6ef3f078e4bbd1bc992e87aa369f.js,8.1.3.35989,False,True,True,False,False,False,False
/dana-na/css/ds_11aaa782e76aab152312ee9fa1e1fb6292c85162262ec05670517c63842110ba.js,9.1.11.14929,False,False,False,False,False,False,True

Hier sehen wir, dass wir für jeden eindeutigen Dateinamen die zugehörige Version und eine Wahrheitstabelle für jede der sieben von uns analysierten Sicherheitshinweise haben. Anschließend importieren wir diese neue CSV-Datei mit dem BigQuery-Befehlszeilendienstprogramm in eine neue BigQuery-Tabelle:

~$ bq load --source_format CSV \
  --replace --autodetect \
  <bigquery-project-id>:<database>.pulse-vulnerability-matrix \
  vulnerability_matrix.csv

Mit dem obigen Befehl wird automatisch ein BigQuery-Datenbankschema erstellt und die Daten werden geladen. Die resultierende Tabelle sollte ähnlich wie der folgende Screenshot aussehen:

Nun können wir diese neu erstellte Tabelle verwenden, um die Daten in unserem globalen Internet-Datensatz zu verknüpfen und Berichte über die Hosts und Dienste zu erstellen, die für diese Sicherheitshinweise anfällig sind. Die folgende SQL-Abfrage gibt uns einen Überblick über die einzelnen Sicherheitshinweise und die Anzahl der betroffenen Dienste im Internet.

WITH
  pulse_hosts AS (
  SELECT
    host_identifier.ipv4,
    REGEXP_EXTRACT(SAFE_CONVERT_BYTES_TO_STRING(service.http.response.body), ".*(/dana-na/css/ds_[a-f0-9]{64}.js).*") AS file_hash,
  FROM
    `censys-io.universal_Internet_dataset.current` main,
    UNNEST(dienste) service
  WHERE
    service.service_name = 'HTTP'
    AND SAFE_CONVERT_BYTES_TO_STRING(service.http.response.body) LIKE '%/dana-na/%')
SELECT
  COUNT(*) TOTAL,
  COUNTIF(pulse.SA43604 = TRUE) SA43604,
  COUNTIF(impuls.SA43877 = TRUE) SA43877,
  COUNTIF(Impuls.SA44101 = TRUE) SA44101,
  COUNTIF(Impuls.SA44516 = WAHR) SA44516,
  COUNTIF(Impuls.SA44588 = TRUE) SA44588,
  COUNTIF(Impuls.SA44784 = WAHR) SA44784,
  COUNTIF(puls.SA44858 = WAHR) SA44858
FROM
  puls_hosts`
LEFT JOIN
  `db.table.pulse-Schwachstellen-Matrix` pulse
ON (file_hash=pulse.path)

 

Sie können auch die CSV-formatierten Zuordnungen der verschiedenen Pfade zu bestimmten Pulse Connect-Versionen herunterladen.

Wie kann Censys helfen?

Über den Autor

Mark Ellzey
Senior Security Researcher Alle Beiträge von Mark Ellzey
Mark Ellzey ist ein leitender Sicherheitsforscher bei Censys. Vor seiner jetzigen Tätigkeit war Mark Ellzey über 22 Jahre lang als Netzwerksicherheitsingenieur und Softwareentwickler für verschiedene Internetdienstleister und Finanzinstitute tätig.
Lösungen für das Management von Angriffsflächen
Mehr erfahren