scapy构造数据包总结

1.收发数据包函数

scapy模块中有好几个收发数据包的函数,他们能完成不同的功能:

  • send()  只发送而不接收数据包,并且网络层之下的都默认处理好了,只需传给它网络层之上(包括网络层)的参数即可
  • sendp()  只发送不接收,并且数据链路层之下的都处理好了,只需传给它数据链路层之上(包括数据联络层,最常用的是Ether)的参数
  • sr1()  发送完只接受1个响应包
  • sr()  发送完会返回2个列表,一个用来存收到的所以响应,另一个存未收到响应的数据包

2.发送ARP包

使用ls(ARP)查看scapy模块中的ARP类:

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()

注意:/ 用来连接不同层。

3.发送ICMP包

先看看IP类

ip

一般情况下只需要填写IP类的src,dst即源和目的地址即可。ICMP类的参数可以用同样方法查看。

发送ICMP包:

 

1

2

ans,unans = sr(IP(dst="192.168.1.108")/ICMP())

ans.show()

 

4.发送TCP包

TCP类如下:

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):

tcp2

如果没开放则返回flags为RA(RST/ACK):

tcp3

用这个原理也可以实现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>
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章