zoukankan      html  css  js  c++  java
  • 【Socket】linux黑客之网络嗅探底层原理

     
    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!!!
    ");
    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!!!
    ");
    32             continue;
    33         }
    34         ethhead = (char *)buffer;
    35         pHead = ethhead;
    36         int ethernetmask = 0XFF;
    37         framecount++;
    38         printf("------------------Analysis   Packet [%d]---------------------
    ",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("
    ");
    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("
    ");
    68         int prototype = (iphead + 9)[0];
    69         pHead = iphead + 20;
    70         printf("Protocol: ");
    71         switch(prototype)
    72         {
    73             case IPPROTO_ICMP:
    74                 printf("ICMP
    ");
    75                 break;
    76             case IPPROTO_IGMP:
    77                 printf("IGMP
    ");
    78                 break;
    79             case IPPROTO_IPIP:
    80                 printf("IP
    ");
    81                 break;
    82             case IPPROTO_TCP :
    83                 printf("TCP | source port: %u | ",(pHead[0]<<8)&0XFF00 | pHead[1]&0XFF);
    84                 printf("dest port: %u
    ", (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
    ", (pHead[2]<<8)&0XFF00 | pHead[3]&0XFF);
    89                 break;
    90             case IPPROTO_RAW :
    91                 printf("RAW
    ");
    92                 break;
    93             default:
    94                 printf("Unkown
    ");
    95         }
    96         printf("-------------------------end-----------------------
    ");
    97     }
    98 }
    View Code


    3.mystery注解
       1)运行效果

       2)如图所示,运行此程序需要root权限
        原因:原始套接字提供管理下层传输的能力,他们可能会被恶意利用。因此,仅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

       我一直比较认同一句话:其实我们一直都不是很优秀,是别人的赞赏和鼓励,让我们有机会成为别人期待的样子!所以,我也一直用我希望被对待的方式去对待别人,在此感谢各们同行以及老师们的认可和支持,谢谢!我会努力做得更好!

  • 相关阅读:
    【SICP练习】129 练习3.60
    【SICP练习】128 练习3.59
    【SICP练习】127 练习3.58
    【SICP练习】126 练习3.57
    【SICP练习】125 练习3.56
    【SICP练习】124 练习3.55
    【SICP练习】123 练习3.54
    【SICP练习】122 练习3.53
    【SICP练习】121 练习3.52
    【SICP练习】120 练习3.51
  • 原文地址:https://www.cnblogs.com/lcw/p/3159510.html
Copyright © 2011-2022 走看看