我在和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)
然而,当我打印这些值时,我得到了一个好的确认号,但是当我观看wireshark捕获时,我有一个巨大的ack号,包被标记为“ACKed unseen segment”。当我查看hexa中的字节时,我得到了正确的值。有人知道为什么会这样吗?怎么解决?在
获取TCP段长度。这已经针对IPv6流量进行了验证
tcp_头_len=rp.getlayer(TCP).DATOFS*32/8 tcp段长度=rp.plen公司-tcp_头_len
Wireshark uses relative numbers在其显示中,因此右scapy行是:
下面的代码(参见问题中的编辑)确实有效:
^{pr2}$相关问题 更多 >
编程相关推荐