伪造 UDP 校验和

伪造 UDP 校验和

我们遇到了一些 IPSec 连接问题,这些问题似乎与某些 ISP 的 UDP 校验和设置(错误)有关。
为了进一步调查,我想在受控环境中重现错误。
现在,我不知道 ISP 到底做了什么,所以我想直接操纵 UDP 数据包来重现给定的场景(UDP 校验和缺失、正确设置和错误设置)。

客户端:一台装有部分工具(perl、iptables、gnu tools、bash、tcpdump)的 Linux 机器。
服务器:一台几乎没有任何工具(bash、pf、tcpdump)的基于 freeBSD 的机器。

我想测试服务器对不同 UDP 校验和情况的反应。
由于它没有太多工具,我认为重现这些情况的最简单方法是从 Linux 客户端。
我知道可以使用曼格尔表
这只允许我正确设置 UDP 校验和。

如何伪造数据包的 UDP 校验和,使其不存在、设置正确或设置错误?

关于如何重现这些场景的任何想法(也许以不同的方式)也欢迎在评论中提出。

答案1

我找到了一种方法,可以将 Python 脚本挂接到 mangle 表中,并使用该 Python 脚本更改数据包。性能显然很慢,但对于测试目的来说已经足够了。

python3 脚本如下所示(使用斯卡皮网络过滤队列):

from netfilterqueue import NetfilterQueue as nfqueue
from scapy.all import *
import os

iptablesr = 'iptables -t mangle -A POSTROUTING -p udp --dport 4500 -j NFQUEUE --queue-num 1'
print("Adding iptable rules: ")
print(iptablesr)
os.system(iptablesr)
def alter_callback(packet):
  print("=======================")
  pkt = IP(packet.get_payload())
  pkt.show2()

  udp = pkt.getlayer(UDP)

  del pkt.chksum
  #del udp.chksum
  udp.chksum = 0x111 # set udp checksum to something else

  pkt.show2()

  print("=======================")
  packet.set_payload(bytes(pkt))
  packet.accept()

def main():
  q = nfqueue()
  q.bind(1, alter_callback)
  try:
    q.run()
  except KeyboardInterrupt:
    q.unbind()
    print("Flushing iptables.")
    os.system("iptables -t mangle -F")

if __name__ == "__main__":
  main()

相关内容