scapypython中⽂⼿册pdf_Scapy中⽂⽂档:三、使⽤⽅法使⽤⽅法
0x01 起航Scapy
Scapy的交互shell是运⾏在⼀个终端会话当中。因为需要root权限才能发送数据包,所以我们在这⾥使⽤sudo
$ sudo scapy
Welcome to Scapy (2.0.1-dev)
>>>
在Windows当中,请打开命令提⽰符(),并确保您拥有管理员权限:
C:\>scapy
INFO: No IPv6 support in kernel
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.0.1-dev)
>>>
如果您没有安装所有的可选包,Scapy将会告诉你有些功能不可⽤:
INFO: Can't import python gnuplot wrapper . Won't be able to plot.
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
虽然没有安装,但发送和接收数据包的基本功能仍能有效。
0x02 互动教程
本节将会告诉您⼀些Scapy的功能。让我们按上⽂所述打开Scapy,亲⾃尝试些例⼦吧。
第⼀步
让我们来建⽴⼀个数据包试⼀试
>>> a=IP(ttl=10)
>>> a
< IP ttl=10 |>
>>> a.src
’127.0.0.1’
>>> a.dst="192.168.1.1"
>>> a
< IP ttl=10 dst=192.168.1.1 |>
>>> a.src
’192.168.8.14’
>>> l)
>>> a
< IP dst=192.168.1.1 |>
>>> a.ttl
64
堆加层次(OSI参考模型)
/操作符在两层之间起到⼀个组合的作⽤。当使⽤该操作符时,下层可以根据其上层,使它的⼀个或多个默认字段被重载。(您仍可以赋予您想要的值)⼀个字符串也可以被⽤作原料层(raw layer)。
>>> IP()
>>> IP()/TCP()
>
>>> Ether()/IP()/TCP()
>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
>>
>>> Ether()/IP()/IP()/UDP()
>>>
>>> IP(proto=55)/TCP()
>
每⼀个数据包都可以被建⽴或分解(注意:在Python中_(下划线)是上⼀条语句执⾏的结果):
>>> str(IP())
'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
>>> IP(_)
chksum=0x7ce7 src=127.0.0.1 dst=127.0.0.1 |>
>>> a=Ether()/IP(dst="")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>> hexdump(a)
00 02 15 37 A2 44 00 AE F3 52 AA D1 08 00 45 00 ...R....E.
00 43 00 01 00 00 40 06 78 3C C0 A8 05 15 42 23 .C....@.x<....b>
FA 97 00 14 00 50 00 00 00 00 00 00 00 00 50 02 .....P........P.
20 00 BB 39 00 00 47 45 54 20 2F 69 6E 64 65 78 ..9..GET /index
2E 68 74 6D 6C 20 48 54 54 50 2F 31 2E 30 20 0A .html HTTP/1.0 .
0A .
>>> b=str(a)
>>> b
'\x00\x02\x157\xa2D\x00\xae\xf3R\xaa\xd1\x08\x00E\x00\x00C\x00\x01\x00\x00@\x06x
\xa8\x05\x15B#\xfa\x97\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00
\xbb9\x00\x00GET /index.html HTTP/1.0 \n\n'
>>> c=Ether(b)
>>> c
ihl=5L tos=0x0 len=67 id=1 flags= frag=0L ttl=64 proto=TCP chksum=0x783c
src=192.168.5.21 dst=66.35.250.151 options='' |
ack=0L dataofs=5L reserved=0L flags=S window=8192 chksum=0xbb39 urgptr=0
options=[] |>>>
我们看到⼀个分解的数据包将其所有的字段填充。那是因为我认为,附加有原始字符串的字段都有它⾃⾝的价值。如果这太冗
长,hide_defaults()⽅法将会删除具有默认值的字段:
>>> c.hide_defaults()
>>> c
frag=0 proto=TCP chksum=0x783c src=192.168.5.21 dst=66.35.250.151 |
chksum=0xbb39 options=[] |>>>
读取PCAP⽂件
你可以从PCAP⽂件中读取数据包,并将其写⼊到⼀个PCAP⽂件中。
>>> a=rdpcap("/spare/captures/isakmp.cap")
>>> a
图形转储(PDF,PS)
如果您已经安装PyX,您可以做⼀个数据包的图形PostScript/ PDF转储(见下⾯丑陋的PNG图像,PostScript/PDF则具有更好的质量...) >>> a[423].pdfdump(layer_shift=1)
>>> a[423].psdump("/tmp/isakmp_pkt.eps",layer_shift=1)
命令
效果
str(pkt)
组装数据包
hexdump(pkt)
⼗六进制转储
ls(pkt)
显⽰出字段值的列表
pkt.summary()
⼀⾏摘要
pkt.show()
针对数据包的展开试图
pkt.show2()
显⽰聚合的数据包(例如,计算好了校验和)
pkt.sprintf()
⽤数据包字段填充格式字符串
pkt.decode_payload_as()
改变payload的decode⽅式
pkt.psdump()
绘制⼀个解释说明的PostScript图表
pkt.pdfdump()
绘制⼀个解释说明的PDF
pktmand()
返回可以⽣成数据包的Scapy命令
⽣成⼀组数据包
⽬前我们只是⽣成⼀个数据包。让我们看看如何轻易地定制⼀组数据包。整个数据包的每⼀个字段(甚⾄是⽹络层次)都可以是⼀组。在这⾥隐含地定义了⼀组数据包的概念,意即是使⽤所有区域之间的笛卡尔乘积来⽣成的⼀组数据包。
>>> a=IP(dst="/30")
>>> a
>>> [p for p in a]
[, ,
, ]
>>> b=IP(ttl=[1,2,(5,9)])
>>> b
>>> [p for p in b]
[, , , ,
, , ]
>>> c=TCP(dport=[80,443])
>>> [p for p in a/c]
[>,
>,
>,
>,
>,
>,
>,
>]
某些操作(如修改⼀个数据包中的字符串)⽆法对于⼀组数据包使⽤。在这些情况下,如果您忘记展开您的数据包集合,只有您忘记⽣成的列表中的第⼀个元素会被⽤于组装数据包。
命令
python官方文档中文版效果
summary()
显⽰⼀个关于每个数据包的摘要列表
nsummary()
同上,但规定了数据包数量
conversations()
显⽰⼀个会话图表
show()
显⽰⾸选表⽰(通常⽤nsummary())
filter()
返回⼀个lambda过滤后的数据包列表
hexdump()
返回所有数据包的⼀个hexdump
hexraw()
返回所以数据包Raw layer的hexdump
padding()
返回⼀个带填充的数据包的hexdump
nzpadding()
返回⼀个具有⾮零填充的数据包的hexdump
plot()
规划⼀个应⽤到数据包列表的lambda函数
make table()
根据lambda函数来显⽰表格
发送数据包
现在我们知道了如何处理数据包。让我们来看看如何发送它们。send()函数将会在第3层发送数据包。也就是说它会为你处理路由和第2层的数据。sendp()函数将会⼯作在第2层。选择合适的接⼝和正确的链路层协议都取决于你。
>>> send(IP(dst="1.2.3.4")/ICMP())
.
Sent 1 packets.
>>> sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
....
Sent 4 packets.
>>> sendp("I'm travelling on Ethernet", iface="eth1", loop=1, inter=0.2)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。