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

时间:2014-08-28 15:52:56

标签: python ubuntu networking tcp scapy

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

nc -l -p 1025

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

#!/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捕获数据包,

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,

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)我发送了ACK 5)目的地系统回复RST 所以我无法建立连接! 问题: 1)我怎样才能成功建立连接 2)我的源ip =“1.2.3.4”, *但当我发送到虚拟机它显示172.16.28.1(广播IP)。为什么吗

1 个答案:

答案 0 :(得分:1)

  
    

1)我怎样才能成功建立连接

  

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

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未出现的原因是您没有使用它:

ip = IP(dst = dst)

您指定目标地址,但没有源地址。某些实体(scapy或主机操作系统IP堆栈,我不确定)是为您选择合理的源地址。你可以试试:

ip = IP(dst = dst, src = src)

看看那里发生了什么。