En sistemas Windows, cuando una aplicación o servicio arranca ejecuta una serie de librerías DLL (dynamic link library), si alguna de estas no existe o está implementado de manera no segura, por ejemplo siendo llamado sin usar un fully qualified path, es posible entonces escalar privilegios a través de la creación de un DLL malicioso en esa misma ruta.

 

El DLL Hijack es una técnica usada durante la post explotación de un sistema, tanto para como comentábamos conseguir una elevación de privilegios como para obtener persistencia en el sistema ya que mientras no sea detectado, el sistema ejecutará nuestro payload cada vez que la aplicación o servicio vulnerable sea ejecutada, pudiendo ser utilizado a modo de "backdoor".

Como decíamos, cuando una aplicación arranca busca sus DLL. Como en un mismo sistema podemos tener múltiples versiones de un mismo DLL, las aplicaciones pueden especificar la localización desde la cual se cargará el mismo usando una ruta completa o por ejemplo con una manifiesto. Si ninguno de estos métodos es utilizado el sistema busca en un determinado orden en una serie de rutas.

A grandes rasgos este orden sería el siguiente

  • El directorio desde donde se ha lanzado la aplicación
  • C:\Windows\System32 o el equivalente en nuestro sistema
  • C:\Windows\System o el equivalente en nuestro sistema
  • C:\Windows
  • El directorio actual
  • Directorios incluidos en la variable de entorno PATH

Decíamos a grandes rasgos ya que este orden se puede ver alterado por diferentes motivos, como que ya exista cargada en memoria un DLL con el mismo nombre de módulo, caso en que comunmente usará la DLL ya cargada o que el DLL se encuentre en la lista de DLL conocidos en nuestra versión de Windows, en este caso el sistema usará la copia del DLL presente ya en el sistema.

Además de estos ejemplos, el orden de ruta de búsqueda de los DLL también es ligeramente diferente para Windows Apps,etc... Podéis encontrar el detalle de todos estos comportamientos en este link.

Cómo protegerse de este tipo de ataques?

Como con todos los tipos de vulnerabilidades, lo primordial es mantener completamente actualizado todo nuestro software y sistema operativo a la vez que solo mantener instalado en nuestra máquina aquel software que realmente utilizamos, de esta manera la ventana de ataque se reduce. En el caso del DLL Hijack, los sistemas Windows actuales ya incluyen por defecto mitigaciones para evitar por ejemplo la ejecución remota de DLL a la vez que muchos antivirus nos protegerán en cierta medida de este ataque, sobretodo a la hora de cazar el código de los DLL maliciosos; pero siempre es bueno saber cómo podemos identificar estos procesos vulnerables.

Para ello podríamos utilizar diversas aplicaciones como, por poner un ejemplo con interfaz gráfica, la utilidad Process Monitor de Sysinternals para comprobar en nuestra propia máquina si tenemos algún proceso potencialmente vulnerable. Como por defecto la herramienta nos devolverá una cantidad ingente de información, deberemos utilizar los siguientes filtros:

process monitor procmon

A partir de ahí, un atacante debería comprobar si tiene permisos de escritura en la ruta que marca Process Monitor y en caso que así fuera, se podría crear un DLL malicioso, por ejemplo con msfvenom y esperar (o forzar) que el servicio lo ejecute.

Si quisiéramos automatizar esta tarea podemos utilizar por ejemplo PowerSploit y su módulo Find-ProcessDLLHijack que nos devolverá automáticamente el listado de procesos en el sistema que están intentando cargar DLL no encontradas.

Como comentábamos, mantener el software mínimo y necesario a la vez que actualizado reducirá el riesgo a ser expuestos a este ciber ataque.