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

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.

Находим открытый порт 9100 программой Nmap
Находим открытый порт 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

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Check Also

Шах и мат! Как устроен нашумевший эксплоит checkm8 и как им воспользоваться

До недавнего времени джейлбрейка для iOS 13 не существовало. Точнее, до тех пор, пока хаке…

Оставить мнение