Promise SmartStor NS2300N remote root exploit

Небольшая преамбула. Несмотря на изрядный опыт в IT, вопросами получения доступа туда, куда производитель железа (софта) не предполагал этот доступ давать, мне заниматься раньше не приходилось. Но этим летом я сподобился купить для домашних нужд более-менее полноценный NAS - вышеупомянутый SmartStor NS2300N. Ну там бэкапиться на него, держать варез, музыку и порнуху, you know.

В устройстве этом обнаружилась удобнейшая вещь - плагин под официальным названием Download Station, который при ближайшем рассмотрении оказался ни чем иным как MLDonkey - P2P-клиентом, который поддерживает торренты, eDonkey и еще энное кол-во файлообменных протоколов. Все на первый взгляд было замечательно и удобно - скормил коробке торрент, коробка его скачала сама, компьютер включенным держать не нужно.

На практике же выяснилось что работает вся эта конструкция как-то до безобразия странно: любой просмотр состояния закачек посредством родного Promise-овского GUI почему-то приводил к тому, что уже скачанные торренты тут же прекращали раздаваться (а для трекеров, следящих за соотношением UL/DL, это недопустимо по очевидным причинам - забанят).

И тут, собственно начинается амбула.

Для того, чтобы разобраться, что же на самом деле внутри железки происходит, нужен был консольный доступ. Копание вокруг вопроса в гугле к разумным результатам не привело: дыра с загрузочным скриптом ITunes-плагина была разработчиками уже заткнута. После этого пришлось изучать скрипты и конфиги самого MLDonkey на предмет потенциальных уязвимостей.

На входе мы имели:
1) MLDonkey, запускаемый на устройстве с рутовыми правами;
2) открытый порт 4001, по которому при помощи GUI-протокола можно общаться с клиентом и посылать ему разные команды;
3) возможность залогиниться по этому протоколу с пустым паролем (именно таким образом работает Promise SmartNavi - прилагающееся к устройству GUI).

Для экспериментов использовались также свободно доступные оболочки для MLDonkey - Sancho и xDonkey. Помимо контроля за состоянием загрузок и раздач обе утилиты дают возможность просматривать активную конфигурацию, изменять ее и сохранять (держим в уме, что демон работает с рутовыми правами и напрямую конфиги менять нельзя, а через GUI - сколько угодно).

И вот ВНЕЗАПНО обнаружилось, что в конфигурационном файле есть опция allow_any_command, которой можно выставить значение true. После чего прямо из командной оболочки GUI-клиента превосходным образом можно выполнить любую команду в shell (для этого перед командой нужно поставить ! - таким образом оболочка отличает команды shell от собственных команд MLDonkey). Дальнейшее уже было делом техники.

Если кто-нибудь обладателей NS2300N захочет, на свой страх и риск, воспроизвести этот результат (я не исключаю, что при нарушении прав доступа вендор может снять устройство с гарантии), последовательность рекомендуется следующая:

1. Находясь внутри MLDonkey GUI, скопировать в какое-нибудь место на устройстве, к которому у вас есть доступ на запись, файл /etc/crontab. Делается это, понятно, посредством команды ! /bin/cp /etc/crontab /VOLUME1/FOLDER_NAME.

2. Закомментировать в нем строчку

* * * * *       root    /usr/sbin/chkhttpd >/dev/null 2>/dev/null

Эта строчка, помимо очевидной функции (проверить состояние http-демона) перезаписывает раз в минуту файл /etc/telnet.user, который нам через пару шагов понадобится; после исправления нужно скопировать файл обратно: ! /bin/cp /VOLUME1/FOLDER_NAME/crontab /etc/

3. Аналогичным образом поступить с файлом /etc/sudoers - в него нужно будет добавить строчку

username   ALL=(ALL) NOPASSWD: ALL

После чего тоже скопировать на место. username - это в данном случае ваше имя пользователя на устройстве, которое было добавлено через SmartNAVI или PASM (web-интерфейс NAS), пароль этого пользователя должен быть заранее известен.

4. Последний штрих - копируется в сторону файл /etc/telnet.user и в него добавляется username из предыдущего шага, после чего файл копируется на место.

После этого:

telnet -l username <nas_hostname> 2380
sudo -s

Готово, у нас есть root shell. Если мы хотим вернуть на место обслуживающий скрипт chkhttpd, его нужно скопировать куда-нибудь за пределы /usr (она смонтирована как read-only), удалить строчки, которые перезаписывают /etc/telnet.user, и снова поставить в крон запуск отредактированной версии.

Дальнейшие эксперименты с конфигурацией NAS редакция оставляет на усмотрение и ответственность читателя.

Re: Promise SmartStor NS2300N remote root exploit

Все конечно хорошо, но как можно залить на накопитель MySQL и Perl?