История одной НЕ уязвимости

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

image
На этапе настройки роутер был подключен к интернету. Но устройства, подключенные к Wi-Fi почему-то его не получали. Я полез разбираться. В панели роутера была вкладка с возможностью воспользоваться утилитой ping, поэтому telnet можно не включать (надеюсь все читатели понимают, чем опасен telnet, открытый наружу?). Выглядела форма вот так:

d6hu67t0tcxp7zgydz40mxzxxx4.png

Реализована эта фича следующим образом. Программа роутера получает от пользователя строку, содержащую адрес, затем подставляет в строку вызова команды ping:

ping -c <число пакетов> <хост>


На сколько хорошо проверяет роутер строку, содержащую адрес? Именно этот вопрос возник у меня в голове. Тогда я подставил амперсанд и команду ls. Получил вот это:

y5lz3j2vo_tk-shplz3ob8jqt1y.png

Для тех, кто не в танке


В UNIX системах мы можем заставить bash выполнять команду в фоновом режиме, подставив после нее амперсанд. При этом, мы можем подставить после амперсанда команду, и она выполнится одновременно с первой. Чем я и воспользовался в данном случае. Подставив »8.8.8.8 & ls», я получил «ping -c 3 8.8.8.8 & ls». Роутер выполнил одновременно команду ping и ls. Затем вывел результат.

Будь этот баг допущен в любом другом месте, он стал бы очень серьезной угрозой. Ведь такая уязвимость помогла бы злоумышленнику получить полный контроль над устройством. Подобные уязвимости классифицируются как CWE-78 (OS Command Injection) .

Мне не сиделось на месте, и я поспешил написать производителю о найденном баге. Я подробно описал модель роутера, версию прошивки и сценарий воспроизведения бага. На что получил интересный ответ:

image

Перевод (дословно)

Не могли бы вы проверить версию аппаратного обеспечения на нижней этикетке продукта?
У нас нет Rev. Px. Вы знаете источник или место покупки этого устройства?

Как оказалось, они не учли, что я пишу из России. Данная модель роутера распространялась только в нашей стране. Переписка закончилась тем, что мне выслали новую прошивку, в которой устранены все недостатки предыдущей и добавлено много фич, но почему то она не оказалась в публичном доступе.

2t7t4vnud_kklx8uskcgh34_oyi.png

© Habrahabr.ru