首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么系统在python中尝试- TCP 3方式握手时会发送RST标志?

为什么系统在python中尝试- TCP 3方式握手时会发送RST标志?
EN

Stack Overflow用户
提问于 2014-08-28 15:52:56
回答 1查看 2.7K关注 0票数 0

我想在我的ubuntu中创建一个TCP-3方式的握手。我在虚拟机中使用了一个kali linux。在kali linux终端(IP-172.16.28.130)中,我以“侦听”模式打开了一个端口,以获得与该机器的连接。

代码语言:javascript
复制
nc -l -p 1025

我在ubuntu主机上运行的python代码,

代码语言:javascript
复制
#!/usr/bin/python
from scapy.all import *
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

#if i send to broadcast address : 192.168.1.255 what will happen?
def sendPacket(src, dst):
   ip = IP(dst = dst)
   port = RandNum(1024, 65535)
   SYN = ip / TCP(sport=port, dport=1025, flags="S", seq = 42)
   SYNACK = sr1(SYN, verbose=0)

   ACK = ip / TCP(sport = SYNACK.dport, dport=80, flags="A", seq = SYNACK.ack, ack = SYNACK.seq + 1)
   send(ACK)

   print "Done!!\n"

src = '1.2.3.4'
dst = '172.16.28.130'
sendPacket(src, dst)

用wireshark捕获数据包,

代码语言:javascript
复制
3      172.16.28.1   172.16.28.130   TCP   54   64865 > blackjack [SYN] Seq=0 Win=8192 Len=0

4      172.16.28.130   172.16.28.1   TCP   60   blackjack > 64865 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460

7      172.16.28.1   172.16.28.130   TCP   54   64865 > blackjack [RST] Seq=1 Win=0 Len=0

8      172.16.28.1   172.16.28.130   TCP   54   64865 > http [ACK] Seq=1 Ack=1 Win=8192 Len=0

9      172.16.28.130   172.16.28.1   TCP   60   http > 64865 [RST] Seq=1 Win=0 Len=0

在运行代码之前,我更改了IPtable,

代码语言:javascript
复制
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.20 -j DROP

当我将目标更改为,dst = "www.google.com“和目的端口到,dport=80时,它正常工作。

但是现在,1)我可以发送SYN数据包2)目的地响应用SYN,ACK数据包3) 我的系统发送RST 4)我用RST发送了目标系统回复,所以我不能建立连接!问题:1)我如何才能完全建立连接( 2)我的源ip = "1.2.3.4",但是当我发送到虚拟机时,它显示了172.16.28.1(广播ip)。为什么?

EN

回答 1

Stack Overflow用户

发布于 2014-08-28 16:12:35

( 1)怎样才能成功完全建立联系

这是个猜测。将iptables命令更改为:

代码语言:javascript
复制
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 172.16.28.1 -j DROP

当您连接到google.com时,您将通过物理以太网设备进行连接,该设备的IP为192.168.x.y,因此-s参数匹配。

当您连接到Kali时,您正在通过一个地址为172.16.x.y的虚拟以太网设备进行连接,因此-s不匹配。

您需要从正确的输出队列中删除RST数据包。

2)我的源ip = "1.2.3.4",但是当我发送到虚拟机时,它显示了172.16.28.1(广播ip)。为什么?

首先,172.16.28.1是而不是您的广播IP。它是您的主机虚拟以太网设备的IP。

您的源IP没有出现的原因是您没有使用它:

代码语言:javascript
复制
ip = IP(dst = dst)

指定目标地址,但不指定源地址。某些实体(我不确定)正在为您选择一个合理的源地址。你可以试试:

代码语言:javascript
复制
ip = IP(dst = dst, src = src)

看看那里会发生什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25553055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档