
Printer Exploitation Toolkit - A ferramenta que tornou obsoleto o mergulho em lixeiras.
A sua impressora está segura? Verifique antes que alguém o faça...
O PRET é uma nova ferramenta para testes de segurança de impressoras desenvolvida no âmbito de uma Dissertação de Mestrado na Universidade de Ruhr Bochum. Conecta-se a um dispositivo via rede ou USB e explora as funcionalidades de uma determinada linguagem de impressora. Atualmente PostScript, PJL e PCL são suportados, os quais são falados pela maioria das impressoras laser. Isso permite coisas interessantes como capturar ou manipular trabalhos de impressão, acessar o sistema de arquivos e a memória da impressora ou até mesmo causar danos físicos ao dispositivo. Todos os ataques estão documentados em detalhe no Hacking Printers Wiki.
A ideia principal do PRET é facilitar a comunicação entre o utilizador final e a impressora. Assim, após inserir um comando do tipo UNIX, o PRET traduz para PostScript, PJL ou PCL, envia para a impressora, avalia o resultado e traduz de volta para um formato amigável ao utilizador. O PRET oferece um monte de comandos úteis para ataques e fuzzing em impressoras.

O PRET requer apenas um interpretador Python2. No entanto, para saída colorida e suporte SNMP, módulos de terceiros precisam ser instalados:
# pip install colorama pysnmp
Se estiver a executar numa consola Windows e os caracteres Unicode não forem exibidos corretamente, instale o módulo win_unicode_console:
# pip install win_unicode_console
Para impressão experimental 'sem driver' (veja o comando print), o ImageMagick e o GhostScript precisam ser instalados:
# 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
O PRET requer um alvo válido e uma linguagem de impressora como argumentos. O alvo pode ser o endereço IP/nome do host de uma impressora de rede (com a porta 9100/tcp aberta) ou um dispositivo como /dev/usb/lp0 para uma impressora USB local. Para descobrir rapidamente todas as impressoras de rede na sua sub-rede usando broadcast SNMP, execute o PRET sem argumentos:
./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
A linguagem de impressora a ser usada deve ser uma de ps, pjl ou pcl. Nem todas as linguagens são suportadas por todas as impressoras, por isso pode querer trocar de linguagem se não receber nenhum feedback. Cada linguagem de impressora está mapeada para um conjunto diferente de comandos PRET e tem diferentes capacidades de exploração.
--safe tenta verificar via IPP, HTTP e SNMP se a linguagem de impressão selecionada (PS/PJL/PCL) é realmente suportada pelo dispositivo antes de conectar. Em impressoras não ligadas à rede (USB, cabo paralelo) este teste falhará.
--quit suprime a determinação do modelo da impressora, a mensagem de introdução e outras conversas.
--debug mostra o fluxo de dados realmente enviado para o dispositivo e o feedback recebido. Note que os dados de cabeçalho e outras sobrecargas são filtrados. Para ver todo o tráfego, use o wireshark. A depuração também pode ser ativada/desativada dentro de uma sessão PRET usando o comando debug
--load filename lê e executa comandos PRET a partir de um ficheiro de texto. Isto é útil para automação. Os ficheiros de comandos também podem ser invocados posteriormente dentro de uma sessão PRET através do comando load.
--log filename escreve uma cópia do fluxo de dados bruto enviado para a impressora num ficheiro. Isto pode ser útil para construir um ficheiro de trabalho de impressão malicioso que pode ser implantado noutra impressora não diretamente acessível, por exemplo, imprimindo-o a partir de uma unidade USB.
After connecting to a printer device, you will see the PRET shell and can execute various commands:
$ ./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
Uma lista de comandos genéricos do PRET é fornecida abaixo:
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.
Operações genéricas de sistema de ficheiros com uma implementação específica para PS/PJL/PCL são: