
Bypass UAC secuestrando una DLL ubicada en el Native Image Cache
Evita el Control de Cuentas de Usuario (UAC) para obtener privilegios elevados (Administrador) y ejecutar cualquier programa con un alto nivel de integridad.

He decidido actualizar ByeIntegrity para que sea mucho más rápido, ligero y fiable. Esta es una revisión significativa, así que he creado un nuevo proyecto en la solución de VS llamado "ByeIntegrity2021", que es la versión actualizada de este ataque. Por supuesto, la versión original sigue ahí. Para más información sobre la nueva versión, expande los detalles a continuación.
La nueva versión ahora es capaz de secuestrar el NIC sin depender de las imágenes nativas existentes instaladas en el NIC. Lo hace creando sus propios descriptores de imágenes nativas y cargas útiles, y luego moviéndolos al NIC, eliminando la necesidad de:
*.ni existentes producidas por NGEN.exeEl CLR carga imágenes nativas desde el NIC realizando un escaneo recursivo de directorios de cada entrada, y luego leyendo su archivo *.aux. Este archivo contiene información sobre la imagen nativa y sus dependencias. Basándose en la información del archivo AUX, el CLR cargará la imagen o la rechazará, y luego pasará al siguiente candidato. Si no se encuentran candidatos viables, carga la imagen estándar y usa jit para compilarla normalmente. Ninguna parte de la imagen nativa real es leída (solo se verifica su existencia), por lo que ByeIntegrity simplemente coloca la DLL de carga útil con el mismo nombre que tendría la imagen nativa.
La versión actualizada de ByeIntegrity viene con una herramienta llamada AUXGen, que toma el nombre de un ensamblado del GAC y luego genera su archivo AUX correspondiente. El archivo AUX se genera de manera que coincida con las comprobaciones del CLR y el CLR cargará la "imagen nativa" descrita por el archivo AUX. Nota: AUXGen no maneja dependencias al generar el archivo AUX. Solo hace lo necesario para que el CLR cargue la imagen. Publicaré detalles del formato del archivo AUX más adelante.
ByeIntegrity ahora usa ISecurityEditor, al igual que UACMe, lo que reduce el código necesario. También requiere que hayas generado el archivo AUX para el ensamblado MMCEx y que lo hayas colocado en el mismo directorio que ByeIntegrity. MMCEx es ahora la imagen objetivo debido a su orden de carga y nombre más corto.
ByeIntegrity secuestra una DLL ubicada en el Caché de Imágenes Nativas (NIC). El NIC es utilizado por .NET Framework para almacenar ensamblados .NET optimizados que han sido generados a partir de programas como Ngen, el Generador de Imágenes Nativas de .NET Framework. Debido a que Ngen generalmente se ejecuta bajo el usuario actual con privilegios de Administrador a través del Programador de tareas, el NIC otorga acceso de modificación a los miembros del grupo de Administradores.
El complemento del Firewall de Windows de la Consola de Administración de Microsoft (MMC) utiliza .NET Framework, y al inicializarse, los módulos del NIC se cargan en el proceso de MMC. El ejecutable de MMC utiliza AutoElevate, un mecanismo que Windows utiliza para elevar automáticamente el token de un proceso sin solicitud de UAC.
ByeIntegrity secuestra una DLL específica ubicada en el NIC llamada Accessibility.ni.dll. Escribe shellcode en un área de relleno de tamaño apropiado ubicada en la sección .text de la DLL. Luego, el punto de entrada de la DLL se actualiza para que apunte al shellcode. Al cargar la DLL, se ejecuta el punto de entrada (que en realidad es el shellcode). El shellcode calcula la dirección de kernel32!CreateProcessW, crea una nueva instancia de cmd.exe ejecutándose como Administrador, y luego simplemente devuelve TRUE. Esto es solo por la razón DLL_PROCESS_ATTACH; todas las demás razones devolverán TRUE inmediatamente.
Este ataque está implementado en UACMe como el método #63. Si quieres probar este ataque, por favor, usa UACMe primero. El ataque es el mismo, sin embargo, UACMe usa un método diferente para modificar el NIC. ByeIntegrity usa IFileOperation mientras que UACMe usa ISecurityEditor. Además, UACMe elige el Accessibility.ni.dll correcto para tu sistema y realiza las tareas de mantenimiento del sistema si es necesario (para generar los componentes del NIC). ByeIntegrity simplemente elige la primera entrada del NIC que existe (que puede o no ser la entrada correcta que MMC está usando) y no ejecuta las tareas de mantenimiento del sistema. ByeIntegrity contiene significativamente más código que UACMe, por lo que leer la implementación de UACMe será mucho más fácil de entender que leer el código de ByeIntegrity. Por último, ByeIntegrity lanza un proceso hijo durante el ataque, mientras que UACMe no lo hace.
tl;dr: UACMe es más simple y efectivo que ByeIntegrity, así que usa UACMe primero.
Si estás leyendo esto, probablemente sepas cómo compilar el código fuente. Solo ten en cuenta que esto no ha sido probado ni diseñado para x86 en absoluto, y probablemente no funcionará en x86 de todas formas.
Al igual que UACMe, nunca subiré binarios compilados a este repositorio. Siempre hay personas que quieren que el mundo colapse y arda, y no voy a proporcionar una ruta fácil para que ejecuten esto en la computadora de otra persona y causen daños intencionales. Tampoco quiero que los script-kiddies usen este ataque sin entender lo que hace y el daño que puede causar.
Este ataque funciona desde Windows 7 (7600) hasta la versión más reciente de Windows.