Jef*_*eux 5 python network-programming scapy
我正在玩 scapy,尝试做一个类似 nmap 的操作,我成功地进行了三向握手,如果我连接到 smtp 服务器,我会自动接收数据,但我无法确认。
我已经通过 netcat 连接到它,看看为什么它不起作用,并且 nc 实际上发送了一个 ACK 数据包,其中 TCP ack 字段设置为接收到的数据段的长度 + 1。所以我试图对 scapy 做同样的事情,但是我不知道在哪里可以找到 TCP 段的长度。我尝试了 lsc(TCP) 但我看不到该字段。
这是 netcat 连接的wireshark捕获:
以及数据包的详细信息:
如您所见,数据正下方的数据包的 ack 字段是 37 + 1 = 38。
有人知道在哪里或如何找到它吗?
编辑:
实际上没有给出段长度的字段,但可以用两种方法计算:
tcp_seg_len = len(rp.getlayer(Raw).load)
# or
ip_total_len = rp.getlayer(IP).len
ip_header_len = rp.getlayer(IP).ihl * 32 / 8
tcp_header_len = rp.getlayer(TCP).dataofs * 32 / 8
tcp_seg_len = ip_total_len - ip_header_len - tcp_header_len
ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \
dport=pkt[1].sport, \
seq=rp[1].ack, \
ack=tcp_seg_len + 1, \
flags="A"), \
verbose=0, timeout=1)
Run Code Online (Sandbox Code Playgroud)
但是,当我打印值时,我得到了很好的 ack 编号,但是当我观看 wireshark 捕获时,我有一个巨大的 ack 编号,并且数据包被标记为“ACKed unseen segment”。当我查看 hexa 中的字节时,我得到了正确的值。有谁知道为什么会发生这种情况以及如何解决?
Wireshark在其显示中使用相对数字,因此正确的 scapy 线是:
ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \
dport=pkt[1].sport, \
seq=rp[1].ack, \
ack=rp[1].seq + tcp_seg_len, \
flags="A"), \
verbose=0, timeout=1)
Run Code Online (Sandbox Code Playgroud)
以下代码(请参阅问题中的编辑)确实有效:
ip_total_len = rp.getlayer(IP).len
ip_header_len = rp.getlayer(IP).ihl * 32 / 8
tcp_header_len = rp.getlayer(TCP).dataofs * 32 / 8
tcp_seg_len = ip_total_len - ip_header_len - tcp_header_len
ans_ack,unans_ack = sr(IP(dst=ip)/TCP(sport=pkt[1].dport, \
dport=pkt[1].sport, \
seq=rp[1].ack, \
ack=rp[1].seq + tcp_seg_len, \
flags="A"), \
verbose=0, timeout=1)
Run Code Online (Sandbox Code Playgroud)