网络抓包原理 - CSDN
精华内容
参与话题
  • wireshark学习笔记----抓包网络原理

    千次阅读 2019-07-28 02:00:47
    抓包是我们常见的分析网络的一种方式,根据不同的抓包方式,网络原理也有所不同。 本机环境 直接抓包本机网卡进出流量,这种抓包是直接抓取本地与互联网上交互的数据包,直接在本机上抓取。 集线器环境 集线器环境...

    抓包是我们常见的分析网络的一种方式,根据不同的抓包方式,网络原理也有所不同。

    本机环境


    直接抓包本机网卡进出流量,这种抓包是直接抓取本地与互联网上交互的数据包,直接在本机上抓取。

    集线器环境


    集线器环境下,因为都是以广播域的形式来传输数据包的,所以我们在一个集线器环境下,就能收到当前局域网下的所有数据包,就能直接抓取这些数据包来进行分析。

    交换机环境


    在交换机环境中,因为数据包不再以广播的形式发送,如果我们要抓取同一交换机环境下的其他主机的数据包,必须采取一些其他的策略。

    1. 端口镜像

    在交换机做端口镜像(SPAN技术)处理,将其他进入交换机的流量copy一份到本机
    端口镜像实际上就是将交换机或者路由器与其他发给其他端口的数据转发一份到本端口,这样就可以获取交换机/路由器与其他端口交互的信息。
    如下图:
    在这里插入图片描述
    在交换机与PC2和PC3的连接的端口上,可以看作图中的GE0/0/1和GE0/0/2上使用端口镜像,将PC2和PC3与交换机交互的数据包copy一份到交换机与PC1交互的端口上GE0/0/0,这样我们在PC1上就可以抓取交换机与PC2和PC3交互的数据包了。

    2. ARP欺骗

    在交换机上,我们通过ARP协议来将ipv4地址转为MAC地址以发送数据到指定的设备上,而ARP欺骗,就是针对我们想要获取的信息,对源地址发出的ARP请求做出假的回复,使其发送到本机对应的MAC地址上。
    如下图:
    在这里插入图片描述
    这里PC2为了向PC3发送信息,此时又只知道IP3的IP地址,不知道其MAC地址,所以要通过ARP协议,发送一个广播帧,若IP地址为IP3,则返回ARP响应告知PC2 PC3的MAC地址,然而,PC1欺骗了PC2,告诉它自己的IP地址也是IP3,将自己的MAC地址发送给了PC2,这样一来,我们就能在PC1抓取PC2发送给PC3的数据包了。

    3. MAC泛洪

    MAC泛洪也是一种攻击方式,当我们在一台主机上,以足够快的速度发送去往位置目的的数据包,且数据包对应的MAC地址都不相同,那么就会将交换机/路由器上的路由表“爆掉”,使其他端口发送的数据包对应的MAC地址无法进入到交换机/路由器的路由表中,那么这些端口发送的信息都会变成以广播的形式发出,而我们就可以在本机上接收到这些广播信息了。
    如下图:
    在这里插入图片描述
    首先PC1发送大量泛洪垃圾包,将交换机上MAC表中PC2和PC3的MAC地址挤出MAC表,MAC表更换后,PC2和PC3的数据在发送到交换机上后,发现没有对应的MAC地址可以发送,而且也无法加入新的MAC地址,只能将数据以广播的形式发送,而PC1就理所当然地得到了这些数据包,成功抓包。

    文章参考教程
    上面地图片是使用ensp绘制的

    展开全文
  • 计算机网络抓包原理(wireshark学习) 软件2019-9-10 22:20 查看:3491|评论: 0|发布者:月月 ?????С 简介:抓包原理分为网络原理和底层原理1.网络原理: 1)本机环境-直接抓本机网卡进出的流量:直接在终端安装...

    计算机网络—抓包原理(wireshark学习)

    软件 2019-9-10 22:20

    查看: 3491| 评论: 0| 发布者: 月月

    ?????С

    简介:抓包原理分为网络原理和底层原理1.网络原理: 1)本机环境-直接抓本机网卡进出的流量:直接在终端安装ws,然后ws抓本机网卡的与互联网通信的流量。 2)集线器环境(老网络)-集线器:向其他所有端口都会泛洪,抓整个 ...


    抓包原理分为网络原理和底层原理

    1.网络原理:

    1)本机环境-直接抓本机网卡进出的流量:直接在终端安装ws,然后ws抓本机网卡的与互联网通信的流量。

    2)集线器环境(老网络)-集线器:向其他所有端口都会泛洪,抓整个局域网里面的包。

    *集线器-(hub)(多端口的信号放大设备)属于纯硬件网络底层设备,基本上不具有类似于交换机的"智能记忆"能力和"学习"能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。

    3)交换机环境:

    *端口镜像(安全):SPAN技术,复制其他端口的数据包到特定端口。

    计算机网络—抓包原理(wireshark学习)

    **ARP欺骗(攻击):需安装arp欺骗软件,错位欺骗,如图,PC1会不断发送欺骗,毒化PC2的arp表,会产生错的绑定,交换机根据mac表就会把数据包乖乖丢给PC1。

    计算机网络—抓包原理(wireshark学习)

    ***MAC泛洪:泛洪大量垃圾包,产生大量的mac地址,改变了交换机原有的mac地址表,如图,这样流量就泛洪给F1了。

    计算机网络—抓包原理(wireshark学习)

    计算机网络—抓包原理(wireshark学习)

    2.底层原理:wireshark底层抓包工具

    计算机网络—抓包原理(wireshark学习)


    本文仅代表作者个人观点,不代表SEO研究协会网(www.seoxiehui.cn)官方发声,对观点有疑义请先联系作者本人进行修改,若内容侵权或非法,请先联系发布者或作者删除,若需平台协助请联系平台管理员,邮箱cxb5918@163.com。学习互联网营销技术请到巨推学院www.jutuiedu.com。
    展开全文
  • WireShark抓包网络原理

    2019-10-14 18:53:04
    抓包原理: 本机安装wireshark后自动绑定一个网卡 抓取电脑网卡进出的流量 还可以通过集线器抓取整个局域网的流量 另一种是交换机环境 交换机环境分为端口镜像,ARP欺骗,MAC泛洪 交换机属于链路层,通信完全采用...
    抓包原理:
    本机安装wireshark后自动绑定一个网卡
    抓取电脑网卡进出的流量
    
    还可以通过集线器抓取整个局域网的流量
    
    另一种是交换机环境
    交换机环境分为端口镜像,ARP欺骗,MAC泛洪
    交换机属于链路层,通信完全采用mac表
    假设有三个主机连上交换机
    其中两个主机通信,其流量很难流到
    但是我们可以在交换机做一种策略叫span技术
    中文名叫端口映射
    也就是将流量copy一份,相当于把流量引到另一台主机上
    然后这台主机的网卡设置为混杂模式
    这个时候就可以抓包了
    
    因为交换机采用mac表,我们可以采用ARP欺骗
    这是在没有权限在交换机上部署端口镜像
    也就是冒充另一个人的mac地址来接收流量
    因为ARP协议有先到先得,虽然两个相同的人同时请求流量
    但是谁先请求,流量就是谁的
    
    mac泛洪,向交换机发送大量mac地址,使其充满交换机的mac表
    一旦充满了,交换机就会让所有用户下线
    然后攻击者就可以抓包了
    /
    
    
    
    展开全文
  • 本篇我们从总体看下tcpdump工具的抓包原理,通过学习了解并掌握其实现的机制,为后续进一步底层操作做准备。1.1.1.1 如何实现先来看看包传递过来的流程,如下图。包从网卡到内存,到内核态,最后给用户程序使用。...

    博文原地址:https://blog.csdn.net/notbaron/article/details/79735414 本篇我们从总体看下tcpdump工具的抓包原理,通过学习了解并掌握其实现的机制,为后续进一步底层操作做准备。

    1.1.1.1  如何实现

    先来看看包传递过来的流程,如下图。包从网卡到内存,到内核态,最后给用户程序使用。我们知道tcpdump程序运行在用户态,那如何实现从内核态的抓包呢?


      这个就是通过libpcap库来实现的,tcpdump调用libpcapapi函数,由libpcap进入到内核态到链路层来抓包,如下图。图中的BPF是过滤器,可以根据用户设置用于数据包过滤减少应用程序的数据包的包数和字节数从而提高性能。BufferQ是缓存供应用程序读取的数据包。我们可以说tcpdump底层原理其实就是libpcap的实现原理。


    libpcaplinux系统链路层中抓包是通过PF_PACKET套接字来实现的(不同的系统其实现机制是由差异的),该方法在创建的时候,可以指定第二参数为SOCK_DGRAM或者SOCK_RAW,影响是否扣除链路层的首部。

                libpcap在内核收发包的接口处将skb_clone()拿走的包.

    关于内核中如何注册网络协议和钩子函数的过程,此处先不展开,后续专门讲解。我们接下去是看下libpcap的一些实现及其api.

    1.1.1.2  libpcap

    当在系统中输入tcpdump –version的时候,输出的其实还有libpcap,足见其在tcpdump中的地位。

                其实最早的编译系统和过滤引擎是在tcpdump项目中的,后来为了编译其他抓包的应用,将其独立出来。现在libpcap提供独立于平台的库和API,来满足执行网络嗅探。

    tcpdump.c正式使用libpcap里的函数完成两个最关键的动作:获取捕获报文的接口,和捕获报文并将报文交给callback。

    libpcap支持“伯克利包过滤(BPF)”语法。BPF能够通过比较第2、3、4层协议中各个数据字段值的方法对流量进行过滤。Libpcap的使用逻辑如下图:


           如果愿意,大家也可以基于libpcap开发一个类似tcpdump的抓包工具。需要注意的是如果使用分组捕获设备,只能在单个接口上接收到达的分组。

     

    1.1.1.3  核心函数

    我们先来看下libpcap中的一些核心函数,根据函数的功能,可以分为如下几类:

    l   为读包打开句柄

    l   为抓包选择链路层

    l   抓包函数

    l   过滤器

    l   选定抓包方向(进还是出)

    l   抓统计信息

    l   将包写入文件打开句柄

    l   写包

    l   注入包

    l   报告错误

    l   获取库版本信息

    官方的介绍查看http://www.tcpdump.org/manpages/pcap.3pcap.html

    常用的一些函数如下:

    pcap_lookupdev,如果分组捕获设备未曾指定(-i命令行选项),该函数选择一个设备。

    pcap_open_offine打开一个保存的文件。

    pcap_setfilter设置过滤器

    pcap_open_live打开选择的设备。

    pcap_next接收一个包

    pcap_dump将包写入到pcap_dump_t结构体

    pcap_loopupnet返回分组捕获设备的网络地址和子网掩码,然后在调用pcap_compile时必须指定这个子网掩码。

    pcap_compile把cmd字符数组中构造的过滤器字符串编译成一个过滤器程序,存放在fcode中。

    pcap_setfilter把编译出来的过滤器程序装载到分组捕获设备,同时引发用该过滤器选取的分组的捕获。

    pcap_datalink返回分组捕获设备的数据链路类型。

    等等,那么如何去使用libpcap库呢,一起来看下。

    1.1.1.4  使用准备

    先在系统中安装pcap-dev包(apt-get install pcap-dev),然后创建一个test.c文件如下:

    #include <stdio.h>

    #include <pcap.h>

     

    int

    main (int argc, char *argv[])

    {

      char *dev, errbuf[PCAP_ERRBUF_SIZE];

     

      dev = pcap_lookupdev (errbuf);

      if (dev == NULL)

        {

          fprintf (stderr, “Couldn’t find default device: %s\n”, errbuf);

          return (2);

        }

      printf (“Device: %s\n”, dev);

      return (0);

    }

    然后编译如下:

    gcc test.c -lpcap -lpthread

                就可以执行了,在系统中寻找一个可以抓包的接口。

                有了接口设备,可以继续创建嗅探会话了,使用函数

    pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms,        char *ebuf)

    其中snaplen是pcap抓包的字节数, promisc 是否启用混杂模式(不是混杂模式的话就只抓给本机的包。),to_ms是否超时,ebuf存放错误信息。

                创建了嗅探会话之后,就要一个过滤器。可以只提取我们想要的数据。过滤器在应用之前必须要先编译,调用函数如下:

    int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize,            bpf_u_int32 netmask)

      第一个参数就是pcap_open_live返回的值,fp 存储的过滤器的版本,optimize是表示是否需要优化,最后netmask是过滤器使用的所在子网掩码。

                有了过滤器之后就是要使用编译器,调用函数:

    int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

                到此整个代码流程参考如下代码段:

            #include <pcap.h>

            …

            pcap_t *handle;             /* Session handle */

            char dev[] = “rl0”;         /* Device to sniff on */

            char errbuf[PCAP_ERRBUF_SIZE];    /* Error string */

            struct bpf_program fp;            /* The compiled filter expression */

            char filter_exp[] = “port 23”;    /* The filter expression */

            bpf_u_int32 mask;          /* The netmask of our sniffing device */

            bpf_u_int32 net;            /* The IP of our sniffing device */

     

            if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {

                   fprintf(stderr, “Can’t get netmask for device %s\n”, dev);

                   net = 0;

                   mask = 0;

            }

            handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);

            if (handle == NULL) {

                   fprintf(stderr, “Couldn’t open device %s: %s\n”, dev, errbuf);

                   return(2);

            }

            if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {

                   fprintf(stderr, “Couldn’t parse filter %s: %s\n”, filter_exp, pcap_geterr(handle));

                   return(2);

            }

            if (pcap_setfilter(handle, &fp) == -1) {

                   fprintf(stderr, “Couldn’t install filter %s: %s\n”, filter_exp, pcap_geterr(handle));

                   return(2);

            }

    1.1.1.5  开始抓包

    已经准备好监听抓包,并设置了过滤器,下面就是启动抓包了。

    抓包技术有两种,一种是一次抓一个包;另一种是等待有n个包的时候在一起抓。

                先看抓一次抓一个包,使用函数如下:

    u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

                第一个参数就是创建的会话句柄,第二个参数是存放包信息的。

                这个函数是比较少用的,现在大多数抓包工具都是使用第二种技术抓包的,其用到的函数就是:

    int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

                第一个参数是创建的会话句柄,第二个参数是数量(抓几个包),就是这个参数制定抓多少包,抓完就结束了,第三个函数是抓到足够数量后的回调函数,每次抓到都会调用回调函数,第四个参数经常设置为NULL,在一些应用中会有用。

                和pcap_loop函数类似的是pcap_dispatch,两者用法基本一致,主要差异是pcap_dispatch只会执行一次回调函数,而pcap_loop会一直调用回调函数处理包。

                其回调函数的定义如下:

            void got_packet(u_char *args, const struct pcap_pkthdr *header,          const u_char *packet);

                是void型的,第一个参数args是pcap_loop函数的最后一个参数,第二个参数是pcap的头其包含了抓住的包的信息,第三个就是包本身了。

           struct pcap_pkthdr {

                  struct timeval ts; /* time stamp */

                  bpf_u_int32 caplen; /* length of portion present */

                  bpf_u_int32 len; /* length this packet (off wire) */

           };

                关于包本身其实是一个字符串指针,怎么去寻找我的ip头,tcp头,以及头中的内容呢?这就需要是使用C语言中异常强大的指针了,定义一个宏如下:

    /* Ethernet addresses are 6 bytes */

    #define ETHER_ADDR_LEN      6

     

           /* Ethernet header */

           struct sniff_ethernet {

                  u_char ether_dhost[ETHER_ADDR_LEN]; /* Destination host address */

                  u_char ether_shost[ETHER_ADDR_LEN]; /* Source host address */

                  u_short ether_type; /* IP? ARP? RARP? etc */

           };

     

           /* IP header */

           struct sniff_ip {

                  u_char ip_vhl;              /* version << 4 | header length >> 2 */

                  u_char ip_tos;              /* type of service */

                  u_short ip_len;             /* total length */

                  u_short ip_id;              /* identification */

                  u_short ip_off;             /* fragment offset field */

           #define IP_RF 0x8000        /* reserved fragment flag */

           #define IP_DF 0x4000        /* dont fragment flag */

           #define IP_MF 0x2000        /* more fragments flag */

           #define IP_OFFMASK 0x1fff   /* mask for fragmenting bits */

                  u_char ip_ttl;               /* time to live */

                  u_char ip_p;         /* protocol */

                  u_short ip_sum;             /* checksum */

                  struct in_addr ip_src,ip_dst; /* source and dest address */

           };

           #define IP_HL(ip)           (((ip)->ip_vhl) & 0x0f)

           #define IP_V(ip)            (((ip)->ip_vhl) >> 4)

     

           /* TCP header */

           typedef u_int tcp_seq;

     

           struct sniff_tcp {

                  u_short th_sport;    /* source port */

                  u_short th_dport;    /* destination port */

                  tcp_seq th_seq;              /* sequence number */

                  tcp_seq th_ack;              /* acknowledgement number */

                  u_char th_offx2;     /* data offset, rsvd */

           #define TH_OFF(th)   (((th)->th_offx2 & 0xf0) >> 4)

                  u_char th_flags;

           #define TH_FIN 0x01

           #define TH_SYN 0x02

           #define TH_RST 0x04

           #define TH_PUSH 0x08

           #define TH_ACK 0x10

           #define TH_URG 0x20

           #define TH_ECE 0x40

           #define TH_CWR 0x80

           #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)

                  u_short th_win;              /* window */

                  u_short th_sum;             /* checksum */

                  u_short th_urp;             /* urgent pointer */

    };

    /* ethernet headers are always exactly 14 bytes */

    #define SIZE_ETHERNET 14

     

           const struct sniff_ethernet *ethernet; /* The ethernet header */

           const struct sniff_ip *ip; /* The IP header */

           const struct sniff_tcp *tcp; /* The TCP header */

           const char *payload; /* Packet payload */

     

           u_int size_ip;

           u_int size_tcp;

                通过以上结构体定义,可以从回调函数的包指针地址出发,逐个找到链路帧头、IP帧头、TCP帧头、数据负载了。

                附上一个实例DEMO链接。

    实例DEMO

                    </div>
    
    展开全文
  • 感谢和转载于: ... 本文以App作为例子,实际应用不限于App范围。 前言:本来只打算放链接的,但是看见文本是以富文本格式展示的,却是以...1. 为什么要抓包 定位网络接口问题 分析其他App数据接口 学...
  • 网络抓包原理

    万次阅读 多人点赞 2018-06-08 16:27:02
    # 网络抓包原理及常用抓包工具本文以App作为例子,实际应用不限于App范围。## 1. 为什么要抓包1. 定位网络接口问题2. 分析其他App数据接口 3. 学习网络协议,使用抓包工具分析网络数据更直观 大部分场合都可以通过...
  • tcpdump源码分析(2)——抓包原理

    千次阅读 2018-03-28 22:35:40
    本篇我们从总体看下tcpdump工具的抓包原理,通过学习了解并掌握其实现的机制,为后续进一步底层操作做准备。1.1.1.1 如何实现先来看看包传递过来的流程,如下图。包从网卡到内存,到内核态,最后给用户程序使用。...
  • 0、说在前面的话1) 本文将以一个初学者的角度,一步一步几乎是从0开始讲述如何完成一个基于winpcap+MFC的sniffer(嗅探器)当然我指的“0”并不是指连编程都不会,如果C/C++不知为...懂一点点网络知识,起码知道O...
  • Fiddler抓包原理解析

    千次阅读 2019-08-20 21:23:11
    是位于客户端和服务器端之间的http(s)代理,它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,记录所有客户端和服务器间的http请求,针对特定的http(s)请求,分析网络传输的数据,支持...
  • 浅谈HTTPS通信机制和Charles抓包原理

    万次阅读 2018-06-17 16:44:57
    网络请求是应用开发的基础,在开发过程中经常需要通过抓包来分析网络问题,了解HTTP基础知识和HTTPS通信机制对...3)浅谈HTTPS抓包原理,为什么Charles能够抓取HTTPS报文? 1. HTTP基础知识:URL和报文结构 1....
  • fiddler抓包原理解析

    千次阅读 2019-02-21 20:41:39
    一、fiddler简介 Fiddler是一款免费且功能强大的数据包抓取软件。...fiddler包含了一个强大的基于事件脚本的子系统,并且能够使用.net框架语言扩展。...二、Fiddler工作原理 Fiddler是位于客户端和服...
  • Wireshark之抓包原理剖析

    千次阅读 2019-11-22 13:04:59
    1. 网卡      网卡是局域网(LAN,全称是:Local Area NetWork)中连接计算机和传输介质的接口,它工作在...网卡的书面语是网络适配器/网络接口卡。如图1所示,为Inter I250网卡示意图。            ...
  • https协议 和 Charles 进行https抓包原理

    千次阅读 2018-05-21 08:42:04
    1.对称加密其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信...
  • libpcap抓包原理

    千次阅读 2013-08-28 20:56:02
    libpcap抓包原理[转] libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的...
  • 前言 面试官:面试官问我iOS开发过程中使用了那些抓包工具?...面试官:那你说说Charles抓https的抓包原理? 回复:如果直接问https的原理(可查看http与https的爱恨情仇),还可以直接回复,问了个这个就懵逼...
  • HTTP的缺点: 通信使用明文,内容可能被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能遭到篡改
  • WireShark抓包底层原理

    2019-10-14 18:53:52
    从第一步开始到第五步 ...不同类型的网络接口抓包 3. 由于抓到的包是01比特流,所以还需要一些处理 Wiretap:因为抓到的包不同,肯定需要不同的文件格式,所以它是提供格式支持的,解读的 4. core:核心引擎,通过...
  • 使用网络协议分析仪 Wireshark 二、实验目的 1、掌握安装和配置网络协议分析仪Wireshark的方法; 2、 熟悉使用Wireshark工具分析网络协议的基本方法,加深对协议格式、协议层次和协议交互过程的理解。 三、实验内容...
  • 抓包工具原理和使用

    千次阅读 2017-10-13 16:38:08
    抓包环境常用的抓包工具 RawCap 可以转到本地回环(127.0.0.1)的数据 抓取所有协议的包 Fiddler HTTP或者HTTPS 协议抓包 可以过滤,抓取特定特征的包 可以拦截数据包,篡改数据包 Wireshark 抓取所有的数据包,但...
  • 这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。前文分享了Wireshark安装入门和一个抓取网站用户名和密码的案例,本篇文章将继续深入...
1 2 3 4 5 ... 20
收藏数 31,498
精华内容 12,599
热门标签
关键字:

网络抓包原理