• Добро пожаловать на наш форум Гость !
    Чтобы пользоваться всеми его возможностями необходимо Зарегистрироваться
    Без регистрации Вы сможете просматривать только определенные темы
    Зарегистрироваться здесь, чтобы воспользоваться всеми функциями форума.

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

Vasiliy

Бывалый
Сообщения
17
Реакции
10
PJL и JetDirect
Компания HP разработала язык Printer Job Language (PJL) еще в далеких девяностых. Изначально он был предназначен для расширения команд принтера, но прошли годы, и в динамичном мире информационных технологий для этой функции стали использовать другой язык программирования — Printer Command Language (PCL). С легкой руки HP язык PJL пошел своей дорогой. Его использовали другие компании и он оброс большим количество дополнительных функций. В итоге мы получили что-то похожее на ассемблер — язык программирования один, а инструкции на каждый девайс разные.
Даже если взять только устройства HP, то полного описания инструкций и команд в открытом доступе нет (видимо, компания поняла, что выкладывать технические детали в интернет небезопасно). Есть общий Войдите или зарегистрируйтесь чтобы увидеть ссылку, в котором сопоставлены серийные модели принтеров и поддерживаемые ими команды. Также есть Войдите или зарегистрируйтесь чтобы увидеть ссылку, описывающая действия команд, синтаксис и ошибки. Документ уже устарел и сильно на него полагаться не стоит.
Помимо языка управления принтерами, HP разработала еще одну интересную технологию, которая служит и по сей день, — Войдите или зарегистрируйтесь чтобы увидеть ссылку. Это штука, позволяет превратить любой принтер в сетевой. На ее основе выпускаются как отдельные принт-серверы, так и встроенные (в принтеры, МФУ и роутеры). JetDirect дает возможность подключить устройства к сети и печатать удаленно… причем не только самому владельцу!

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

Войдите или зарегистрируйтесь чтобы увидеть ссылку

Поиск открытого порта 9100 программой Nmap






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

----------------------------------------------
nc -v 172.22.1.207 9100
@PJL STMSG DISPLAY="HACKED"
----------------------------------------------

@PJL — эти символы дают понять принтеру, какой мы используем язык;
STMSG DISPLAY — это сама команда изменения надписи на дисплее. После нее мы просто пишем то, что хотим вывести.

Войдите или зарегистрируйтесь чтобы увидеть ссылку Отправляем команду на принтер

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

Войдите или зарегистрируйтесь чтобы увидеть ссылку

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

Аналогичного эффекта можно добиться, используя оператор 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
----------------------------------------------

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

Для начала создадим файл с любым содержимым. Теперь нам необходимо просканировать диапазон IP-адресов на наличие всех узлов с открытым портом 9100. В этом нам поможет старый добрый Войдите или зарегистрируйтесь чтобы увидеть ссылку. Однако, чтобы получить чистые 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}"
----------------------------------------------

Войдите или зарегистрируйтесь чтобы увидеть ссылку

Теперь загоним все это в цикл, указав желаемый 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
----------------------------------------------

Войдите или зарегистрируйтесь чтобы увидеть ссылку

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

Войдите или зарегистрируйтесь чтобы увидеть ссылку

Можно было бы заставить печатать принтеры и с помощью команды 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 (это самый легкий способ) и видим больше полумиллиона потенциальных целей.

Войдите или зарегистрируйтесь чтобы увидеть ссылку
Поиск в ZoomEye по порту 9100

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

----------------------------------------------
device:"printer" +port:9100 +city:moscow
----------------------------------------------

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

----------------------------------------------
inurl:hp/device/this.LCDispatcher
intitle:"web image monitor"
----------------------------------------------

Веб-интерфейс управления JetDirect использует SNMP (Simple Network Management Protocol) — протокол прикладного уровня для управления сетевыми устройствами, включая принтеры. Он работает в IP-сетях поверх TCP/UDP, а девайсы с поддержкой SNMP легко обнаруживаются как специализированными утилитами вроде Войдите или зарегистрируйтесь чтобы увидеть ссылку, так и универсальными админскими комбайнами, например Войдите или зарегистрируйтесь чтобы увидеть ссылку.
Гораздо дольше искать в интернете открытые порты 9100 сканером Nmap. Все делается так же, как и в локальной сети. Для удобства возьмем Войдите или зарегистрируйтесь чтобы увидеть ссылку или программу, которая может выдать все IP-адреса в конкретном городе. Записываем их в файл и запускаем сканирование Nmap.

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

Войдите или зарегистрируйтесь чтобы увидеть ссылку

Этот способ более долгий, зато и результат будет свежий. Базы ZoomEye обновляются далеко не каждый день.

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

Сканирование сети с помощью Nmap
Небольшое уточнение. В Войдите или зарегистрируйтесь чтобы увидеть ссылку к этому сканеру говорится, что порт 9100 по умолчанию пропускается, если включена функция определения версий (задается она опциями -sV, которые также включают в себя опцию -A). Сделано это из-за того, что некоторые принтеры просто печатают все, что поступает на порт JetDirect. В ответ на опрос TCP 9100 они распечатают запрос вида GET / HTTP. Поэтому при запуске с данными флагами Nmap версии 3.90 и новее выдаст только предположительную службу с вопросительным знаком. Более безопасный (но менее информативный) вариант — запускать Nmap с ключами -sO. Так он попытается определить ОС хоста, но не станет отправлять дополнительные запросы, чтобы выяснить, какие службы отвечают на указанном порте.

Войдите или зарегистрируйтесь чтобы увидеть ссылку

Сканирование c функцией определения версий

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

Войдите или зарегистрируйтесь чтобы увидеть ссылку — кросс-платформенная и не требующая установки утилита с открытым исходным кодом, которая позволяет отправлять команды на языке PJL, включая недокументированные. Например, задействовать функцию RFU (remote firmware update), выполняющую удаленную перепрошивку устройства. Вместо официальной прошивки можно подсунуть свою (модифицированную) — в большинстве случаев никакие проверки не выполняются. Версия для Windows имеет интуитивно понятный GUI, а в nix-системах удобнее выполнять автоматизацию, работая из командной строки. Документация скудноватая, но разобраться с программой несложно.

Войдите или зарегистрируйтесь чтобы увидеть ссылку — эта программа предназначена для аудита безопасности при проверке настроек подключения сетевых принтеров. Умеет выполнять автоматический поиск и скачивать документы из памяти принтера. Работает на портах TCP 80 и 443, то есть поддерживает защищенное соединение. Ее можно запустить и под Windows, однако предварительно придется кое-что поменять в коде самой программы (см. документацию).

Войдите или зарегистрируйтесь чтобы увидеть ссылку — это целый фреймворк на Python для эксплуатации известных уязвимостей в службах удаленной печати. Работает в Linux, поддерживает команды PJL и PCL. Инструмент очень хорошо документирован, есть даже подробный Войдите или зарегистрируйтесь чтобы увидеть ссылку с примерами.
 

Вложения

Сверху