Fork me on GitHub

20199104许星霖 网络嗅探与协议分析

tcpdump分析与使用

参考博客https://yq.aliyun.com/articles/573120?spm=a2c4e.11155435.0.0.33453a10zlXi7N
https://www.cnblogs.com/wangchaowei/p/8572711.html
https://github.com/the-tcpdump-group/libpcap
https://blog.csdn.net/u012501054/article/details/80969953

tcpdump原理

tcpdump命令是基于unix系统的命令行的数据报嗅探工具,可以抓取流动在网卡上的数据包。它的原理大概如下:linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,如以太网协议、x25协议处理模块来尝试进行报文的解析处理。当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它对网卡收到的保温进行一次处理,此时该模块就会趁机对报文进行窥探,也就是啊这个报文完完整整的复制一份,假装是自己接收的报文,汇报给抓包模块。

tcpdump的版本

我们可以通过tcpdump --version来查看系统中tcpdump的源码版本。可以通过tcpdump -help查看相关的命令参数或者查阅相关的博客和文档。

tcpdump的选项介绍

-a    将网络地址和广播地址转变成名字;

-d    将匹配信息包的代码以人们能够理解的汇编格式给出;

-dd    将匹配信息包的代码以c语言程序段的格式给出;

-ddd    将匹配信息包的代码以十进制的形式给出;

-e    在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议;

-f    将外部的Internet地址以数字的形式打印出来;

-l    使标准输出变为缓冲行形式;

-n    指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;

-nn: 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示

-t    在输出的每一行不打印时间戳;

-v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;

-vv    输出详细的报文信息;

-c    在收到指定的包的数目后,tcpdump就会停止;

-F    从指定的文件中读取表达式,忽略其它的表达式;

-i    指定监听的网络接口;

-p: 将网卡设置为非混杂模式,不能与host或broadcast一起使用

-r    从指定的文件中读取包(这些包一般通过-w选项产生);

-w    直接将包写入文件中,并不分析和打印出来;

-s snaplen snaplen表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。

-T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)

-X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。

使用tcpdump对在本机上访问www.tianya.cn网站过程进行嗅探

tcpdump源码分析

包从网卡到内存,到内核态,最后给用户程序使用。我们知道tcpdump程序运行在用户态,通过libpcap库实现从内核态的抓包

tcpdump调用libpcap的api函数,由libpcap进入到内核态到链路层来抓包,BPF是过滤器,可以根据用户设置用于数据包过滤减少应用程序的数据包的包数和字节数从而提高性能。BufferQ是缓存供应用程序读取的数据包。我们可以说tcpdump底层原理其实就是libpcap的实现原理。
目前编程实现一个简单的抓包应用程序都是基于libpcap这个C库的,这个库源于tcpdump项目,是从最开始tcpdump中剥离出来的一个库, tcpdump中抓包,过滤,filter的执行的代码被提取出来成了libpcap。我们可以从TCPDUMP的官网上看到这个程序的代码。所以我们能够看到libpcap各个函数的功能。

我们可以通过官网查询到代码的逻辑

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

  • 为读包打开句柄:要打开实时捕获的句柄,请在给定应进行捕获的网络或其他接口名称的情况下,调用 pcap_create(),在该句柄上设置适当的选项,然后使用pcap_activate()激活它 。如果 pcap_activate()失败,则应使用pcap_close()关闭句柄 。要获取可以打开以进行实时捕获的设备列表,请调用 pcap_findalldevs()。要释放由pcap_findalldevs()返回的列表 ,请调用 pcap_freealldevs()。pcap_lookupdev()将返回该列表中不是“环回”网络接口的第一个设备。

  • 为抓包选择链路层:要获取设备提供的所有链路层头类型的列表,请在已激活 的设备的pcap_t上调用 pcap_list_datalinks() 。要释放链接层头类型的列表,请调用 pcap_free_datalinks()。要设置设备的链路层头类型,请调用 pcap_set_datalink()。

  • 读取数据包:可以使用pcap_dispatch()或 pcap_loop()来读取数据包 ,后者处理一个或多个数据包,为每个数据包调用回调例程,

  • 过滤器: 使用pcap_compile(),并将所得的程序可以由一个滤波器

  • 选定抓包方向(进还是出):默认情况下,libpcap将尝试同时捕获机器发送的数据包和机器接收的数据包。要将其限制为仅捕获机器接收的数据包,或者如果仅捕获机器发送的数据包,调用 pcap_setdirection()。

  • 抓统计信息:获取有关实时捕获中接收和丢弃的数据包的统计信息,请调用 pcap_stats()。

  • 将包写入文件打开句柄: pcap_dump_open()。

  • 写包:调用 pcap_dump()

  • 报告错误: pcap_statustostr()。

  • 获取库版本信息:pcap_lib_version()。

  • 要使用抓包必须要先系统中安装pcap-dev包(apt-get install pcap-dev)

时间问题,没有自己写出代码

登录网站,并嗅探,分析出账号和密码

抓取手机App的登录过程数据包,分析账号和密码。

首先,我们应该让手机共享到电脑的网络,才能用wireshark进行抓包分析,在win下,打开网络及INTERNET设置,点开移动数据,开启即可。如下图所示。


参考https://blog.csdn.net/u012501054/article/details/80969953使用http.request.method==POST 进行过滤
我们打开 THML Form URL Encode 选项就会看到一些提交的表单信息,在其中可以直接看到 name 和 password 的数据。我对蓝墨云抓包,发现用户名和密码都是密文传输。

posted @ 2020-03-29 02:12  20199104许星霖  阅读(322)  评论(0编辑  收藏  举报