首页 > 编程知识 正文

网络抓包命令,代理抓包工具

时间:2023-05-04 14:48:18 阅读:51689 作者:4127

建设利器scapy最近在帮助用户调试网络问题时,会找到非常好用的建设工具scapy,并记录使用方法。

我们调试TCP/IP时,有时需要发送一些消息。 使用的工具一般有ping、nping、netcat等。 如果需要进一步细化IP或传输层的域,或者发送畸形消息,上述工具可能不一定都可以。 这个时候,我们可以自己用套接字编程,但是麻烦,迭代周期太长了。 在这种情况下,scapy是个好选择。

安装

直接从https://github.com/secdev/scapy下载压缩包,解压缩到任意目录即可。 如果您使用的是Linux,则很可能已经有合适的安装软件包。 有关详细信息,请参阅3359 scapy.readthedocs.io/en/latest/installation.html。

运行

根据主机上是否安装了python2或python3,运行run_scapy_py2或run_scapy_py3时为:

./run_scapy_py2进入交互式Python界面。 运行一些简单的函数,感受一下scapy的功能。

str(IP ) ) (e(x00 ) x00 ) x14 ) x00 ) x01 ) x00|xe7(x7fx00 ) x00 ) x01 ) fx00

IP version=4IHL=5t OS=0x0len=20id=1flags=frag=0TTL=64 proto=hopoptchksum=0x7ce7src=127.0.0.1 dst=127

send(IP ) dst='172.25.52.34 ' )/ICMP ) ) Sent 1 packets .请注意使用“/”连接不同的协议层。 也就是说,“/”之后的数据是上一层的负荷。

一个实例

用户的问题是,主机a向主机b发送了超过2千字节的UDP消息,但由于MTU的限制,该消息在主机a上被分为两个IP区块,当通过中间路由器时,第一个IP区块又被分成两个区块,到达主机b 为了找出原因在哪里,在IP层还是UDP层被废弃了。

因为主机b是我所在公司的产品,所以我需要验证这三个IP分片包在主机b上受到的待遇。 上层APP应用程序没有收到的理由是什么?

把大包直接ping主机b也不能说明问题,必须使用用户的原始数据。 用户已经抓住包,并将其存储在/tmp/fragments.pcap中。 我们可以用scapy的rdpcap ) )读取包。

p=rdpcap((/tmp/fragments.PACP ) ) pfragments.pcap : TCP :0 UDP 33601 icmp :0 other :2 len ) p为列表,请看长度

forIinrange(len ) p ) :len ) p[I].load ) . 144824875和内容:

forIinrange(len ) p ) . p[I].load.p[I].load是用户发送的数据(IP和UDP标头除外)。 然后,可以利用这些数据构建自己的IP瓷砖。

a=IP(dst='172.25.52.34 ',id=1,flags='MF ',frag=0,ttl=255 )/UDP ) sport=5059,dport=5060, dst指定了目标IP地址。 所有片都需要相同的id。 此处设定为1。 前两个切片设置为标志“更多帧”(MF ),表示后面有切片。 最后一个切片不需要设置标志。 frag设置切片在整个包中的偏移。 第一个切片的偏移当然是0。 第二个切片的偏移是第一个切片的数据长度。 frag是IP标头中的13位字段,表示以8字节为单位的偏移,因此实际长度除以8得到182。 第三个切片的偏移是第一个和第二个切片将数据长度相加,再除以8,最后得到185。 proto为17,表示传输层为UDP。 使TL最大化

值255,表示IP分片失效的秒数。

另外,第一分片要有一个UDP头,其余分片只要IP头加上数据就可以了, 所以我们构造了一个UDP层:

UDP(sport=5059,dport=5060,len=2355,chksum=0x8061)

这里的源端口、目的端口,长度和 chksum 都是从抓包信息里读出的。

构造好三个分片后,我们就可以发送了:

>>> send(a)>>> send(b)>>> send(c)

也可以写一个简单的函数一下子发送:

>>> def send_all():... send(a)... send(b)... send(c)>>> send_all()

在发送的同时,我们用wireshark 抓包,可以看到IP报文的确发出去了。 但在目的主机 172.25.52.34 上建立的UDP 服务器没有收到这个UDP消息。

由于目标主机上的网络协议就是自己公司的(实验的目的也是为了调试网络协议), 加入调用代码后发现是UDP层检查checksum失败, 把UDP消息丢弃了。 再回过头来看我构造的第一个分片:

>>> a=IP(dst="172.25.52.34",id=1,flags="MF",frag=0,ttl=255)/UDP(sport=5059,dport=5060,len=2355,chksum=0x8061)/p[0].load

这是的 chksum=0x8061 ,我是从用户的抓包里看到的,直接拿来用了。 其实是不对的 。 查资料找到UDP checksum的构成: 它先要构造一个伪IP头,包含目的IP、源IP, UDP长度。 然后这个伪IP头再和UDP头和数据合在一起计算checksum, 由于用户的IP地址和我的环境不同,checksum 当然不同了。 幸好还可以强制让协议栈不计算checksum, 这样至少可以看到一次成功的发收包, 把checksum 设为0:

a=IP(dst="172.25.52.34",id=1,flags="MF",frag=0,ttl=255)/UDP(sport=5059,dport=5060,len=2355,chksum=0)/p[0].load

再发送 a,b,c 这回对方收到UDP消息了。 这说明IP层没有问题,分片都是正确的,问题很可能出在UDP的checksum上。 再参考这个网页https://scapy.readthedocs.io/en/latest/functions.html

计算一下UDP 的checksum, 果然不是0x8061。 很有可能用户的主机在发送UDP的时候,checksum 计算错了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。