Язык программирования и дефолтные конфиги позволяют взламывать принтеры как в локальной сети, так и удаленно через интернет. Если вы следите за новостями в мире информационной безопасности, то наверняка помните как хакеры взломавшие сетевые принтеры распечатали листовки с призывом поддержать видео-блогера PewDiePie. В сегодняшней статье я покажу вам, как это делается и заодно расскажу как защитить принтер от атак.
Еще по теме: Как хакеры скрывают вирусы в документах Office
PJL и JetDirect
Компания HP разработала язык Printer Job Language (PJL) еще в далеких девяностых. Изначально он был предназначен для расширения команд принтера, но прошли годы, и в динамичном мире информационных технологий для этой функции стали использовать другой язык программирования — Printer Command Language (PCL). С легкой руки HP язык PJL пошел своей дорогой. Его использовали другие компании и он оброс большим количество дополнительных функций. В итоге мы получили что-то похожее на ассемблер — язык программирования один, а инструкции на каждый девайс разные.
Даже если взять только устройства HP, то полного описания инструкций и команд в открытом доступе нет (видимо, компания поняла, что выкладывать технические детали в интернет небезопасно). Есть общий мануал, в котором сопоставлены серийные модели принтеров и поддерживаемые ими команды. Также есть инструкция, описывающая действия команд, синтаксис и ошибки. Документ уже устарел и сильно на него полагаться не стоит.
Помимо языка управления принтерами, HP разработала еще одну интересную технологию, которая служит и по сей день, — JetDirect. Это штука, позволяет превратить любой принтер в сетевой. На ее основе выпускаются как отдельные принт-серверы, так и встроенные (в принтеры, МФУ и роутеры). JetDirect дает возможность подключить устройства к сети и печатать удаленно… причем не только самому владельцу!
Взлом приветствия
С помощью языка PJL некоторые хакерские приемы применяются в сервисных центрах. Например, так сбрасывают счетчики напечатанных листов или очищают память о вставленных ранее картриджах. Это нельзя сделать из меню самого принтера, поэтому и приходится прибегать к таким уловкам через консоль. Давайте копнем глубже и разберемся как они взламывают принтеры.
Статья написана в образовательных целях. Ни автор, ни редакция сайта spy-soft.net не несут ответственности за любой возможный вред, причиненный материалами данной статье.
Сервис JetDirect по умолчанию слушает TCP-порта 9100. На него мы и будем отправлять команды из консоли. Для эксперимента я использовал сетевой принтер HP Color LaserJet 3600n со встроенным принт-сервером HP JetDirect Fast Ethernet.
На открытый порт мы можем подключиться обычным telnet, но так как я приверженец всяких изощренных методов, то воспользуюсь netcat. Давайте попробуем поменять приветствие принтера на дисплее.
1 2 |
nc -v 172.22.1.207 9100 @PJL STMSG DISPLAY="HACKED" |
Поясню немного команду:
@PJL — эти символы дают понять принтеру, какой мы используем язык;
STMSG DISPLAY — это сама команда изменения надписи на дисплее. После нее мы просто пишем то, что хотим вывести.
В итоге получаем результат как на фотографии.
Теперь наша надпись будет сиять на дисплее вместо стандартного приветствия, пока кто-то не нажмет любую кнопку на самом устройстве.
Аналогичного эффекта можно добиться, используя оператор RDYMSG (сообщение о готовности) вместо STMSG (стандартное сообщение). Команда приобретет следующий вид:
1 |
@PJL RDYMSG DISPLAY="HACKED" |
То же самое можно проделать, выполнив печать из файла:
1 2 3 4 5 |
# Записываем команду в текстовый файл перенаправлением вывода echo '"@PJL STMSG DISPLAY="HACKED"' >> PJL.txt # Отправляем файл на IP-адрес сетевого принтера с помощью netcat # Ключ -v включает режим вывода дополнительных сообщений (verbose) сat PJL.txt | nc –v 172.22.1.207 |
После этих команд на табло принтера снова гордо воссияла надпись HACKED, а это значит, что мы можем отправлять принтеру PJL-команды из файла.
Массовый тест
Взаимодействие принтера и компьютера при печати можно представить как трехслойную модель. На первом слое будет сетевой протокол, затем язык управления принтером (в нашем случае PJL) и последним — язык описания (PostScript).
Тут есть интересный момент: поскольку порт 9100 де-факто зарезервирован для JetDirect, то он прослушивается на получение как команд PJL, так и собственно заданий печати. Другими словами, мы можем послать туда любую строку, которая не относится к PJL. Принт-сервер передаст ее на следующий уровень, где PostScript преобразует ее в задание на печать. Конечно, без взаимодействия с драйвером распечатать форматы типа .docx или .png, скорее всего, нельзя, а вот для обычного файла .txt этого вполне хватит.
Внесу небольшую ремарку: если есть желание получить идентичные надписи на разных моделях и марках принтеров и МФУ — лучше сразу забыть. PostScript не «понимает» форматирование текста, или, если сказать другими словами, шрифт и размер надписи будет разный, тот, который используется по дефолту.
Для проверки создадим текстовый файл printme.txt, не содержащий команд. Это просто строки с латинскими буквами. Отправляем его на принтер той же командой, и… спустя пару секунд устройство выплюнет распечатанный лист!
1 |
cat printme.txt | nc –v 172.22.1.207 |
В итоге мы имеем возможность печатать документ при помощи JetDirect, просто отправив текст на TCP-порт 9100 из файла или консоли. Можно ли это автоматизировать? Конечно!
Массовая печать
Давайте разберемся с автоматизацией, это не так уж и сложно. Я буду использовать bash и выполнять все тесты на примере своей локальной сети, хотя за NAT это тоже без труда сработает.
Для начала создадим файл с любым содержимым. Теперь нам необходимо просканировать диапазон IP-адресов на наличие всех узлов с открытым портом 9100. В этом нам поможет старый добрый Nmap. Однако, чтобы получить чистые IP-адреса в удобном формате (без лишних символов), воспользуюсь утилитой grep для обработки регулярных выражений:
1 |
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") |
С такой маской мы получим вывод, содержащий только IP-адреса в каждой строчке.
Вот итоговая команда после объединения:
1 |
nmap -p 9100 172.22.1.1/24 --open | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |
Теперь загоним все это в цикл, указав желаемый IP-адрес и маску подсети:
1 |
for ip in $(nmap -p 9100 172.22.1.1/24 --open | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}");do cat PJL | nc -v $ip 9100; done |
Запуск… и слышно, как загудели все сетевые принтеры в офисе. Помимо разных моделей HP, Kyocera 2040dn тоже присоединилась к работе.
Можно было бы заставить печатать принтеры и с помощью команды echo, а не из файла, но это кому как удобно.
DoS-атака
Теперь попробуем вызвать отказ в обслуживании. Для этого (как вариант) нам необходимо создать бесконечный цикл. На bash он выглядит как-то так:
1 |
while [ 0 -eq 0 ] |
Добавим в него отправку заданий:
1 |
while [ 0 -eq 0 ]; do echo "HACKED" | nc –v 172.22.1.163; done |
Запускаем и смотрим результат. У меня на подопытном МФУ HP LaserJet Pro M1536dnf вышло вот что: он успел напечатать пару листов, а затем на табло постоянно горело «Печать документа», хотя сама печать уже не выполнялась. Печать не возобновилась даже после остановки работы скрипта. Видимо, слишком длинная очередь заданий подвесила МФУ. Его пришлось перезагрузить для восстановления работоспособности. Примерно то же произошло позже и с Kyocera 2040dn.
Глобальный поиск
Своя сеть — хороший полигон, но куда интереснее отправлять задания на печать и веселые дисплейные надписи по всему миру. Вооружившись хакерским поисковиком ZoomEye, задаем обычный поиск по порту 9100 (это самый легкий способ) и видим больше полумиллиона потенциальных целей.
Возможно, не все из них принтеры или МФУ. Поэтому воспользуемся фильтрами, которые можно найти в документации. Например, добавляем в наш запрос уточнение +device:printer и получаем уже около 300 тысяч результатов. Дальше можно указать город, и запрос приобретет вид
1 |
device:"printer" +port:9100 +city:moscow |
В итоге получим поисковую выдачу, содержащую примерно 5000 устройств в Москве. Кто там хотел напечатать предвыборные листовки подешевле?
Еще по теме: Поиск и взлом уязвимых устройств интернета вещей
Найти доступные через интернет сетевые принтеры можно и с помощью Google. Для этого нужно знать, как выглядит типовая часть URL веб-интерфейса, или специфический отклик принт-сервера. Вот пара гугл дорков для примера:
1 2 |
inurl:hp/device/this.LCDispatcher intitle:"web image monitor" |
Веб-интерфейс управления JetDirect использует SNMP (Simple Network Management Protocol) — протокол прикладного уровня для управления сетевыми устройствами, включая принтеры. Он работает в IP-сетях поверх TCP/UDP, а девайсы с поддержкой SNMP легко обнаруживаются как специализированными утилитами вроде Net-SNMP, так и универсальными админскими комбайнами, например Fing.
Гораздо дольше искать в интернете открытые порты 9100 сканером Nmap. Все делается так же, как и в локальной сети. Для удобства возьмем сайт или программу, которая может выдать все IP-адреса в конкретном городе. Записываем их в файл и запускаем сканирование Nmap.
За двадцать минут работы программа порадовала меня тридцатью строками с айпишниками, но только десять из них оказались внешними принтерами.
Этот способ более долгий, зато и результат будет свежий. Базы ZoomEye обновляются далеко не каждый день.
Для автоматизации можно воспользоваться прежним способом: снова завернуть все строки в цикл, а при обнаружении принтера отправлять файл на печать. Тогда во время сканирования все найденные принтеры автоматом напечатают указанный файл.
Сканирование сети с помощью Nmap
Небольшое уточнение. В документации к этому сканеру говорится, что порт 9100 по умолчанию пропускается, если включена функция определения версий (задается она опциями -sV, которые также включают в себя опцию -A). Сделано это из-за того, что некоторые принтеры просто печатают все, что поступает на порт JetDirect. В ответ на опрос TCP 9100 они распечатают запрос вида GET / HTTP. Поэтому при запуске с данными флагами Nmap версии 3.90 и новее выдаст только предположительную службу с вопросительным знаком. Более безопасный (но менее информативный) вариант — запускать Nmap с ключами -sO. Так он попытается определить ОС хоста, но не станет отправлять дополнительные запросы, чтобы выяснить, какие службы отвечают на указанном порте.
Web-интерфейс принтера
Сетевые принтеры часто оказываются подключены к интернету, причем без ведома их владельцев. Веб-интерфейс со страницами настроек и функциями управления также будет виден из-за NAT’а без существенных ограничений доступа. В большинстве случаев логин/пароль либо установлен по умолчанию, либо отсутствует вовсе. Вот сайт с говорящим названием passwordsdatabase.com — один из онлайновых справочников дефолтных паролей с поиском по вендору. Новые модели в нем (пока) отсутствуют, но принтеры сразу сообщают свой номер, по которому легко найти заводской пароль в руководстве на сайте производителя.
В зависимости от модели принтера через его веб-панель можно делать разные вещи: смотреть и менять настройки, отправлять команду напечатать тестовую страницу или указанный файл.
Также можно прочесть логи использования принтера, то есть увидеть, кто и что печатал. Обычно в хронологическом порядке указываются имена пользователей, используемые приложения, названия документов и прочее.
Некоторые принтеры (в частности, встречалось на Ricoh Aficio MP C3500) сами подсказывают хакерам, что либо пароль администратора дефолтный, либо его нет совсем. Это выглядит как строка «Change your admin password!» прямо на панели управления принтером.
Инструменты для взлома принтеров
В 2017 году на конференции Black Hat рассматривали автоматизированные способы эксплуатации различных дыр в безопасности сетевых принтеров, после чего готовых инструментов стало еще больше. Вот некоторые из них.
Hijetter — кросс-платформенная и не требующая установки утилита с открытым исходным кодом, которая позволяет отправлять команды на языке PJL, включая недокументированные. Например, задействовать функцию RFU (remote firmware update), выполняющую удаленную перепрошивку устройства. Вместо официальной прошивки можно подсунуть свою (модифицированную) — в большинстве случаев никакие проверки не выполняются. Версия для Windows имеет интуитивно понятный GUI, а в nix-системах удобнее выполнять автоматизацию, работая из командной строки. Документация скудноватая, но разобраться с программой несложно.
Praeda — эта программа предназначена для аудита безопасности при проверке настроек подключения сетевых принтеров. Умеет выполнять автоматический поиск и скачивать документы из памяти принтера. Работает на портах TCP 80 и 443, то есть поддерживает защищенное соединение. Ее можно запустить и под Windows, однако предварительно придется кое-что поменять в коде самой программы (см. документацию).
PRET — это целый фреймворк на Python для эксплуатации известных уязвимостей в службах удаленной печати. Работает в Linux, поддерживает команды PJL и PCL. Инструмент очень хорошо документирован, есть даже подробный гайд с примерами.
Защита принтеров от взлома
Чтобы защитить принтер от подобных посягательств, необходимо как минимум закрыть порт 9100 (например, через настройки маршрутизатора). Это написано даже в руководстве о минимальной сетевой безопасности на сайте HP, однако что-то мне подсказывает, что его мало кто читал.
Обычно компьютер отправляет задание на печать по сети иначе — например, на TCP-порт 631 по протоколу IPP. На скриншоте ниже отображены пакеты, перехваченные сниффером во время печати документа на сетевом принтере HP Color LaserJet 3600n.
Продвинутые модели позволяют настроить список доступа с определенных IP-адресов. Поищите в документации соответствующий раздел или ключевые слова IP ACL.
Смените дефолтные логины/пароли, даже если не собираетесь использовать удаленное управление.
Однако все это не панацея. Различные уязвимости в системе JetDirect используются давно, а патчатся крайне медленно. В 2018 году компания HP даже приглашала хакеров для пентеста новых принтеров, но основная проблема в быстром сворачивании поддержки старых. Организации годами используют морально устаревшие принтеры и МФУ. Для них есть готовые эксплоиты, но нет и не будет новых драйверов/прошивок, закрывающих известные уязвимости.
Поэтому лучше вообще отключить свой принтер от интернета и пользоваться им только через локальную сеть. Включайте его, только когда в этом есть реальная необходимость. Только выключенное устройство невозможно взломать удаленно.
Заключение
Уязвимости сетевых принтеров рассматривались со времен их появления, но за прошедшие годы положение дел нисколько не улучшилось. В принтерах появился WiFi и функция автоматического обновления прошивки через интернет, а в МФУ подороже теперь есть встроенная память, зачастую хранящая копии сканированных и распечатанных документов за длительный период.
Постепенно из баловства атаки на сетевые принтеры превращаются в бизнес. Одни ищут на них конфиденциальные данные, другие используют как точку проникновения в корпоративную сеть, а третьи пытаются извлечь прибыль из массовых рассылок. Какие-то предприимчивые люди уже создали сервис Printer Advertising, на котором за определенную сумму рассылают спам, удаленно печатая его на чужих принтерах.
Еще по теме: Лучшие хакерские программы для взлома со смартфона
А можно скачать вот это всё на андроид?