赞
踩
scapy模块中有好几个收发数据包的函数,他们能完成不同的功能:
使用ls(ARP)查看scapy模块中的ARP类:
发送ARP包:
1 2 3 4 5 6 | eth = Ether(src="bc:77:37:d7:cd:14",type=0x0806) arp = ARP(hwtype=0x1,ptype=0x0800,op=0x1,hwsrc="bc:77:37:d7:cd:14",\ psrc="192.168.1.107",pdst="192.168.1.108") package = eth/arp recv = srp1(package) recv.show() |
注意:/ 用来连接不同层。
先看看IP类
一般情况下只需要填写IP类的src,dst即源和目的地址即可。ICMP类的参数可以用同样方法查看。
发送ICMP包:
1 2 | ans,unans = sr(IP(dst="192.168.1.108")/ICMP()) ans.show() |
TCP类如下:
sport,dport是源和目的端口,flags可以设置SYN,FIN等一些标志。其他序列号之类的就不再多说。
发送TCP SYN数据包探测主机端口是否开放:
1 2 | recv = sr1(IP(dst="220.181.51.53")/TCP(dport=80,flags="S")) recv.show() |
如果端口开放则返回flags为SA(SYN/ACK):
如果没开放则返回flags为RA(RST/ACK):
用这个原理也可以实现SYN泛洪攻击,端口扫描器等等。另外,发送UDP和TCP类似。
一、进入scapy交互界面
在终端下输入:scapy ,进入交互界面:
二、查看scapy已经实现的网络协议
- ls() 列出scapy中已实现的网络协议
- ls(协议类型) 查看某个协议头部字段格式
- lsc() 列出scapy中可以使用的命令或函数,比如嗅探时,我们经常会用到sniff()函数
- IP().show() 显示包的IP信息
- IP().display() 显示包的模板
-
- dpkg = sniff(filter="tcp",count=4)
- dpkg[2].show() 显示包抓取到的tkpk的第3个数据包的的详细内容
- dpkg[2].summary() 查看捕获到数据包的信息摘要
-
- wrpcap("dpkgsniff.pcap",dpkg) 将嗅探到的packet内容写到pcap文件
- dpkg_read = rdpcap("dpkgsniff.pcap") 读取pcap文件
三、构造数据包
- #构造一个ip数据包
- dpkg = IP()
- #修改数据包的值
- dpkg.ttl = 24
- #构造一个ICMP数据包
- dpkg = ICMP()
- #构造一个TCP数据包
- dpkg = TCP()
通过“/”来表示网络中各个层的组合
- dpkg=Ether()/IP(dst="www.baidu.com")/TCP()/"GET /index.html HTTP/1.0 \n\n"
- dpkg.show()
- hexdump(dpkg)
sprintf()输出某一层某个参数的取值,如果不存在就输出”??”,具体的format格式是:%[[fmt][r],][layer[:nb].]field%
%[[fmt][r],][layer[:nb].]field%
layer: 协议层的名字,如Ether、IP、Dot11、TCP等。
filed: 需要显示的参数。
nb: 当有两个协议层有相同的参数名时,nb用于到达你想要的协议层。
r: 一个标志。当使用r标志时,意味着显示的是参数的原始值。
例如,TCP标志中使用人类可阅读的字符串’SA’表示SYN和ACK标志,而其原始值是18.
例子:pkt.sprintf("Etherent source: %Ether.src% IP src: %IP.src%")
或者:pkt.sprintf(
'%Raw.load%'
) #其中Raw为具体的协议层
显示具体的网络层的信息:
dpkg["IP"].show() 或者dpkg[IP].show() 也可以
- dpkg["TCP"].show()
- dpkg["Raw"].show()
- #或者等价于
- dpkg.getlayer(ip).show()
- dpkg.getlayer(TCP).show()
- dpkg.getlayer(Raw).show()
获取某个协议的具体字段值:
- dpkg["Raw"].load
- dpkg.getlayer(TCP).window
基本命令
ls()
List all available protocols and protocol options
lsc()
List all available scapy command functions
conf
Show/set scapy configuration parameters
生成数据包
# Setting protocol fields
>>> ip=IP(src="10.0.0.1")
>>> ip.dst="10.0.0.2"
# Combining layers
>>> l3=IP()/TCP()
>>> l2=Ether()/l3
# Splitting layers apart
>>> l2.getlayer(1)
<IP frag=0 proto=tcp |<TCP |>>
>>> l2.getlayer(2)
<TCP |>
显示数据包
# Show an entire packet
>>> (Ether()/IPv6()).show()
###[ Ethernet ]###
dst= ff:ff:ff:ff:ff:ff
src= 00:00:00:00:00:00
type= 0x86dd
###[ IPv6 ]###
version= 6
tc= 0
fl= 0
plen= None
nh= No Next Header
hlim= 64
src= ::1
dst= ::1
# Show field types with default values
>>> ls(UDP())
sport : ShortEnumField = 1025 (53)
dport : ShortEnumField = 53 (53)
len : ShortField = None (None)
chksum : XShortField = None (None)
指定地址和值(Specifying Addresses and Values)
指定IP值 Explicit IP address (use quotation marks)
>>> IP(dst="192.0.2.1")
指定域名 DNS name to be resolved at time of transmission
>>> IP(dst="example.com")
# IP network (results in a packet template)
>>> IP(dst="192.0.2.0/24")
随机生成ip和mac Random addresses with RandIP() and RandMAC()
>>> IP(dst=RandIP())
>>> Ether(dst=RandMAC())
指定TTL范围 Set a range of numbers to be used (template)
>>> IP(ttl=(1,30))
# Random numbers with RandInt() and RandLong()
>>> IP(id=RandInt())
发送包(Sending Packets)
send(pkt, inter=0, loop=0, count=1, iface=N)
发送三层包(Send one or more packets at layer three)
sendp(pkt, inter=0, loop=0, count=1, iface=N)
发送二层包(Send one or more packets at layer two)
sendpfast(pkt, pps=N, mbps=N, loop=0, iface=N)
Send packets much faster at layer two using tcpreplay
>>> send(IP(dst="192.0.2.1")/UDP(dport=53))
.Sent 1 packets.
>>> sendp(Ether()/IP(dst="192.0.2.1")/UDP(dport=53))
.Sent 1 packets.
发送和接受包(Sending and Receiving Packets)
sr(pkt, filter=N, iface=N), srp(…)
Send packets and receive replies
sr1(pkt, inter=0, loop=0, count=1, iface=N), srp1(…)
Send packets and return only the first reply
srloop(pkt, timeout=N, count=N), srploop(…)
Send packets in a loop and print each reply
>>> srloop(IP(dst="packetlife.net")/ICMP(), count=3)
RECV 1: IP / ICMP 174.143.213.184 > 192.168.1.140
RECV 1: IP / ICMP 174.143.213.184 > 192.168.1.140
RECV 1: IP / ICMP 174.143.213.184 > 192.168.1.140
嗅探包(Sniffing Packets)
sniff(count=0, store=1, timeout=N)
Record packets off the wire; returns a list of packets when stopped
# Capture up to 100 packets (or stop with ctrl-c)
>>> pkts=sniff(count=100, iface="eth0")
>>> pkts
<Sniffed: TCP:92 UDP:7 ICMP:1 Other:0>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。