Сейчас в любой организации есть принтеры. Несмотря на тренд последнего десятилетия на сохранение окружающей среды и перехода на электронный документооборот, печатные копии документов по‑прежнему требуются для работы. Соответственно, без корпоративной системы печати обойтись довольно сложно, а если есть система, то значит, это ещё один вектор для возможной атаки.
В этой статье мы начнём рассмотрение основ систем печати и проведения разведки этих систем при пентесте. В следующей статье мы подробнее рассмотрим возможные векторы атак. А начнём с основных принципов работы систем печати.
Просто нажми Print
Давайте посмотрим, что происходит, когда мы нажимаем в офисном приложении кнопку печати. Для того чтобы исходный документ был распечатан принтером, используются специальные сетевые протоколы и языки управления принтерами (PCL).
Конечно, бывают принтеры, подключённые локально к компьютеру по USB или другим портам. Например, в кабинетах руководства часто используются локальные принтеры для конфиденциальности и для того, чтобы занятые руководители не тратили время на поход за распечатанной копией. В принципе, многие из тех атак, о которых мы будем говорить в этой и следующей статьях, применимы и для локальных принтеров, но основной упор мы всё‑таки будем делать на сетевую печать.
И начнём мы с сетевых протоколов, так как именно их мы дальше будем использовать при пентесте. В сетях под управлением ОС Windows обычно используют протоколы SMB/CIFS. Также существуют различные экзотические протоколы для сетевой печати, такие как Novell's NCP или AppleTalk, но при пентесте вы вряд ли их встретите. Кроме того, некоторые устройства поддерживают печать по таким протоколам, как FTP или HTTP, для загрузки файлов. Обычно на самом принтере есть встроенный веб‑сервер, на который можно загружать документы для печати. Это не слишком удобно (и не безопасно) и кроме того, при печати офисных документов могут возникнуть проблемы с отсутствием нужных шрифтов.
Однако наиболее распространёнными протоколами печати, поддерживаемыми непосредственно сетевыми принтерами, являются LPD, IPP и печать напрямую, через порт 9100.
Протокол сетевой печати выступает в качестве канала для передачи заданий на печать, которые либо содержат непосредственно язык описания страниц, либо сначала вызывают язык управления принтером/заданием для изменения параметров — например, лотков для бумаги.
Общий принцип вложенности протоколов, языков контроля печати и языков описания страниц представлен на следующей схеме.

С точки зрения безопасности такая инкапсуляция довольно интересна, особенно потому, что функциональность может дублироваться. Например, имя пользователя — каждый раз разное — может быть задано в протоколе Internet Printing Protocol (IPP), и в Printer Job Language (PJL), и непосредственно в PostScript. Если что‑то ограничено на одном уровне, оно может быть разрешено на следующем.
Также стоит обратить внимание на то, что сетевой принтер обычно поддерживает несколько протоколов для печати документа, что в целом увеличивает поверхность атаки.
Далее давайте посмотрим, что такое языки управления принтером и описания страниц.
Языки управления принтером
Язык управления заданиями (PCL) управляет такими параметрами, как выходные лотки, формат для текущего задания печати. Хотя он обычно является дополнительным слоем между протоколом печати и языком описания страниц, его функции могут дублироваться. Примерами языков управления заданиями, разработанных конкретными производителями, являются CPCA, XJCL, EJL и PJL, который поддерживается различными принтерами и будет рассмотрен ниже. Кроме того, языки контроля и управления принтерами предназначены для воздействия не только на отдельное задание печати, но и на устройство в целом. Одним из подходов к определению общего стандарта для решения этой задачи стал язык NPAP. Однако он не прижился и поддерживается только компанией Lexmark. Другие производители принтеров вместо этого используют SNMP или его метаязык PML, основанный на PJL.
Языки описания страниц
Язык описания страниц (PDL) определяет внешний вид реального документа. Однако следует отметить, что некоторые PDL предлагают ограниченное управление заданиями, поэтому чёткое разграничение между описанием страницы и языком управления принтером/заданием не всегда возможно. Функция драйвера принтера заключается в переводе файла для печати в PDL, понятный для модели принтера. Здесь стоит обратить внимание на то, что некоторые недорогие струйные принтеры вообще не поддерживают язык описания страниц высокого уровня. Так называемые принтеры на основе хоста или GDI принимают только простые растровые потоки данных, такие как ZJS, а фактический рендеринг выполняется драйвером принтера. Существуют различные собственные языки описания страниц, например, PRESCRIBE, SPL, XES, CaPSL, RPCS, ESC/P от Kyocera, которые в основном используются в матричных принтерах, или HP‑GL и HP‑GL/2, разработанные для плоттеров. Поддержка прямой печати в форматах PDF и XPS также широко распространена в новых принтерах. Однако наиболее распространёнными стандартными языками описания страниц являются PostScript и PCL.
Итак, с основными элементами, участвующими в процессе печати, мы разобрались. Теперь самое время перейти к основной теме статьи — пентесту системы печати.
Ищем принтеры в сети
Для поиска принтеров в сети можно воспользоваться утилитой Nmap с указанием списка портов, которые обычно используются системами печати. Это прежде всего порт прямого доступа (direct‑IP) 9100, также может быть интересен порт 515 LPR/LPD и порт 631, который используется протоколом IPP при работе с большинством современных принтеров и принт‑серверов на базе системы печати CUPS.
В итоге:
nmap -p 9100,515,631 подсеть/маска
Однако многие устройства (не только принтеры) используют протокол SNMP, и с его помощью мы тоже можем попробовать найти принтеры. Помимо Nmap для взаимодействия по SNMP нам также потребуется утилита snmpwalk, которая входит в состав Kali Linux.
Представленный ниже скрипт сканирует сеть с помощью Nmap, выявляя открытые порты 161/UDP (SNMP). Затем к каждому найденному узлу мы пытаемся подключиться с помощью snmpwalk и различных значений community.
nmap -P0 -v -sU -p 161 -oA snmp_scan 192.168.0.1/24
for i in *.gnmap
do for j in $(grep ‘161/open/’ $i | awk ‘{ print $2 }’) do
echo $j
snmpwalk -v2c -c public $j &> snmpwalk_${j}_public.txt
if [ "$?" = "0" ]; then echo "$j accepts SNMP community string public"; fi
snmpwalk -v2c -c private $j &> snmpwalk_${j}_private.txt
if [ "$?" = "0" ]; then echo "$j accepts SNMP community string private"; fi
done
done
Если принтер имеет настройки по умолчанию, то такой способ поможет найти принтеры. Но ещё можно вместо использования самописных скриптов воспользоваться более интересным инструментом.
PRET — Printer Exploitation Toolkit
Тулкит PRET может подключаться к принтеру по сети или USB и общаться с ним на PostScript, PJL и PCL. То есть мы можем, к примеру, перехватывать задания печати или манипулировать ими, получать доступ к файловой системе и памяти принтера и даже наносить физические повреждения устройству.
Основная идея PRET заключается в облегчении коммуникации между конечным пользователем и принтером. Так, после ввода UNIX‑подобной команды утилита PRET переводит её в PostScript, PJL или PCL, отправляет на принтер, оценивает результат и переводит его обратно в удобный для пользователя формат. PRET предлагает целый ряд команд, полезных для атак на принтеры. В следующей статье мы рассмотрим этот инструмент подробнее, а сейчас нас будет интересовать установка PRET для поиска принтеров в сети.
Тулкит написан на Python, и установить его довольно просто:
$ git clone https://github.com/RUB-NDS/PRET && cd PRET
$ pip install colorama pysnmp
$ chmod +x pret.py
Сейчас мы будем использовать PRET только для поиска устройств, поэтому запустим./pret.py без параметров.

В результате получаем список найденных принтеров.
Более творческие способы поиска принтеров
Помимо поиска специфичных портов и использования не менее специфичных утилит, мы можем также поискать открытые порты 80/443TCP, что всегда делается при проведении пентеста. Конечно, веб-интерфейс имеют множество устройств и приложений, но возможно, среди найденных страниц окажется консоль управления принтером.
А ещё многие принтеры имеют встроенный функционал точки доступа Wi‑Fi для доступа к печати с помощью беспроводной сети. SSID сети, скорее всего, будет соответствовать модели принтера, и это существенно упростит нам как задачу выявления принтера, так и поиск учётных данных, которые используются по умолчанию для доступа к беспроводной сети и к самой консоли администрирования.
Как защититься
Как можно усложнить злоумышленнику задачу выявления принтеров в сети? Конечно, закрыть порты, необходимые для работы принтера, мы можем не всегда, но можно настроить списки доступа между сегментами сети таким образом, чтобы тем, кому этот принтер особенно не нужен, соответствующие порты не были бы доступны.
Что касается SNMP: его лучше отключить, особенно если SNMPv3 не поддерживается. Если же SNMP < v3 вам жизненно необходим, то хотя бы смените community по умолчанию на более сложный.
Веб-интерфейс предназначен для администрирования устройства и не должен быть доступен из пользовательских сегментов сети.
Функционал точки доступа на принтере вам вряд ли нужен, и лучше всего его отключить. Если без него никак, то также смените заводские настройки, в частности, ключ WPA, на более сложный.
Заключение
Мы начали рассматривать тему пентеста системы печати. В этой статье мы рассмотрели основные принципы работы и способы поиска принтеров в сети. В следующей статье мы поговорим о различных векторах атак на принтеры и систему печати.
Пользуясь случаем, напоминаю про открытые уроки по информационной безопасности, которые проведут мои коллеги в Otus в феврале:
19 февраля. Комплексная кибербезопасность компании: как выстроить многоуровневую защиту, чтобы избежать финансовых потерь и соблюсти действующие и будущие стандарты ИБ. Записаться
25 февраля. SSTI-методы поиска и эксплуатации недостатка в реальной среде: получите глубокое понимание принципов возникновения SSTI и практические навыки их поиска и эксплуатации. Записаться
JungHerr
Отключить на самом принтере или отключить в свойствах порта инсталлированного на "клиенте"/"сервере печати" принтера?
Первое чревато тем, что принтер может быть некорректно инсталлирован - неверно или не определены лотки, модули (дуплексная печать, брошюрирование и т.д.). Особенно это касается использования универсальных драйверов печати.
Второе тем, что статус очереди на "клиенте"/"сервер печати" будет всегда - вне зависимости от реального статуса принтера - "online".