安全学习记录——网络篇(五)数据包

之前学了很久的协议,虽然同一类型的协议的原理很好懂,但是一旦开始关注细节后就会发现每一个都需要去单独练习记忆,每一个需要的时间都不短,因为网络的变化太多,这需要大量的时间和经验,没有任何办法速成。但是网络安全的从业者不可能全部是经验丰富深刻理解并熟练应用各种网络设备和协议的大佬,那样学习成本太高了。所以这些网络协议一定有一个共同点,通过这个共同点我们可以适当学习我们所需要的知识,而不是当个全才。

在谈到动态路由协议的安全性问题时,我们知道,除了通过物理方式直接连接或者抢夺节点外,最简单的方法就是欺骗网络上的设备。通过什么来欺骗呢,数据包。

程序由于外部操作或者内部响应,根据协议规定的外壳和报文内容构造一个数据包并且发送出去,交给指定的设备后,对方会解读这个数据包并做出一定的操作和回应。所有的网络交互都完全依赖于数据包的传递,一旦丢包,就会导致传输失败或者不完全传输。传输失败很好理解,就好像在网上买了一个东西后快递在路上被丢了,那自然到不了我们手上。不完全传输现在应该挺少见的了,以前网络慢的时候,在响应时间内,网络只来得及将必要的数据传过来,于是我们就会得到一个全部是文字链接整齐排列在屏幕左侧的网站,没有任何的图像格式,相当于快递到我们手上了,但是是一堆碎片,拼完后发现还缺一截。

报文

首先第一步是构造数据包,在ARP欺骗那一篇里我已经完整地展示过数据包是如何被构造的,那么我是怎么知道这个数据包需要什么内容的呢?当我们开始学一个协议时,很多教程都喜欢把一张报文大图贴上来,就告诉我们,这是报文结构,好了自己悟去吧。所以我们先要学会看懂报文格式,我们还是以ARP为例子:

Frame 109: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface \Device\NPF_{5B8AEA91-7D4D-4C50-BBFC-3E358D7FB66F}, id 0
Ethernet II, Src: 46:47:0a:a5:c3:ae (46:47:0a:a5:c3:ae), Dst: Broadcast (ff:ff:ff:ff:ff:ff)

Address Resolution Protocol (request)
    Hardware type: Ethernet (1)
    Protocol type: IPv4 (0x0800)
    Hardware size: 6
    Protocol size: 4
    Opcode: request (1)
    Sender MAC address: 46:47:0a:a5:c3:ae (46:47:0a:a5:c3:ae)
    Sender IP address: 192.168.124.195
    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
    Target IP address: 192.168.124.12
  • 最上面的数字代表了二进制的位数,比如硬件类型占了16格说明它用了16个二进制数来表示,这里显示的是Ethernet,以太网,编号是1,也可以写为0x0001。0x表示是16进制,0001是它的编号,转换为2进制就是0000000000000001,正好占16位。
  • 协议类型同理,0x0800是IPv4的编号,表示使用的IP协议类型是v4
  • MAC地址和协议地址长度对应的就是上面的MAC类型和协议类型所对应的下面的MAC、IP应该占用的字节数。4位2进制为1字节。长度规定是非常有必要的,并不是确定了协议类型读取数据包的内容时就会自动地确定哪个地方到底读取多少字节后结束,电子设备并没有那么智能,尤其是这里MAC和IP存在分段,如果我们不规定MAC必须要读完6字节,那么对方可能只会识别到前4字节,然后把后2字节理解为另外的东西,于是就发包后,对方根本找不到源MAC也就无法返回消息完成通信。
  • 但是为什么要把地址拿来分段呢,为什么不能再加8位来让MAC完整地显示在一行上,那是因为出现这个协议时,处理器一次最多只能处理32位数据,因为每一个计算核心代表2个电压变化,所以处理器的最大位数只有2^{n},不存在2^{n}+2^{m}的情况。假设当时的计算机是128位,那么每行自然也是128,这也是64位报文无法被32位电脑读取,但是32位报文可以通过添加字段长度来使64位计算读取的原因。
  • 操作方式规定了收到数据包后应该执行的操作,request说明这是一个希望反馈回某些东西的请求,所有目标在收到后就会更新缺失的目标MAC,再返回包。如果它不是1,而是2响应的话,那么这个包就只会用于更新目标地址符合的设备的路由表。
  • 但这只是设备的操作,一个报文还需要一个头来告诉网络怎么发送这个包,因为报文可以被加密,或者编码,这时网络设备根本不知道地址是谁,所以在ARP上面还有一段显示了发送地址和应该被转发的地址,这里显示的是broadcast广播,也就是说所有能连上的设备全都会收到包,目标们收到后会看看是不是自己,是就回应,不是就直接丢掉。返回的包会显示出目标MAC地址

这样我们就知道了一个数据包到底有什么内容和什么作用,一个协议几乎所有的内容全都在这里面,协议必须依赖数据包来转递执行命令。也就是说,我们既可以通过构造数据包来欺骗设备,也可以自己创造协议。当然,创建协议是很麻烦的,因为它不只是创建报文就行,还需要通过程序来使协议可被执行,同时需要相应的驱动来识别。能搞懂这些就可以去开发物联网了,那收入也不低的。但是我们搞安全就不用管这些,只需要知道,怎么获取数据包,如何构造数据包,数据包被执行的规则是什么就行。获取数据包是为了知道有哪些协议,协议应该包括哪些字段,传输规则大概是什么;构造数据包是为了学习如何通过脚本任意更改报文以达成我们想要的效果;了解了执行规则有助于我们排除掉一些根本无法被执行的数据包,或者更改发送方式来达成目的,比如ospf的同时发送迫使序列号检验失效。

数据包的价值

这里举一个完全不同的例子来证明我们学懂数据包后的价值:游戏外挂

我们先打开一个页游,然后进入游戏后通过代理工具截取网页数据包,比如使用burp:

中间就是我们从游戏获取到的数据包,右上是这个网页的控制台记录,显示的是跨域、邮件地址关闭、参数编码等。左下是检测到的可能漏洞,跨站脚本等。然后我们需要去利用一下这个包看看它到底有些什么用:

我们把其中一个包重新打包发送后就获得一个json文件,名称是boss blood,这个文件返回的是我们游戏内部的各项参数,包括玩家、boss属性等基本数据,这个是保存再服务器上的,我们无法更改,我只是展示一下,一个网络游戏到底是如何在运行。这种请求没有办法直接更改,那么如果我们使用脚本文件呢:

大家看到,这个文件的名字是level_up,所以它是一份升级文件,我在关闭了游戏甚至关闭了浏览器的基础之上,游戏服务器仍然在相应升级的脚本文件,并返回了升级的参数。我为什么知道一定是游戏响应的而不是本地保存的呢,因为第一次发送时过了几秒钟才出现了结果,缓存后再次发送是秒出。所以我们可以发现这个服务器会不断响应我们的请求,一旦我们找到执行某个操作对应的数据包,就可以通过代码构造工具,发包来制造外挂。升级过程确实是在我放行数据时出现的,所以只要知道了对应任务的的文件名,就可以通过修改标头直接获取任务奖励。虽然我并不知道文件名,但是可以通过字典爆破获取,反正这个服务器会一直响应。(仅用于抓包放行测试,未进行任何攻击更改)提醒大家一下,这个游戏服务的IP属于中国联通而且通过fofa查出来全是禁止访问。

或者说,再回到我们修改参数上,我们已经知道了这个包本地角色升级的方式是通过服务器返回json参数进行的,那么我们把自己的电脑变成服务器就行,只需要向这个url发送get请求不就好了?但这可能违法,在查不到这个服务商的时候有可能比违法还严重,所以我只提供一个思路,不会去做实验:

import requests  
import json  
  
url = 'http://balabala.com' #页游url

params = {  
    'character_id': '123',  #角色ID
    'level_up': '20' #升级
}  

 response = requests.get(url, params=params) #发送请求 
    
if response.status_code == 200:   
    data = response.json()  
    print(data)  #看看是不是有结果
else:  
    print(f"失败:{response.status_code}")

好了,现在我们知道了应该怎么通过阅读报文了解一个协议的核心,也明白了数据包在网路传输过程中的重要性,同时也讲到了暴露的数据包和参数传递对于安全的威胁到底有多大,似乎会构造数据包就可以肆无忌惮地做任何事情,在不考虑被运维人员抓到不正常数据的情况下,但是真是如此吗,加密的出现导致数据参数不再暴露,cookie的存在使得我们无法随意地越权进入别人的账户。但是,数据包在挖洞的过程中仍然好用,因为绝大部分挖洞禁止工具和扫描,这时就需要依赖于我们个人的知识积累和代码能力了。

  • 26
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值