
Archivo de Objeto Beacon de Cobalt Strike que implementa la escalada de privilegios local SMBGhost CVE-2020-0796 con rutas duales de weaponización para robo de tokens y elevación de sesión.
Esto es la experimentación de Raphael con el SMBGhost LPE.
Empecé con el código fuente del Metasploit Framework:
cve-2020-0796: Desbordamiento de búfer de compresión SMBv3 (SMBGhost) (CVE 2020-0796) https://github.com/rapid7/metasploit-framework/tree/master/external/source/exploits/CVE-2020-0796 [Licencia BSD]
Y, esto es lo que hice:
Esto requirió declarar varias APIs de Win32 en el formato MODULE$Function de Dynamic Function Resolution.
Por el lado positivo, esto redujo parte del código para llamar cosas en NTDLL ya que DFR lo maneja por nosotros. :)
Eliminé el array ptr de 1000 elementos no utilizado de get_handle_addr. Esto causaba que cl.exe insertara una
función __chkstk debido a que las variables locales superaban el límite de 8KB. Los BOFs no tienen esta función
disponible.
Luego incorporé algunas APIs específicas de Beacon (por ejemplo, BeaconPrintf, BeaconInjectProcess, etc.) para hacer
las cosas de la manera nativa de Beacon.
Tuve que escribir algunas funciones para compensar la falta de cosas de libc que no tengo (debido a... BOFs).
Usa el alias smbghost en Beacon, sin argumentos, para ejecutar este exploit y afectar solo el token del proceso de Beacon.
Si el exploit tiene éxito, tu token de proceso actual tendrá superpoderes que antes no tenía. Por ejemplo, ahora puedes
inyectarte en otros procesos (incluso en otras sesiones de escritorio) o generar un proceso hijo bajo winlogon.exe.
Puede que necesites ejecutar smbghost varias veces, ya que el exploit no siempre tiene éxito en el primer intento.
Opcionalmente, usa elevate smbghost para obtener una nueva sesión de Beacon usando la API de escalada de privilegios
disponible en el Aggressor Script de Cobalt Strike. Esto está bien para una demo rápida, se ajusta a los flujos de trabajo
del producto, etc. pero... se inyecta en winlogon.exe. Inyectarse en winlogon.exe no es un invariante de esta
elevación en particular. Sospecho que todos los POCs públicos lo hacen porque CreateRemoteThread no funciona
a través de límites de procesos y ¿quién quiere escribir el código adicional para la suplantación del proceso padre?
winlogon.exe es la fruta baja fácil para demostrar que tenemos derechos elevados.
Para compilar esto con Visual Studio:
Usa make.bat desde el Símbolo del sistema de herramientas cruzadas x64.
Esto generará expolit.x64.o en dist/
Usé Visual Studio 2013. Otros compiladores/versiones no fueron probados. No probé/testeé x86.