Решил тут немного погрузиться в новую для себя тему. Ну а лучший способ - это систематизировать информацию в тест. Речь пойдет о тестировании сетевых принтеров. Чтобы чтиво не вышло невыносимо долгим, будет несколько частей.
В чем же собственно проблема?
Вы таки удивитесь, но даже 30 лет назад уже существовали не только матричные, но и струйные и лазерные принтеры: бурное развитие технологий печати пришлось на 80-е годы прошлого века. Однако, они были далеки от современного офисного МФУ. Да и интернет в знакомом нам виде только-только начинал зарождаться. Что уж тут говорить о хакерах. В наше время подходя к МФУ мы видим и сам принтер, и сетевую карту (а то и две: для проводной связи и Wi-Fi), клавиатуру, дисплей, плату для телефонной линии. Все это безобразие управляется полноценной операционной системой на ядре Linux.
Так что же значит напечатать документ на таком МФУ?
По сути, это два действия
Самое интересное кроется во втором пункте!
У вас огромное число возможных файлов для вывода на печать: простой текст, векторная графика, растровая графика, сложные документы с немыслимой комбинацией всего и вся на одной странице. Как все это разнообразие перевести в команды для механической печатающей части принтера? Какой тип и размер бумаги выбрать? Как управлять очередью заданий? Как задать число копий?
Передачей команд для механической части занимается интерпретатор принтера. В свою очередь, он получает от компьютера/смартфона перечень инструкций на понятном яму языке. Например, на PostScript или PCL. Таким образом, ваш файл конвертируется в набор команд для принтера. Для некоторой наглядности приведу пример описания картинки в PostScrip, честно взятый из Вики
Крайне важно понять, что PostScript — это не язык разметки гипертекста в стиле HTML. Это полнофункциональный язык программирования.
Другими словами, выполнение кода PostScript - это по сути RCE.
Если же мы возьмем язык PJL, то что мы сможем сделать? Довольно много. Установить размер листа, число копий по умолчанию.
Забавно, но PJL не ограничивается рамками текущего задания на печать.
Фишкой PJL является то, что он разрабатывался не столько для описания документа, сколько для управления принтером. Поэтому он имеет весьма интересные функции, такие как доступ к файловой системе. Несмотря на то, что эта уязвимость была публично продемонстрирована более 15 лет назад, в безопасности принтеров ничего не изменилось.
К слову, границы между языками описания страниц и языкам и управления принтером весьма размыты.
Например, после появления PJL многие его возможности были портированы в PostScript
Подводя итог вступительной части хочу резюмировать, что в базовом функционале любого принтера заложены возможности для проведения атак. При этом атакующий не сильно зависит от используемых компанией систем безопасности (если он не проводит атаку через Веб).
Насколько реален такой вектор в жизни? Вполне реален и весьма опасен, особенно если речь идет о серьезных схемах с участием инсайдера.
В чем же собственно проблема?
- Принтеры везде. Серьезная организация без МФУ.... я таких не видел.
- В наше время в офисах стоят не только принтеры, но и МФУ - полноценные компьютеры, подключенные к сети
- Сотрудники ИБ далеко не всегда рассматривают эту угрозу как таковую
- Стандарты и языки для печати файлов разработаны 30 лет назад
- Эти базовые стандарты никто не спешит отменять/модифицировать в угоду совместимости, прибыли, удобству.
Вы таки удивитесь, но даже 30 лет назад уже существовали не только матричные, но и струйные и лазерные принтеры: бурное развитие технологий печати пришлось на 80-е годы прошлого века. Однако, они были далеки от современного офисного МФУ. Да и интернет в знакомом нам виде только-только начинал зарождаться. Что уж тут говорить о хакерах. В наше время подходя к МФУ мы видим и сам принтер, и сетевую карту (а то и две: для проводной связи и Wi-Fi), клавиатуру, дисплей, плату для телефонной линии. Все это безобразие управляется полноценной операционной системой на ядре Linux.
Так что же значит напечатать документ на таком МФУ?
По сути, это два действия
- Выбор канала передачи данных
- USB
- IPP - Internet Printing Protocol
- SMB - Server Message Block
- LPR/LPD - Line Printer Daemon Protocol
- Raw port 9100
- ...
- Выбор драйвера
- Драйвер определяет язык управления принтером
- PJL - Printer Job Language.Разработан компанией HP для управления принтером, расширяя возможности PCL служебными командами (управление файловой системой, счетчиками, заданиями, языками и т.д.)
- PML
- SNMP
- UEL
- ...
- Драйвер определяет язык описания страниц (PDL), понимаемый данной моделью принтера
- PostScript - самый известный язык описания страниц и управления принтером. Разработан компанией Adobe, которая и появилась в 1982 году благодаря двум сотрудникам Xerox и их желанию развивать свою разработку - язык PostScript.
- PCL - Printer Command Language. Язык управления принтером, разработанный компанией Hewlett-Packard. Практически стандарт для систем HP и ОС MS Windows
- XPS
- ...
- Драйвер определяет язык управления принтером
Самое интересное кроется во втором пункте!
У вас огромное число возможных файлов для вывода на печать: простой текст, векторная графика, растровая графика, сложные документы с немыслимой комбинацией всего и вся на одной странице. Как все это разнообразие перевести в команды для механической печатающей части принтера? Какой тип и размер бумаги выбрать? Как управлять очередью заданий? Как задать число копий?
Передачей команд для механической части занимается интерпретатор принтера. В свою очередь, он получает от компьютера/смартфона перечень инструкций на понятном яму языке. Например, на PostScript или PCL. Таким образом, ваш файл конвертируется в набор команд для принтера. Для некоторой наглядности приведу пример описания картинки в PostScrip, честно взятый из Вики
Код:
%!PS-Adobe-1.0
% По умолчанию, постскрипт использует единицу измерения 1 пункт=1/72 дюйма,
% а нам нравятся миллиметры.
72 25.4 div % 1 мм = 72/25.4 пунктов
dup % дублировать значение на вершине стека
scale % растянуть в это количество раз по обеим координатам
100 100 translate % установить начало координат в (100 мм, 100 мм)
/Times-Roman findfont % взять шрифт Times-Roman
10 scalefont % растянуть до размера 10 (у нас - мм!)
setfont % установить выбранный шрифт
0 30 330 { % цикл для углов от 0 до 330 с шагом 30
gsave % запомнить текущее преобразование координат
rotate % повернуть систему координат (угол в градусах берём с вершины стека)
15 0 moveto % перейти в точку (15 мм, 0 мм)
(Wikipedia) show % написать слово текущим шрифтом
grestore % вернуть преобразование координат
} for % конец цикла for
showpage % вывести страницу
Другими словами, выполнение кода PostScript - это по сути RCE.
Если же мы возьмем язык PJL, то что мы сможем сделать? Довольно много. Установить размер листа, число копий по умолчанию.
Забавно, но PJL не ограничивается рамками текущего задания на печать.
Фишкой PJL является то, что он разрабатывался не столько для описания документа, сколько для управления принтером. Поэтому он имеет весьма интересные функции, такие как доступ к файловой системе. Несмотря на то, что эта уязвимость была публично продемонстрирована более 15 лет назад, в безопасности принтеров ничего не изменилось.
К слову, границы между языками описания страниц и языкам и управления принтером весьма размыты.
Например, после появления PJL многие его возможности были портированы в PostScript
Подводя итог вступительной части хочу резюмировать, что в базовом функционале любого принтера заложены возможности для проведения атак. При этом атакующий не сильно зависит от используемых компанией систем безопасности (если он не проводит атаку через Веб).
Насколько реален такой вектор в жизни? Вполне реален и весьма опасен, особенно если речь идет о серьезных схемах с участием инсайдера.