首页
社区
课程
招聘
[原创]HEVD内核漏洞学习(7)未初始化栈变量
发表于: 2020-11-7 11:40 5983

[原创]HEVD内核漏洞学习(7)未初始化栈变量

2020-11-7 11:40
5983

这一系列就这样快结束了 这次是未初始化栈变量 开始吧

未初始化的栈 会在调用的时候 随机填入值 我们可以将shellcode填入其中 从而去执行我们的shellcode

如前面所说 这个函数漏洞版本中未初始化内存栈 导致UserValue != MagicValue 调用回调

先下断点

这次是会有几率失败的 所以我从TJ师傅那里的代码 进行验证 IO控制码还是从IDA中得到的哈

还有就是wjllz师傅说的方法(师傅在看雪另一位师傅下的评论 其实早都看到了 但还是在这里说一下吧)

可以看到 对UserValue的值进行了正确的赋值

起初我以为是将回调函数的指针覆盖为shellcode的地址 在下断点查看之后发现并不是 看到TJ师傅讲的文章 里面提到了j00ru师傅的文章 进行栈喷射 在操作系统中 我们学到过关于用户栈和内核栈的皮毛 关于栈的结构 其实在ctfwiki上早已看到过 在j00ru师傅的文章中 也讲到过栈结构 再进一点的东西 我们需要知道下面函数

大致的先讲一下思路 我们先利用NtMapUserPhysicalPages进行栈喷射 将栈中的数据覆盖为我们shellcode 然后使用漏洞点 将其使用我们刚才我们控制的栈

我们也可以看到COPY_STACK_SIZE是缓冲区栈值的大小 所以它可以使用户传递1024*4=4096个字节的值

即可以用来控制最多4096个字节的内核栈 我们将shellcode的位置传到此处 而我们使用的为

看看exp的核心部分 首先申请内存进行栈喷射将shellcode的地址覆盖在栈中 然后再触发漏洞函数 进行提权

提权成功

在安全版本中 我们将栈的初始值进行赋值

对于未初始化栈利用 在内核态需要更加注意 稍有不慎就会覆盖到重要数据导致宕机 还好有前人的经验总结 让我们的可以更好的利用这些 不足之处是 师傅们不仅专业能力强 而且对于英文能力也是毫不逊色 自己真是太菜了qaq。。。

对于shellcode的地址在原则上说是没有问题的 但下断点查看之后 发现并不是这样 还是一个跳转表 本以为和上次一样 但继续跟踪之后发现并不能跟到shellcode的地址 这就很疑惑的 而我查看被覆盖的栈中 确实是大量相同的数据。。。。。不理解。。。。。但确实是提权成功了

对于提权成功也有点问题 每次恢复快照 有时候就可以100%提权成功 有时候就不可以 奇奇怪怪。。。

NTSTATUS
TriggerUninitializedMemoryStack(
    _In_ PVOID UserBuffer
)
{
    ULONG UserValue = 0;
    ULONG MagicValue = 0xBAD0B0B0;
    NTSTATUS Status = STATUS_SUCCESS;
 
#ifdef SECURE
    //
    // Secure Note: This is secure because the developer is properly initializing
    // UNINITIALIZED_MEMORY_STACK to NULL and checks for NULL pointer before calling
    // the callback
    //
 
    UNINITIALIZED_MEMORY_STACK UninitializedMemory = { 0 };
#else
    //
    // Vulnerability Note: This is a vanilla Uninitialized Memory in Stack vulnerability
    // because the developer is not initializing 'UNINITIALIZED_MEMORY_STACK' structure
    // before calling the callback when 'MagicValue' does not match 'UserValue'
    //
 
    UNINITIALIZED_MEMORY_STACK UninitializedMemory;            //漏洞点
#endif
 
    PAGED_CODE();
 
    __try
    {
        //
        // Verify if the buffer resides in user mode
        //
 
        ProbeForRead(UserBuffer, sizeof(UNINITIALIZED_MEMORY_STACK), (ULONG)__alignof(UCHAR));
 
        //
        // Get the value from user mode
        //
 
        UserValue = *(PULONG)UserBuffer;
 
        DbgPrint("[+] UserValue: 0x%p\n", UserValue);
        DbgPrint("[+] UninitializedMemory Address: 0x%p\n", &UninitializedMemory);
 
        //
        // Validate the magic value
        //
 
        if (UserValue == MagicValue) {
            UninitializedMemory.Value = UserValue;
            UninitializedMemory.Callback = &UninitializedMemoryStackObjectCallback;
        }
 
        DbgPrint("[+] UninitializedMemory.Value: 0x%p\n", UninitializedMemory.Value);
        DbgPrint("[+] UninitializedMemory.Callback: 0x%p\n", UninitializedMemory.Callback);
 
#ifndef SECURE
        DbgPrint("[+] Triggering Uninitialized Memory in Stack\n");
#endif
 
        //
        // Call the callback function
        //
 
        if (UninitializedMemory.Callback)
        {
            UninitializedMemory.Callback();
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        Status = GetExceptionCode();
        DbgPrint("[-] Exception Code: 0x%X\n", Status);
    }
 
    return Status;
}
NTSTATUS
TriggerUninitializedMemoryStack(
    _In_ PVOID UserBuffer
)
{
    ULONG UserValue = 0;
    ULONG MagicValue = 0xBAD0B0B0;
    NTSTATUS Status = STATUS_SUCCESS;
 
#ifdef SECURE
    //
    // Secure Note: This is secure because the developer is properly initializing
    // UNINITIALIZED_MEMORY_STACK to NULL and checks for NULL pointer before calling
    // the callback
    //
 
    UNINITIALIZED_MEMORY_STACK UninitializedMemory = { 0 };
#else
    //
    // Vulnerability Note: This is a vanilla Uninitialized Memory in Stack vulnerability
    // because the developer is not initializing 'UNINITIALIZED_MEMORY_STACK' structure
    // before calling the callback when 'MagicValue' does not match 'UserValue'
    //
 
    UNINITIALIZED_MEMORY_STACK UninitializedMemory;            //漏洞点
#endif
 
    PAGED_CODE();
 
    __try
    {
        //
        // Verify if the buffer resides in user mode
        //
 
        ProbeForRead(UserBuffer, sizeof(UNINITIALIZED_MEMORY_STACK), (ULONG)__alignof(UCHAR));
 
        //
        // Get the value from user mode
        //
 
        UserValue = *(PULONG)UserBuffer;
 
        DbgPrint("[+] UserValue: 0x%p\n", UserValue);
        DbgPrint("[+] UninitializedMemory Address: 0x%p\n", &UninitializedMemory);
 
        //
        // Validate the magic value
        //
 
        if (UserValue == MagicValue) {
            UninitializedMemory.Value = UserValue;
            UninitializedMemory.Callback = &UninitializedMemoryStackObjectCallback;
        }
 
        DbgPrint("[+] UninitializedMemory.Value: 0x%p\n", UninitializedMemory.Value);
        DbgPrint("[+] UninitializedMemory.Callback: 0x%p\n", UninitializedMemory.Callback);
 
#ifndef SECURE
        DbgPrint("[+] Triggering Uninitialized Memory in Stack\n");
#endif
 
        //
        // Call the callback function
        //
 
        if (UninitializedMemory.Callback)
        {
            UninitializedMemory.Callback();
        }
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        Status = GetExceptionCode();
        DbgPrint("[-] Exception Code: 0x%X\n", Status);
    }
 
    return Status;
}
bp HEVD!TriggerUninitializedMemoryStack
bp HEVD!TriggerUninitializedMemoryStack
 
#include<stdio.h>
#include<Windows.h>
 
 
int main()
{
 
    DWORD bReturn = 0;
    char buf[] = { 0 };
    *(PDWORD32)(buf) = 0xAAAAAAAA;
    HANDLE hDevice = NULL;
         hDevice = CreateFileA("\\\\.\\HackSysExtremeVulnerableDriver",
        GENERIC_READ | GENERIC_WRITE,
        NULL,
        NULL,
        OPEN_EXISTING,
        NULL,
        NULL);
    DeviceIoControl(hDevice, 0x22202f, buf, 4, NULL, 0, &bReturn, NULL);
 
    return 0;
}
#include<stdio.h>
#include<Windows.h>
 
 
int main()
{
 
    DWORD bReturn = 0;
    char buf[] = { 0 };
    *(PDWORD32)(buf) = 0xAAAAAAAA;
    HANDLE hDevice = NULL;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 919
活跃值: (1340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
.我搞的这个工程...基本很多都跑不通,自己一个一个修复...
2020-11-8 16:11
0
雪    币: 557
活跃值: (3020)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
丿一叶知秋 .我搞的这个工程...基本很多都跑不通,自己一个一个修复...
环境的问题?我有时候快照恢复会提权失败 有时候则不会。。。。
2020-11-11 11:23
0
游客
登录 | 注册 方可回帖
返回
//