确认scapy中数据的确认号

2024-04-19 07:49:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在和scapy玩,试着做一个nmap,我成功地做了一个三方握手,如果我连接到一个smtp服务器,我会自动接收数据,但我无法确认。在

我已经通过netcat连接到它,看看它为什么不工作,nc实际上发送了一个ACK包,TCP ACK字段设置为接收到的数据段的长度+1。 所以我试着用scapy做同样的事情,但是我不知道从哪里可以找到TCP段的长度。我尝试了lsc(TCP),但我看不到字段。在

以下是netcat连接的wireshark捕获:

enter image description here

以及包裹的细节:

enter image description here

如您所见,数据下方的数据包的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中的字节时,我得到了正确的值。有人知道为什么会这样吗?怎么解决?在


Tags: 数据iplenrpscapytcpheaderwireshark
2条回答

获取TCP段长度。这已经针对IPv6流量进行了验证

tcp_头_len=rp.getlayer(TCP).DATOFS*32/8 tcp段长度=rp.plen公司-tcp_头_len

Wireshark uses relative numbers在其显示中,因此右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)

下面的代码(参见问题中的编辑)确实有效:

^{pr2}$

相关问题 更多 >