VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1519|回复: 6

[交流] 原始套接字伪造A的IP地址给B发送TCP数据包(类似三次握手第一步)

[复制链接]
03_avatar_middle
在线会员 发表于 2017-3-6 10:36:42 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 00011011 于 2017-3-6 10:42 编辑

楼主在校生,在做一个项目,改良版的nmap扫描器中的idle扫描。
下面的代码实现的功能是:原始套接字伪造A的IP地址给B发送TCP数据包(类似三次握手第一步)
下面代码中setsockopt这个函数一直报错,请各位指正,参考书是刘文涛的《网络安全编程技术与实例》、李瑞民的《网络扫描技术揭秘》以及诸位大佬的相关代码额。。。。。
  1. #include "stdafx.h"
  2. #include <WinSock2.h>
  3. #pragma warning(disable:4996)       
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <WS2tcpip.h>
  7. #include "mstcpip.h"               
  8. #include <time.h>
  9. #pragma comment(lib,"ws2_32.lib")

  10. #define MAXSIZE 1024
  11. char  *CHAR_SOURCE_IP = "10.251.93.11";                        //所伪造的IP地址
  12. char  *CHAR_TARGET_IP = "10.252.245.38";                        //目标的IP地址

  13. //重定义IP数据包头部
  14. typedef struct ip_header
  15. {
  16.         unsigned char h_verlen;         //版本号+头长度--------------1组
  17.         unsigned char tos;                                 //分区服务(默认为0)--------1组
  18.         unsigned short total_len;                //首部及数据总长度-----------2组
  19.         unsigned short ident;                         //分片标识-------------------2组
  20.         unsigned short frag_and_flags;  //分片设置3bit---------------3/4组

  21.         unsigned char ttl;                                 //生存周期(跳数限制)-------1组
  22.         unsigned char proto;                         //携带的协议-----------------1组
  23.         unsigned short checksum;                //首部校验和-----------------2组
  24.         unsigned int sourceIP;                         //源IP地址-------------------4组
  25.         unsigned int destIP;                         //目的IP地址-----------------4组
  26. };

  27. //重定义TCP数据包首部
  28. typedef struct tcp_header
  29. {
  30.         USHORT th_sport;                                                //16位源端口
  31.         USHORT th_dport;                                                //16位目的端口
  32.         unsigned int th_seq;                                        //32位序列号seq
  33.         unsigned int th_ack;                                        //32位确认号        
  34.         unsigned char th_lenres;                                //4位首部长度/6位保留字
  35.         unsigned char th_flag;                                //6位标志位
  36.         USHORT th_win;                                                //16位窗口大小
  37.         USHORT th_sum;                                                //16位校验和
  38.         USHORT th_urp;                                                //16位紧急数据偏移量
  39. };

  40. //定义TCP伪首部
  41. typedef struct psd_tcp_header
  42. {
  43.         unsigned long saddr; //源地址
  44.         unsigned long daddr; //目的地址
  45.         char mbz; char ptcl; //协议类型
  46.         unsigned short tcpl; //TCP长度
  47. };

  48. //计算首部校验和的函数
  49. unsigned short checksum(unsigned short * buffer, int size)
  50. {
  51.         unsigned long cksum = 0;
  52.         unsigned short answer = 0;
  53.         while (size > 1)
  54.         {
  55.                 cksum += *buffer++;                                                                       
  56.                 size -= sizeof(USHORT);
  57.         }
  58.         if (size == 1)
  59.         {
  60.                 *(char *)&answer = *(char *)buffer;
  61.                 cksum += answer;
  62.         }
  63.         while (cksum >> 16)
  64.                 cksum = (cksum >> 16) + (cksum & 0xffff);
  65.         return (USHORT)(~cksum);
  66. };


  67. int attacker2target(int port)
  68. {
  69.         SOCKET sendsocket;
  70.         SOCKADDR_IN addr_in;
  71.         WSADATA wsa;
  72.         ip_header IP_HEADER;
  73.         tcp_header TCP_HEADER;
  74.         psd_tcp_header PSD_TCP_HEADER;
  75.         int SOURCE_PORT = 80;
  76.         char szSendBuf[MAXSIZE] = { 0 };
  77.         unsigned long desip = inet_addr(CHAR_TARGET_IP);

  78.         if (WSAStartup(MAKEWORD(2, 2), &wsa) == SOCKET_ERROR)
  79.         {
  80.                 printf("error !\n%d\n", GetLastError());
  81.                 return false;
  82.         }

  83.         srand((unsigned)time(NULL));                //随机种子生成,留出时间

  84.         if ((sendsocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
  85.         {
  86.                 printf("WSASocket failed with error !\n%d\n", GetLastError());
  87.                 return false;
  88.         }
  89.        
  90.         bool bOpt = true;
  91.         if (setsockopt(sendsocket, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR )
  92.         {
  93.                 printf("setsocketopt error !\n %d \n", WSAGetLastError());
  94.                 return false;
  95.         }

  96.         int nTimeOver = 1000;
  97.         if (setsockopt(sendsocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver)) == SOCKET_ERROR)
  98.         {
  99.                 printf("setsockopt failed with error %d\n\n", WSAGetLastError());
  100.                 return false;
  101.         }

  102.         addr_in.sin_family = AF_INET;
  103.         addr_in.sin_port = htons(port);
  104.         addr_in.sin_addr.S_un.S_addr = inet_addr(CHAR_TARGET_IP);

  105.         //填充IP报头
  106.         IP_HEADER.h_verlen = (4 << 4 | sizeof(IP_HEADER) / sizeof(unsigned long));
  107.         // IP_HEADER.tos=0;
  108.         IP_HEADER.total_len = htons(sizeof(IP_HEADER) + sizeof(TCP_HEADER));
  109.         IP_HEADER.ident = 1;
  110.         IP_HEADER.frag_and_flags = 0;
  111.         IP_HEADER.ttl = 128;
  112.         IP_HEADER.proto = IPPROTO_TCP;
  113.         IP_HEADER.checksum = 0;
  114.         IP_HEADER.sourceIP = inet_addr("localhost");
  115.         IP_HEADER.destIP = desip;

  116.         //填充TCP报头
  117.         TCP_HEADER.th_dport = htons(port);
  118.         TCP_HEADER.th_sport = htons(SOURCE_PORT); //源端口号
  119.         TCP_HEADER.th_seq = htonl(0x12345678);
  120.         TCP_HEADER.th_ack = 0;
  121.         TCP_HEADER.th_lenres = (sizeof(TCP_HEADER) / 4 << 4 | 0);
  122.         TCP_HEADER.th_flag = 2; //标志位探测,2是SYN
  123.         TCP_HEADER.th_win = htons(512);
  124.         TCP_HEADER.th_urp = 0;
  125.         TCP_HEADER.th_sum = 0;

  126.         PSD_TCP_HEADER.saddr = IP_HEADER.sourceIP;
  127.         PSD_TCP_HEADER.daddr = IP_HEADER.destIP;
  128.         PSD_TCP_HEADER.mbz = 0;
  129.         PSD_TCP_HEADER.ptcl = IPPROTO_TCP;
  130.         PSD_TCP_HEADER.tcpl = htons(sizeof(TCP_HEADER));

  131.         memcpy(szSendBuf, &PSD_TCP_HEADER, sizeof(PSD_TCP_HEADER));
  132.         memcpy(szSendBuf + sizeof(PSD_TCP_HEADER), &TCP_HEADER, sizeof(TCP_HEADER));
  133.         TCP_HEADER.th_sum = checksum((unsigned short*)szSendBuf, sizeof(PSD_TCP_HEADER) + sizeof(TCP_HEADER));

  134.         memcpy(szSendBuf, &IP_HEADER, sizeof(IP_HEADER));
  135.         memcpy(szSendBuf + sizeof(IP_HEADER), &TCP_HEADER, sizeof(TCP_HEADER));
  136.         memset(szSendBuf + sizeof(IP_HEADER) + sizeof(TCP_HEADER), 0, 4);
  137.         IP_HEADER.checksum = checksum((unsigned short*)szSendBuf, sizeof(IP_HEADER) + sizeof(TCP_HEADER));

  138.         memcpy(szSendBuf, &IP_HEADER, sizeof(IP_HEADER));

  139.         int rect = sendto(sendsocket, szSendBuf, sizeof(IP_HEADER) + sizeof(TCP_HEADER), 0,
  140.                 (struct sockaddr*) &addr_in, sizeof(addr_in));
  141.         if (rect == SOCKET_ERROR)
  142.         {
  143.                 printf("send error!:%d\n", WSAGetLastError());
  144.                 return false;
  145.         }
  146.         else
  147.                 printf("send ok!\n");

  148.         closesocket(sendsocket);
  149.         WSACleanup();

  150.         return rect;
  151. }


  152. int main()
  153. {
  154.         int port;
  155.         printf("please enput port number=\n");
  156.         scanf("%d", &port);
  157.         attacker2target(port);
  158.         return 0;
  159. }
复制代码





上一篇:一个关于WinPCAP和TCP的问题
下一篇:一个简单的C语言题求大神解答
27_avatar_middle
online_vip 发表于 2017-3-19 03:43:26 | 显示全部楼层
我想说就算你设置对了,你这个也没什么效果,注意平台啊平台啊。原始套接字在xp sp2以后修改IP进行伪装的功能就没了,现在WinServer上可以这样。还有能不能把错代码发出来上来这么多代码,没人愿意看的
03_avatar_middle
ico_lz  楼主| 发表于 2017-3-19 22:16:16 | 显示全部楼层
1114135188 发表于 2017-3-19 03:43
我想说就算你设置对了,你这个也没什么效果,注意平台啊平台啊。原始套接字在xp sp2以后修改IP进行伪装的功 ...

多谢指教
03_avatar_middle
ico_lz  楼主| 发表于 2017-3-19 22:49:44 | 显示全部楼层
1114135188 发表于 2017-3-19 03:43
我想说就算你设置对了,你这个也没什么效果,注意平台啊平台啊。原始套接字在xp sp2以后修改IP进行伪装的功 ...

还有个问题想问,我是根据Nmap扫描器中的IDLE扫描方式有感而写的程序,我并未真正的使用过Namp的IDLE扫描方式,我想问下这个namp的idle扫描方式是如何避免这个问题的?或是namp是如何进行idle扫描方式的?我能力有限nmap的源码看不大懂,求教,真心的!!!
27_avatar_middle
online_vip 发表于 2017-3-22 01:14:35 | 显示全部楼层
00011011 发表于 2017-3-19 22:49
还有个问题想问,我是根据Nmap扫描器中的IDLE扫描方式有感而写的程序,我并未真正的使用过Namp的IDLE扫描 ...

这个我不懂,我不是做这方面的,如果你想实现扫描伪造IP技术有两个解决方案,第一自己写一套独立微软的驱动进行网络发送,第二用WinPcap的驱动发送.
98_avatar_middle
在线会员 发表于 2017-3-22 09:00:00 | 显示全部楼层
希望多这方面的知识
03_avatar_middle
ico_lz  楼主| 发表于 2017-3-23 13:22:32 | 显示全部楼层
1114135188 发表于 2017-3-22 01:14
这个我不懂,我不是做这方面的,如果你想实现扫描伪造IP技术有两个解决方案,第一自己写一套独立微软的驱 ...

多谢指点
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-19 03:57

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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