Содержание статьи
PJL и JetDirect
Компания Hewlett-Packard разработала язык Printer Job Language (PJL) еще в девяностых. Изначально он был предназначен для расширения команд принтера, но шли годы, и в динамичном мире информационных технологий для этой функции стал использоваться другой язык — Printer Command Language (PCL). С легкой руки HP язык PJL пошел своей дорогой. Его взяли на вооружение другие компании, он оброс новыми функциями... В итоге мы получили что-то сравнимое с ассемблером — язык один, а инструкции на каждое устройство свои.
Даже если взять только устройства HP, то полного описания инструкций и команд в открытом доступе нет (видимо, компания поняла, что выкладывать технические детали в интернет небезопасно). Есть общий мануал, в котором сопоставлены серийные модели принтеров и поддерживаемые ими команды. Также существует инструкция, описывающая действия команд, синтаксис и ошибки. Документ старый, сильно на него полагаться не стал бы.
Помимо языка управления принтерами, HP разработала еще одну интересную штуку, которая служит и по сей день, — JetDirect. Это технология, позволяющая превратить любой принтер в сетевой. На ее основе выпускаются как отдельные принт-серверы, так и встроенные (в принтеры, МФУ и роутеры). JetDirect позволяет подключать устройства к сети и печатать удаленно... причем не только их владельцу! 😉
Ломаем приветствие
С помощью PJL некоторые хакерские приемы применяются в сервисных центрах. Например, так сбрасывают счетчики напечатанных листов или очищают память о вставленных ранее картриджах. Это нельзя сделать из меню самого принтера, поэтому и приходится прибегать к таким уловкам через консоль. Давай и мы разомнемся!
WARNING
Статья написана в образовательных целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный изложенными здесь материалами.
Сервис JetDirect по умолчанию сконфигурирован на прослушивание TCP-порта 9100. На него мы и будем отправлять команды из консоли. Для опытов я использовал сетевой принтер HP Color LaserJet 3600n со встроенным принт-сервером HP JetDirect Fast Ethernet.
На открытый порт мы можем подключиться обычным 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
В итоге мы имеем возможность печатать документ при помощи JetDirect, просто отправив текст на TCP-порт 9100 из файла или консоли. Можно ли это автоматизировать? Нужно!
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»