#Winlogon Notification Package
#Autor: Machine_Dramon
La funcionalidad de "Winlogon Notification Packages" soportada por los Windows 2K y XP permite cargar archivos DLL dentro del proceso de WinLogon.exe para responder a eventos generados por WinLogon. A esta caracteristica se le puede dar algun uso malicioso, si se consigue ejecutar el codigo necesario para agregar una DLL, en el contexto de un usuario con suficientes privilegios para modificar la rama del registro necesaria.
Pasos para agregar una DLL:
Modificar el Registro:
Crear una Sub-Clave bajo la rama del registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Winlogon\Notify
En este caso crearemos una Sub-Clave llamada Gedzac. Necesitamos crear los valores necesarios dentro de la Sub-Clave, para
indicar el Path de la DLL y otras opciones:
Asynchronous (REG_DWORD) [0 / 1]
Indica si las llamadas a las funciones de la DLL que manejan los eventos
se deben llamar en forma asincrona, si se establece a 1 WinLogon ejecuta
la funcion en un hilo independiente. Si la funcion debe acabar antes de
que el usuario obtenga el control establecer en 0.
DllName (REG_SZ)
La ruta completa de la DLL
Impersonate (REG_DWORD) [0 / 1]
Indica si se debe personificar el contexto de seguridad del usuario
actual, cuando se llama a las funciones de la DLL, si se establece a 1
WinLogon utiliza la personificación.
Necesitamos indicar cuales eventos manejara la DLL, para esto debemos crear
un valor de tipo cadena (REG_SZ) dentro de la Sub-Clave, por cada evento que
queremos que la DLL maneje, el nombre del valor debera ser el nombre del
evento y su contenido el nombre de la funcion que la DLL exporta para
manejar dicho evento.
Los eventos que puede manejar la DLL son:
Lock
Evento que ocurre cuando se "bloquea" el sistema, como cuando se ejecuta
el ScreenSaver estando marcada la opcion "Mostrar pantalla de bienvenida
al volver" o se presiona las teclas WIN+L.
Logoff
Evento que ocurre cuando un usuario cierra sesion en el sistema, este
evento siempre se maneja en forma sincrona, independientemente de la
configuracion de la DLL.
Logon
Evento que ocurre cuando un usuario inicia sesion en el sistema, este
evento ocurre antes de que se restauren las conexiones de red del usuario.
Shutdown
Evento que ocurre cuando un usuario apaga el sistema.
StartScreenSaver
Evento que ocurre cuando se ejecuta el ScreenSaver(Protector de Pantalla).
StartShell
Evento que ocurre luego de que un usuario a iniciado sesion en el sistema,
cuando se ha ejecutado el Shell del sistema (Windows Explorer / Explorador
de Windows), difiere del evento Logon en que las conexiones de red están
disponibles.
Startup
Evento que ocurre cuando se inicia el sistema.
StopScreenSaver
Evento que ocurre cuando se detiene el ScreenSaver.
Unlock
Evento que ocurre cuando se "desbloquea" el sistema.
En el .Zip del articulo puede encontrar el codigo necesario para realizar el paso 1 en el archivo addreg.cpp
Codificar la DLL:
Incluir el archivo de cabecera winwlx.h.En la funcion de entrada de la DLL DllEntryPoint, verificamos el argumento fdwReason y si es igual a DLL_PROCESS_ATTACH, llamamos a DisableThreadLibraryCalls, para desabilitar el envio de las notificaciones DLL_THREAD_ATTACH y DLL_THREAD_DETACH a la DLL, que en este ejemplo no las necesitamos. Escribir las funciones que la DLL exportara para manejar los eventos, las funciones deben tener el siguiente prototipo:
EXPORT VOID APIENTRY FunctionName(PWLX_NOTIFICATION_INFO pInfo)
Donde:
EXPORT
Esta definido como:
#define EXPORT extern "C" __declspec(dllexport)
FunctionName
Es el nombre de la funcion.
pInfo
Es un puntero a una estructura WLX_NOTIFICATION_INFO
En el .Zip del articulo puede encontrar el codigo necesario para realizar el
paso 2 en el archivo dllmain.cpp .Una cosa interesante que se puede hacer con esto, es algo que hace el Adware
Look2Me.
Cuando un proceso padre ejecuta un proceso hijo, el hijo se ejecuta bajo la misma cuenta de usuario que el proceso padre a menos que se use CreateProcessAsUser para especificar otro usuario. Entonces ya que WinLogon se ejecuta con los privilegios del usuario SYSTEM, ante el evento Startup, la DLL ejecuta un .exe que tambien se ejecutara como SYSTEM. Los usuarios con el privilegio SeDebugPrivilege, como los administradores, pueden terminar un proceso que se ejecute como SYSTEM. Entonces la DLL antes de ejecutar el .exe, enumera los grupos y usuarios que tengan este privilegio y se los revoca, de tal forma que no podran terminar el proceso iniciado por la DLL.
En el .Zip del articulo puede encontrar el codigo necesario para realizar esto en el archivo disabled.cpp, tambien el codigo para revocar un privilegio a un grupo o usuario en concreto, en el archivo user_privilege.cpp.El codigo del .exe que ejecuta la DLL se encuentra en el archivo user.cpp y muestra el nombre de usuario bajo el cual se ejecuta el proceso. Otra cosa interesante es que aunque el sistema se inicie en Modo Seguro el codigo de la DLL igualmente se ejecuta.
(C) Mitosis 4 - GEDZAC LABS