我想用scapy做tcp 3路握手,我的代码如下:
from scapy.all import *
# VARIABLES
src = sys.argv[1]
dst = sys.argv[2]
sport = random.randint(20000,65535)
dport = int(sys.argv[3])
print src
print dst
print sport
print dport
# SYN
ip=IP(src=src,dst=dst)
SYN=TCP(sport=sport,dport=dport,flags='S',seq=1000)
SYNACK=sr1(ip/SYN)
SYN.show()
SYNACK.show()
# ACK
seq=SYNACK.ack + 1
ack=SYNACK.seq + 1
print seq
print ack
ACK=TCP(sport=sport, dport=dport, flags='A', seq=seq, ack=ack)
sr1(ip/ACK)
ACK.show()
exec命令:
python 3WSK.py 10.16.11.21 10.11.157.130 26789
SYNACK结果如下:
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 44
id = 0
flags = DF
frag = 0L
ttl = 60
proto = tcp
chksum = 0x821a
src = 10.11.157.130
dst = 10.16.11.21
\options \
###[ TCP ]###
sport = 26789
dport = 35067
seq = 1918207620
ack = 1001
dataofs = 6L
reserved = 0L
flags = SA
window = 5840
chksum = 0xd630
urgptr = 0
options = [('MSS', 1460)]
###[ Padding ]###
load = '\x00\x00'
但是我的tcp服务器没有记录任何东西。
进行测试:
我使用telnet 10.11.157.130 26789
连接我的tcp服务器,然后我的tcp服务器可以记录类似:" INFO l.t.TcpServer - in,/ 10.16.11.21:34906"
所以,我不确定我的scapy代码是否连接成功,我也想知道 如何验证tcp connect是否有效。感谢
答案 0 :(得分:0)
检查在SYN + ACK到达时是否看到从您的操作系统发送的RST。如果有,请查看this answer并使用iptables删除RST:
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s <your_ip> -j DROP
如果不是这种情况,请查看this gist,这对我来说很合适。