我在玩弄替罪羊,尝试做一个像nmap一样的动作,我成功地进行了三次握手,如果我连接到smtp服务器,我会自动接收数据,但我无法确认。
我已经通过netcat连接到它,以了解它为什么不能工作,nc实际上发送了一个ACK数据包,它的TCP ack字段设置为接收到的数据段的长度。所以,我也在尝试对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)但是,当我打印值时,我得到了好的ack号,但是当我看到wireshark捕获时,我有一个巨大的ack号,数据包被标记为"ACKed未见段“。但是,当我查看十六进制中的字节时,得到了正确的值。有没有人知道为什么会发生这种情况,以及如何解决?
发布于 2015-11-02 16:02:00
Wireshark使用相对数字在它的显示中,所以右边的替罪羊线是:
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)下面的代码(参见问题中的编辑)确实有效:
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)发布于 2016-08-18 12:04:32
要获得TCP段长度(已对IPv6通信量进行了验证):
tcp_header_len = rp.getlayer(TCP).dataofs * 32 / 8
tcp_seg_len = rp.plen - tcp_header_lenhttps://stackoverflow.com/questions/33476561
复制相似问题