Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
EventViewerUAC_BOF — Implementación de Beacon Object File para el bypass de UAC mediante deserialización del Visor de eventos. | Kitploit
Herramientas/GitHubGitHub/octoberfest7/eventvieweruac_bof
Escalada de PrivilegiosGeneración de PayloadsExplotaciónPost-ExplotaciónRed Teaming
GitHuboctoberfest7/eventvieweruac_bof

EventViewerUAC_BOF

Implementación de Beacon Object File para el bypass de UAC mediante deserialización del Visor de eventos.

Ver Repositorio
1333115hace 4 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

EventViewerUAC_BOF

Esta es una implementación de Beacon Object File del bypass de UAC por deserialización del Visor de Eventos descubierto por @orange_8361 y el PoC elaborado por CsEnox.

Probado en x64 Win10/Win11

¡ADVERTENCIAS OPSEC!

Este bypass de UAC realiza las siguientes acciones que deben considerarse en referencia a OPSEC:

-1. Escribe un archivo binario en %LOCALAPPDATA%\Microsoft\Event Viewer\RecentViews

-2. Llama a ShellExecute() para iniciar mmc.exe / Visor de Eventos

--A. ¡El Visor de Eventos se abrirá en la GUI!

--B. El Visor de Eventos llamará a cmd.exe

---a. Cmd.exe llamará a Taskkill para cerrar mmc.exe

---b. Cmd.exe imprimirá un mensaje de error en la ventana de consola que a veces se mantiene abierta, con el objetivo de engañar al usuario haciéndole creer que todo está bien

---c. Cmd.exe ejecutará cualquier otro comando proporcionado por el usuario

-3. El archivo binario se elimina de %LOCALAPPDATA%\Microsoft\Event Viewer\RecentViews

Cómo funciona

Siguiendo la demostración original y el PoC de CsEnox, se utilizó ysoserial para crear un payload inicial: image

ysoserial.exe -o raw -f BinaryFormatter -g TextFormattingRunProperties -c "taskkill /f /im mmc.exe >nul && echo Windows has Recovered from an Unexpected Error.  You may Close this Window. &&" > cmd.bin

Este bypass de UAC funciona invocando mmc.exe, que se abre en pantalla y debe cerrarse. Desafortunadamente, no he encontrado una forma de iniciar mmc.exe sin que se abra la GUI; he probado CreateProcess() y la bandera CREATE_NO_WINDOW, sin embargo CreateProcess() no se lleva bien con UAC. Las publicaciones de StackOverflow sobre este tema me dirigieron a la API ShellExecuteA() que sí tiene la bandera SW_HIDE (y otras), pero esto no resultó fructífero. Parece inevitable que mmc.exe parpadee en la pantalla.

Ysoserial llama a cmd.exe /c, por lo que esto se usa para llamar a taskkill y cerrar mmc.exe. Se usa && para encadenar comandos, de modo que se pueda ejecutar la acción deseada como Administrador. En las pruebas descubrí que en algunos casos esa acción mantenía abierto el símbolo del sistema de cmd.exe generado por mmc.exe; esto ocurre cuando se invocan payloads de tipo "Local Injector(normal)", como el payload ejecutable predeterminado de Cobalt Strike. Para solucionarlo, redirigí la salida del comando taskkill (que antes se imprimía en el cmd.exe abierto) a /dev/null, y mostré en pantalla un mensaje sobre un error que ha sido manejado, con el fin de intentar que este comportamiento sospechoso no alarme a un usuario no informado.

Los payloads que crean un proceso, se inyectan en él y luego salen no mantendrán abierta la ventana de cmd.exe, por lo que el mensaje no es necesario. De manera similar, los comandos que se ejecutan y finalizan (por ejemplo, net user Administrator newpassword) no mantendrán la ventana abierta.

Puede ejecutar comandos codificados en PowerShell a través de este BOF:

image

image

image

El comando taskkill y el mensaje al usuario están integrados en el comando ysoserial. Si quisiera alterar este comportamiento, necesitaría ejecutar su propio comando ysoserial y seguir la demostración a continuación de cómo se creó el código.

Usando una herramienta personalizada, el archivo binario se ingirió y se imprimió como hexadecimal: image

Copiando esto al bloc de notas y buscando '&' en hexadecimal se localizan los bytes deseados (tenga en cuenta que hay varios conjuntos de estos; necesitamos el último):

image

El payload se divide en dos partes inmediatamente después de estos bytes:

image

Se calcula la longitud de cada parte y se anota para más adelante.

Aquí es donde las cosas se complican.

Para ser sincero, no sé mucho sobre deserialización o ysoserial, pero descubrí que hay un conjunto de bytes en el payload que representan la longitud de la parte "importante" del payload, incluido el comando definido por el usuario. Esto se puede ver en la siguiente captura de pantalla de un volcado hexadecimal lado a lado de dos payloads diferentes creados por ysoserial, cada uno con un comando diferente a ejecutar:

image

Por razones que no puedo explicar, estos bytes reflejan la longitud del payload en base-128; el 0x05 se multiplica por 128 para obtener 640; esto se suma al valor del otro byte (0xb0 o 0xd4) menos 128; descubrí que cuando el segundo byte (0x05) se desborda (0x06), el primer byte comienza de nuevo en 0x80 en lugar de 0x00 como cabría esperar.

El payload utilizado en esta herramienta tiene este aspecto:

image

Convirtiendo todos los valores a decimal, el cálculo es el siguiente:

(6 x 128) + (180-128) = 820

El tamaño del archivo es 1042; en las pruebas descubrí que (con este gadget de ysoserial, al menos) siempre hay una diferencia de 222 bytes entre el tamaño del archivo y la longitud reflejada en este conjunto de bytes. Estos 222 bytes parecen ser la "cabecera del payload".

Ambas partes del payload se copian en main.c, donde la longitud original de 820 también se define como variable. Se calcula la longitud del comando del usuario, y este valor se suma al 820 original (además de un byte adicional por un espacio que debe insertarse) para calcular el valor final que debe representarse en este conjunto de bytes. El segundo byte se calcula dividiendo LenBytes entre 128, y el primer byte se calcula encontrando el resto de LenBytes y sumándole 128 (para adaptarse a que comienza en 0x80).

image

Una vez que estos bytes están definidos, se copian en el buffer Before en el lugar adecuado para establecer la longitud del payload al valor correcto según el contenido. Luego se ensambla el buffer final:

image

El payload finalizado se escribe en disco y se llama a mmc.exe para ejecutarlo. Posteriormente se limpia el payload.

Para compilar:

x86_64-w64-mingw32-gcc -o EventViewerUAC.x64.o -Os -c main.c -DBOF

Trabajo futuro

Descargar herramienta