25 November 2014

DD-WRT и сертификаты SSL

Cryptography
From Sandbox
Всем привет!

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

Для того, чтобы осуществить всё описанное, нам понадобиться роутер, который поддерживается DD-WRT, компьютер с ОС Linux с любым более или менее современным дистрибутивом (у меня Debian Wheezy) и жажда новых знаний.

Итак, дошли у меня наконец руки водрузить на мой уже довольно старенький LinkSys E4200 прошивку от DD-WRT. К старой оригинальной прошивке от LinkSys было много претензий. В частности:

1) Работала не со всем USB Mass Storage;
2) Жутчайшие, дикие тормоза WebUI при заходе через HTTPS;
3) Постоянная ругань браузеров на сертификат SSL, который похоже генерился каждую новую сессию. Поэтому добавление исключений не работало;
4) Отстутствие локального DNS;
5) Ну и множество других глюков.

В общем, одним воскресным вечером я решил залить DD-WRT. Сделал всё как рассказано в Wiki по моему роутеру, то есть залил сначала mini версию, потом проапдейтил до mega. Сами билды были взяты со странички Router Database, то есть сборка 21061.

Обнаружил следующие косяки:

1) Chrome 39 отказывался посещать роутер через HTTPS;
2) У Firefox 33 тоже возникли какие-то странные проблемы с HTTPS;
3) Новый IE отказывался делать для самоподписного сертификата исключение;
4) Chromium 38 также отказался посещать роутер через HTTPS;
5) Не работал SSH. При попытке входа получал ответ «Connection was closed by 192.168.1.1»

В общем, успешно посетить роутер с помощью HTTPS удалось только лишь с помощью Konqueror.

Дальнейшее ковыряние выявило следующую проблему: web-сервер роутера не умел TLS1. А в новых версиях браузеров, в связи с обнаруженной некоторое время назад уязвимостью SSL3 POODLE, SSL3 похоже отключено начисто. На Linux'овом Chromium я запретил его сам.

Кроме того, использование HTTPS «из коробки» DD-WRT весьма странно, так как сам ключ хранится в прошивке в открытом виде (далее мы это увидим воочию), что в общем-то сводит на нет всю нужду HTTPS.

Итак, первое, что надо знать при использовании DD-WRT: наплюйте на ту версию прошивки, которую вам предлагает Router Database. Вместо этого найдите более свежую сборку под ваш роутер тут.

Обновив версию до последней, я решил сразу две проблемы:

1) SSH заработал. Оказывается он был сломан в изначальном билде;
2) Web-сервер роутера стал поддерживать TLS 1.2, что позволило заходить на него уже всеми браузерами, кроме Firefox 33 (хотя это вылечили в 34) и IE и Chrome под виндой, хотя и это лечится путем настройки виндовых политик, а именно отключением запрета на игнорирование проблем сертификатов сайтов.

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

Для наших целей есть прекрасная утилита под названием Firmware Modification Kit, скачать её исходники можно здесь. Утилиту нужно собрать стандартной последовательностью команд:
$ ./configure
$ make


Далее в директории с firmware-mod-kit имеются два скрипта: extract-firmware.sh и build-firmware.sh. Запускаем:
$ ./extract-firmware.sh ~/Downloads/dd-wrt.v24-25408_NEWD-2_K2.6_mega-nv60k.bin
Понятно, что здесь указывается файл вашей прошивки. Она распаковывает прошивку в директорию fmk.

Далее заходим в директорию fmk/rootfs/etc и воочию наблюдаем сертификат cert.pem, который предъявляет роутер при заходе по HTTPS и ключ от него key.pem, который хранится в открытом виде. Есть файлик privkey.pem — это тот же key.pem зашифрованный паролем «pass:password». И это доступно любому, кто скачает эту прошивку.

Итак, наша задача — сгенерировать свой собственный ключ и сертификат. Я сделал так: сгенерировал собственный Certificate Authority (CA) — он мне ещё понадобится при настройке OpenVPN на этом же роутере. Далее, я сгенерировал пару ключ/запрос сертификата и для Web-сервера роутера и подписал его моим CA, полученный сертификат и ключ положил в указанное место прошивки. А свой Certificate Authority я добавил как доверенное на всех своих компах.

Чтобы не писать два раза то, как это делать, я сошлюсь на замечательную статью на Хабре по поводу деятельности с CA и сертификатами. Отмечу лишь два важных момента:
1) в комментариях к этой статье есть описание того, как сгенерировать сертификат на несколько доменов или IP-адресов. Я сгенерировал сертификат на адрес 192.168.1.1, на домен amber.loc (так у меня называется роутер внутри локалки), на внешний IP-адрес (если он у вас есть) и на внешнее DNS-имя (можно взять динамическое DNS-имя).
2) сгенерированный ключ надо делать без пароля. *Paranoid mode ON* После создания и заливки прошивки уничтожить и ключ, и сам файл прошивки. *Paranoid mode OFF*. Запароленный ключ privkey.pem, лежащий в прошивке, никак не используется.

После того, как вы заменили указанные файлы в прошивке, запускаем скрипт:
$ ./build-firmware.sh fmk/
и получаем в директории fmk новую прошивку new-firmware.bin, которую и заливаем на роутер.

Вот и всё.
Tags: dd-wrt ssl-сертификаты сетевое оборудование
Hubs: Cryptography
+3
15.6k 70
Comments 8
Ads