В предыдущей статье мы начали разговор о пентесте системы печати. Мы рассмотрели, на каких протоколах и языках строится взаимодействие с принтерами, попробовали поискать открытые порты, через которые можно с ними взаимодействовать, а также познакомились с инструментом PRET.
Теперь давайте перейдём к практике и попробуем проэксплуатировать то, что удалось найти. Начнём со сброса настроек.
Hard reset
Сброс устройства к заводским настройкам по умолчанию является критически важной функцией, так как при этом происходит перезапись механизмов защиты, например, паролей, установленных пользователем. Обычно это можно сделать, нажав специальную комбинацию клавиш на панели управления принтера. При пентесте это не такой уж и фантастический сценарий, так как Внутренний нарушитель и Гость имеют физический доступ к принтерам, которые, как правило, физически не ограничивают от пользователей.
Но далее давайте рассмотрим сценарий, когда у атакующего нет физического доступа к оборудованию. Например, наш нарушитель получил доступ на одну из пользовательских машин и ему необходимо развить атаку и закрепиться в сети.
Вспоминая материалы предыдущей статьи, начнём с протокола SNMP.
Если включен SNMP
Итак, допустим, нам повезло и на принтере доступен порт SNMP с комьюнити public. Для того, чтобы общаться с устройством по протоколу SNMP, нам необходимо использовать MIB. Management Information Base — виртуальная база данных, используемая для управления объектами в сети. Объекты в базе MIB представлены в виде иерархической структуры.
Саму иерархию MIB можно представить в виде дерева с безымянным корнем, уровни назначаются различными организациями. Идентификаторы OID высшего уровня принадлежат организациям по стандартизации, в то время как идентификаторы нижнего уровня выделены связанным организациям.
Для лучшего понимания посмотрим рисунок, представленный ниже. В столбце справа мы видим OID представленный в виде идентификаторов, например, OID 1.3.6.1.2.1.43… Слева мы видим расшифровку этого дерева, где каждая ветка имеет название.

Но вернёмся к нашей теме — сбросу настроек принтера к заводским. Это можно сделать с помощью протокола SNMP. В Printer‑MIB определён объект prtGeneralReset
(OID 1.3.6.1.2.1.43.5.1.1.3.1), который позволяет злоумышленнику перезагрузить устройство (powerCycleReset(4)
), сбросить настройки NVRAM (resetToNVRAM(5)
) или восстановить заводские настройки (resetToFactoryDefaults(6)
) с помощью SNMP.
Эта функция/атака поддерживается большим количеством принтеров и снимает все механизмы защиты, такие как пользовательские пароли для встроенного веб‑сервера. Хотя механизмы защиты можно эффективно обойти, практический недостаток этого подхода заключается в том, что вся статическая конфигурация IP‑адресов будет потеряна. Если служба DHCP недоступна, атакующий не сможет повторно подключиться к устройству после сброса настроек до заводских.
Этот риск надо учитывать. Конечно, атакующий может поднять свой временный DHCP, чтобы вернуть доступ и затем постараться всё вернуть к прежним настройкам (насколько это возможно).
Сброс устройства на заводские настройки можно выполнить с помощью утилиты snmpset, входящей в состав Kali Linux, как показано ниже:
snmpset -v1 -c public IP_принтера 1.3.6.1.2.1.43.5.1.1.3.1 i 6
Здесь значение 6 — это как раз сброс к заводским настройкам.
Если же нам не повезло и SNMP либо выключен, либо используется более сложное название комьюнити, то можно попробовать воспользоваться средствами языка PJL.
Так, на устройствах HP можно преобразовать SNMP в представление PML и встроить запрос в легитимное задание печати. Это позволяет злоумышленнику перезагрузить устройство и/или вернуть его к заводским настройкам по умолчанию в рамках обычных заданий печати, как показано ниже:
@PJL DMCMD ASCIIHEX=”040 006 020 501 010 301 040 106”
Также, на принтерах HP перезапуск или сброс устройства можно легко воспроизвести с помощью PRET:
$./pret.py ‑q IP_принтера pjl

Эту атаку можно реализовать не только по сети, но и локально, подключившись с помощью USB-кабеля, если по каким‑то причинам нельзя выполнить сброс нажатием специальных клавиш. PRET поддерживает работу через USB-интерфейс, необходимо лишь указать соответствующее устройство при подключении.
Язык PostScript, который мы рассматривали в предыдущей статье, также предлагает аналогичную функцию по сбросу настроек. Системный параметр FactoryDefaults
, «флаг, который, если установить в true непосредственно перед выключением принтера, заставляет все энергонезависимые параметры вернуться к заводским значениям по умолчанию при следующем включении питания».
С другой стороны, перезапуск принтера может быть осуществлён с помощью SNMP и PML, как описано выше. Следует отметить, что сам PostScript также имеет возможность перезапуска своей среды, но для этого требуется действительный пароль. Однако интерпретатор PostScript может быть помещен в бесконечный цикл, что вынуждает пользователя вручную перезапускать устройство и, таким образом, сбрасывать пароль PostScript.
Сброс системных параметров PostScript на заводские значения по умолчанию:
<< /FactoryDefaults true >> setsystemparams
Перезапуск интерпретатора PostScript и сброс виртуальной памяти:
true 0 startjob systemdict /quit get exec
С помощью PRET мы можем выполнить сброс посредством:
./pret.py -q IP_принтера ps
И далее reset и restart, как и в примере с PJL.
Доступ к заданиям
Можно без преувеличения сказать, что самые ценные данные, хранящиеся на принтерах, — это сами задания на печать. Как уже говорилось ранее, даже в цифровом мире важные документы печатаются и хранятся в виде бумажных копий. В средах с высоким уровнем безопасности с зашифрованными жёсткими дисками и сетевым трафиком принтеры могут оказаться самым слабым звеном в цепи безопасности. Однако, даже имея доступ к файловой системе принтера, злоумышленник не сможет получить задания на печать, если они не были сохранены в явном виде. Это связано с тем, что задания печати обрабатываются «на лету» только в памяти и никогда не хранятся на жёстком диске.
Здесь конечно будет не так много универсальных советов, так как многое определяется принципами работы самих устройств. Так, на некоторых принтерах задания печати доступны с веб‑сервера (например, HP DesignJet Z6100ps). Однако обычно сохранение заданий должно быть явно активировано, что можно сделать с помощью стандартных команд PJL или команд PostScript. После этого задания сохраняются в памяти и могут быть повторно напечатаны с панели управления.
С помощью PRET мы можем явно указать принтеру сохранять задания. Это можно сделать с помощью команды hold
.

Также при использовании PostScript можно указать команду hold
для сохранения заданий:

Захват заданий
Активировать сохранение задания в веб-интерфейсе печати, как говорилось выше, можно, но нечасто. Однако в PostScript есть полный доступ к текущему заданию печати, а с помощью оператора startjob
можно даже выйти из цикла текущего задания сервера и получить доступ к будущим заданиям. Такая функциональность способна захватить все документы, если PostScript используется в качестве драйвера принтера.
С помощью возможности подключаться к произвольным операторам PostScript можно манипулировать и получать доступ к заданиям печати. Так, для анализа фактического потока данных, отправляемого на принтер, можно применить довольно интересную особенность языка PostScript: читать собственный программный код как данные с помощью оператора currentfile
. Таким образом, весь поток данных, обрабатываемый интерпретатором PostScript, может быть доступен для чтения и сохранён в файле на диске принтера. Если принтер не предоставляет доступа к файловой системе, захваченные документы можно хранить в памяти, например, в постоянных словарях PostScript.
Одна из практических проблем для такого сценария заключается в том, как решить, к какому оператору следует подключиться — поскольку доступ к потоку данных можно получить только после того, как этот оператор будет обработан интерпретатором PostScript. Поскольку атакующий хочет перехватывать задания печати с самого начала, переопределённый оператор должен быть самым первым оператором, содержащимся в PostScript‑документе. К счастью, все документы, печатаемые с помощью CUPS, втиснуты в фиксированную структуру, начинающуюся с currentfile /ASCII85Decode filter /LZWDecode filter cvx exec
.
Исходя из предположения о такой фиксированной структуре, злоумышленник может перехватить документы с самого начала и выполнить (распечатать) файл после этого. Для систем печати, отличных от CUPS, такая атака также возможна, но операторы должны быть адаптированы соответствующим образом.
Обратите внимание, что заголовок PostScript, который обычно включает размер носителя, имена пользователя и задания, не может быть перехвачен этим методом, потому что мы сначала подключаемся к началу фактического документа.
Другая универсальная стратегия перехвата каждого задания печати – установка системного параметра BeginPage, если он поддерживается принтером (большинство принтеров поддерживают). Предположительно, эта уязвимость присутствует в печатных устройствах уже несколько десятилетий, поскольку злоупотребляют исключительно языковыми конструкциями, определёнными стандартом PostScript.
Итак, выполним захват печати с помощью PRET:

Теперь посмотрим, что удалось перехватить и затем распечатаем захваченные документы:

Заключение
Теперь мы знаем, как можно сбросить принтер к заводским настройкам и как можно настроить перехват заданий, которые на него отправляют. В следующей статье мы посмотрим, как можно реализовать другие атаки на систему печати.
6 марта в Otus пройдёт открытый урок «Классические атаки стандартными инструментами». На нём вы научитесь профессионально работать с nmap, crunch и Hydra, а также строить эффективные превентивные меры защиты. Записаться можно на странице курса «Пентест».
Полный список бесплатных уроков по информационной безопасности, разработке и другим ИТ-направлениям смотрите в календаре.