Содержание статьи
- 01. Точка входа, или Account takeover
- 02 .А как же остальные?
- 03. Захватываем камеры, или еще одна RCE
- 04 .Анализ прошивки
- 05. Фантазии
Точка входа, или 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, можно найти приблизительное местонахождение камеры через базу данных wigle.net. Эта информация нам еще пригодится.
Анализ прошивки
Продолжая исследование, я через Telnet подключился к камере и выгрузил бинарный файл прошивки. Он был в формате UPX, так что пришлось распаковать.
Еще неделю я изучал прошивку. Мое внимание привлекли функции подключения камеры к Wi-Fi и проверка скорости сети. Давай посмотрим поближе на функцию F3C8C.
Не удалось прогрузить медиа
Она играет роль распределителя: получает команду с параметрами и выбирает, какой из функций их передавать.
А в коде ниже обнаруживаем отличную возможность для инъекции команд ОС.
Не удалось прогрузить медиа
Вот уязвимая строчка кода:
Вот уязвимая строчка кода:
Code:
sprintf(s, "echo $(cat /proc/net/rtl8188fu/wlan0/survey_info | grep '%s' | awk '{print $4}')",
(const char *)&v31[1]);
Когда пользователь переходит в меню Network Detection и привязывает камеру к сети, система проверяет уровень сигнала, выполняя вот такую команду:
Code:
echo $(cat /proc/net/rtl8192fu/wlan0/survey_info | grep '%s' | awk '{print $4}')
В survey_info хранятся данные ближайших точек доступа.
Не удалось прогрузить медиа
Если создать сеть с именем
Code:
q';echo k3vg3n>/home/poc;echo '
Минус такого RCE состоит в том, что можно использовать только короткие команды: камера не может подключиться к точкам доступа, SSID которых превышает 32 байта.
Зато теперь, имея RCE и зная расположение камеры, можно приехать к этому месту и прокинуть шелл, тем самым полностью захватив камеру.
Фантазии
После получения шелла можно редактировать файловую систему камеры, встроить бэкдор, подключить камеру обратно к рабочему Wi-Fi и даже сканировать хосты внутренней сети.
Не удалось прогрузить медиа
Набор команд у BusyBox немаленький, и есть ftpget. В теории можем творить, что захотим, в инфраструктуре компании, купившей такие камеры.
источник
👍66
❤️13
🔥7
🤔18
😢16
LIMB