【Socket】linux黑客之网络嗅探底层原理
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]ðernetmask); 44 } 45 printf("---->"); 46 for(i = 0; i <=5; i++) 47 { 48 printf("%.2X:",pHead[i]ðernetmask); 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]ðernetmask); 57 if(i != 3) 58 printf("."); 59 } 60 printf("---->"); 61 for(i = 4; i <=7; i++) 62 { 63 printf("%d",pHead[i]ðernetmask); 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 }
原因:原始套接字提供管理下层传输的能力,他们可能会被恶意利用。因此,仅root组的成员能够窗口SOCK_RAW类型的套接字
3)本程序是采用的PF_PACKET来创建的SOCK_RAW,即工作在数据链路层,另外也可以指定在网络层使用
4.mystery说明
这只是我在学习计算机网络时一个小小的知识点验证实验,记录了一些知识总结和心得体会,这只是学习,无关任何作业或者开发之说。
算法的艺术:http://infohacker.blog.51cto.com/6751239/1171388
算法之美,解剖艺术:http://infohacker.blog.51cto.com/6751239/1194158
在此附上我学习计算机网络时的一系列心得体会,我相信不管是对自己,还是对别人,总会有一定的帮助。
linux无连接编程技术:http://infohacker.blog.51cto.com/6751239/1155102
linux套接字技术之tcp:http://infohacker.blog.51cto.com/6751239/1155096
linux多路复用IO技术:http://infohacker.blog.51cto.com/6751239/1155107
linux网络嗅探底层原理:http://infohacker.blog.51cto.com/6751239/1155113
linux广播技术:http://infohacker.blog.51cto.com/6751239/1155115
linux组播技术:http://infohacker.blog.51cto.com/6751239/1155123
linux高性能网络服务:http://infohacker.blog.51cto.com/6751239/1155167
linux网络扫描程序开发:http://infohacker.blog.51cto.com/6751239/1155170
linux下http服务器开发:http://infohacker.blog.51cto.com/6751239/1155176
我一直比较认同一句话:其实我们一直都不是很优秀,是别人的赞赏和鼓励,让我们有机会成为别人期待的样子!所以,我也一直用我希望被对待的方式去对待别人,在此感谢各们同行以及老师们的认可和支持,谢谢!我会努力做得更好!