Рады видеть вас на Ghost-Club.com

Зарегистрируйтесь сейчас, чтобы то бы вступить в наш клуб. После регистрации и входа в систему вы сможете создавать темы, отвечать на существующие темы, давать репутацию другим пользователям, получить свой собственный мессенджер, размещать обновления статуса, управлять профилем и многое другое. Это сообщение будет удалено после входа в систему.

Sign in to follow this  
дубрава

Взлом и защита сетевых принтеров

Recommended Posts

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

PJL и JetDirect

Компания HP разработала язык Printer Job Language (PJL) еще в далеких девяностых. Изначально он был предназначен для расширения команд принтера, но прошли годы, и в динамичном мире информационных технологий для этой функции стали использовать другой язык программирования — Printer Command Language (PCL). С легкой руки HP язык PJL пошел своей дорогой. Его использовали другие компании и он оброс большим количество дополнительных функций. В итоге мы получили что-то похожее на ассемблер — язык программирования один, а инструкции на каждый девайс разные.

Даже если взять только устройства HP, то полного описания инструкций и команд в открытом доступе нет (видимо, компания поняла, что выкладывать технические детали в интернет небезопасно). Есть общий мануал, в котором сопоставлены серийные модели принтеров и поддерживаемые ими команды. Также есть инструкция, описывающая действия команд, синтаксис и ошибки. Документ уже устарел и сильно на него полагаться не стоит.

Помимо языка управления принтерами, HP разработала еще одну интересную технологию, которая служит и по сей день, — JetDirect. Это штука, позволяет превратить любой принтер в сетевой. На ее основе выпускаются как отдельные принт-серверы, так и встроенные (в принтеры, МФУ и роутеры). JetDirect дает возможность подключить устройства к сети и печатать удаленно… причем не только самому владельцу!

Взлом приветствия

С помощью языка PJL некоторые хакерские приемы применяются в сервисных центрах. Например, так сбрасывают счетчики напечатанных листов или очищают память о вставленных ранее картриджах. Это нельзя сделать из меню самого принтера, поэтому и приходится прибегать к таким уловкам через консоль. Давайте копнем глубже и разберемся как они взламывают принтеры.

Сервис JetDirect по умолчанию слушает TCP-порта 9100. На него мы и будем отправлять команды из консоли. Для эксперимента я использовал сетевой принтер HP Color LaserJet 3600n со встроенным принт-сервером HP JetDirect Fast Ethernet.

o5Zw12XQXbo.jpg

На открытый порт мы можем подключиться обычным telnet, но так как я приверженец всяких изощренных методов, то воспользуюсь netcat. Давайте попробуем поменять приветствие принтера на дисплее.

nc -v 172.22.1.207 9100

@PJL STMSG DISPLAY="HACKED"

Поясню немного команду:

@PJL — эти символы дают понять принтеру, какой мы используем язык;

STMSG DISPLAY — это сама команда изменения надписи на дисплее. После нее мы просто пишем то, что хотим вывести.

p2KCBhhKhmQ.jpg

В итоге получаем результат как на фотографии.

xaNE5ZC39BI.jpg

Теперь наша надпись будет сиять на дисплее вместо стандартного приветствия, пока кто-то не нажмет любую кнопку на самом устройстве.

Аналогичного эффекта можно добиться, используя оператор RDYMSG (сообщение о готовности) вместо STMSG (стандартное сообщение). Команда приобретет следующий вид:

@PJL RDYMSG DISPLAY="HACKED"

То же самое можно проделать, выполнив печать из файла:

# Записываем команду в текстовый файл перенаправлением вывода
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, не содержащий команд. Это просто строки с латинскими буквами. Отправляем его на принтер той же командой, и… спустя пару секунд устройство выплюнет распечатанный лист!

cat printme.txt | nc –v 172.22.1.207

В итоге мы имеем возможность печатать документ при помощи JetDirect, просто отправив текст на TCP-порт 9100 из файла или консоли. Можно ли это автоматизировать? Конечно!

Массовая печать

Давайте разберемся с автоматизацией, это не так уж и сложно. Я буду использовать bash и выполнять все тесты на примере своей локальной сети, хотя за NAT это тоже без труда сработает.

Для начала создадим файл с любым содержимым. Теперь нам необходимо просканировать диапазон IP-адресов на наличие всех узлов с открытым портом 9100. В этом нам поможет старый добрый Nmap. Однако, чтобы получить чистые IP-адреса в удобном формате (без лишних символов), воспользуюсь утилитой grep для обработки регулярных выражений:

grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")

С такой маской мы получим вывод, содержащий только IP-адреса в каждой строчке.

Вот итоговая команда после объединения:

nmap -p 9100 172.22.1.1/24 --open | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

daBQioIGEIw.jpg

Теперь загоним все это в цикл, указав желаемый IP-адрес и маску подсети:

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

rqjM66Xio_Y.jpg

Запуск… и слышно, как загудели все сетевые принтеры в офисе. Помимо разных моделей HP, Kyocera 2040dn тоже присоединилась к работе.

zFLVd3eyDWo.jpg

Можно было бы заставить печатать принтеры и с помощью команды echo, а не из файла, но это кому как удобно.

DoS-атака

Теперь попробуем вызвать отказ в обслуживании. Для этого (как вариант) нам необходимо создать бесконечный цикл. На bash он выглядит как-то так:

while [ 0 -eq 0 ]

Добавим в него отправку заданий:

while [ 0 -eq 0 ]; do echo "HACKED" | nc –v 172.22.1.163; done

Запускаем и смотрим результат. У меня на подопытном МФУ HP LaserJet Pro M1536dnf вышло вот что: он успел напечатать пару листов, а затем на табло постоянно горело «Печать документа», хотя сама печать уже не выполнялась. Печать не возобновилась даже после остановки работы скрипта. Видимо, слишком длинная очередь заданий подвесила МФУ. Его пришлось перезагрузить для восстановления работоспособности. Примерно то же произошло позже и с Kyocera 2040dn.

Глобальный поиск

Своя сеть — хороший полигон, но куда интереснее отправлять задания на печать и веселые дисплейные надписи по всему миру. Вооружившись поисковиком ZoomEye, задаем обычный поиск по порту 9100 (это самый легкий способ) и видим больше полумиллиона потенциальных целей.

VR9OsYeTimY.jpg

Возможно, не все из них принтеры или МФУ. Поэтому воспользуемся фильтрами, которые можно найти в документации. Например, добавляем в наш запрос уточнение +device:printer и получаем уже около 300 тысяч результатов. Дальше можно указать город, и запрос приобретет вид

rtsMTt9lMDk.jpg

Web-интерфейс принтера

Сетевые принтеры часто оказываются подключены к интернету, причем без ведома их владельцев. Веб-интерфейс со страницами настроек и функциями управления также будет виден из-за NAT’а без существенных ограничений доступа. В большинстве случаев логин/пароль либо установлен по умолчанию, либо отсутствует вовсе. Вот сайт с говорящим названием passwordsdatabase.com — один из онлайновых справочников дефолтных паролей с поиском по вендору. Новые модели в нем (пока) отсутствуют, но принтеры сразу сообщают свой номер, по которому легко найти заводской пароль в руководстве на сайте производителя.

В зависимости от модели принтера через его веб-панель можно делать разные вещи: смотреть и менять настройки, отправлять команду напечатать тестовую страницу или указанный файл.

LnmVU4vVZqM.jpg

Также можно прочесть логи использования принтера, то есть увидеть, кто и что печатал. Обычно в хронологическом порядке указываются имена пользователей, используемые приложения, названия документов и прочее.

Некоторые принтеры (в частности, встречалось на Ricoh Aficio MP C3500) сами подсказывают хакерам, что либо пароль администратора дефолтный, либо его нет совсем. Это выглядит как строка «Change your admin password!» прямо на панели управления принтером.

XjnvKdnEv0c.jpg

Инструменты для взлома принтеров

В 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.

wtlar29z5RA.jpg

Продвинутые модели позволяют настроить список доступа с определенных IP-адресов. Поищи в документации соответствующий раздел или ключевые слова IP ACL.

Смени дефолтные логины/пароли, даже если не собираешься использовать удаленное управление

BGyQqmat3MM.jpg

Однако все это не панацея. Различные уязвимости в системе JetDirect используются давно, а патчатся крайне медленно. В 2018 году компания HP даже приглашала хакеров для пентеста новых принтеров, но основная проблема в быстром сворачивании поддержки старых. Организации годами используют морально устаревшие принтеры и МФУ. Для них есть готовые эксплоиты, но нет и не будет новых драйверов/прошивок, закрывающих известные уязвимости.

Поэтому лучше вообще отключить свой принтер от интернета и пользоваться им только через локальную сеть. Включай его, только когда в этом есть реальная необходимость. Только выключенное устройство невозможно взломать удаленно.

Заключение

Уязвимости сетевых принтеров рассматривались со времен их появления, но за прошедшие годы положение дел нисколько не улучшилось. В принтерах появился WiFi и функция автоматического обновления прошивки через интернет, а в МФУ подороже теперь есть встроенная память, зачастую хранящая копии сканированных и распечатанных документов за длительный период.

Постепенно из баловства атаки на сетевые принтеры превращаются в бизнес. Одни ищут на них конфиденциальные данные, другие используют как точку проникновения в корпоративную сеть, а третьи пытаются извлечь прибыль из массовых рассылок. Какие-то предприимчивые люди уже создали сервис Printer Advertising, на котором за определенную сумму рассылают спам, удаленно печатая его на чужих принтерах.

  • Upvote 1

Share this post


Link to post
Share on other sites

Спасибо за статью, описание просто вышка!!!!

Share this post


Link to post
Share on other sites

Кто не то мне объяснит мне для чего это вообще нужно???

Share this post


Link to post
Share on other sites

Актуально!!!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this