stihl не предоставил(а) никакой дополнительной информации.
В этом ресерче я хочу рассказать о цепочке уязвимостей, которую я нашел в системах компании — производителя роутеров, камер и модемов. Мы пройдем путь от возможности перебора пользователей на сайте через захват аккаунтов до полного захвата камер через RCE.
Это исследование получило третье место на Для просмотра ссылки Войдиили Зарегистрируйся в категории «Девайс». Соревнование ежегодно проводится компанией Awillix.
Все камеры этой компании‑производителя управляются через приложение. Довольно популярное — оно загружено уже больше 500 тысяч раз.
При регистрации в приложении я попробовал вручную поперебирать коды подтверждения адреса электронной почты и обнаружил, что на перебор нет никаких лимитов, за превышение которых могли бы заблокировать. Не было их и в форме восстановления пароля, где тоже нужно ввести код из почты.
Тогда я открыл Burp и начал перебирать код... но ничего не получилось. Дело в том, что приложение вычисляет некую сигнатуру, которая должна быть разной от запроса к запросу.
Для просмотра ссылки Войдиили Зарегистрируйся
Метод хеширования можно было увидеть в JADX.
Для просмотра ссылки Войдиили Зарегистрируйся
Приложение берет SHA-256 от данных в Base64 и затем вызывает MD5.
Полный алгоритм вычисления сигнатуры
Алгоритм восстановили, теперь можно перебирать!
Для ускорения и правильного вычисления сигнатуры я написал на JS скрипт, который достигал скорости перебора в 270 запросов в секунду.
Учитывая, что срок жизни кода — 30 минут, вероятность подбора верного кода с первой попытки превышает 48%. Так как за один день можно отправить не более восьми кодов восстановления, вероятность захватить аккаунт за сутки — 99,5%.
При вводе правильного кода в ответе лежит VERIFY_CODE, который потом подставляется в форму сброса пароля.
Смотрим запрос смены пароля.
Для просмотра ссылки Войдиили Зарегистрируйся
Видим VERIFY_CODE и сигнатуру, а также подмечаем странный формат пароля.
Расчехляю Frida и вижу, что вместо асимметричного шифрования пароля используется MD5.
Для просмотра ссылки Войдиили ЗарегистрируйсяДля просмотра ссылки Войди или Зарегистрируйся
Приложение берет пароль в Hex и добавляет к нему SHA-1 от почты. Между паролем и почтой добавляются нули так, чтобы длина полученной строки делилась на четыре без остатка. Далее берутся байты этой строки и пять раз (!) хешируются в MD5.
Теперь после подбора кода можно сразу менять пароль на свой и входить в аккаунт жертвы. При этом все сессии жертвы деактивируются.
Сейчас уязвимость уже закрыта.
Тут на помощь приходит одна из функций приложения — «друзья».
Добавлять друзей можно, указав их почту, телефон или (внимание!) user_id. Последний имеет вид ID_region_number, где number — инкрементируемое число.
Для просмотра ссылки Войдиили Зарегистрируйся
Можно просто перебрать user_id пользователей в Burp Intruder и собрать большой список почт.
Для просмотра ссылки Войдиили Зарегистрируйся
Используя их SSID, можно найти приблизительное местонахождение камеры через базу данных Для просмотра ссылки Войдиили Зарегистрируйся. Эта информация нам еще пригодится.
Еще неделю я изучал прошивку. Мое внимание привлекли функции подключения камеры к Wi-Fi и проверка скорости сети. Давай посмотрим поближе на функцию F3C8C.
Для просмотра ссылки Войдиили Зарегистрируйся
Она играет роль распределителя: получает команду с параметрами и выбирает, какой из функций их передавать.
А в коде ниже обнаруживаем отличную возможность для инъекции команд ОС.
Для просмотра ссылки Войдиили Зарегистрируйся
Вот уязвимая строчка кода:
sprintf(s, "echo $(cat /proc/net/rtl8188fu/wlan0/survey_info | grep '%s' | awk '{print $4}')",
(const char *)&v31[1]);
Когда пользователь переходит в меню Network Detection и привязывает камеру к сети, система проверяет уровень сигнала, выполняя вот такую команду:
echo $(cat /proc/net/rtl8192fu/wlan0/survey_info | grep '%s' | awk '{print $4}')
Далее SSID Wi-Fi без проверки используется в коде.
В survey_info хранятся данные ближайших точек доступа.
Для просмотра ссылки Войдиили Зарегистрируйся
Если создать сеть с именем q';echo k3vg3n>/home/poc;echo ' и подключить камеру к ней, то мы получим RCE с правами root.
Минус такого RCE состоит в том, что можно использовать только короткие команды: камера не может подключиться к точкам доступа, SSID которых превышает 32 байта.
Зато теперь, имея RCE и зная расположение камеры, можно приехать к этому месту и прокинуть шелл, тем самым полностью захватив камеру.
Для просмотра ссылки Войдиили Зарегистрируйся
Набор команд у BusyBox немаленький, и есть ftpget. В теории можем творить, что захотим, в инфраструктуре компании, купившей такие камеры.
Это исследование получило третье место на Для просмотра ссылки Войди
Точка входа, или Account takeover
В первых числах мая я решил окунуться в хардварь и специально для этого купил IP-камеру. На ее полное исследование у меня ушло чуть меньше двух месяцев.Все камеры этой компании‑производителя управляются через приложение. Довольно популярное — оно загружено уже больше 500 тысяч раз.
При регистрации в приложении я попробовал вручную поперебирать коды подтверждения адреса электронной почты и обнаружил, что на перебор нет никаких лимитов, за превышение которых могли бы заблокировать. Не было их и в форме восстановления пароля, где тоже нужно ввести код из почты.
Тогда я открыл Burp и начал перебирать код... но ничего не получилось. Дело в том, что приложение вычисляет некую сигнатуру, которая должна быть разной от запроса к запросу.
Для просмотра ссылки Войди
Метод хеширования можно было увидеть в JADX.
Для просмотра ссылки Войди
Приложение берет SHA-256 от данных в Base64 и затем вызывает MD5.

Алгоритм восстановили, теперь можно перебирать!
Для ускорения и правильного вычисления сигнатуры я написал на JS скрипт, который достигал скорости перебора в 270 запросов в секунду.
Учитывая, что срок жизни кода — 30 минут, вероятность подбора верного кода с первой попытки превышает 48%. Так как за один день можно отправить не более восьми кодов восстановления, вероятность захватить аккаунт за сутки — 99,5%.
При вводе правильного кода в ответе лежит VERIFY_CODE, который потом подставляется в форму сброса пароля.
Смотрим запрос смены пароля.
Для просмотра ссылки Войди
Видим VERIFY_CODE и сигнатуру, а также подмечаем странный формат пароля.
Расчехляю Frida и вижу, что вместо асимметричного шифрования пароля используется MD5.
Для просмотра ссылки Войди
Приложение берет пароль в Hex и добавляет к нему SHA-1 от почты. Между паролем и почтой добавляются нули так, чтобы длина полученной строки делилась на четыре без остатка. Далее берутся байты этой строки и пять раз (!) хешируются в MD5.
Теперь после подбора кода можно сразу менять пароль на свой и входить в аккаунт жертвы. При этом все сессии жертвы деактивируются.
Сейчас уязвимость уже закрыта.
А как же остальные?
Главный изъян этой атаки — нужно предварительно знать почту жертвы.Тут на помощь приходит одна из функций приложения — «друзья».
Добавлять друзей можно, указав их почту, телефон или (внимание!) user_id. Последний имеет вид ID_region_number, где number — инкрементируемое число.
Для просмотра ссылки Войди
Можно просто перебрать user_id пользователей в Burp Intruder и собрать большой список почт.
Захватываем камеры, или еще одна RCE
Получив доступ к аккаунту жертвы, атакующий может смотреть список ближайших к камере точек доступа Wi-Fi.Для просмотра ссылки Войди
Используя их SSID, можно найти приблизительное местонахождение камеры через базу данных Для просмотра ссылки Войди
Анализ прошивки
Продолжая исследование, я через Telnet подключился к камере и выгрузил бинарный файл прошивки. Он был в формате UPX, так что пришлось распаковать.Еще неделю я изучал прошивку. Мое внимание привлекли функции подключения камеры к Wi-Fi и проверка скорости сети. Давай посмотрим поближе на функцию F3C8C.
Для просмотра ссылки Войди
Она играет роль распределителя: получает команду с параметрами и выбирает, какой из функций их передавать.
А в коде ниже обнаруживаем отличную возможность для инъекции команд ОС.
Для просмотра ссылки Войди
Вот уязвимая строчка кода:
sprintf(s, "echo $(cat /proc/net/rtl8188fu/wlan0/survey_info | grep '%s' | awk '{print $4}')",
(const char *)&v31[1]);
Когда пользователь переходит в меню Network Detection и привязывает камеру к сети, система проверяет уровень сигнала, выполняя вот такую команду:
echo $(cat /proc/net/rtl8192fu/wlan0/survey_info | grep '%s' | awk '{print $4}')
Далее SSID Wi-Fi без проверки используется в коде.
В survey_info хранятся данные ближайших точек доступа.
Для просмотра ссылки Войди
Если создать сеть с именем q';echo k3vg3n>/home/poc;echo ' и подключить камеру к ней, то мы получим RCE с правами root.
Минус такого RCE состоит в том, что можно использовать только короткие команды: камера не может подключиться к точкам доступа, SSID которых превышает 32 байта.
Зато теперь, имея RCE и зная расположение камеры, можно приехать к этому месту и прокинуть шелл, тем самым полностью захватив камеру.
Фантазии
После получения шелла можно редактировать файловую систему камеры, встроить бэкдор, подключить камеру обратно к рабочему Wi-Fi и даже сканировать хосты внутренней сети.Для просмотра ссылки Войди
Набор команд у BusyBox немаленький, и есть ftpget. В теории можем творить, что захотим, в инфраструктуре компании, купившей такие камеры.