
Cliente Python para el protocolo de control WiFi local de la dashcam Thinkware U3000, obtenido mediante ingeniería inversa de la aplicación oficial de Android. Herramientas PoC detrás de CVE-2026-101053, CVE-2026-101054 y CVE-2026-101055.
Un cliente Python para el protocolo de control WiFi local de la dashcam Thinkware U3000, obtenido mediante ingeniería inversa de la aplicación oficial de Android, confirmado contra hardware real, no a partir de ninguna especificación pública (no existe ninguna).
Este proyecto tiene dos propósitos: una biblioteca utilizable para extraer grabaciones de tu propia dashcam, y material de apoyo para una divulgación de CVE completada (ver Seguridad más abajo).
docs/protocol-reference.md para el desglose completo de lo que es sólido y lo que es una suposición.confirm=True porque son destructivos (formatear la tarjeta SD) o porque pueden desconectar la cámara de la red que estás usando para acceder a ella (set_wifi_mode, connect_to_ap, etc.). Lee el docstring antes de pasar confirm=True en cualquiera de estos.Sin publicación en PyPI. Instala directamente desde GitHub:
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
O sin la CLI, solo la biblioteca:
pip install git+https://github.com/turretsec/u3000py.git
O fija a una versión etiquetada:
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)
O desde la línea de comandos, una vez instalado con el extra [cli]:
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
--host es obligatorio en cada invocación, ya sea como el flag mostrado arriba o mediante la variable de entorno U3000PY_HOST si prefieres no repetirlo.
El detalle completo método por método, incluyendo qué resultados provienen de pruebas con hardware real frente a cuáles son conjeturas fundamentadas pendientes de verificación, se encuentra en el documento de referencia del protocolo.
PUT_FILE: confirmado que permite escrituras arbitrarias de archivos sin autenticación en cualquier ruta absoluta del sistema de archivos de la cámara. Este es uno de los tres hallazgos de CVE; incluir un método genérico de escritura en cualquier lugar en una biblioteca pública entregaría una herramienta de ataque lista para usar. Detalle completo en 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
Un script independiente de prueba de humo para la propia CLI se encuentra en scripts/smoke_test_cli.py. No forma parte de la suite de pytest (invoca el comando u3000py real instalado contra una cámara real) para comprobaciones de cordura tras los cambios.
docs/protocol-reference.md: el protocolo completo obtenido por ingeniería inversa; formato de cable, cada comando confirmado, lo que aún no está verificado y misterios abiertos conocidos (un par de cosas genuinamente no se comportan como predecirían las propias convenciones del protocolo).Este protocolo no tiene autenticación. De esta investigación surgieron tres hallazgos, completamente documentados y divulgados en un repositorio separado: disclosure-thinkware-u3000.
PUT_FILE (CVE-2026-101053 (VulDB #410915)), confirmada escribiendo en el directorio /tmp real de la cámara. Deliberadamente no expuesta por esta biblioteca (ver Lo que deliberadamente no está aquí arriba).LS/GET_FILE (CVE-2026-101054 (VulDB #410916)), sin ninguna restricción de ruta. El método download() de esta biblioteca demuestra la primitiva directamente, p. ej. cam.download("/tmp/wpa_supplicant.conf") lee el archivo de configuración WiFi en vivo del dispositivo.GET_STATUS "wifi_info" (CVE-2026-101055 (VulDB #410917)). El método get_wifi_info() de esta biblioteca demuestra la primitiva directamente (con la contraseña censurada por defecto en cualquier salida impresa, ver el repr() de WifiInfo).Thinkware fue notificada el 2026-06-21. La ventana de divulgación de 30 días se cerró el 2026-07-21 con solo un acuse de recibo no técnico y sin confirmación de corrección. Los tres hallazgos siguen siendo reproducibles en el firmware de producción actual. Se hace referencia a una investigación previa relacionada sobre un modelo diferente de Thinkware (F800 Pro) por geo-chen en el repositorio de divulgación para contexto.
MIT, ver LICENSE.