hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md

9.9 KiB
Raw Blame History

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Puedes hacer que un usuario envíe una solicitud HTTP POST al puerto 9100 de varias IPs intentando alcanzar un puerto de impresión raw abierto. Si se encuentra, el encabezado HTTP se imprime como texto plano o se descarta según la configuración de la impresora. Sin embargo, los datos POST pueden contener trabajos de impresión arbitrarios como comandos PostScript o PJL para ser interpretados.

Impresión cross-site mejorada

Puedes usar objetos JavaScript XMLHttpRequest (XHR) como se define para realizar solicitudes HTTP POST a impresoras internas. Una limitación del enfoque de impresión cross-site discutido hasta ahora es que solo se pueden enviar datos al dispositivo, no recibirlos debido a la política de mismo origen. Para doblar las restricciones de la política de mismo origen, puedes hacer que el servidor responda con una respuesta HTTP falsa pero válida que permita solicitudes CORS (incluyendo Access-Control-Allow-Origin=*). A continuación se muestra una visión esquemática del ataque:

Impresión cross-site avanzada con suplantación de CORS

En tal variante mejorada de XSP combinada con suplantación de CORS un atacante web tiene acceso completo a la respuesta HTTP, lo que le permite extraer información arbitraria como trabajos de impresión capturados del dispositivo de impresión. A continuación se muestra un fragmento de código JavaScript de prueba de concepto:

job = "\x1B%-12345X\r\n"
+ "%!\r\n"
+ "(HTTP/1.0 200 OK\\n) print\r\n"
+ "(Server: PostScript HTTPD\\n) print\r\n"
+ "(Access-Control-Allow-Origin: *\\n) print\r\n"
+ "(Connection: close\\n) print\r\n"
+ "(Content-Length: ) print\r\n"
+ "product dup length dup string cvs print\r\n"
+ "(\\n\\n) print\r\n"
+ "print\r\n"
+ "(\\n) print flush\r\n"
+ "\x1B%-12345X\r\n";

var x = new XMLHttpRequest();
x.open("POST", "http://printer:9100");
x.send(job);
x.onreadystatechange = function() {
if (x.readyState == 4)
alert(x.responseText);
};

Limitaciones de la impresión cruzada

Tenga en cuenta que PCL como lenguaje de descripción de página no es aplicable para el spoofing de CORS porque solo permite que se eco un único número. PJL tampoco puede usarse porque desafortunadamente antepone @PJL ECHO a todas las cadenas eco, lo que hace imposible simular un encabezado HTTP válido. Sin embargo, esto no significa que los ataques XSP mejorados estén limitados a trabajos PostScript: PostScript se puede usar para responder con un encabezado HTTP falsificado y el UEL puede invocarse adicionalmente para cambiar el lenguaje de la impresora. De esta manera, un atacante web también puede obtener los resultados de los comandos PJL. Existen dos trampas de implementación que merecen ser mencionadas: Primero, se necesita determinar un Content-Length correcto para los datos a responder con PostScript. Si el atacante no puede predecir el tamaño total de la respuesta y la codificación fragmentada tampoco es una opción, necesita establecer un valor muy alto y usar relleno. Segundo, es importante agregar el campo de encabezado Connection: close, de lo contrario, las conexiones HTTP/1.1 se mantienen activas hasta que el cliente web o el dispositivo de la impresora activan un tiempo de espera, lo que significa que la impresora no será accesible durante algún tiempo.

Si el dispositivo de la impresora admite la impresión de texto plano, el encabezado de la solicitud HTTP del XHR se imprime como copia en papel, incluido el campo de encabezado Origin que contiene la URL que invocó el JavaScript malicioso, lo que hace difícil para un atacante permanecer en silencio. Esto es inevitable, ya que no obtenemos control sobre la impresora y bajo algunas circunstancias podemos deshabilitar la funcionalidad de impresión hasta que se procese el cuerpo HTTP y el encabezado HTTP ya haya sido interpretado como texto plano por el dispositivo de la impresora. Si reducir el ruido es una prioridad, el atacante puede intentar primero deshabilitar la funcionalidad de impresión con comandos PJL propietarios como se propone en PJL jobmedia utilizando otros canales XSP potenciales como IPP, LPD, FTP o el servidor web integrado de la impresora. Aunque todos los protocolos podrían probarse con éxito para implementar trabajos de impresión utilizando variantes de scripting entre protocolos, tienen algunas desventajas más allá de no proporcionar retroalimentación utilizando encabezados CORS falsificados:

  • El acceso entre protocolos a los puertos LPD y FTP está bloqueado por varios navegadores web
  • Los parámetros para la impresión directa a través del servidor web integrado son específicos del modelo
  • El estándar IPP requiere que el Content-type para las solicitudes HTTP POST se establezca en application/ipp, lo cual no se puede hacer con objetos XHR sin embargo, depende de la implementación preocuparse realmente por los tipos incorrectos

A continuación se presenta una comparación de los canales de impresión cruzada:

Canal Puerto Sin Retroalimentación Impresiones no solicitadas Estandarizado Bloqueado por
Raw 9100 - -
Web 80 - - -
IPP 631 - -
LPD 515 - FF, Ch, Op
FTP 21 - FF, Ch, Op, IE

Un problema importante de XSP es encontrar la dirección correcta o el nombre de host de la impresora. Nuestro enfoque es abusar de WebRTC que está implementado en la mayoría de los navegadores modernos y tiene la característica de enumerar direcciones IP para interfaces de red locales. Dada la dirección IP local, se utilizan además objetos XHR para abrir conexiones al puerto 9100/tcp para todas las 253 direcciones restantes para recuperar el nombre del producto de la impresora usando PostScript y spoofing de CORS, lo que solo toma segundos en nuestras pruebas. Si la impresora está en la misma subred que el host de la víctima, su dirección se puede detectar únicamente usando JavaScript. WebRTC está en desarrollo para Safari y es compatible con las versiones actuales de Firefox, Chrome y Microsoft Edge. Internet Explorer no tiene soporte para WebRTC, pero VBScript y Java también se pueden usar para filtrar la dirección IP local. Si no se puede recuperar la dirección de la interfaz local, aplicamos un enfoque de fuerza bruta inteligente: intentamos conectarnos al puerto 80 del enrutador de la víctima usando objetos XHR. Para ello, se compiló una lista de 115 direcciones de enrutadores predeterminadas de varios recursos accesibles por Internet. Si se puede acceder a un enrutador, escaneamos la subred en busca de impresoras como se describió anteriormente.

Prueba de concepto

Una implementación de prueba de concepto que demuestra que los ataques avanzados de impresión cruzada son prácticos y una amenaza real para empresas e instituciones está disponible en hacking-printers.net/xsp/

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: