找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4203|回复: 0

[原]VC++信息安全编程(19)PnP溢出代码漏洞扫描检测

[复制链接]
发表于 2012-3-8 15:07:59 | 显示全部楼层 |阅读模式
具体漏洞检测代码
  1. #include "winsock2.h"
  2. #include "windows.h"
  3. #include <winnetwk.h>
  4. #include <Rpc.h>
  5. #include "stdio.h"
  6. #include "string.h"
  7. #pragma comment(lib, "ws2_32")
  8. #pragma comment(lib, "mpr")
  9. #pragma comment(lib, "Rpcrt4")
  10. //72字节netbios会话请求,若445端口连接不成功,访问139 的时候就先发送这个
  11. unsigned char reqNBSS[] =
  12.         "\x81\x00\x00\x44\x20\x43\x4B\x46\x44\x45\x4E\x45\x43\x46\x44\x45"
  13.         "\x46\x46\x43\x46\x47\x45\x46\x46\x43\x43\x41\x43\x41\x43\x41\x43"
  14.         "\x41\x43\x41\x43\x41\x00\x20\x46\x44\x45\x44\x46\x46\x43\x4E\x45"
  15.         "\x46\x44\x47\x44\x48\x44\x44\x46\x49\x45\x44\x46\x47\x46\x43\x45"
  16.         "\x4C\x45\x49\x44\x44\x41\x41\x00";
  17. //Negotiate 协议
  18. unsigned char SMB_Negotiate[] =
  19. "\x00\x00\x00\x2f\xFF\x53\x4D\x42\x72\x00\x00\x00\x00\x18\x01\xC5"
  20. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFE"
  21. "\x00\x00\x00\x00\x00\x0C\x00\x02\x4E\x54\x20\x4C\x4D\x20\x30\x2E"
  22. "\x31\x32\x00";
  23. //建立会话
  24. unsigned char SMB_SessionSetupAndX[] =
  25.     "\x00\x00\x00\xa6\xFF\x53\x4D\x42\x73\x00\x00\x00\x00\x18\x01\xC5"
  26.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFE"
  27.         "\x00\x00\x01\x00\x0D\xFF\x00\x00\x00\x00\x20\x32\x00\x00\x00\x00"
  28.         "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xD4\x00\x00\x00\x69"
  29.         "\x00\x00\x00\x00\x00\x00\x57\x00\x69\x00\x6E\x00\x64\x00\x6F\x00"
  30.         "\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32\x00\x20\x00"
  31.         "\x53\x00\x65\x00\x72\x00\x57\x00\x69\x00\x6E\x00\x64\x00\x6F\x00"
  32.         "\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32\x00\x20\x00"
  33.         "\x53\x00\x65\x00\x72\x00\x00\x00\x41\x00\x41\x00\x41\x00\x41\x00"
  34.         "\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00"
  35.         "\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00";
  36. //列出要访问的共享资源---命名管道
  37. unsigned char SMB_TreeConnectAndX[] =
  38.     "\x00\x00\x00\x3a\xFF\x53\x4D\x42\x75\x00\x00\x00\x00\x18\x01\xC5"
  39.     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFE"
  40.     "\x00\x08\x03\x00\x04\xFF\x00\x00\x00\x08\x00\x01\x00\x0E\x00\x00"
  41.     "\x49\x00\x50\x00\x43\x00\x24\x00\x00\x00\x49\x50\x43\x00";
  42. //扫描数据
  43. char szScan[] =
  44.     "\x05\x00\x00\x03\x10\x00\x00\x00\xF8\x00\x00\x00\x01\x00\x00\x00"
  45.     "\x00\xE0\x00\x00\x00\x00\x36\x00\x3D\x00\x00\x00\x00\x00\x00\x00"
  46.         "\x3D\x00\x00\x00\x50\x00\x43\x00\x49\x00\x5C\x00\x56\x00\x45\x00"
  47.         "\x4E\x00\x5F\x00\x31\x00\x30\x00\x31\x00\x31\x00\x26\x00\x44\x00"
  48.         "\x45\x00\x56\x00\x5F\x00\x30\x00\x30\x00\x30\x00\x39\x00\x26\x00"
  49.         "\x53\x00\x55\x00\x42\x00\x53\x00\x59\x00\x53\x00\x5F\x00\x32\x00"
  50.         "\x31\x00\x31\x00\x34\x00\x30\x00\x41\x00\x30\x00\x30\x00\x26\x00"
  51.         "\x52\x00\x45\x00\x56\x00\x5F\x00\x32\x00\x30\x00\x5C\x00\x33\x00"
  52.         "\x26\x00\x32\x00\x36\x00\x37\x00\x41\x00\x36\x00\x31\x00\x36\x00"
  53.         "\x41\x00\x26\x00\x30\x00\x26\x00\x35\x00\x30\x00\x00\x00\xAF\x72"
  54.         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00"
  55.         "\x00\x00\x00\x00\x00\x00\x00\x00\x7F\xEC\x00\x00\x00\x00\x00\x00"
  56.         "\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  57.         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  58.         "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  59.         "\x00\x00\x00\x00\x00\x00\x00\x00";
  60. BYTE PRPC[0x48] =
  61. {
  62.         0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
  63.         0xB8,0x10,0xB8,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
  64.         0x6A,0x28,0x19,0x39,0x0C,0xB1,0xD0,0x11,0x9B,0xA8,0x00,0xC0,0x4F,0xD9,0x2E,0xF5,
  65.         0x00,0x00,0x00,0x00,0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,
  66.         0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00
  67. };
  68. //RPC接口属性
  69. struct RPCBIND
  70. {
  71.         BYTE VerMaj;
  72.         BYTE VerMin;
  73.         BYTE PacketType;
  74.         BYTE PacketFlags;
  75.         DWORD DataRep;
  76.         WORD FragLength;
  77.         WORD AuthLength;
  78.         DWORD CallID;
  79.         WORD MaxXmitFrag;
  80.         WORD MaxRecvFrag;
  81.         DWORD AssocGroup;
  82.         BYTE NumCtxItems;
  83.         WORD ContextID;
  84.         WORD NumTransItems;
  85.         GUID InterfaceUUID; //16字节的GUID对象
  86.         WORD InterfaceVerMaj;
  87.         WORD InterfaceVerMin;
  88.         GUID TransferSyntax;
  89.         DWORD SyntaxVer;
  90. };
  91. //转换为UNICODE
  92. void convert_name(char *out, char *name)
  93. {
  94.         unsigned long len;
  95.        
  96.         len = strlen(name);
  97.         out += len * 2 - 1;
  98.         while (len--)
  99.         {
  100.                 *out-- = '\x00';
  101.                 *out-- = name[len];
  102.         }
  103. }
  104. //设置RPC接口属性,并通过管道browser进行访问
  105. BOOL BindRpcInterface(HANDLE PH, char *Interface, char *InterfaceVer)
  106. {
  107.         BYTE rbuf[0x1000];
  108.         DWORD dw;
  109.         struct RPCBIND RPCBind;       
  110.         BOOL bRet;
  111.         memcpy(&RPCBind, &PRPC, sizeof(RPCBind));
  112.         UuidFromString((unsigned char *)Interface, &RPCBind.InterfaceUUID);
  113.         UuidToString(&RPCBind.InterfaceUUID, (unsigned char **)&Interface);
  114.         RPCBind.InterfaceVerMaj = atoi(&InterfaceVer[0]);
  115.         RPCBind.InterfaceVerMin = atoi(&InterfaceVer[2]);
  116.         bRet = TransactNamedPipe(PH, &RPCBind, sizeof(RPCBind), rbuf, sizeof(rbuf), &dw, NULL);
  117.         //printf("%d\n", WSAGetLastError());
  118.         return bRet;
  119. }
  120. //扫描函数
  121. BOOL ScanPNP(HANDLE PipeHandle)
  122. {
  123.         BYTE rbuf[0x100] = {0};
  124.         DWORD dw;       
  125.        
  126.         if(!TransactNamedPipe(PipeHandle, szScan, sizeof(szScan), rbuf, sizeof(rbuf), &dw, NULL))
  127.     {
  128.                 printf("Cann't get scan data!\n");
  129.                 return FALSE;
  130.         }
  131.         if(dw != 0x48)
  132.         {               
  133.                 return FALSE;
  134.         }
  135.         if(rbuf[0x44] != 0x0b)
  136.         {
  137.                 return FALSE;
  138.         }
  139.         return TRUE;
  140. }
  141. //主函数
  142. int main(int argc, char **argv)
  143. {
  144.         if (argc < 2)
  145.         {
  146.                 printf("Usage: %s <host>\n", argv[0]);
  147.                 return 1;
  148.         }
  149.         WSADATA wsa;
  150.         if(WSAStartup(MAKEWORD(1, 0), &wsa) != 0)
  151.         {
  152.                 printf("1\n");
  153.                 return -1;
  154.         }
  155.         //创建套接字
  156.         SOCKET ClientSock;
  157.         sockaddr_in ClientAddr;       
  158.         int len;
  159.     unsigned char szRecv[0x1000] = {0};
  160.         ClientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  161.     ClientAddr.sin_family  = AF_INET;
  162.         ClientAddr.sin_port = htons(445);
  163.     ClientAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
  164.         printf("[*] Connecting to 445 ... ");
  165.         //先连接445端口,如果不成功,则连接139
  166.         if(connect(ClientSock, (const sockaddr *)&ClientAddr, sizeof(ClientAddr)) < 0)
  167.         {
  168.                 printf("Cann't connecting to 445 ... ");
  169.                 printf("[*] Connecting to 445 ... ");
  170.                 ClientAddr.sin_port = htons(139);
  171.                 if(connect(ClientSock, (const sockaddr *)&ClientAddr, sizeof(ClientAddr)) < 0)
  172.                 {
  173.                         printf("Cann't create NULL session!\n");
  174.                         return -1;
  175.                 }
  176.                 //发送72字节的reqNBSS
  177.                 if(send(ClientSock, (const char *)reqNBSS, sizeof(reqNBSS) - 1, 0) < 0)
  178.                 {
  179.                         printf("[-] Send reqNBSS failed\n");
  180.                         closesocket(ClientSock);
  181.                         return -1;
  182.                 }
  183.                 len = recv(ClientSock, (char *)szRecv, sizeof(szRecv) - 1, 0);
  184.                 if(len < 0)
  185.                 {
  186.                         printf("2\n");
  187.                         closesocket(ClientSock);
  188.                         return -1;
  189.                 }
  190.         }
  191.         printf("ok!\n");
  192.         //发送SMB_Negotiate
  193.         if (send(ClientSock, (const char *)SMB_Negotiate, sizeof(SMB_Negotiate) - 1, 0) < 0)
  194.         {
  195.                 printf("\n[-] send SMB_Negotiate failed\n");
  196.                 return -1;
  197.         }
  198.         len = recv(ClientSock, (char *)szRecv, sizeof(szRecv) - 1, 0);
  199.         if ((len <= 10) || (szRecv[9] != 0))
  200.         {
  201.                 printf("3\n");
  202.                 return -1;
  203.         }
  204.     //发送SMB_SessionSetupAndX
  205.     if (send(ClientSock, (const char *)SMB_SessionSetupAndX, sizeof(SMB_SessionSetupAndX)-1, 0) < 0)
  206.         {
  207.                 printf("\n[-] send SMB_SessionSetupAndX failed\n");
  208.                 return -1;
  209.         }       
  210.         len = recv(ClientSock, (char *)szRecv, 4096, 0);
  211.         if (len <= 10 || (szRecv[9] != 0))
  212.         {
  213.                 printf("4\n");
  214.                 exit(0);
  215.         }       
  216.        
  217.         //发送SMB_TreeConnectAndX
  218.         if (send(ClientSock, (const char *)SMB_TreeConnectAndX, sizeof(SMB_TreeConnectAndX), 0) < 0)
  219.         {
  220.                 printf("\n[-] send failed\n");
  221.                 return -1;
  222.         }       
  223.         len = recv(ClientSock, (char *)szRecv, 4096, 0);
  224.         if ((len <= 10) || (szRecv[9] != 0))
  225.         {
  226.                 printf("6\n");
  227.                 return -1;
  228.         }
  229.         //下面就是获取管道客户端句柄
  230.     char szPipe[MAX_PATH];
  231.         HANDLE hFile;
  232.         //打开命名管道“\\server\pipe\browser”客户端句柄
  233.         _snprintf(szPipe, sizeof(szPipe), "\\\\%s\\pipe\\browser", argv[1]);
  234.         hFile = CreateFile(szPipe, GENERIC_READ|GENERIC_WRITE, 0, NULL,
  235.                 OPEN_EXISTING, 0, NULL);
  236.         if(hFile == (HANDLE)(-1))
  237.         {
  238.                 printf("cann't find named pipe\n");
  239.                 return -1;
  240.         }
  241.         //BIND rpc接口
  242.         if(!BindRpcInterface(hFile, "8d9f4e40-a03d-11ce-8f69-08003e30051b", "1.0"))
  243.         {
  244.                 printf("can't get namedpipe! %d\n", GetLastError());
  245.                 return -1;
  246.         }
  247.         //发送请求RPC request包
  248.         BOOL ret = ScanPNP(hFile);
  249.         closesocket(ClientSock);
  250.         if(ret)
  251.         {
  252.                 printf("Vulnerable\n");
  253.                 return 0;
  254.         }               
  255.         else
  256.                 printf("Not Vulnerable\n");
  257.         return 0;
  258. }
复制代码
作者:yincheng01 发表于2011-12-15 8:12:35 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 19:54 , Processed in 0.013299 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表