
Python-клиент для локального WiFi-протокола управления видеорегистратором Thinkware U3000, полученный обратной разработкой официального Android-приложения. Инструментарий PoC для CVE-2026-101053, CVE-2026-101054 и CVE-2026-101055.
Python-клиент для локального WiFi-протокола управления видеорегистратором Thinkware U3000, восстановленный реверс-инжинирингом из официального Android-приложения, подтверждённый на реальном оборудовании, а не из какой-либо публичной спецификации (которой не существует).
У этого проекта две цели: пригодная для использования библиотека для выгрузки записей с вашего собственного видеорегистратора и вспомогательные материалы для завершённого раскрытия CVE (см. Безопасность ниже).
docs/protocol-reference.md для полного разбора того, что надёжно, а что является предположением.confirm=True, потому что они деструктивны (форматирование SD-карты) или потому что они могут отключить камеру от сети, через которую вы к ней обращаетесь (set_wifi_mode, connect_to_ap и т. д.). Прочитайте docstring, прежде чем передавать confirm=True для любого из них.Релиза на PyPI нет. Устанавливайте напрямую с GitHub:
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
Или без CLI, только библиотеку:
pip install git+https://github.com/turretsec/u3000py.git
Или привяжитесь к помеченному релизу:
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)
Или из командной строки, после установки с дополнением [cli]:
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
--host обязателен при каждом вызове — либо в виде флага, показанного выше, либо через переменную окружения U3000PY_HOST, если вы предпочитаете не повторять его.
Подробное описание каждого метода, включая то, какие результаты получены из реальных аппаратных тестов, а какие являются обоснованными предположениями, ожидающими проверки, находится в справочном документе по протоколу.
PUT_FILE: подтверждено, что позволяет неаутентифицированную запись произвольных файлов по любому абсолютному пути в файловой системе камеры. Это одна из трёх находок CVE; включение в публичную библиотеку универсального метода записи куда угодно было бы выдачей готового к использованию инструмента атаки. Полности в 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
Отдельный скрипт дымового тестирования для самого CLI находится в scripts/smoke_test_cli.py. Он не является частью набора pytest (он вызывает реально установленную команду u3000py против реальной камеры) для проверок работоспособности после изменений.
docs/protocol-reference.md: полный восстановленный протокол; формат передачи данных, каждая подтверждённая команда, что всё ещё не проверено, и известные открытые загадки (пара вещей действительно ведёт себя не так, как предсказывали бы собственные соглашения протокола).Этот протокол не имеет аутентификации. Из этого исследования вышли три находки, полностью задокументированные и раскрытые в отдельном репозитории: disclosure-thinkware-u3000.
PUT_FILE (CVE-2026-101053 (VulDB #410915)), подтверждена записью в реальный каталог /tmp камеры. Намеренно не предоставляется этой библиотекой (см. Чего здесь намеренно нет выше).LS/GET_FILE (CVE-2026-101054 (VulDB #410916)), без каких-либо ограничений пути. Метод download() этой библиотеки демонстрирует этот примитив напрямую, например cam.download("/tmp/wpa_supplicant.conf") читает живой файл конфигурации WiFi устройства.GET_STATUS "wifi_info" (CVE-2026-101055 (VulDB #410917)). Метод get_wifi_info() этой библиотеки демонстрирует этот примитив напрямую (с паролем, скрытым по умолчанию в любом печатаемом выводе, см. repr() у WifiInfo).Thinkware была уведомлена 2026-06-21. 30-дневное окно раскрытия закрылось 2026-07-21 с лишь нетехническим подтверждением получения и без подтверждения исправления. Все три находки остаются воспроизводимыми на текущей производственной прошивке. Связанное предыдущее исследование другой модели Thinkware (F800 Pro) от geo-chen упоминается в репозитории раскрытия для контекста.
MIT, см. LICENSE.