scapy命令用于定义udp数据包的数据部分

时间:2014-01-02 13:37:01

标签: command scapy

我使用以下命令使用sendp

生成GTP数据包
>>>sendp(Ether()/IP(dst="1.1.1.1", proto=17,  
len=124)/UDP(sport=2152,dport=2152,len=104)/Raw(load=('32 ff 00 58 00 00 00 01 '
'28 db 00 00 45 00 00 54 00 00 40 00 40 00 5e a5 ca 0b 28 9e c0 a8 28 b2 08 00 '
'be e7 00 00 28 7b 04 11 20 4b f4 3d 0d 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 '
'14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d '
'2e 2f 30 31 32 33 34 35 36 37')), iface="eth1", loop=1, inter=1.0002)

在Wireshark中,

点击以下链接查看wireshark视图: http://imgur.com/M1Hpl7P

将UDP数据包的数据视为 -

32 ff 00 58 00 00 00 01 28 db 00 00 45 00 00 54 00 00 40 00 40 00 5e a5 ca 0b 28
9e c0 a8 28 b2 08 00 be e7 00 00 28 7b 04 11 20 4b f4 3d 0d 00 08 09 0a 0b 0c 0d
0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28
29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37

但我发现这个数据位于“数据包描述的最右侧”,而不是“数据包描述的中间部分”。

请您告诉我用于纠正此问题的命令。

1 个答案:

答案 0 :(得分:1)

我假设您希望上面的十六进制值是UDP数据包中的数据。

您提供给Raw的是一串字符,包含空格,而不是Python中的十六进制代码。我们将首先将您的字符串转换为Python中的有效十六进制字符串,然后将其提供给Scapy,以便数据将根据您的需要进行连接。

我还会向您展示一些很好的功能,以预览您将在Wireshark中看到的内容。

首先,我们将您的数据放入自己的变量中。

>>> data = ('32 ff 00 58 00 00 00 01 '
...     '28 db 00 00 45 00 00 54 00 00 40 00 40 00 5e a5 ca 0b 28 9e c0 a8 28 b2 08 00 '
...     'be e7 00 00 28 7b 04 11 20 4b f4 3d 0d 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 '
...     '14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d '
...     '2e 2f 30 31 32 33 34 35 36 37')

然后把它分成一个好的列表。

>>> data_list = data.split(" ")
>>> data_list
['32', 'ff', '00', '58', '00', '00', '00', '01', '28', 'db', '00', '00', '45',
 '00', '00', '54', '00', '00', '40', '00', '40', '00', '5e', 'a5', 'ca', '0b',
 '28', '9e', 'c0', 'a8', '28', 'b2', '08', '00', 'be', 'e7', '00', '00', '28', 
 '7b', '04', '11', '20', '4b', 'f4', '3d', '0d', '00', '08', '09', '0a', '0b',
 '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18',
 '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', 
 '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', 
 '33', '34', '35', '36', '37']

生成可以传递给Raw的字符串作为要在数据包中显示的二进制数据。

>>>data_s = ''.join(data_list).decode('hex')
>>>data_s
'2\xff\x00X\x00\x00\x00\x01(\xdb\x00\x00E\x00\x00T\x00\x00@\x00@\x00^\xa5\xca
\x0b(\x9e\xc0\xa8(\xb2\x08\x00\xbe\xe7\x00\x00({\x04\x11K\xf4=\r\x00\x08\t\n\x0b
\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f
!"#$%&\'()*+,-./01234567'

将此字符串用于UDP Payload并构建数据包!

>>> packet = IP(dst="1.1.1.1", proto=17,  
... len=124)/UDP(sport=2152,dport=2152,len=104)/Raw(load=data_s)
>>> packet.show()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= 124
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= udp
  chksum= None
  src= 0.0.0.0
  dst= 1.1.1.1
  \options\
###[ UDP ]###
     sport= gtp_user
     dport= gtp_user
     len= 104
     chksum= None
###[ Raw ]###
        load= '2\xff\x00X\x00\x00\x00\x01(\xdb\x00\x00E\x00\x00T\x00\x00@\x00@
               \x00^\xa5\xca\x0b(\x9e\xc0\xa8(\xb2\x08\x00\xbe\xe7\x00\x00({\x04
               \x11K\xf4=\r\x00\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14
               \x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0
               1234567'

这应该在Wireshark中产生预期的数据。这是您应该看到的hexdump。我排除了以太网层,因为一个未知的原因,给我的机器上的Scapy带来了一些麻烦。

>>> hexdump(p)
0000   45 00 00 7C 00 01 00 00  40 11 78 6F 00 00 00 00   E..|....@.xo....
0010   01 01 01 01 08 68 08 68  00 68 90 1A 32 FF 00 58   .....h.h.h..2..X
0020   00 00 00 01 28 DB 00 00  45 00 00 54 00 00 40 00   ....(...E..T..@.
0030   40 00 5E A5 CA 0B 28 9E  C0 A8 28 B2 08 00 BE E7   @.^...(...(.....
0040   00 00 28 7B 04 11 20 4B  F4 3D 0D 00 08 09 0A 0B   ..({.. K.=......
0050   0C 0D 0E 0F 10 11 12 13  14 15 16 17 18 19 1A 1B   ................
0060   1C 1D 1E 1F 20 21 22 23  24 25 26 27 28 29 2A 2B   .... !"#$%&'()*+
0070   2C 2D 2E 2F 30 31 32 33  34 35 36 37               ,-./01234567