mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
86 lines
9.9 KiB
Markdown
86 lines
9.9 KiB
Markdown
<details>
|
||
|
||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
Otras formas de apoyar a HackTricks:
|
||
|
||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||
|
||
</details>
|
||
|
||
|
||
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](http://hacking-printers.net/wiki/images/thumb/c/ce/Cross-site-printing.png/900px-Cross-site-printing.png)
|
||
|
||
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:
|
||
```javascript
|
||
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**](./#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](http://hacking-printers.net/wiki/index.php/Document\_processing#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/](http://hacking-printers.net/xsp/)
|
||
|
||
|
||
<details>
|
||
|
||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
Otras formas de apoyar a HackTricks:
|
||
|
||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
* Obtén el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||
|
||
</details>
|