Scapy中文使用文档Word下载.docx
《Scapy中文使用文档Word下载.docx》由会员分享,可在线阅读,更多相关《Scapy中文使用文档Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
/操作符在两层之间起到一个组合的作用。
当使用该操作符时,下层可以根据其上层,使它的一个或多个默认字段被重载。
(您仍可以赋予您想要的值)一个字符串也可以被用作原料层(rawlayer)。
IP()
IP|>
IP()/TCP()
IPfrag=0proto=TCP|<
TCP|>
Ether()/IP()/TCP()
Ethertype=0x800|<
IP()/TCP()/"
GET/HTTP/\r\n\r\n"
TCP|<
Rawload='
GET/HTTP/\r\n\r\n'
|>
Ether()/IP()/IP()/UDP()
IPfrag=0proto=IP|<
IPfrag=0proto=UDP|<
UDP|>
IP(proto=55)/TCP()
IPfrag=0proto=55|<
每一个数据包都可以被建立或分解(注意:
在Python中_(下划线)是上一条语句执行的结果):
str(IP())
'
E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
IP(_)
IPversion=4Lihl=5Ltos=0x0len=20id=1flags=frag=0Lttl=64proto=IP
chksum=0x7ce7src=dst=|>
a=Ether()/IP(dst="
)/TCP()/"
GET/HTTP/\n\n"
hexdump(a)
00021537A24400AEF352AAD108004500......R....E.
0043000100004006783CC0A805154223.C....@.x<
....B#
FA970014005000000000000000005002.....P........P.
2000BB390000474554202F696E646578..9..GET/index
2E68746D6C20485454502F312E30200A.htmlHTTP/.
0A.
b=str(a)
b
\x00\x02\x157\xa2D\x00\xae\xf3R\xaa\xd1\x08\x00E\x00\x00C\x00\x01\x00\x00@\x06x<
\xc0
\xa8\x05\x15B#\xfa\x97\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02\x00
\xbb9\x00\x00GET/HTTP/\n\n'
c=Ether(b)
c
Etherdst=00:
02:
15:
37:
a2:
44src=00:
ae:
f3:
52:
aa:
d1type=0x800|<
IPversion=4L
ihl=5Ltos=0x0len=67id=1flags=frag=0Lttl=64proto=TCPchksum=0x783c
src=dst=options='
|<
TCPsport=20dport=80seq=0L
ack=0Ldataofs=5Lreserved=0Lflags=Swindow=8192chksum=0xbb39urgptr=0
options=[]|<
GET/HTTP/\n\n'
我们看到一个分解的数据包将其所有的字段填充。
那是因为我认为,附加有原始字符串的字段都有它自身的价值。
如果这太冗长,hide_defaults()方法将会删除具有默认值的字段:
()
c
0f:
66:
56:
fa:
d2src=00:
IPihl=5Llen=67
frag=0proto=TCPchksum=0x783csrc=dst=|<
TCPdataofs=5L
chksum=0xbb39options=[]|<
读取PCAP文件
你可以从PCAP文件中读取数据包,并将其写入到一个PCAP文件中。
a=rdpcap("
/spare/captures/"
UDP:
721TCP:
0ICMP:
0Other:
0>
图形转储(PDF,PS)
如果您已经安装PyX,您可以做一个数据包的图形PostScript/PDF转储(见下面丑陋的PNG图像,PostScript/PDF则具有更好的质量...)
a[423].pdfdump(layer_shift=1)
a[423].psdump("
/tmp/"
layer_shift=1)
命令效果
str(pkt)组装数据包
hexdump(pkt)十六进制转储
ls(pkt)显示出字段值的列表
()一行摘要
()针对数据包的展开试图
()显示聚合的数据包(例如,计算好了校验和)
()用数据包字段填充格式字符串
()改变payload的decode方式
()绘制一个解释说明的PostScript图表
()绘制一个解释说明的PDF
()返回可以生成数据包的Scapy命令
生成一组数据包
目前我们只是生成一个数据包。
让我们看看如何轻易地定制一组数据包。
整个数据包的每一个字段(甚至是网络层次)都可以是一组。
在这里隐含地定义了一组数据包的概念,意即是使用所有区域之间的笛卡尔乘积来生成的一组数据包。
a=IP(dst="
IPdst=Net('
)|>
[pforpina]
[<
IPdst=|>
<
<
]
b=IP(ttl=[1,2,(5,9)])
IPttl=[1,2,(5,9)]|>
[pforpinb]
IPttl=1|>
IPttl=2|>
IPttl=5|>
IPttl=6|>
IPttl=7|>
IPttl=8|>
IPttl=9|>
c=TCP(dport=[80,443])
[pforpina/c]
IPfrag=0proto=TCPdst=|<
TCPdport=80|>
TCPdport=443|>
某些操作(如修改一个数据包中的字符串)无法对于一组数据包使用。
在这些情况下,如果您忘记展开您的数据包集合,只有您忘记生成的列表中的第一个元素会被用于组装数据包。
summary()显示一个关于每个数据包的摘要列表
nsummary()同上,但规定了数据包数量
conversations()显示一个会话图表
show()显示首选表示(通常用nsummary())
filter()返回一个lambda过滤后的数据包列表
hexdump()返回所有数据包的一个hexdump
hexraw()返回所以数据包Rawlayer的hexdump
padding()返回一个带填充的数据包的hexdump
nzpadding()返回一个具有非零填充的数据包的hexdump
plot()规划一个应用到数据包列表的lambda函数
maketable()根据lambda函数来显示表格
发送数据包
现在我们知道了如何处理数据包。
让我们来看看如何发送它们。
send()函数将会在第3层发送数据包。
也就是说它会为你处理路由和第2层的数据。
sendp()函数将会工作在第2层。
选择合适的接口和正确的链路层协议都取决于你。
send(IP(dst="
)/ICMP())
.
Sent1packets.
sendp(Ether()/IP(dst="
ttl=(1,4)),iface="
eth1"
....
Sent4packets.
sendp("
I'
mtravellingonEthernet"
iface="
loop=1,inter=
................^C
Sent16packets.
sendp(rdpcap("
/tmp/pcapfile"
))#tcpreplay
...........
Sent11packets.
Fuzzing
fuzz()函数可以通过一个具有随机值、数据类型合适的对象,来改变任何默认值,但该值不能是被计算的(像校验和那样)。
这使得可以快速建立循环模糊化测试模板。
在下面的例子中,IP层是正常的,UDP层和NTP层被fuzz。
UDP的校验和是正确的,UDP的目的端口被NTP重载为123,而且NTP的版本被更变为4.其他所有的端口将被随机分组:
target"
)/fuzz(UDP()/NTP(version=4)),loop=1)
发送和接收数据包(sr)
现在让我们做一些有趣的事情。
sr()函数是用来发送数据包和接收应答。
该函数返回一对数据包及其应答,还有无应答的数据包。
sr1()函数是一种变体,用来返回一个应答数据包。
发送的数据包必须是第3层报文(IP,ARP等)。
srp()则是使用第2层报文(以太网,等)。
p=sr1(IP(dst="
)/ICMP()/"
XXXXXXXXXXX"
Beginemission:
...Finishedtosend1packets.
.*
Received5packets,got1answers,remaining0packets
p
IPversion=4Lihl=5Ltos=0x0len=39id=15489flags=frag=0Lttl=42proto=ICMP
chksum=0x51ddsrc=dst=options='
ICMPtype=echo-reply
code=0chksum=0xee45id=0x0seq=0x0|<
XXXXXXXXXXX'
Paddingload='
\x00\x00\x00\x00'
---[IP]---
version=4L
ihl=5L
tos=0x0
len=39
id=15489
flags=
frag=0L
ttl=42
proto=ICMP
chksum=0x51dd
src==='
---[ICMP]---
type=echo-reply
code=0
chksum=0xee45
id=0x0
seq=0x0
---[Raw]---
load='
---[Padding]---
DNS查询(rd
=recursiondesired)。
主机是我的DNS服务器。
注意从我Linksys来的非空填充具有Etherleak缺陷:
sr1(IP(dst="
)/UDP()/DNS(rd=1,qd=DNSQR(qname="
)))
Finishedtosend1packets.
..*
Received3packets,got1answers,remaining0packets
IPversion=4Lihl=5Ltos=0x0len=78id=0flags=DFfrag=0Lttl=64proto=UDPchksum=0xaf38
UDPsport=53dport=53len=58chksum=0xd55d
DNSid=0qr=1Lopcode=QUERYaa=0Ltc=0Lrd=1Lra=1Lz=0Lrcode=okqdcount=1ancount=1
nscount=0arcount=0qd=<
DNSQRqname='
qtype=Aqclass=IN|>
an=<
DNSRRrrname='
type=Arclass=INttl=3560Lrdata='
ns=0ar=0|<
\xc6\x94\xc7\xeb'
发送和接收函数族是scapy中的核心部分。
它们返回一对两个列表。
第一个就是发送的数据包及其应答组成的列表,第二个是无应答数据包组成的列表。
为了更好地呈现它们,它们被封装成一个对象,并且提供了一些便于操作的方法:
sr(IP(dst="
)/TCP(dport=[21,22,23]))
Received6packets,got3answers,remaining0packets
(<
Results:
0TCP:
3ICMP:
Unanswered:
ans,unans=_
IP/TCP>
S==>
Ether/IP/TCP>
RA/Padding
如果对于应答数据包有速度限制,你可以通过inter参数来设置两个数据包之间等待的时间间隔。
如果有些数据包丢失了,或者设置时间间隔不足以满足要求,你可以重新发送所有无应答数据包。
你可以简单地对无应答数据包列表再调用一遍函数,或者去设置retry参数。
如果retry设置为3,scapy会对无应答的数据包重复发送三次。
如果retry设为-3,scapy则会一直发送无应答的数据包,直到。
timeout参数设置在最后一个数据包发出去之后的等待时间:
SYNScans
在Scapy提示符中执行一下命令,可以对经典的SYNScan初始化:
)/TCP(dport=80,flags="
S"
))
以上向Google的80端口发送了一个SYN数据包,会在接收到一个应答后退出:
.Finishedtosend1packets.
*
Received2packets,got1answers,remaining0packets
IPversion=4Lihl=5Ltos=0x20len=44id=33529flags=frag=0Lttl=244
proto=TCPchksum=0x6a34src=dst=options=.....*.**.......Finishedtosend9packets.
**.*.*..*..................
Received362packets,got8answers,remaining1packets
(
...lambda(s,r):
,
...("
{TCP:
%%}{ICMP:
%%-%%}"
-dest-unreachRA-
80SARASA
443SASASA
在以上的例子中,如果接收到作为响应的ICMP数据包而不是预期的TCP数据包,就会打印出ICMP差错类型(errortype)。
对于更大型的扫描,我们可能对某个响应感兴趣,下面的例子就只显示设置了"
SA"
标志位的数据包:
(lfilter=lambda(s,r):
("
%%"
)=="
0003IP/TCP>
S======>
IP/TCP>
SA
如果我们想对响应进行专业分析,我们可以使用使用以下的命令显示哪些端口是open的:
prn=lambda(s,r):
("
%%isopen"
httpsisopen
对于更大型的扫描,我们可以建立一个端口开放表:
(lambda(s,r):
TCPinrandr[TCP].flags&
2).make_table(lambda(s,r):
...,,"
X"
X-X
443XXX
如果以上的方法还不够,Scapy还包含一个report_ports()函数,该函数不仅可以自动化SYNscan,而且还会对收集的结果以LaTeX形式输出:
report_ports("
(440,443))
...*.**Finishedtosend4packets.
Received8packets,got4answers,remaining0packets
\\begin{tabular}{|r|l|l|}\n\\hline\nhttps&
open&
SA\\\\\n\\hline\n440
&
closed&
TCPRA\\\\\n441&
TCPRA\\\\\n442&
TCPRA\\\\\n\\hline\n\\hline\n\\end{tabular}\n'
TCPtraceroute
TCP路由追踪:
ans,unans=sr(IP(dst=target,ttl=(4,25),id=RandShort())/TCP(flags=0x2))
*****.******.*.***..*.**Finishedtosend22packets.
***......
Received33packets,got21answers,remaining1packets
forsnd,rcvinans:
...print,,isinstance,TCP)
...
50
60
40
70
80
90
100
110
130
120
140
150
160
170
180
191
201
211
221
231
241
注意:
TCP路由跟踪和其他高级函数早已被构造好了:
lsc()
sr:
Sendandreceivepacketsatlayer3
sr1:
Sendpacketsatlayer3andreturnonlythefirstanswer
srp:
Sendandreceivepacketsatlayer2
srp1:
Sendandreceivepacketsatlayer2andreturnonlythefirstanswer
srloop:
Sendapacketatlayer3inloopandprinttheanswereachtime
srploop:
Sendapacketatlayer2inloopandprinttheanswereachtime
sniff:
Sniffpackets
p0f:
PassiveOSfingerprinting:
whichOSemittedthisTCPSYN?
arpcachepoison:
Poisontarget'
scachewith(yourMAC,victim'
sIP)couple
send:
Sendpacketsatlayer3
sendp:
Sendpacketsatlayer