抓包原理
一、预备知识
1,集线器(hub)
它属于纯硬件网络底层设备,工作于OSI参考模型的第一层,即物理层。不解析。
集线器只对信号进行整形、放大后再重发,不进行编码,转发的时候是以广播的方式进行的,即它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。
2,交换机
交换机工作于OSI参考模型的第二层,即数据链路层。它可以解析到MAC地址。
交换机是针对共享工作模式(例hub)的弱点而推出的。交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接在这条背部总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表(ARP表)以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口。目的MAC若不存在,交换机才广播(ARP协议)到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中。
3,路由器
路由器工作于OSI参考模型的第三层,即数据网络层。它可以解析到IP。
提供了路由与转送两种重要机制,可以决定数据包从来源端到目的端所经过的路由路径(即两个网络或多个网络间转发数据包),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。
选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路径表(Routing Table),供路由选择时使用。路径表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路径表可以是由系统管理员固定设置好的。
4,网卡
网卡收到传输来的数据,网卡内的单片程序先接收数据头的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就在接收后产生中断信号通知CPU,认为不该接收就丢弃不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。CPU得到中断信号产生中断,操作系统就根据网卡驱动程序中设置的网卡中断程序地址调用驱动程序接收数据,驱动程序接收数据后放入信号堆栈让操作系统处理。
5,ARP欺骗
https://blog.csdn.net/jung_zhang/article/details/52100383
二、嗅探器原理
- 收集:从网卡上收集二进制信息(将网卡设置成混杂模式完成抓包)
- 转换:将捕获的二进制信息转换成可读形式。
- 分析:对捕获和转换后的数据进行分析。
前提,要捕获的东西必须是要物理信号能收到的报文信息。显然只要通知网卡接收其收到的所有包(一般叫做混杂promiscuous模式:指网络上的所有设备都对总线上传送的数据进行侦听,并不仅仅是它们自己的数据。),在HUB下就能接收到这个网段的所有包,但是交换机下就只能是自己的包加上广播包。
要想在交换机下接收别人的包,那就要让其发往你的机器所在端口。交换机记住一个口的MAC是通过接收来自这个口的数据后并记住其源MAC,就像一个机器的IP与MAC对应的ARP列表,交换机维护一个物理口与MAC的表,所以可以欺骗交换机的。可以发一个包设置源MAC是你想接收的机器的MAC,那么交换机就把你机器的网线插的物理口与那个MAC对应起来了,以后发给那个MAC的包就发往你的网线插口了,也就是你的网卡可以Sniffer到了。注意这物理口与MAC的表与机器的ARP表一样是动态刷新的,那机器发包后交换HUB就又记住他的口了,所以实际上是两个在争,这只能应用在只要收听少量包就可以的场合。
内部网基于IP的通信可以用ARP欺骗别人机器让其发送给你的机器,如果要想不影响原来两方的通信,可以欺骗两方,让其都发给你的机器再由你的机器转发,相当于做中间人,这用ARP加上编程很容易实现。并且现在很多设备支持远程管理,有很多交换机可以设置一个口监听别的口,不过这就要管理权限了。
三、抓包工具
1,wireshark
wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。
使用方法:https://blog.csdn.net/zjy900507/article/details/79303359
2,Fiddler
Fiddler和wireshark工作原理不一样。fiddler的实现原理是以代理服务器的方式工作,代理就是在客户端和服务器之间设置一道关卡,客户端先将请求数据发送出去后,代理服务器会将数据包进行拦截,代理服务器再冒充客户端发送数据到服务器;同理,服务器将响应数据返回,代理服务器也会将数据拦截,再返回给客户端。
Fiddler是一个http协议调试代理工具,即只是针对HTTP协议的(工作在OSI参考模型的应用层),而wireshark是针对几乎所有协议的。
浏览器与服务器之间通过建立TCP连接以HTTP协议进行通信,浏览器默认通过自己发送HTTP请求到服务器。 而Fiddler是c#开发(微软出品,主要作者Eric Lawrence)的http代理服务器,fiddler工作于七层中的应用层,能够捕获到通过的http(s)请求。(浏览器 < -> Fiddler < -> 服务器)
启动Fiddler之后会监听8888端口(默认8888,可以修改)。
一个实验转自:https://blog.csdn.net/gscaiyucheng/article/details/26938019
1. 在启动fiddler之前端口8888的状态
命令:netstat -ano|findstr “8888″
表示查不到占用状态
2. 启动fiddler之后:
在启动fiddelr之后可以发现8888端口被5256线程给监听
可以查看到5256线程为fiddler程序:
命令:tasklist |findstr “5256″
3.然后启动Chrome浏览器,浏览网页就会发现:
5658进程与fiddler建立了tcp连接,发送端为5658进程占用3258端口,接收端为fiddler(5256)占用的8888端口
命令:netstat -ano|findstr “8888″
查看5568进程,为chrome程序
命令:tasklist |findstr “5568″
同理,打开Firefox浏览器,浏览网页也是如此:
7836进程与fiddler建立了tcp连接,发送端为7836进程占用3294端口,接收端为fiddler(5256)占用的8888端口
命令:netstat -ano|findstr “8888″
查看7836进程,为firefox程序:
命令:tasklist |findstr “7836″
ps:要注意的firefox中需要手工将代理设置成fiddler:127.0.0.1:8888,因为Firefox不是使用系统默认的winINET(不过刚亲自试验发现安装fiddler后,firefox会提示安装fiddler插件,之后就不需要在手动配置了,如果不能监听火狐,就手动配置一下吧~)
所以,fiddler作为一个代理服务器,跟浏览器建立连接之后,浏览器像目标服务器发送的请求都会经过fiddler代理,
所以fiddler可以捕获到http(s)请求,从而可以解释、分析、甚至重写发出去的http(s)请求。
使用方法:https://www.cnblogs.com/miantest/p/7289694.html
补充一个小知识:
1)127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。
2)localhost是本地DNS解析的127.0.0.1的域名,这个你打开本机的hosts文件就可以看到,一般位于c:\windows\system32\driver\etc下,一般在最后有这么一行:127.0.0.1 localhost。我们在本机上安装tomcat默认即监听8080端口,我们访问tomcat里的网页例如http://localhost:8080/login/to_login。
参考:
1,百度百科
2,《Wireshark 数据包分析实战(第二版)》