
Python-Client für das lokale WiFi-Steuerungsprotokoll der Thinkware U3000 Dashcam, reverse-engineered aus der offiziellen Android-App. PoC-Tooling hinter CVE-2026-101053, CVE-2026-101054 und CVE-2026-101055.
Ein Python-Client für das lokale WiFi-Steuerungsprotokoll der Thinkware U3000 Dashcam, reverse-engineered aus der offiziellen Android-App, bestätigt an echter Hardware, nicht aus einer öffentlichen Spezifikation (die es nicht gibt).
Dieses Projekt hat zwei Zwecke: eine nutzbare Bibliothek, um Filmmaterial von der eigenen Dashcam zu holen, und Begleitmaterial für eine abgeschlossene CVE-Offenlegung (siehe Sicherheit unten).
docs/protocol-reference.md für die vollständige Aufschlüsselung dessen, was gesichert ist und was eine Vermutung ist.confirm=True gesperrt, weil sie destruktiv sind (Formatieren der SD-Karte) oder weil sie die Kamera vom Netzwerk trennen können, über das du sie erreichst (set_wifi_mode, connect_to_ap usw.). Lies den Docstring, bevor du bei einer dieser Methoden confirm=True übergibst.Kein PyPI-Release. Direkt von GitHub installieren:
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
Oder ohne CLI, nur die Bibliothek:
pip install git+https://github.com/turretsec/u3000py.git
Oder auf ein getaggtes Release festlegen:
pip install git+https://github.com/turretsec/[email protected]
from u3000py import ThinkLinkClient, VideoCategory
with ThinkLinkClient("192.168.1.100") as cam: # your camera's actual IP
print(cam.get_device_info())
print(cam.get_system_status())
files = cam.list_files(VideoCategory.CONTINUOUS)
latest = files[-1]
def show_progress(received, total):
print(f"\r{received / total:.0%}", end="")
cam.download(latest.path, dest="latest_clip.mp4", progress=show_progress)
Oder über die Kommandozeile, sobald mit dem [cli]-Extra installiert:
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
--host ist bei jedem Aufruf erforderlich, entweder als oben gezeigtes Flag oder über die Umgebungsvariable U3000PY_HOST, falls du es lieber nicht wiederholen möchtest.
Vollständige Details Methode für Methode, einschließlich dessen, welche Ergebnisse aus echten Hardware-Tests stammen und welche begründete Vermutungen sind, die noch verifiziert werden müssen, findest du im Protokoll-Referenzdokument.
PUT_FILE: bestätigt, dass es unauthentifizierte beliebige Dateischreibvorgänge an jeden absoluten Pfad im Dateisystem der Kamera erlaubt. Dies ist einer von drei CVE-Befunden; eine generische Write-Anywhere-Methode in einer öffentlichen Bibliothek auszuliefern, würde ein einsatzbereites Angriffswerkzeug bereitstellen. Vollständige Details in disclosure-thinkware-u3000.pip install -e ".[dev]"
pytest -v # unit tests, no camera needed
pytest -m hardware --host 192.168.1.100 # real-camera tests, opt-in only
Ein eigenständiges Smoke-Test-Skript für die CLI selbst liegt in scripts/smoke_test_cli.py. Es ist nicht Teil der pytest-Suite (es ruft den real installierten u3000py-Befehl gegen eine echte Kamera auf) für Plausibilitätsprüfungen nach Änderungen.
docs/protocol-reference.md: das vollständige reverse-engineerte Protokoll; Wire-Format, jeder bestätigte Befehl, was noch unbestätigt ist und bekannte offene Rätsel (ein paar Dinge verhalten sich tatsächlich nicht so, wie es die eigenen Konventionen des Protokolls vorhersagen würden).Dieses Protokoll hat keine Authentifizierung. Drei Befunde gingen aus dieser Recherche hervor, vollständig dokumentiert und offengelegt in einem separaten Repository: disclosure-thinkware-u3000.
PUT_FILE (CVE-2026-101053 (VulDB #410915)), bestätigt durch Schreiben in das echte /tmp-Verzeichnis der Kamera. Bewusst nicht durch diese Bibliothek exponiert (siehe Was hier bewusst nicht enthalten ist oben).LS/GET_FILE (CVE-2026-101054 (VulDB #410916)), überhaupt keine Pfadbeschränkung. Die download()-Methode dieser Bibliothek demonstriert das Primitiv direkt, z. B. liest cam.download("/tmp/wpa_supplicant.conf") die Live-WiFi-Konfigurationsdatei des Geräts.GET_STATUS "wifi_info" (CVE-2026-101055 (VulDB #410917)). Die get_wifi_info()-Methode dieser Bibliothek demonstriert das Primitiv direkt (wobei das Passwort standardmäßig in jeder gedruckten Ausgabe redigiert wird, siehe repr() von WifiInfo).Thinkware wurde am 2026-06-21 benachrichtigt. Das 30-tägige Offenlegungsfenster schloss am 2026-07-21 mit nur einer nicht-technischen Empfangsbestätigung und ohne Bestätigung einer Behebung. Alle drei Befunde bleiben auf der aktuellen Produktions-Firmware reproduzierbar. Verwandte frühere Forschung zu einem anderen Thinkware-Modell (F800 Pro) von geo-chen wird im Offenlegungs-Repo als Kontext referenziert.
MIT, siehe LICENSE.