๐DLL Injection
DLL injection
es un mรฉtodo que implica insertar un fragmento de cรณdigo, estructurado como una biblioteca de vรญnculos dinรกmicos (DLL), en un proceso en ejecuciรณn. Esta tรฉcnica permite que el cรณdigo insertado se ejecute dentro del contexto del proceso, influyendo asรญ en su comportamiento o accediendo a sus recursos.
DLL injection
se puede encontrar en aplicaciones legรญtimas en varias รกreas. Por ejemplo, los desarrolladores de software aprovechan esta tecnologรญa para hot patching
, un mรฉtodo que permite la modificaciรณn o actualizaciรณn de cรณdigo sin problemas, sin la necesidad de reiniciar el proceso en curso de inmediato. Un excelente ejemplo de esto es el uso de hot patching de Azure para actualizar servidores operativos , lo que facilita los beneficios de la actualizaciรณn sin necesidad de tiempo de inactividad del servidor.
Sin embargo, no es completamente inocuo. Los cibercriminales suelen manipular DLL injection
para insertar cรณdigo malicioso en procesos de confianza. Esta tรฉcnica es especialmente eficaz para evadir la detecciรณn del software de seguridad.
Existen varios mรฉtodos diferentes para ejecutar una inyecciรณn de DLL.
LoadLibrary
LoadLibrary
es un mรฉtodo ampliamente utilizado para la inyecciรณn de DLL, que emplea la API LoadLibrary
para cargar la DLL en el espacio de direcciones del proceso de destino.
La LoadLibrary
API es una funciรณn proporcionada por el sistema operativo Windows que carga una biblioteca de vรญnculos dinรกmicos (DLL) en la memoria del proceso actual y devuelve un identificador que puede usarse para obtener las direcciones de las funciones dentro de la DLL.
El primer ejemplo muestra cรณmo se puede utilizar LoadLibrary
para cargar una DLL en el proceso actual de forma legรญtima:
Cรณdigo: c
El segundo ejemplo ilustra el uso de LoadLibrary
para la inyecciรณn de DLL. Este proceso implica asignar memoria dentro del proceso de destino para la ruta de la DLL y luego iniciar un subproceso remoto que comienza en la ruta de la DLL LoadLibrary
y se dirige hacia ella:
Mapeo manual
Manual Mapping
es un mรฉtodo increรญblemente complejo y avanzado de inyecciรณn de DLL. Implica la carga manual de una DLL en la memoria de un proceso y resuelve sus importaciones y reubicaciones. Sin embargo, evita la detecciรณn fรกcil al no utilizar la funciรณn LoadLibrary
, cuyo uso es monitoreado por sistemas de seguridad y antivirus.
Un esquema simplificado del proceso puede representarse de la siguiente manera:
Cargue la DLL como datos sin procesar en el proceso de inyecciรณn.
Asigne las secciones de DLL al proceso de destino.
Inyectar el shellcode en el proceso de destino y ejecutarlo. Este shellcode reubica la DLL, rectifica las importaciones, ejecuta las devoluciones de llamadas de Thread Local Storage (TLS) y, por รบltimo, llama a la DLL principal.
Inyecciรณn de DLL reflexiva
Reflective DLL injection
es una tรฉcnica que utiliza programaciรณn reflexiva para cargar una biblioteca desde la memoria a un proceso host. La biblioteca en sรญ es responsable de su proceso de carga implementando un cargador de archivos ejecutable portรกtil (PE) mรญnimo. Esto le permite decidir cรณmo se cargarรก e interactuarรก con el host, minimizando la interacciรณn con el sistema y el proceso host.
Stephen Fewer tiene un excelente GitHub que demuestra la tรฉcnica. A continuaciรณn, se reproduce su explicaciรณn:
"El procedimiento para inyectar de forma remota una biblioteca en un proceso es doble. En primer lugar, la biblioteca que se pretende inyectar debe estar escrita en el espacio de direcciones del proceso de destino (en adelante denominado "proceso host"). En segundo lugar, la biblioteca debe cargarse en el proceso host para cumplir con las expectativas de tiempo de ejecuciรณn de la biblioteca, como resolver sus importaciones o reubicarla en una ubicaciรณn adecuada en la memoria.
Suponiendo que tenemos ejecuciรณn de cรณdigo en el proceso host y la biblioteca que pretendemos inyectar se ha escrito en una ubicaciรณn de memoria arbitraria en el proceso host, la inyecciรณn de DLL reflectante funciona de la siguiente manera.
El control de ejecuciรณn se transfiere a la funciรณn reflectante de la biblioteca, una funciรณn exportada que se encuentra en la tabla de exportaciรณn de la biblioteca. Esto puede suceder a travรฉs de
El control de ejecuciรณn se transfiere a la funciรณn
ReflectiveLoader
de la biblioteca, una funciรณn exportada que se encuentra en la tabla de exportaciรณn de la biblioteca. Esto puede suceder medianteCreateRemoteThread()
un shellcode de arranque mรญnimo.Como la imagen de la biblioteca reside actualmente en una ubicaciรณn de memoria arbitraria,
ReflectiveLoader
inicialmente calcula la ubicaciรณn de memoria actual de su propia imagen para analizar sus propios encabezados para su uso posterior.Luego
ReflectiveLoader
, analiza la tabla de exportaciรณn del proceso hostkernel32.dll
para calcular las direcciones de tres funciones que necesita el cargador, a saberLoadLibraryA
,GetProcAddress
, yVirtualAlloc
.Ahora
ReflectiveLoader
asigna una regiรณn de memoria continua donde se cargarรก su propia imagen. La ubicaciรณn no es crucial; el cargador reubicarรก correctamente la imagen mรกs adelante.Los encabezados y secciones de la biblioteca se cargan en sus nuevas ubicaciones de memoria.
Luego,
ReflectiveLoader
procesa la copia reciรฉn cargada de la tabla de importaciรณn de su imagen, carga cualquier biblioteca adicional y resuelve sus respectivas direcciones de funciรณn importadas.Luego
ReflectiveLoader
procesa la copia reciรฉn cargada de la tabla de reubicaciรณn de su imagen.Luego
ReflectiveLoader
llama a la funciรณn de punto de entrada de la imagen reciรฉn cargada,DllMain,
conDLL_PROCESS_ATTACH
. La biblioteca se ha cargado correctamente en la memoria.Finalmente, la ejecuciรณn de
ReflectiveLoader
retorna al shellcode de arranque inicial que lo llamรณ, o si se llamรณ a travรฉs deCreateRemoteThread
, el hilo finalizarรญa.
DLL Hijacking
DLL Hijacking
es una tรฉcnica de explotaciรณn en la que un atacante aprovecha el proceso de carga de DLL de Windows. Estas DLL se pueden cargar durante el tiempo de ejecuciรณn, lo que crea una oportunidad de secuestro si una aplicaciรณn no especifica la ruta completa a una DLL requerida, lo que la hace susceptible a este tipo de ataques.
El orden de bรบsqueda de DLL predeterminado que utiliza el sistema depende de si Safe DLL Search Mode
estรก activado o no. Cuando estรก activado (que es la configuraciรณn predeterminada), el modo de bรบsqueda segura de DLL reubica el directorio actual del usuario mรกs abajo en el orden de bรบsqueda. Es fรกcil habilitar o deshabilitar la configuraciรณn editando el registro.
Presione
Windows + R
para abrir el cuadro de diรกlogo Ejecutar.Escriba
Regedit
y presioneEnter
. Esto abrirรก el Editor del Registro.Navegar a
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager
.En el panel derecho, busque el valor
SafeDllSearchMode
. Si no existe, haga clic derecho en el espacio en blanco de la carpeta o haga clic derecho en la carpetaSession Manager
, seleccioneNew
y luegoDWORD (32-bit) Value
. Nombre este nuevo valor comoSafeDllSearchMode
.Haga doble clic en
SafeDllSearchMode
. En el campo Datos del valor, introduzca1
para habilitar o0
para deshabilitar el modo de bรบsqueda segura de DLL.Haga clic en
OK
, cierre el Editor del Registro y reinicie el sistema para que los cambios surtan efecto.
Con este modo habilitado, las aplicaciones buscan los archivos DLL necesarios en la siguiente secuencia:
El directorio desde el que se carga la aplicaciรณn.
El directorio del sistema.
El directorio del sistema de 16 bits.
El directorio de Windows.
El directorio actual.
Los directorios que aparecen enumerados en la variable de entorno PATH.
Sin embargo, si el 'Modo de bรบsqueda segura de DLL' estรก desactivado, el orden de bรบsqueda cambia a:
El directorio desde el que se carga la aplicaciรณn.
El directorio actual.
El directorio del sistema.
El directorio del sistema de 16 bits.
El directorio de Windows
Los directorios que se enumeran en la variable de entorno PATH
El secuestro de DLL implica unos cuantos pasos mรกs. En primer lugar, debe identificar la DLL que el objetivo estรก intentando localizar. Hay herramientas especรญficas que pueden simplificar esta tarea:
Process Explorer
: Esta herramienta, que forma parte de la suite Sysinternals de Microsoft, ofrece informaciรณn detallada sobre los procesos en ejecuciรณn, incluidas las DLL cargadas. Si selecciona un proceso e inspecciona sus propiedades, podrรก ver sus DLL.PE Explorer
: Este explorador de archivos ejecutables portรกtiles (PE) puede abrir y examinar un archivo PE (como un .exe o .dll). Entre otras funciones, revela las DLL desde las que el archivo importa funcionalidad.
Despuรฉs de identificar una DLL, el siguiente paso es determinar quรฉ funciones desea modificar, lo que requiere herramientas de ingenierรญa inversa, como desensambladores y depuradores. Una vez que se han identificado las funciones y sus firmas, es momento de construir la DLL.
Tomemos un ejemplo prรกctico. Considere el programa en C que se muestra a continuaciรณn:
Cรณdigo: c
Carga una funciรณn add
del library.dll
y utiliza esta funciรณn para sumar dos nรบmeros. Posteriormente, imprime el resultado de la suma. Examinando el programa en Process Monitor (procmon), podemos observar el proceso de carga del library.dll
ubicado en el mismo directorio.
Primero, configuremos un filtro en procmon para incluir รบnicamente main.exe
, que es el nombre del proceso del programa. Este filtro nos ayudarรก a centrarnos especรญficamente en las actividades relacionadas con la ejecuciรณn de main.exe
. Es importante tener en cuenta que procmon solo captura informaciรณn mientras se estรก ejecutando activamente. Por lo tanto, si su registro aparece vacรญo, debe cerrar main.exe
y volver a abrirlo mientras procmon se estรก ejecutando. Esto garantizarรก que se capture la informaciรณn necesaria y estรฉ disponible para su anรกlisis.
Luego, si te desplazas hasta la parte inferior, podrรกs ver la llamada a load library.dll
.
Podemos filtrar aรบn mรกs por una operaciรณn de carga de imagen para obtener solo las bibliotecas que la aplicaciรณn estรก cargando.
Proxy
Podemos utilizar un mรฉtodo conocido como DLL Proxying para ejecutar un secuestro. Crearemos una nueva biblioteca que cargarรก la funciรณn Add
desde library.dll
, la manipularรก y luego la devolverรก a main.exe
.
Crear una nueva biblioteca: crearemos una nueva biblioteca que sirva como proxy para
library.dll
. Esta biblioteca contendrรก el cรณdigo necesario para cargar la funciรณnAdd
enlibrary.dll
y realizar la manipulaciรณn necesaria.Cargar la funciรณn
Add
: Dentro de la nueva librerรญa cargaremos la funciรณnAdd
de la originallibrary.dll
. Esto nos permitirรก acceder a la funciรณn original.Modificar la funciรณn: Una vez cargada la funciรณn
Add
, podemos aplicar las modificaciones o manipulaciones que queramos a su resultado. En este caso, simplemente vamos a modificar el resultado de la suma, para aรฑadir+ 1
al resultado.Devolver la funciรณn modificada: despuรฉs de completar el proceso de manipulaciรณn, devolveremos la funciรณn
Add
modificada desde la nueva biblioteca amain.exe
. Esto garantizarรก que, cuandomain.exe
invoque la funciรณnAdd
, se ejecutarรก la versiรณn modificada con los cambios previstos.
El cรณdigo es el siguiente:
Cรณdigo: c
Compรญlelo o utilice la versiรณn precompilada proporcionada. Cambie el nombre de library.dll
a library.o.dll
y cambie el nombre de tamper.dll
a library.dll
.
Al ejecutar main.exe
se muestra el hackeo exitoso.
Bibliotecas no vรกlidas
Otra opciรณn para ejecutar un ataque de secuestro de DLL es reemplazar una biblioteca vรกlida que el programa intenta cargar pero no puede encontrar con una biblioteca creada. Si cambiamos el filtro de procmon para enfocarnos en las entradas cuya ruta termina en .dll
y tiene un estado de NAME NOT FOUND
podemos encontrar dichas bibliotecas en main.exe
.
Como sabemos, main.exe
busca en muchas ubicaciones buscando x.dll
, pero no se encuentra en ninguna parte. La entrada que nos interesa especialmente es:
Buscamos cargar x.dll
desde el directorio de la aplicaciรณn. Podemos aprovechar esto y cargar nuestro propio cรณdigo, con muy poco contexto de lo que busca en x.dll
.
Cรณdigo: c
Este cรณdigo define una funciรณn de punto de entrada de DLL DllMain
que Windows llama automรกticamente cuando se carga la DLL en un proceso. Cuando se carga la biblioteca, simplemente se imprime Hijacked... Oops...
en la terminal, pero en teorรญa podrรญa hacer cualquier cosa aquรญ.
Compรญlelo o utilice la versiรณn precompilada proporcionada. Cambie el nombre hijack.dll
a x.dll
y ejecute main.exe
.
รltima actualizaciรณn
ยฟTe fue รบtil?