Una Prueba de Concepto de bind shell usando el servicio de Fax y un DLL hijack basado en Ualapi.dll.
Consulta el artículo en: https://windows-internals.com/faxing-your-way-to-system/
Cómo Utilizarlo
- Construye
Ualapi.dll
y colócalo enc:\windows\system32
- Inicia el servicio de fax, que cargará la DLL y llamará a la exportación UalStart. UalStart pondrá en cola un elemento de trabajo del grupo de hilos que abrirá un handle a RpcSs, encontrará un token SYSTEM y lo suplantará. Después, creará un socket en la dirección del endpoint local, lo enlazará al puerto 9299, y esperará asíncronamente una conexión usando un puerto de finalización de E/S del grupo de hilos.
- Conéctate al socket en el puerto 9299 usando tu cliente favorito (como nc(at).exe 9299) y luego escribe
let me in
y presiona ENTER. Si estás escribiendo código personalizado, asegúrate de enviar la cadena let me in\n.thread pool I/O completion port. - El paquete de finalización de E/S activará la llamada de retorno del grupo de hilos, que iniciará un proceso Cmd.exe bajo el servicio DcomLaunch con privilegios SYSTEM, vinculando sus manejadores de entrada y salida al socket recién creado.
- Listo!
Evasión EDR / AV
- Utiliza un servicio que no es comúnmente conocido y que no está vigilado o marcado como sospechoso por los proveedores de EDR.
- Utiliza la API del grupo de hilos de Windows para realizar la configuración, lo que hace que las pilas sean más difíciles de leer, descargando el trabajo a través de múltiples hilos y evitando “pistas” fáciles de que algo sospechoso está sucediendo.
- El tiempo de vida de los tokens suplantados es muy pequeño, y sólo el hilo trabajador se ejecuta como SYSTEM, volviendo a NETWORK SERVICE muy rápidamente y después de hacer sólo una llamada a la API. Esto ayuda a reducir la posibilidad de ser detectado por varios escáneres.
- Utiliza APIs de socket poco comunes que hacen que la tabla de importación sea menos sospechosa y evita detecciones EDR, hooks IOCTL y LSPs.
- Crea el bind shell bajo el servicio DcomLaunch (que ya es un servicio SYSTEM) y no bajo el servicio Fax, dándole un aspecto mucho más natural y evitando un árbol de procesos de aspecto muy sospechoso.
- Aprovecha un bug de Windows que hace que parezca que nuestro socket pertenece al servicio de Fax, y no a DcomLaunch o
Cmd.exe
. Si matamos el servicio de Fax parece que el socket pertenece aSystem
.
Advertencias
No se trata de un proyectil indetectable, malicioso y armado:
- Es sólo un bind shell, que la mayoría de los cortafuegos impedirán. Abrir reglas de cortafuegos, o usar un bind shell inverso, o hacer comunicaciones a través de un puerto común como 80 o 443 funcionaría mejor.
- Otros servicios, especialmente el Spooler, también cargan Ualapi.dll. Mientras que el sistema se comporta bien si el servicio de Fax está “atascado” en el estado SERVICE_START_PENDING, esto causará problemas en Spoolsv.exe.
- Es probable que haya bugs/fugas de memoria en la PoC — hicimos todo lo posible para que las cosas tuvieran calidad de producción, pero no pasamos las cosas por Application Verifier o asan.
Dark Mode
faxhell (este enlace se abre en una nueva ventana) por ionescu007 (este enlace se abre en una nueva ventana)
A Bind Shell Using the Fax Service and a DLL Hijack