
Kafka Connect 4.3.1 - Hoch - Windows FileStream-Klassenpfad-Rückstand - unauth Datei lesen/schreiben
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · kafka-connect-filestream-win
Apache Kafka Connect 4.3.1 (26b251a) - Apache Software Foundation
KAFKA-13748 hat FileStream aus dem Unix-Connect-CLASSPATH entfernt, damit unauth REST keine lokalen Dateien öffnen konnte. Der Windows-Launcher hat diesen Ausschluss nie erhalten. Das Tarball liefert connect-file weiterhin in libs/ aus. kafka-run-class.bat verkettet jede Jar darin.
Unauth POST /connectors auf einem unter Windows gestarteten Worker liest und hängt Dateien an, auf die die Connect-UID zugreifen kann.
| ID | noch keine CVE |
| CWE | CWE-552, CWE-1188 |
| CVSS | High: 9.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| Produkt | Apache Kafka Connect |
| Betroffen | 4.3.1 (26b251a); Windows bin/windows/kafka-run-class.bat. Unix .sh schließt connect-file bereits aus. |
| Auth | unauthentifiziertes Connect REST (Standard listeners=http://:8083, kein rest.extension.classes) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Richte einen Browser oder curl auf Connect REST auf einem Worker, der mit den mitgelieferten Windows-.bat-Dateien gestartet wurde. Erstelle eine FileStream-Source. Der Worker öffnet den Pfad, den du in file angibst, und produziert die Bytes auf ein Kafka-Topic. Erstelle eine FileStream-Sink. Der Worker erstellt oder hängt den Pfad an, den du in file angibst. Es gibt keine Allowlist.
Der Unix-Launcher entfernt connect-file.*.jar bereits. Dasselbe JSON gegen das Standard-connect-distributed.sh ergibt einen 400: unbekannter Connector. Das Standard-apache/kafka-Docker ist der Linux-Broker. Dieser Überrest ist der Windows-CLASSPATH.
Ich habe zuerst die Kafka-CVE-Liste gelesen: JAAS Jndi/Ldap, OAUTHBEARER URL-Allowlist, DefaultJwtValidator, ConfigProvider, FileStreams öffentliches JIRA. Unix kafka-run-class.sh hat noch den Ausschluss:
regex="(-(test|test-sources|src|scaladoc|javadoc)\.jar|jar.asc|connect-file.*\.jar)$"
cc_pkg lässt file ebenfalls weg. Dann habe ich die Windows-Kopie geöffnet:
for %%p in (api runtime file json tools) do (
for %%i in ("%BASE_DIR%\connect\%%p\build\libs\connect-%%p*.jar") do (
call :concat "%%i"
)
)
rem Classpath addition for release
for %%i in ("%BASE_DIR%\libs\*") do (
call :concat "%%i"
)
build.gradle kopiert connect-file weiterhin nach libs/. Die Dokumentation sagt, FileStream sei nicht im Standard-CLASSPATH. Dieser Satz stimmt für .sh.
Doyensec hat diese Klasse 2022 beschrieben. KAFKA-13748 / PR 11908 war der Unix-Fix. Die .bat wurde nie aktualisiert.
Bereits dokumentierte Irrwege: Wine; das Ausführen der .bat unter macOS; plugin.path als die Lücke zu betrachten (es ist auf beiden Workern leer); zu behaupten, Linux-Docker sei dieser Bug; ein 201 unter Unix als SUCCESS zu werten. Theater: eine Reverse Shell. Das Orakel ist Unix 400 plus eine Zeugin-Zeile in der Sink-Datei.
cd lab
./run.sh
Unix REST 127.0.0.1:18083 ist das Standard-connect-distributed.sh. Windows-Sim 127.0.0.1:18084 ist ungefiltertes libs/*, die libs\*-Schleife der Release-.bat. Kein Wine. Der Broker ist apache/kafka:4.3.1 im Compose-Netzwerk. Binde es an Loopback.
unix-filestream=absent unix-post=400
win-filestream=present win-source=201 win-sink=201 pwned=yes
SUCCESS kafka-connect-filestream-win ... KAFKA-CONNECT-FILESTREAM-WIN-WITNESS
Gib kafka-run-class.bat denselben connect-file-Ausschluss, den die .sh bereits hat. Entferne file aus der Gradle-from-Source-Schleife for %%p in (api runtime file json tools). Liefere die Jar weiterhin für Leute aus, die plugin.path absichtlich setzen.
26b251a451ce941d3d7a55e6487bcb7f16b5ad48)bin/windows/kafka-run-class.bat · bin/kafka-run-class.shFileStreamSourceTask.java · FileStreamSinkTask.java