首页
社区
课程
招聘
[原创]condrv.sys 拒绝服务漏洞补丁
2021-1-21 20:56 4898

[原创]condrv.sys 拒绝服务漏洞补丁

2021-1-21 20:56
4898

今天微信朋友圈被蓝屏刷屏了,各大厂商也都在出热补,写着玩,不知道会不会PG

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
#include "ntifs.h"
 
 
 
EXTERN_C POBJECT_TYPE* IoDriverObjectType;
 
EXTERN_C NTSTATUS ObReferenceObjectByName(
    PUNICODE_STRING ObjectName,
    ULONG Attributes,
    PACCESS_STATE AccessState,
    ACCESS_MASK DesiredAccess,
    POBJECT_TYPE ObjectType,
    KPROCESSOR_MODE AccessMode,
    PVOID ParseContext,
    PVOID* Object
);
 
 
// 全局变量
PDRIVER_OBJECT   g_Con = NULL;
PDRIVER_DISPATCH g_OriginalCreate = NULL;
 
NTSTATUS HookCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);
    DbgPrint("Open File:%wZ\n", &pStack->FileObject->FileName);
 
    UNICODE_STRING usFileName = { 0 };
    RtlInitUnicodeString(&usFileName, L"\\KernelConnect");
    if (RtlCompareUnicodeString(&pStack->FileObject->FileName, &usFileName, TRUE) == 0)
    {
        // 走到这里说明在访问漏洞函数了,再检查请求是否来自UserMode
        if (Irp->RequestorMode)
        {
            Irp->IoStatus.Information = 0;
            Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
            IoCompleteRequest(Irp, IO_NO_INCREMENT);
            return  Irp->IoStatus.Status;
        }
    }
 
    return g_OriginalCreate(DeviceObject, Irp);
 
}
 
NTSTATUS Init()
{
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    UNICODE_STRING usDrvName = { 0 };
 
    // install Hook
    RtlInitUnicodeString(&usDrvName, L"\\Driver\\condrv");
    status = ObReferenceObjectByName(&usDrvName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID*)&g_Con);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("Couldn't get the driver object \n");
        return status;
    }
    else
    {
        // Start Hooking
        if (!g_OriginalCreate)
        {
            g_OriginalCreate = g_Con->MajorFunction[IRP_MJ_CREATE];
            g_Con->MajorFunction[IRP_MJ_CREATE] = HookCreate;
        }
 
        DbgPrint("Hook: HOOK driver object! Success\n");
    }
    return STATUS_SUCCESS;
}
 
void UnInit()
{
    if (g_Con)
    {
        g_Con->MajorFunction[IRP_MJ_CREATE] = g_OriginalCreate;
        g_OriginalCreate = NULL;
        ObDereferenceObject(g_Con);
        g_Con = NULL;
        DbgPrint("Restore hook!\n");
    }
}
 
void DriverUnload(PDRIVER_OBJECT DriverObject)
{
    UNREFERENCED_PARAMETER(DriverObject);
    DbgPrint("Driver Unloadiang\n");
    UnInit();
}
 
EXTERN_C_START
NTSTATUS DriverEntry(PDRIVER_OBJECT  DriverObject, PUNICODE_STRING RegistryPath)
{
    UNREFERENCED_PARAMETER(RegistryPath);
    DriverObject->DriverUnload = DriverUnload;
 
    ULONG MajorVersion = 0;
    ULONG MinorVersion = 0;
    ULONG BuildNumber = 0;
 
    PsGetVersion(&MajorVersion, &MinorVersion, &BuildNumber, 0);
    if (MajorVersion == 10 && BuildNumber >= 15063)
    {
        Init();
    }
    return STATUS_SUCCESS;
}
EXTERN_C_END

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (4)
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
evilkis 7 2021-1-22 00:36
2
0
火绒的热补丁就是这么做的
雪    币: 405
活跃值: (1885)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wowocock 1 2021-1-25 17:29
3
0
根本就不是检测模式的问题,而是他的垃圾代码里到处都是坑。内核模式下一样挂,比如随便写个驱动在DRIVERENTRY里调用TestCreateconDrv
NTSTATUS
TestCreateconDrv()
{
    OBJECT_ATTRIBUTES ObjA;
    NTSTATUS Status;
    IO_STATUS_BLOCK IoStatusBlock;
    HANDLE FileHandle;
    UNICODE_STRING uCondrv;

       RtlInitUnicodeString(&uCondrv, L"\\??\\GLOBALROOT\\Device\\ConDrv\\KernelConnect");

    InitializeObjectAttributes(&ObjA, &uCondrv, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, NULL, NULL);

    Status = ZwCreateFile(&FileHandle,
                            GENERIC_WRITE,
                            &ObjA,
                            &IoStatusBlock,
                            NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            FILE_SHARE_READ,
                            FILE_OPEN_IF,
                            FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE | FILE_SEQUENTIAL_ONLY,
                            NULL,
                            0
                            );

    if (NT_SUCCESS(Status))
       {

        ZwClose(FileHandle);
    }

    return Status;
}
雪    币: 405
活跃值: (1885)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wowocock 1 2021-1-25 17:40
4
0
建议把CREATE CLEANUP ,CLOSE都PATCH了
EXTERN_C POBJECT_TYPE* IoDriverObjectType;
EXTERN_C NTSTATUS ObReferenceObjectByName(
       PUNICODE_STRING ObjectName,
       ULONG Attributes,
       PACCESS_STATE AccessState,
       ACCESS_MASK DesiredAccess,
       POBJECT_TYPE ObjectType,
       KPROCESSOR_MODE AccessMode,
       PVOID ParseContext,
       PVOID* Object
       );

// 全局变量
PDRIVER_OBJECT   g_Con = NULL;
PDRIVER_DISPATCH g_OriginalCreate = NULL;
PDRIVER_DISPATCH g_OriginalCleanup = NULL;
PDRIVER_DISPATCH g_OriginalClose = NULL;

NTSTATUS HookCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
       UNICODE_STRING usFileName = { 0 };
       PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);
       DbgPrint("Open File:%wZ\n", &pStack->FileObject->FileName);

       RtlInitUnicodeString(&usFileName, L"\\KernelConnect");
       if (RtlCompareUnicodeString(&pStack->FileObject->FileName, &usFileName, TRUE) == 0)
       {
               // 走到这里说明在访问漏洞函数了,再检查请求是否来自UserMode
               if (Irp->RequestorMode)
               {
                       Irp->IoStatus.Information = 0;
                       Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
                       IoCompleteRequest(Irp, IO_NO_INCREMENT);
                       return  Irp->IoStatus.Status;
               }
       }

       return g_OriginalCreate(DeviceObject, Irp);

}

NTSTATUS HookCleanup(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
       UNICODE_STRING usFileName = { 0 };
       PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);

       if (!MmIsAddressValid(pStack->FileObject) || !MmIsAddressValid(pStack->FileObject->FsContext))
       {
               Irp->IoStatus.Information = 0;
               Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
               IoCompleteRequest(Irp, IO_NO_INCREMENT);
               return  Irp->IoStatus.Status;
       }

       return g_OriginalCleanup(DeviceObject, Irp);

}

NTSTATUS HookClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
       UNICODE_STRING usFileName = { 0 };
       PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);

       if (!MmIsAddressValid(pStack->FileObject) || !MmIsAddressValid(pStack->FileObject->FsContext))
       {
               Irp->IoStatus.Information = 0;
               Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
               IoCompleteRequest(Irp, IO_NO_INCREMENT);
               return  Irp->IoStatus.Status;
       }

       return g_OriginalClose(DeviceObject, Irp);

}

NTSTATUS Init()
{
       NTSTATUS status = STATUS_UNSUCCESSFUL;
       UNICODE_STRING usDrvName = { 0 };

       // install Hook
       RtlInitUnicodeString(&usDrvName, L"\\Driver\\condrv");
       status = ObReferenceObjectByName(&usDrvName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID*)&g_Con);
       if (!NT_SUCCESS(status))
       {
               DbgPrint("Couldn't get the driver object \n");
               return status;
       }
       else
       {
               // Start Hooking
               if (!g_OriginalCreate)
               {
                       g_OriginalCreate = g_Con->MajorFunction[IRP_MJ_CREATE];
                       g_Con->MajorFunction[IRP_MJ_CREATE] = HookCreate;
               }

               if (!g_OriginalCleanup)
               {
                       g_OriginalCleanup = g_Con->MajorFunction[IRP_MJ_CLEANUP];
                       g_Con->MajorFunction[IRP_MJ_CLEANUP] = HookCleanup;
               }

               if (!g_OriginalClose)
               {
                       g_OriginalClose = g_Con->MajorFunction[IRP_MJ_CLOSE];
                       g_Con->MajorFunction[IRP_MJ_CLOSE] = HookClose;
               }

               DbgPrint("Hook: HOOK driver object! Success\n");
       }
       return STATUS_SUCCESS;
}

void UnInit()
{
       if (g_Con)
       {
               g_Con->MajorFunction[IRP_MJ_CREATE] = g_OriginalCreate;
               g_OriginalCreate = NULL;

               g_Con->MajorFunction[IRP_MJ_CLEANUP] = g_OriginalCleanup;
               g_OriginalCleanup = NULL;

               g_Con->MajorFunction[IRP_MJ_CLOSE] = g_OriginalClose;
               g_OriginalClose = NULL;

               ObDereferenceObject(g_Con);
               g_Con = NULL;
               DbgPrint("Restore hook!\n");
       }
}
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
evilkis 7 2021-1-26 23:28
5
0
wowocock 根本就不是检测模式的问题,而是他的垃圾代码里到处都是坑。内核模式下一样挂,比如随便写个驱动在DRIVERENTRY里调用TestCreateconDrv NTSTATUS TestCreateco ...
本质是 CREATE IRP返回失败 没有设置IoStatus,你说的内核模式一样挂 也是因为多处返回没有设置IoStatus
第一个内核模式判断eabufer有无attach字符串 没有返回的失败就没设置IoStatus
游客
登录 | 注册 方可回帖
返回