• 3.3 DLL注入:突破会话0强力注入


    Session是Windows系统的一个安全特性,该特性引入了针对用户体验提高的安全机制,即拆分Session 0和用户会话,这种拆分Session 0Session 1的机制对于提高安全性非常有用,这是因为将桌面服务进程,驱动程序以及其他系统级服务取消了与用户会话的关联,从而限制了攻击者可用的攻击面。

    由于DLL注入在Session 0中的注入机制不同于在用户会话中的注入机制,因此需要特别的考虑和处理。如果需要执行DLL注入,必须使用过度级别安全机制解决Session 0上下文问题,并且在设计安全方案时,必须考虑Session 0Session 1之间的区别。

    在之前的远程线程注入章节中,我们通过使用CreateRemoteThread()这个函数来完成线程注入,此方式可以注入普通的进程,但却无法注入到系统进程中,因为系统进程是处在SESSION0高权限级别的会话层,由于CreateRemoteThread()底层会调用ZwCreateThreadEx()这个未公开的内核函数,所以当我们调用该函数的底层函数时则可实现突破Session0的注入机制。

    由于该内核函数并未被导出,所以我们必须找到该函数的原型定义,并通过GetProcAddress获取到ntdll.dll模块下的ZwCreateThreadEx的函数地址,并通过ZwCreateThreadEx函数指针直接调用模块;

    #ifdef _WIN64
      typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
        PHANDLE ThreadHandle,
        ACCESS_MASK DesiredAccess,
        LPVOID ObjectAttributes,
        HANDLE ProcessHandle,
        LPTHREAD_START_ROUTINE lpStartAddress,
        LPVOID lpParameter,
        ULONG CreateThreadFlags,
        SIZE_T ZeroBits,
        SIZE_T StackSize,
        SIZE_T MaximumStackSize,
        LPVOID pUnkown);
    #else
      typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
        PHANDLE ThreadHandle,
        ACCESS_MASK DesiredAccess,
        LPVOID ObjectAttributes,
        HANDLE ProcessHandle,
        LPTHREAD_START_ROUTINE lpStartAddress,
        LPVOID lpParameter,
        BOOL CreateSuspended,
        DWORD dwStackSize,
        DWORD dw1,
        DWORD dw2,
        LPVOID pUnkown);
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    当拿到ZwCreateThreadEx函数指针时,则接下来就可以调用了,ZwCreateThreadEx 可以用于创建一个远程线程,即在目标进程中创建一个线程,并在这个线程中运行指定的代码。与CreateRemoteThread不同,ZwCreateThreadEx可以用于创建一个在指定进程的上下文之外的线程,即可以创建一个与指定进程无关的线程。

    它的函数原型定义如下:

    NTSYSAPI NTSTATUS NTAPI ZwCreateThreadEx(
        PHANDLE ThreadHandle,
        ACCESS_MASK DesiredAccess,
        POBJECT_ATTRIBUTES ObjectAttributes,
        HANDLE ProcessHandle,
        PVOID StartRoutine,
        PVOID Argument,
        ULONG CreateFlags,
        SIZE_T ZeroBits,
        SIZE_T StackSize,
        SIZE_T MaximumStackSize,
        PPS_ATTRIBUTE_LIST AttributeList);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    其参数说明如下:

    • ThreadHandle 用于返回创建的线程句柄的指针。
    • DesiredAccess 用于指定线程句柄的访问权限。
    • ObjectAttributes 一个指向 OBJECT_ATTRIBUTES 结构的指针,指定线程对象的对象名和安全性属性。
    • ProcessHandle 目标进程的句柄,即在哪个进程中创建新线程。
    • StartRoutine 一个指向新线程的入口点的指针。
    • Argument 第二个参数传递给新线程的指针。
    • CreateFlags 指定创建线程的属性,如堆栈大小、创建标志、线程属性等。
    • ZeroBits 保留参数,应该传递0。
    • StackSize 线程堆栈大小。
    • MaximumStackSize 线程堆栈的最大大小。
    • AttributeList 指向结构 PS_ATTRIBUTE_LIST,该结构可以用于在线程创建时指定各种属性。

    具备了上述基本条件那么注入代码的事项将变得非常容易,如下代码是这个注入程序的完整实现流程,读者可自行测试注入效果;

    #include 
    #include 
    #include 
    #include 
    
    // 传入进程名称返回该进程PID
    DWORD FindProcessID(LPCTSTR szProcessName)
    {
        DWORD dwPID = 0xFFFFFFFF;
        HANDLE hSnapShot = INVALID_HANDLE_VALUE;
        PROCESSENTRY32 pe;
        pe.dwSize = sizeof(PROCESSENTRY32);
        hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
        Process32First(hSnapShot, &pe);
        do
        {
            if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
            {
                dwPID = pe.th32ProcessID;
                break;
            }
        } while (Process32Next(hSnapShot, &pe));
        CloseHandle(hSnapShot);
        return dwPID;
    }
    
    // 强力注入
    BOOL ZwCreateThreadExInjectDll(DWORD dwProcessId, char* pDllName)
    {
        HANDLE hProcess = NULL;
        SIZE_T dwSize = 0;
        LPVOID pDllAddr = NULL;
        FARPROC pFuncProcAddr = NULL;
        HANDLE hRemoteThread = NULL;
        DWORD dwStatus = 0;
    
        // 打开注入进程
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        if (NULL == hProcess)
        {
            return FALSE;
        }
    
        // 在注入进程中申请内存
        dwSize = sizeof(char) + lstrlen(pDllName);
        pDllAddr = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
        if (NULL == pDllAddr)
        {
            return FALSE;
        }
    
        // 向申请的内存中写入数据
        if (FALSE == WriteProcessMemory(hProcess, pDllAddr, pDllName, dwSize, NULL))
        {
            return FALSE;
        }
    
        // 加载ntdll.dll模块
        HMODULE hNtdllDll = LoadLibrary("ntdll.dll");
        if (NULL == hNtdllDll)
        {
            return FALSE;
        }
    
        // 获取LoadLibraryA函数地址
        pFuncProcAddr = GetProcAddress(::GetModuleHandle("Kernel32.dll"), "LoadLibraryA");
        if (NULL == pFuncProcAddr)
        {
            return FALSE;
        }
    
        // 获取ZwCreateThread函数地址
    #ifdef _WIN64
        typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
            PHANDLE ThreadHandle,
            ACCESS_MASK DesiredAccess,
            LPVOID ObjectAttributes,
            HANDLE ProcessHandle,
            LPTHREAD_START_ROUTINE lpStartAddress,
            LPVOID lpParameter,
            ULONG CreateThreadFlags,
            SIZE_T ZeroBits,
            SIZE_T StackSize,
            SIZE_T MaximumStackSize,
            LPVOID pUnkown);
    #else
        typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
            PHANDLE ThreadHandle,
            ACCESS_MASK DesiredAccess,
            LPVOID ObjectAttributes,
            HANDLE ProcessHandle,
            LPTHREAD_START_ROUTINE lpStartAddress,
            LPVOID lpParameter,
            BOOL CreateSuspended,
            DWORD dwStackSize,
            DWORD dw1,
            DWORD dw2,
            LPVOID pUnkown);
    #endif
        
        typedef_ZwCreateThreadEx ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdllDll, "ZwCreateThreadEx");
        if (NULL == ZwCreateThreadEx)
        {
            return FALSE;
        }
        // 调用函数执行强力注入
        dwStatus = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hProcess,
            (LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, 0, 0, 0, NULL);
        if (NULL == hRemoteThread)
        {
            return FALSE;
        }
    
        // 关闭句柄
        CloseHandle(hProcess);
        FreeLibrary(hNtdllDll);
        return TRUE;
    }
    
    int main(int argc, char *argv[])
    {
        DWORD pid = FindProcessID("lyshark.exe");
        std::cout << "进程PID: " << pid << std::endl;
    
        bool flag = ZwCreateThreadExInjectDll(pid, (char *)"d://hook.dll");
        std::cout << "注入状态: " << flag << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
  • 相关阅读:
    基于单片机智能汽车仪表设计系统
    安全协议缺陷
    Go 消息队列及工作池处理
    基于SpringBoot的企业部门与员工管理系统,毕设、课设资源包,附送项目源码和数据库脚本
    fluent鱼儿游动,保存为gif动图,python代码
    【Vue】从vue2到vue3,生命周期函数有何变化之详解
    环形均分纸牌问题
    R语言ggplot2可视化:ggcharts包的bar_chart函数可视化条形图、bar_chart函数自动排序条形图并水平显示
    gan与dcgan训练自己的数据集
    滑膜间充质干细胞复合壳聚糖水凝胶/角蛋白壳聚糖水凝胶复合材料/壳聚糖/海藻酸纳复合水凝胶的制备
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/132854782