我想在我的ubuntu中创建一个TCP-3方式的握手。我在虚拟机中使用了一个kali linux。在kali linux终端(IP-172.16.28.130)中,我以“侦听”模式打开了一个端口,以获得与该机器的连接。
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)我用RST发送了目标系统回复,所以我不能建立连接!问题:1)我如何才能完全建立连接( 2)我的源ip = "1.2.3.4",但是当我发送到虚拟机时,它显示了172.16.28.1(广播ip)。为什么?
发布于 2014-08-28 16:12:35
( 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)指定目标地址,但不指定源地址。某些实体(我不确定)正在为您选择一个合理的源地址。你可以试试:
ip = IP(dst = dst, src = src)看看那里会发生什么。
https://stackoverflow.com/questions/25553055
复制相似问题