aboutsummaryrefslogtreecommitdiff
path: root/Exfiltration/mimikatz-1.0/modules/mod_privilege.cpp
blob: 34324b6f2656e23a5ea2781be8904763ef89925b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*	Benjamin DELPY `gentilkiwi`
	http://blog.gentilkiwi.com
	benjamin@gentilkiwi.com
	Licence : http://creativecommons.org/licenses/by/3.0/fr/
*/
#include "mod_privilege.h"

bool mod_privilege::getName(PLUID idPrivilege, wstring * privilegeName)
{
	bool reussite = false;
	DWORD tailleRequise = 0;

	if(!LookupPrivilegeName(NULL, idPrivilege, NULL, &tailleRequise)  && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
	{
		wchar_t * monBuffer = new wchar_t[tailleRequise];
		if(reussite = (LookupPrivilegeName(NULL, idPrivilege, monBuffer, &tailleRequise) != 0))
		{
			privilegeName->assign(monBuffer);
		}
		delete[] monBuffer;
	}
	return reussite;
}

bool mod_privilege::getValue(wstring * privilegeName, PLUID idPrivilege)
{
	return (LookupPrivilegeValue(NULL, privilegeName->c_str(), idPrivilege) != 0);
}

bool mod_privilege::get(vector<pair<wstring, DWORD>> *maPrivilegesvector, HANDLE handleProcess)
{
	bool reussite = false;

	HANDLE hToken = INVALID_HANDLE_VALUE;
	if(OpenProcessToken((handleProcess == INVALID_HANDLE_VALUE ? GetCurrentProcess() : handleProcess), TOKEN_QUERY /*| STANDARD_RIGHTS_READ*/, &hToken))
	{
		DWORD tailleRequise = 0;
		BYTE * monBuffer;
		
		if(!GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &tailleRequise) && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
		{
			monBuffer = new BYTE[tailleRequise];
			if(reussite = (GetTokenInformation(hToken, TokenPrivileges, monBuffer, tailleRequise, &tailleRequise) != 0))
			{
				TOKEN_PRIVILEGES * mesPrivileges = reinterpret_cast<TOKEN_PRIVILEGES *>(monBuffer);
				for(DWORD i = 0; i < mesPrivileges->PrivilegeCount; i++)
				{
					wstring * monPrivilege = new wstring();
					if(getName(&(mesPrivileges->Privileges[i].Luid), monPrivilege))
					{
						maPrivilegesvector->push_back(make_pair(*monPrivilege, mesPrivileges->Privileges[i].Attributes));
					}
					delete monPrivilege;
				}
			}
			delete[] monBuffer;
		}
	}
	return reussite;
}

bool mod_privilege::set(vector<pair<wstring, DWORD>> *maPrivilegesvector, HANDLE handleProcess)
{
	bool reussite = false;

	BYTE * monBuffer = new BYTE[FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges[maPrivilegesvector->size()])];
	TOKEN_PRIVILEGES * mesPrivileges = reinterpret_cast<TOKEN_PRIVILEGES *>(monBuffer);
	mesPrivileges->PrivilegeCount = static_cast<DWORD>(maPrivilegesvector->size());

	unsigned int i;
	vector<pair<wstring, DWORD>>::iterator monPrivilege;
	for(monPrivilege = maPrivilegesvector->begin(), i = 0; (monPrivilege != maPrivilegesvector->end()) && ( i < mesPrivileges->PrivilegeCount) ; monPrivilege++, i++)
	{
		if(reussite = getValue(&(monPrivilege->first), &(mesPrivileges->Privileges[i].Luid)))
		{
			mesPrivileges->Privileges[i].Attributes = monPrivilege->second;
		}
		else
		{
			break;
		}
	}

	if(reussite)
	{
		HANDLE hToken = INVALID_HANDLE_VALUE;
		if(reussite = (OpenProcessToken((handleProcess == INVALID_HANDLE_VALUE ? GetCurrentProcess() : handleProcess), /*TOKEN_QUERY |*/ TOKEN_ADJUST_PRIVILEGES, &hToken) != 0))
		{
			reussite = (AdjustTokenPrivileges(hToken, false, reinterpret_cast<TOKEN_PRIVILEGES *>(mesPrivileges), 0, NULL, NULL) != 0) && (GetLastError() == ERROR_SUCCESS);
		}
	}

	delete monBuffer;
	return reussite;
}