邪恶八进制信息安全团队技术讨论组's Archiver

冰血封情 2005-1-5 02:25

[转载]Microsoft Windows 2000 PCT over SSL vulnerability scanner

信息来源:lion

[code]/*
************************************************************************************
*
* Scanssl.c - Microsoft Windows 2000 PCT over SSL vulnerability scanner.
*
* Copyright (C) 2000-2004 HUC All Rights Reserved.
*
* Author  : lion
*       : lion#cnhonker.net
*       : [url]http://www.cnhonker.com[/url]
*       :
* Notice  : Thx to bkbll (bkbll#cnhonker.net), writted a nice PCT over SSL exploit.
*       :
* Date    : 2004-04-22
*       :
* Complie  : cl scanssl.c
*       :
* Usage   :E:\>scanssl
*       :IIS SSL PCT Protocol Scanner V1.0 (2004-04-22)
*       :Code by lion (lion#cnhonker.net), [url]http://www.cnhonker.com[/url]
*       :
*       :Usage:  scanssl <Options>
*       :
*       :[Options:]
*       :      -s    Start IP
*       :      -e    End IP
*       :      -p    Scan Port        Default: 443
*       :      -t    Scan Thread      Default: 100
*       :      -l    Log file        Default: pctscan.txt
*       :      -n    Note
*
************************************************************************************
*/

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "ws2_32")

#define SCANPORT            443
#define DEFTHREAD            100
#define DEFLOGFILE           "pctscan.txt"
#define VERSION             "1.0"

// PCT on SSL
char clienthello[]=
"\x80\x62"   //size
"\x01"      //client hello
"\x80\x01"   //PCT 1.0
"\x00"      //PAD
//CH_SESSION_ID_DATA[32]
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
//CH_CHALLENGE_DATA[32]
"\xd4\x42\x2b\x54\x8e\x81\x87\xe9\xb7\x85\x11\x92\x56\x89\xcb\x94\xeb\x1b\xcf\x57\xb1\x6b\x0d\xa6\x62\x21\x35\x52\xa7\x9e\xd3\xd4"
"\x00\x0a"   //CH_OFFSET
"\x00\x08"   //CH_CIPHER_SPECS_LENGTH
"\x00\x04"   //CH_HASH_SPECS_LENGTH
"\x00\x04"   //CH_CERT_SPECS_LENGTH
"\x00\x02"   //CH_EXCH_SPECS_LENGTH
"\x00\x00"   //CH_KEY_ARG_LENGTH
"\x00\x04\x80\x40\x00\x04\x28\x40"   //CH_CIPHER_SPECS_DATA
"\x00\x01\x00\x03"              //CH_HASH_SPECS_DATA
"\x00\x03\x00\x01"              //CH_CERT_SPECS_DATA
"\x00\x01"                   //CH_EXCH_SPECS_DATA
;

int iPort=SCANPORT,iThread=DEFTHREAD,found=0,foundport=0,patched=0,disable=0,maxthread=0,scanned=0,scannum=0;
char *filename=DEFLOGFILE;
FILE *fp;


void usage(char *p)
{
   printf( "Usage:\t%s\t<Options>\n\n"
      "[Options:]\n"
      "\t-s\tStart IP\n"
      "\t-e\tEnd IP\n"
      "\t-p\tScan Port        Default: %d\n"
      "\t-t\tScan Thread      Default: %d\n"
      "\t-l\tLog file        Default: %s\n"
      "\t-n\tNote\n\n"
      , p, SCANPORT, DEFTHREAD, DEFLOGFILE);   
}

void WaitThreadEnd()
{  
   int i;

   printf("\r\n");
   for(i=0;i<=100;i++)
   {
      printf("[+] Please wait %d Thread end...  \r", maxthread);
      if (maxthread != 0)
      {
        Sleep(100);
        continue;
      }
      else break;
   }
   return;
}


void TestThread(int thread)
{
   for (;;)
   {
      printf("[+] %2d%% Complete...  \r", scanned*100/scannum);

      if (maxthread >= thread)
      {   
         Sleep(200);
      }
      else break;
   }

   return;
}

DWORD WINAPI sslscan(LPVOID ip)
{
   int ipaddr= (int)ip;
   int l;
   unsigned long flag;
   unsigned long ul[2];
   char recvbuf[100];

   SOCKET s;
   struct sockaddr_in server;
   struct fd_set mask;
   struct timeval timeout;

   server.sin_family=AF_INET;
   server.sin_addr.s_addr=htonl(ipaddr);
   server.sin_port=htons((USHORT)iPort);

   s=socket(AF_INET,SOCK_STREAM,0);

   timeout.tv_sec=3;           // set timeout 2s
   timeout.tv_usec=0;  

   flag=1;

   if(connect(s,(struct sockaddr *)&server,sizeof(server)) == 0)
   {
      foundport ++;
      if(ioctlsocket(s,FIONBIO,&flag)!=0)
      {
        maxthread --;
        closesocket(s);
        return -1;
      }

      if(send(s, clienthello, sizeof(clienthello)-1, 0))
      {
        ul[0] = 1;
        ul[1] = s;

        l = select (0, (fd_set *)&ul, NULL, NULL, &timeout);
        if(l == 1)
        {
           l = recv (s, recvbuf, sizeof(recvbuf), 0);
           if (l >= 0)
           {
              if(recvbuf[2] == &#39;\x00&#39;)
              {
                patched ++;
                printf("[-] %s patched.\r\n",inet_ntoa(server.sin_addr));
              }
              else
              if(recvbuf[2] == &#39;\x02&#39;)
              {  
                found ++;
                printf("[+] %s found!!!\r\n",inet_ntoa(server.sin_addr));  
                fprintf(fp, "%s\r\n", inet_ntoa(server.sin_addr));
                fflush(fp);
              }
              else
              if(recvbuf[2] == &#39;\x05&#39;)
              {  
                disable ++;
                printf("[+] %s disable.\r\n",inet_ntoa(server.sin_addr));  
              }
              else
              {
                //printf("[-] %s failed.\r\n",inet_ntoa(server.sin_addr));
              }
           }
        }
      }
   }
   
   Sleep(50);
   closesocket(s);
   maxthread --;
   return 1;
}


int main(int argc, char **argv)
{
   int i;
   char *startip=NULL,*endip=NULL,*note=NULL;
   int portip,ipstart,ipstop,hoststart,hoststop;
  
   WSADATA wsadata;
   
   printf( "IIS SSL PCT Protocol Scanner V%s (2004-04-22)\r\n"
        "Code by lion (lion#cnhonker.net), [url]http://www.cnhonker.com[/url]\r\n\n"
        , VERSION);
   
   //printf("%d\n", sizeof(clienthello)-1);
   if(argc < 2)
   {
      usage(argv[0]);
      return -1;
   }

   for(i=1;i<argc;i+=2)
   {
      if(strlen(argv[i]) != 2)
      {
        usage(argv[0]);
        return -1;
      }
      // check parameter
      if(i == argc-1)
      {
        usage(argv[0]);
        return -1;
      }
      switch(argv[i][1])
      {
        case &#39;s&#39;:
           startip = argv[i+1];
           break;
        case &#39;e&#39;:
           endip = argv[i+1];
           break;
        case &#39;p&#39;:
           iPort = atoi(argv[i+1]);
           break;
        case &#39;t&#39;:
           iThread = atoi(argv[i+1]);
           break;
        case &#39;l&#39;:
           filename = argv[i+1];
           break;
        case &#39;n&#39;:
           note = argv[i+1];
           break;
      }
   }

   if(startip == NULL || endip == NULL)
   {
      printf("[-] Please enter start and end ip!\r\n");
      return -1;
   }

   if(iPort <1 || iPort >65535)
   {
      usage(argv[0]);
      printf("[-] Invalid port.\n");
      return -1;
   }
  
   if(iThread <10 || iThread >300)
   {
      usage(argv[0]);
      printf("[-] Invalid thread.\n");
      return -1;
   }
  
   fp = fopen(filename, "a+");
   if(fp == NULL)
   {
      printf("[-] Open log file:%s error!\r\n", filename);
      return -1;
   }

   fprintf(fp, "%s-%s %s\r\n", startip, endip, note);
   fflush(fp);
   
   if (WSAStartup(MAKEWORD(1,1),&wsadata)!=0)
   {
      printf("wsatartup error");
      return -1;
   }

   ipstart=inet_addr(startip);
   ipstop=inet_addr(endip);
   hoststart=ntohl(ipstart);
   hoststop=ntohl(ipstop);

   scannum=hoststop-hoststart+1;

   for(portip=hoststart;portip<=hoststop;portip++,maxthread++)
   {
      if ((portip%256)==0)  {scannum--;maxthread--;continue;} // ingore localhost addr
      if ((portip%256)==255) {scannum--;maxthread--;continue;} // ingore broadcast addr

      TestThread(iThread);

      CreateThread(0, 0, sslscan, (void*)portip, 0, 0);
      Sleep(20);
      scanned ++;
   }

   Sleep(5000);
   WaitThreadEnd();

   fclose(fp);
   printf("[+] Host search %d host complete.\r\n", scannum);
   printf("[+] Found %d port, %d vlun host!\r\n", foundport, found);   
   
   return 1;
}[/code]

页: [1]
© 1999-2008 EvilOctal Security Team