Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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
VBA-RunPE — Una implementación en VBA de la técnica RunPE o cómo eludir la lista blanca de aplicaciones. | Kitploit
Herramientas/GitHubGitHub/itm4n/vba-runpe
ExplotaciónEvasión de IDS/IPSPost-ExplotaciónPruebas de PenetraciónRed TeamingDesarrollo de PayloadsArchived
GitHubitm4n/vba-runpe

VBA-RunPE

Una implementación en VBA de la técnica RunPE o cómo eludir la lista blanca de aplicaciones.

Ver Repositorio
8151735hace 6 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

VBA RunPE

Descripción

Una implementación simple pero efectiva de la técnica RunPE en VBA. Este código se puede usar para ejecutar ejecutables desde la memoria de Word o Excel. Es compatible con versiones de 32 bits y 64 bits de Microsoft Office 2010 y superiores.

Más información aquí:
https://itm4n.github.io/vba-runpe-part1/
https://itm4n.github.io/vba-runpe-part2/

Win10_x64_Office2016_x64_PowerShell

Uso 1 - Archivo PE en disco

  1. En el procedimiento Exploit al final del código, establezca la ruta del archivo que desea ejecutar.
root@kitploit:~
strSrcFile = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"

/!\ Si está usando una versión de 32 bits de Microsoft Office en un sistema operativo de 64 bits, debe especificar binarios de 32 bits.

root@kitploit:~
strSrcFile = "C:\Windows\SysWOW64\cmd.exe"
strSrcFile = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
  1. Especifique los argumentos de línea de comandos (opcional).
root@kitploit:~
strArguments = "-exec Bypass"

Esto se usará para formar una línea de comandos equivalente a:

root@kitploit:~
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -exec Bypass
  1. (Opcional) Habilite Ver > Ventana Inmediata (Ctrl+G) para ver los registros de ejecución y errores.

  2. ¡Ejecute la macro Exploit!

Uso 2 - PE incrustado

  1. Use pe2vba.py para convertir un archivo PE a VBA. De esta manera, se puede incrustar directamente en la macro.
root@kitploit:~
user@host:~/Tools/VBA-RunPE$ ./pe2vba.py meterpreter.exe 
[+] Created file 'meterpreter.exe.vba'.
  1. Reemplace el siguiente código en RunPE.vba con el contenido del archivo .vba que se generó en el paso anterior. El script de Python convierte el PE a VBA y aplica la plantilla RunPE automáticamente (no es necesario copiar y pegar manualmente).
root@kitploit:~
' ================================================================================
'                                ~~~ EMBEDDED PE ~~~
' ================================================================================

' CODE GENRATED BY PE2VBA
' ===== BEGIN PE2VBA =====
Private Function PE() As String
    Dim strPE As String
    strPE = ""
    PE = strPE
End Function
' ===== END PE2VBA =====
  1. (Opcional) Habilite Ver > Ventana Inmediata (Ctrl+G) para ver los registros de ejecución y errores.

  2. ¡Ejecute la macro Exploit!

/!\ Al usar un PE incrustado, la macro cambiará automáticamente a este modo porque el método PE() devolverá una cadena no vacía.

Problemas conocidos

  • GetThreadContext() falla con el código de error 998.

Es posible que reciba este error si ejecuta esta macro desde una versión de 64 bits de Office. Como solución alternativa, puede mover el código a un módulo en lugar de ejecutarlo desde las referencias de objetos de Word. Gracias a @joeminicucci por el consejo.

root@kitploit:~
================================================================================
[*] Source file: 'C:\Windows\System32\cmd.exe'
[*] Checking source PE...
[*] Creating new process in suspended state...
[*] Retrieving the context of the main thread...
    |__ GetThreadContext() failed (Err: 998)

No tengo idea de por qué esta solución funciona por el momento. He investigado un poco, sin embargo. Este error parece ser causado por la estructura CONTEXT no alineada correctamente en la versión de 64 bits. Noté que el tamaño de la estructura también es incorrecto ([VBA] LenB(CONTEXT) != [C++] sizeof(CONTEXT)) mientras que está bien en la versión de 32 bits. Tengo una solución funcional que permite que GetThreadContext() devuelva correctamente, pero luego rompe otras cosas más adelante en la ejecución.

Edición 2019-12-15: la definición de la versión de 64 bits de la estructura CONTEXT era incorrecta, pero solucionar esto no solucionó el error. Por lo tanto, implementé una solución alternativa para la versión de 64 bits. Reemplacé el argumento de estructura CONTEXT de las funciones GetThreadContext() y SetThreadContext() con un Byte Array del mismo tamaño.

Edición 2019-12-17: Finalmente encontré el problema. Mi primera suposición era correcta, la estructura CONTEXT debe estar alineada a 16 bytes en memoria. Esto es algo que se puede controlar en C usando align(16) en la definición de la estructura, pero no se puede controlar en VBA. Por lo tanto, GetThreadContext() y SetThreadContext() pueden fallar "aleatoriamente". Por otro lado, los Byte Arrays parecen estar siempre alineados a 16 bytes, por eso esta solución alternativa es efectiva, pero no hay garantía, ¡a menos que realice ingeniería inversa del intérprete/compilador de VBA y lo descubra!

  • LongPtr - Tipo definido por el usuario no definido

Si recibe este error, significa que está ejecutando la macro desde una versión antigua de Office (<=2007). El tipo LongPtr se introdujo en VBA7 (Office 2010) junto con el soporte de la API de Windows de 64 bits. Es muy útil para manejar punteros sin tener que preocuparse por la arquitectura (32 bits / 64 bits).

Como solución alternativa, puede reemplazar todas las apariciones de LongPtr con Long (32 bits) o LongLong (64 bits). Use Ctrl+H en su editor de texto favorito.

Créditos

@hasherezade - Implementación completa de RunPE (https://github.com/hasherezade/)

@Zer0Mem0ry - RunPE de 32 bits escrito en C++ (https://github.com/Zer0Mem0ry/RunPE)

@DidierStevens - Incrustación de PE en VBA

Miscelánea

Pruebas

Este código fue probado en las siguientes plataformas:

  • Windows 7 Pro 32 bits + Office 2010 32 bits
  • Windows 7 Pro 64 bits + Office 2016 32 bits
  • Windows 2008 R2 64 bits + Office 2010 64 bits
  • Windows 10 Pro 64 bits + Office 2016 64 bits

Notas adicionales

Aquí hay una tabla de correspondencia entre algunos tipos de Win32 y VBA:

C++VBAArch
BYTEByte32 & 64
WORDInteger32 & 64
DWORD, ULONG, LONGLong32 & 64
DWORD64LongLong64
HANDLELongPtr(*)32 & 64
LPSTRString32 & 64
LPBYTELongPtr(*)32 & 64

(*) LongPtr es un tipo "dinámico", tiene 4 Bytes en Office 32 bits y 8 Bytes en Office 64 bits. https://msdn.microsoft.com/fr-fr/library/office/ee691831(v=office.14).aspx

Descargar herramienta