用Python注入原始TCP数据包
怎样用Python发送原始的TCP数据包呢?比如说,我有一串十六进制的数字,我想把这串数字发送到网络服务上:这样如果我发送的是'abcdef',我在网络上也能看到'abcdef',而不是像'6162636566'这样的结果。
new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect(('127.0.0.1', 9999))
new.send('abcdef')
我可以用Python的SOCK_RAW来实现这个吗?如果可以的话,能给我一个用SOCK_RAW发送原始TCP数据包的例子吗?因为我自己试了没成功。
谢谢!
Evgeniy
4 个回答
1
如果你想使用原始套接字,SOCK_RAW 是正确的选择。不过要记住,使用 SOCK_RAW 的时候,你不能只发送数据内容。你还需要自己组装数据包的头部信息。等你把这些搞明白后,可能还会遇到操作系统的问题。在 Windows XP 上使用原始套接字时,我们就因为安全问题遇到了一些麻烦。
1
为什么不在发送之前把你的字符串转换成十六进制呢?
new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect(('127.0.0.1', 9999))
mydata = 'abcdef'
new.send(mydata.encode('hex'))
11
试试scapy,这是一个强大的交互式数据包处理程序。
示例:
%> sudo scapy
>>> packet1 = IP(dst='127.0.0.1')/TCP(dport=9999)
>>> packet1.payload = 'abcdef'
>>> send(packet1)
.
Sent 1 packets.
>>> packet1.show()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= ip
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\
###[ Raw ]###
load= 'abcdef'
>>>