
Printer Exploitation Toolkit — инструмент, который сделал поиск в мусоре устаревшим.
Ваш принтер защищен? Проверьте, пока это не сделал кто-то другой...
PRET — это новый инструмент для тестирования безопасности принтеров, разработанный в рамках магистерской диссертации в Рурском университете Бохума. Он подключается к устройству через сеть или USB и использует возможности заданного языка принтера. В настоящее время поддерживаются PostScript, PJL и PCL, которые используются большинством лазерных принтеров. Это позволяет выполнять такие интересные задачи, как захват или изменение заданий печати, доступ к файловой системе и памяти принтера или даже физическое повреждение устройства. Все атаки подробно описаны в Hacking Printers Wiki.
Основная идея PRET — упростить взаимодействие между конечным пользователем и принтером. Таким образом, после ввода команды в стиле UNIX, PRET преобразует её в PostScript, PJL или PCL, отправляет на принтер, оценивает результат и переводит обратно в удобный для пользователя формат. PRET предлагает множество команд, полезных для атак на принтеры и фаззинга.

PRET требует только интерпретатор Python2. Однако для цветного вывода и поддержки SNMP необходимо установить сторонние модули:
# pip install colorama pysnmp
Если вы работаете в консоли Windows и символы Unicode отображаются некорректно, установите модуль win_unicode_console:
# pip install win_unicode_console
Для экспериментальной «бесдрайверной» печати (см. команду print) необходимо установить ImageMagick и GhostScript:
# apt-get install imagemagick ghostscript
usage: pret.py [-h] [-s] [-q] [-d] [-i file] [-o file] target {ps,pjl,pcl}
positional arguments:
target printer device or hostname
{ps,pjl,pcl} printing language to abuse
optional arguments:
-h, --help show this help message and exit
-s, --safe verify if language is supported
-q, --quiet suppress warnings and chit-chat
-d, --debug enter debug mode (show traffic)
-i file, --load file load and run commands from file
-o file, --log file log raw data sent to the target
$ ./pret.py laserjet.lan ps
$ ./pret.py /dev/usb/lp0 pjl
PRET требует указания корректной цели и языка принтера в качестве аргументов. Целью может быть либо IP-адрес/имя хоста сетевого принтера (с открытым портом 9100/tcp), либо устройство, например /dev/usb/lp0 для локального USB-принтера. Чтобы быстро обнаружить все сетевые принтеры в вашей подсети с помощью SNMP-широковещания, просто запустите PRET без аргументов:
./pret.py
No target given, discovering local printers
address device uptime status
───────────────────────────────────────────────────────────────────────────────
192.168.1.5 hp LaserJet 4250 10:21:49 Ready
192.168.1.11 HP LaserJet M3027 MFP 13 days Paper jam
192.168.1.27 Lexmark X792 153 days Ready
192.168.1.28 Brother MFC-7860DW 16:31:17 Sleep mode
Язык принтера для эксплуатации должен быть одним из ps, pjl или pcl. Не все языки поддерживаются каждым принтером, поэтому при отсутствии обратной связи можно переключить язык. Каждому языку принтера соответствует свой набор команд PRET и разные возможности для эксплуатации.
--safe пытается проверить через IPP, HTTP и SNMP, поддерживается ли выбранный язык печати (PS/PJL/PCL) устройством перед подключением. На принтерах без сетевого подключения (USB, параллельный кабель) этот тест завершится ошибкой.
--quit подавляет определение модели принтера, приветственное сообщение и прочий диалог.
--debug показывает поток данных, фактически отправленный на устройство, и полученный ответ. Обратите внимание, что заголовки и другие служебные данные фильтруются. Для просмотра всего трафика используйте Wireshark. Отладку также можно включать/выключать в сеансе PRET с помощью команды debug.
--load filename читает и выполняет команды PRET из текстового файла. Это полезно для автоматизации. Файлы команд также можно вызывать позже в сеансе PRET с помощью команды load.
--log filename записывает копию необработанного потока данных, отправленного на принтер, в файл. Это может быть полезно для создания вредоносного файла задания печати, который можно развернуть на другом принтере, не имеющем прямого доступа, например, распечатав его с USB-накопителя.
После подключения к устройству принтера вы увидите оболочку PRET и сможете выполнять различные команды:
$ ./pret.py laserjet.lan pjl
________________
_/_______________/|
/___________/___//|| PRET | Printer Exploitation Toolkit v0.25
|=== |----| || by Jens Mueller <[email protected]>
| | ô| ||
|___________| ô| ||
| ||/.´---.|| | || 「 cause your device can be
|-||/_____\||-. | |´ more fun than paper jams 」
|_||=L==H==||_|__|/
(ASCII art by
Jan Foerster)
Connection to laserjet.lan established
Device: hp LaserJet 4250
Welcome to the pret shell. Type help or ? to list commands.
laserjet.lan:/> help
Available commands (type help <topic>):
=======================================
append debug edit free id ls open restart timeout
cat delete env fuzz info mirror printenv selftest touch
cd df exit get load mkdir put set traversal
chvol disable find help lock nvram pwd site unlock
close display format hold loop offline reset status version
laserjet.lan:/> ls ../../
- 834 .profile
d - bin
d - dev
d - etc
d - hp
d - hpmnt
- 1276 init
d - lib
d - pipe
d - tmp
laserjet.lan:/> exit
Список общих команд PRET приведен ниже:
help List available commands or get detailed help with 'help cmd'.
debug Enter debug mode. Use 'hex' for hexdump: debug [hex]
load Run commands from file: load cmd.txt
loop Run command for multiple arguments: loop <cmd> <arg1> <arg2> …
open Connect to remote device: open <target>
close Disconnect from device.
timeout Set connection timeout: timeout <seconds>
discover Discover local printer devices via SNMP.
print Print image file or raw text: print <file>|"text"
site Execute custom command on printer: site <command>
exit Exit the interpreter.
Общие операции с файловой системой с реализацией, специфичной для PS/PJL/PCL:
┌───────────┬─────┬─────┬─────┬────────────────────────────────────────┐
│ Команда │ PS │ PJL │ PCL │ Описание │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ ls │ ✓ │ ✓ │ ✓ │ Показать содержимое удаленного каталога. │
│ get │ ✓ │ ✓ │ ✓ │ Получить файл: get <file> │
│ put │ ✓ │ ✓ │ ✓ │ Отправить файл: put <local file> │
│ append │ ✓ │ ✓ │ │ Добавить к файлу: append <file> <str> │
│ delete │ ✓ │ ✓ │ ✓ │ Удалить удаленный файл: delete <file> │
│ rename │ ✓ │ │ │ Переименовать удаленный файл: rename <old> <new> │
│ find │ ✓ │ ✓ │ │ Рекурсивно вывести содержимое каталога. │
│ mirror │ ✓ │ ✓ │ │ Зеркально скопировать удаленную файловую систему в локальный каталог. │
│ cat │ ✓ │ ✓ │ ✓ │ Вывести удаленный файл в stdout. │
│ edit │ ✓ │ ✓ │ ✓ │ Редактировать удаленные файлы с помощью vim. │
│ touch │ ✓ │ ✓ │ │ Обновить временные метки файла: touch <file> │
│ mkdir │ ✓ │ ✓ │ │ Создать удаленный каталог: mkdir <path> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ cd │ ✓ │ ✓ │ │ Изменить рабочий удаленный каталог. │
│ pwd │ ✓ │ ✓ │ │ Показать рабочий каталог на устройстве. │
│ chvol │ ✓ │ ✓ │ │ Изменить удаленный том: chvol <volume> │
│ traversal │ ✓ │ ✓ │ │ Установить обход пути: traversal <path> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ format │ ✓ │ ✓ │ │ Инициализировать файловую систему принтера. │
│ fuzz │ ✓ │ ✓ │ │ Фаззинг файловой системы: fuzz <category> │
├─ ─ ─ ─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ path - Исследовать структуру ФС с помощью стратегий обхода путей. │
│ write - Сначала поместить/добавить файл, затем проверить его существование. │
│ blind - Тесты только на чтение существующих файлов, например /etc/passwd. │
├───────────┬─────┬─────┬─────┬────────────────────────────────────────┤
│ df │ ✓ │ ✓ │ │ Показать информацию о томе. │
│ free │ ✓ │ ✓ │ ✓ │ Показать доступную память. │
└───────────┴─────┴─────┴─────┴────────────────────────────────────────┘
id Показать информацию об устройстве.
version Показать версию интерпретатора PostScript.
devices Показать доступные устройства ввода-вывода.
uptime Показать время работы системы (может быть случайным).
date Показать системную дату и время принтера.
pagecount Показать счетчик страниц принтера.
lock Установить пароль startjob и системных параметров.
unlock Сбросить пароль startjob и системных параметров.
restart Перезапустить интерпретатор PostScript.
reset Сбросить настройки PostScript к заводским.
disable Отключить функцию печати.
destroy Вызвать физическое повреждение NVRAM принтера.
hang Выполнить бесконечный цикл PostScript.
overlay Наложить EPS-файл на все печатные копии: overlay <file.eps>
cross Добавить граффити на все печатные копии: cross <font> <text>
replace Заменить строку в документах для печати: replace <old> <new>
capture Захватывать последующие задания для печати на этом устройстве.
hold Включить удержание заданий.
set Установить ключ в значение в верхнем словаре: set <key=value>
known Список поддерживаемых операторов PostScript: known <operator>
search Поиск по всем словарям по ключу: search <key>
dicts Возвращает список словарей и их разрешений.
resource Список или дамп ресурса PostScript: resource <category> [dump]
dump Сделать дамп словаря: dump <dict>
Словари: - systemdict - statusdict - userdict
- globaldict - serverdict - errordict
- internaldict - currentsystemparams
- currentuserparams - currentpagedevice
config Изменить настройки принтера: config <setting>
duplex - Установить двустороннюю печать.
copies # - Установить количество копий.
economode - Установить экономичный режим.
negative - Установить негативную печать.
mirror - Установить зеркальное отображение.
Не все команды поддерживаются каждым принтером. Особенно устройства Brother и Kyocera используют собственные клоны PostScript — Br-Script и KPDL — вместо лицензирования оригинального «Adobe PostScript». Такие версии языка PostScript могут быть не на 100% совместимы, особенно в отношении критичных для безопасности функций, таких как захват заданий печати. Доступ к файловой системе поддерживается большинством принтеров, однако обычно ограничен определенным изолированным каталогом.
id Показать информацию об устройстве.
status Включить сообщения о состоянии.
version Показать версию прошивки или серийный номер (из 'info config').
pagecount Управлять счетчиком страниц принтера: pagecount <number>
printenv Показать переменную окружения принтера: printenv <VAR>
env Показать переменные окружения (псевдоним для 'info variables').
set Установить переменную окружения принтера: set <VAR=VALUE>
display Установить сообщение на дисплее принтера: display <message>
offline Перевести принтер в офлайн и отобразить сообщение: offline <message>
restart Перезапустить принтер.
reset Сбросить к заводским настройкам.
selftest Выполнить различные самотесты принтера.
disable Отключить функцию печати.
destroy Вызвать физическое повреждение NVRAM принтера.
flood Затопить пользовательский ввод, может выявить переполнение буфера.
lock Заблокировать настройки панели управления и запись на диск.
unlock Разблокировать настройки панели управления и запись на диск.
hold Включить удержание заданий.
nvram Операции с NVRAM: nvram <operation>
nvram dump [all] - Сбросить (всю) NVRAM в локальный файл.
nvram read addr - Прочитать один байт по адресу.
nvram write addr value - Записать один байт по адресу.
info Показать информацию: info <category>
info config - Предоставляет информацию о конфигурации.
info filesys - Возвращает информацию о файловой системе PJL.
info id - Предоставляет номер модели принтера.
info memory - Определяет объем доступной памяти.
info pagecount - Возвращает количество напечатанных страниц.
info status - Предоставляет текущий статус принтера.
info ustatus - Список переменных статуса по требованию.
info variables - Список переменных окружения принтера.
Некоторые команды поддерживаются исключительно принтерами HP, так как другие производители реализовали только подмножество стандарта PJL. Это особенно касается команд на основе PML, таких как restart или reset. Включение долговременного удержания заданий с помощью команды hold, по-видимому, возможно только для некоторых устройств Epson. Доступ к NVRAM через команду nvram является собственной функцией принтеров Brother. Ограниченный доступ к файловой системе поддерживается различными устройствами HP, OKI, Konica, Xerox, Epson и Ricoh.
selftest Выполнить самотест принтера.
info Показать информацию: info <category>
info fonts - Показать установленные шрифты.
info macros - Показать установленные макросы.
info patterns - Показать пользовательские шаблоны.
info symbols - Показать наборы символов.
info extended - Показать расширенные шрифты.
PCL — это очень ограниченный язык описания страниц без доступа к файловой системе. Поэтому команды get/put/ls используют виртуальную файловую систему на основе макросов PCL, реализованную в основном ради хакерской ценности. Эта доказательная концепция показывает, что даже устройство, поддерживающее только минималистичные языки, такие как PCL, может использоваться для хранения произвольных файлов, например материалов, нарушающих авторские права. Хотя такой сервис обмена файлами сам по себе не является уязвимостью безопасности, он может расцениваться как «нецелевое использование услуги» в зависимости от корпоративной политики.
pret.py - Исполняемая основная программаcapabilities.py - Процедуры для проверки поддержки языка принтераdiscovery.py - Процедуры для вывода списка принтеров с помощью SNMP-широковещанияprinter.py - Общий код для описания устройства печатиpostscript.py - Код, специфичный для PS (наследуется от класса printer)pjl.py - Код, специфичный для PJL (наследуется от класса printer)pcl.py - Код, специфичный для PCL (наследуется от класса printer)helper.py - Вспомогательные функции для вывода, логирования, сокетов и т.д.codebook.py - Статическая таблица кодов состояния/ошибок PJLfuzzer.py - Константы для фаззинга файловой системыmibs/* - Специфичные для принтера MIB-файлы SNMPdb/* - база данных поддерживаемых моделейУчитывая возможности и различные проприетарные расширения в языках печати, таких как PostScript и PJL, проведение пентеста на принтерах — нетривиальная задача. PRET может помочь проверить и подтвердить известные проблемы в языке. Когда вы поиграете с инструментом, возможно, захотите выполнить систематический анализ безопасности принтеров. Хорошей отправной точкой является Шпаргалка по тестированию безопасности принтеров.
Удачного хакинга!
lpd/* - Скрипты для фаззинга LPD