1.mystery引入
  1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的
  2)原始套接字是一种套接字底层技术,它工作在网络层
  3)谈到网络安全,刚好本学期学过这门课程,这里mystery总结下基于原始套接字技术开发的网络安全软件类型
   木马中的通信模块:为了躲避杀毒软件的检测,有一些木马程序采用原始套接字技术进行通信,例如,开启本地嗅探,对特定格式的ICMP报文进行响应触发。对外传输数据时采用自定义的报文格式,比如伪造成80端口中的请求或响应数据以逃过防火墙的阻断。
   伪造IP地址:生成自定义格式的IP报文,填充任意的IP源地址,以达到伪装自己的目的。在局域网上的ARP病毒就是基于这种原理
   拒绝服务攻击:类似于伪造IP地址,通过自定义特定格式的IP报文,向目标机器以送大量的同类型信息,以达到淹没对方处理能力的目的。由于这种非法报文会占据大量的目标机器的资源,造成服务不能正常运行,从而实现拒绝服务的目的。
   数据包嗅探:数据包嗅探是原始套接字技术最广泛的一项应用,通过设置网卡的工作模式,采集所有流经本网卡的网络数据包,通过分析数据包,以达到既定的目的

   4)在原始套接字中,执行数据发送要调用setsocketopt函数进行套接字的首部设定。设定套接字的首部选项IP_HDRINCL,不然系统会自动填充套接字的首部


2.实例操作
   1)实现一个简单的网络数据包嗅程序
   2)基本原理是:将网卡设为混杂模式,然后采集网络数据包,针对到来的数据包,按相应的协议字段进行反向解析,并输出到终端
   3)基本流程
   1)创建一个原始套接字,设置属性为SOCK_RAW,协议号htons(ETH_P_IP)
   2)循环调用recvfrom()函数,采集到来的网络数据包,并进行如下解析
   3)解析源MAC地址
   4)解析目的MAC地址
   5)解析源IP地址
   6)解析目的IP地址
   7)解析协议号
   8)若协议号为TCP或UDP,则解析数据包中的源端口与目的端口

   4)源代码

 1 //rawsocket.c
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <sys/socket.h>
 5 #include <sys/types.h>
 6 #include <linux/if_ether.h>
 7 #include <linux/in.h>
 8 #include <stdlib.h>
 9 #define BUFFER_MAX 2048
10 int main(int argc, char *argv[])
11 {
12     int rawsock;
13     char buffer[BUFFER_MAX];
14     char *ethhead;
15     char *iphead;
16     char *tcphead;
17     char *udphead;
18     char *icmphead;
19     char *pHead;
20     if((rawsock = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP))) < 0)
21     {
22         printf("error: create raw socket!!!\n");
23         exit(0);
24     }
25     long framecount = 0;
26     while(1)
27     {
28         int readnum = recvfrom(rawsock, buffer,2048,0, NULL, NULL);
29         if(readnum < 42)
30         {
31             printf("error: Header is incomplete!!!\n");
32             continue;
33         }
34         ethhead = (char *)buffer;
35         pHead = ethhead;
36         int ethernetmask = 0XFF;
37         framecount++;
38         printf("------------------Analysis   Packet [%d]---------------------\n",framecount);
39         printf("MAC:");
40         int i = 6;
41         for(; i <=11; i++)
42         {
43             printf("%.2X:",pHead[i]&ethernetmask);
44         }
45         printf("---->");
46         for(i = 0; i <=5; i++)
47         {
48             printf("%.2X:",pHead[i]&ethernetmask);
49         }
50         printf("\n");
51         iphead = ethhead + 14;
52         pHead = iphead + 12;
53         printf("IP:");
54         for(i = 0; i <=3; i++)
55         {
56             printf("%d",pHead[i]&ethernetmask);
57             if(i != 3)
58             printf(".");
59         }
60         printf("---->");
61         for(i = 4; i <=7; i++)
62         {
63             printf("%d",pHead[i]&ethernetmask);
64             if(i != 7)
65             printf(".");
66         }
67         printf("\n");
68         int prototype = (iphead + 9)[0];
69         pHead = iphead + 20;
70         printf("Protocol: ");
71         switch(prototype)
72         {
73             case IPPROTO_ICMP:
74                 printf("ICMP\n");
75                 break;
76             case IPPROTO_IGMP:
77                 printf("IGMP\n");
78                 break;
79             case IPPROTO_IPIP:
80                 printf("IP\n");
81                 break;
82             case IPPROTO_TCP :
83                 printf("TCP | source port: %u | ",(pHead[0]<<8)&0XFF00 | pHead[1]&0XFF);
84                 printf("dest port: %u\n", (pHead[2]<<8)&0XFF00 | pHead[3]&0XFF);
85                 break;
86             case IPPROTO_UDP :
87                 printf("UDP | source port: %u | ",(pHead[0]<<8)&0XFF00 | pHead[1]&0XFF);
88                 printf("dest port: %u\n", (pHead[2]<<8)&0XFF00 | pHead[3]&0XFF);
89                 break;
90             case IPPROTO_RAW :
91                 printf("RAW\n");
92                 break;
93             default:
94                 printf("Unkown\n");
95         }
96         printf("-------------------------end-----------------------\n");
97     }
98 }
View Code

 

 

相关文章:

  • 2021-08-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2021-07-07
  • 2021-11-04
猜你喜欢
  • 2022-01-11
  • 2022-02-06
  • 2021-05-16
  • 2021-05-13
  • 2021-12-27
  • 2022-01-15
相关资源
相似解决方案