scapy学习笔记(2)--包及包的定义
转载请注明:@小五义:http://www.cnblogs/xiaowuyi
一、包
包(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。其主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成,包括包头和包体,包头是固定长度,包体的长度不定,各字段长度固定,双方的请求数据包和应答数据包的包头结构是一致的,不同的是包体的定义。 数据包的结构与我们平常写信非常类似,目的IP地址是说明这个数据包是要发给谁的,相当于收信人地址;源IP地址是说明这个数据包是发自哪里的,相当于发信人地址;而净载数据相当于信件的内容。包沿着不同的路径在一个或多个网络中传输,并且在目的地重新组合。
二、常见的几个关键字
ICMP:Internet Control Message Protocol(Internet控制报文协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
DST:目的地址
SRC:源地址
TTL:(Time To Live ) 生存时间,指定数据包被路由器丢弃之前允许通过的网段数量。TTL是IP协议包中的一个值,它告诉网络,数据包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
三、scapy中常用的几个命令
1、ls():作用也是list show,可以显示所有支持的数据包对象。ls()可以不带参数,也可以带参数,参数可是任何一个具体的包。下面列出了一部分结果:
>>> from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
>>> ls()
ARP : ARP
ASN1_Packet : None
BOOTP : BOOTP
CookedLinux : cooked linux
DHCP : DHCP options
DHCP6 : DHCPv6 Generic Message)
DHCP6OptAuth : DHCP6 Option - Authentication
DHCP6OptBCMCSDomains : DHCP6 Option - BCMCS Domain Name List
DHCP6OptBCMCSServers : DHCP6 Option - BCMCS Addresses List
DHCP6OptClientFQDN : DHCP6 Option - Client FQDN
DHCP6OptClientId : DHCP6 Client Identifier Option
DHCP6OptDNSDomains : DHCP6 Option - Domain Search List option
DHCP6OptDNSServers : DHCP6 Option - DNS Recursive Name Server
DHCP6OptElapsedTime : DHCP6 Elapsed Time Option
DHCP6OptGeoConf : 列出TCP的所有对象:
>>> from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
>>> ls(TCP)
sport : ShortEnumField = (20)
dport : ShortEnumField = (80)
seq : IntField = (0)
ack : IntField = (0)
dataofs : BitField = (None)
reserved : BitField = (0)
flags : FlagsField = (2)
window : ShortField = (8192)
chksum : XShortField = (None)
urgptr : ShortField = (0)
options : TCPOptionsField = ({})
列出任意包的情况如:
>>> a=IP(ttl=5)
>>> a.src
'127.0.0.1'
>>> a
<IP ttl=5 |>
>>> a.dst
'127.0.0.1'
>>> a.dst="192.168.0.1"
>>> a
<IP ttl=5 dst=192.168.0.1 |>
>>> ls(a)
version : BitField = 4 (4)
ihl : BitField = None (None)
tos : XByteField = 0 (0)
len : ShortField = None (None)
id : ShortField = 1 (1)
flags : FlagsField = 0 (0)
frag : BitField = 0 (0)
ttl : ByteField = 5 (64)
proto : ByteEnumField = 0 (0)
chksum : XShortField = None (None)
src : Emph = '27.214.7.85' (None)
dst : Emph = '192.168.0.1' ('127.0.0.1')
options : PacketListField = [] ([])
>>>
2、lsc()列出所有函数。如:
>>> lsc()
arpcachepoison : Poison target's cache with (your MAC,victim's IP) couple
arping : Send ARP who-has requests to determine which hosts are up
bind_layers : Bind 2 layers on some specific fields' values
corrupt_bits : Flip a given percentage or number of bits from a string
corrupt_bytes : Corrupt a given percentage or number of bytes from a string
defrag : defrag(plist) -> ([not fragmented], [defragmented],
defragment : defrag(plist) -> plist defragmented as much as possible
dyndns_add : Send a DNS add message to a nameserver for "name" to have a new "rdata"
dyndns_del : Send a DNS delete message to a nameserver for "name"
etherleak : Exploit Etherleak flaw
fragment : Fragment a big IP datagram
fuzz : Transform a layer into a fuzzy layer by replacing some default values by random objects
getmacbyip : Return MAC address corresponding to a given IP address
hexdiff : Show differences between 2 binary strings
hexdump : --
hexedit : --
is_promisc : Try to guess if target is in Promisc mode. The target is provided by its ip.
linehexdump : --
ls : List available layers, or infos on a given layer
promiscping : Send ARP who-has requests to determine which hosts are in promiscuous mode
rdpcap : Read a pcap file and return a packet list
send : Send packets at layer 3
sendp : Send packets at layer 2
sendpfast : Send packets at layer 2 using tcpreplay for performance
sniff : Sniff packets
split_layers : Split 2 layers previously bound
sr : Send and receive packets at layer 3
sr1 : Send packets at layer 3 and return only the first answer
srbt : send and receive using a bluetooth socket
srbt1 : send and receive 1 packet using a bluetooth socket
srflood : Flood and receive packets at layer 3
srloop : Send a packet at layer 3 in loop and print the answer each time
srp : Send and receive packets at layer 2
srp1 : Send and receive packets at layer 2 and return only the first answer
srpflood : Flood and receive packets at layer 2
srploop : Send a packet at layer 2 in loop and print the answer each time
traceroute : Instant TCP traceroute
tshark : Sniff packets and print them calling pkt.show(), a bit like text wireshark
wireshark : Run wireshark on a list of packets
wrpcap : Write a list of packets to a pcap file
3、hide_defaults()方法,用来删除一些用户提供的那些和default value相同的项目
>>> a=IP()/TCP()
>>> b=IP(str(a))
>>> b
<IP version=4L ihl=5L tos=0x0 len=40 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x7ccd src=127.0.0.1 dst=127.0.0.1 options=[] |<TCP sport=ftp_data dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x917c urgptr=0 |>>
>>> b.hide_defaults()
>>> b
<IP ihl=5L len=40 frag=0 proto=tcp chksum=0x7ccd src=127.0.0.1 |<TCP dataofs=5L chksum=0x917c |>>
4、display():display()方法可以简单查看当前packet的各个参数的取值情况,例子见下。
5、sprintf:输出某一层某个参数的取值,如果不存在就输出??,具体的format是:%[[mt][r],][layer[:nb].]field%,参数的具体信息请参看《Security Power Tools》146页或者http://wikicode.net。例:
>>> a=IP()/TCP()
>>> b=IP(str(a))
>>> b
<IP version=4L ihl=5L tos=0x0 len=40 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x7ccd src=127.0.0.1 dst=127.0.0.1 options=[] |<TCP sport=ftp_data dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0x917c urgptr=0 |>>
>>> b.hide_defaults()
>>> b
<IP ihl=5L len=40 frag=0 proto=tcp chksum=0x7ccd src=127.0.0.1 |<TCP dataofs=5L chksum=0x917c |>>
>>> a.sprintf("%IP.gabuzomeu%")
'??'
四、创建包
scapy的包创建是按照网络接口层,互联网层,传输层,应用层四层参考模型来完成,各个层都有各自的创建函数,比如IP(),TCP(),UDP()等等,不同层之间通过“/”来连接。例如 ,接前面a的例子:
例1
>>> a=IP(ttl=5)
>>> a.src
'127.0.0.1'
>>> a
<IP ttl=5 |>
>>> a.dst
'127.0.0.1'
>>> a.dst="192.168.0.1"
>>> a
<IP ttl=5 dst=192.168.0.1 |>
>>> packet1=a
>>> packet1
<IP ttl=5 dst=192.168.0.1 |>
例2
>>> packet2=IP(dst="192.168.0.1")/TCP(dport=80)
例3
>>> packet3=IP(dst="www.baidu.com")/ICMP()
>>> packet3
<IP frag=0 proto=icmp dst=Net('www.baidu.com') |<ICMP |>>
>>> ls(packet3)
version : BitField = 4 (4)
ihl : BitField = None (None)
tos : XByteField = 0 (0)
len : ShortField = None (None)
id : ShortField = 1 (1)
flags : FlagsField = 0 (0)
frag : BitField = 0 (0)
ttl : ByteField = 64 (64)
proto : ByteEnumField = 1 (0)
chksum : XShortField = None (None)
src : Emph = '27.214.7.85' (None)
dst : Emph = Net('www.baidu.com') ('127.0.0.1')
options : PacketListField = [] ([])
--
type : ByteEnumField = 8 (8)
code : MultiEnumField = 0 (0)
chksum : XShortField = None (None)
id : ConditionalField = 0 (0)
seq : ConditionalField = 0 (0)
ts_ori : ConditionalField = 4842323 (4842323)
ts_rx : ConditionalField = 4842323 (4842323)
ts_tx : ConditionalField = 4842323 (4842323)
gw : ConditionalField = '0.0.0.0' ('0.0.0.0')
ptr : ConditionalField = 0 (0)
reserved : ConditionalField = 0 (0)
addr_mask : ConditionalField = '0.0.0.0' ('0.0.0.0')
unused : ConditionalField = 0 (0)
例4
>>> target="www.baidu.com/30"
>>> ip=IP(dst=target)
>>> ip
<IP dst=Net('www.baidu.com/30') |>
>>> ls(ip)
version : BitField = 4 (4)
ihl : BitField = None (None)
tos : XByteField = 0 (0)
len : ShortField = None (None)
id : ShortField = 1 (1)
flags : FlagsField = 0 (0)
frag : BitField = 0 (0)
ttl : ByteField = 64 (64)
proto : ByteEnumField = 0 (0)
chksum : XShortField = None (None)
src : Emph = '27.214.7.85' (None)
dst : Emph = Net('www.baidu.com/30') ('127.0.0.1')
options : PacketListField = [] ([])
>>> IP().display()
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = ip
chksum = None
src = 127.0.0.1
dst = 127.0.0.1
\options \ >>> TCP().display()
###[ TCP ]###
sport = ftp_data
dport = http
seq = 0
ack = 0
dataofs = None
reserved = 0
flags = S
window = 8192
chksum = None
urgptr = 0
options = {}
这里的display()方法可以简单查看当前packet的各个参数的取值情况.
五、包的结构
在Scapy中,scapy为各个层都写了类,使用时,只需要将其实例化,调用类的方法或者改变类的参数取值。如IP()没有传给它参数,那么它的参数就是默认的,如果传了就覆盖了默认值:
>>> a=IP()
>>> a.display()
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = ip
chksum = None
src = 127.0.0.1
dst = 127.0.0.1
\options \
>>> a=IP(dst="192.168.0.1")
>>> a.display()
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = ip
chksum = None
src = 27.214.7.** //(本机IP)
dst = 192.168.0.1
\options \ 注意比较这两次display()的不同,第一次是默认值,第二次传入了“192.168.0.1”。
"/"用来连接各层,如IP()/TCP()。如:
>>> IP()
<IP |>
>>> IP()/TCP()
<IP frag=0 proto=tcp |<TCP |>>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=tcp |<TCP |>>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
<IP frag=0 proto=tcp |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>
>>> Ether()/IP()/IP()/UDP()
<Ether type=0x800 |<IP frag=0 proto=ipencap |<IP frag=0 proto=udp |<UDP |>>>>
>>> IP(proto=55,ttl=10)/TCP()
<IP frag=0 ttl=10 proto=55 |<TCP |>>
具体的参数传递过程,在scapy文档中提供了图表,如下:

scapy学习笔记(2)--包及包的定义的更多相关文章
- java jvm学习笔记七(jar包的代码认证和签名)
		
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
 - Python学习笔记之模块与包
		
一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...
 - mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)
		
下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...
 - JavaScript学习笔记(七)——函数的定义与调用
		
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
 - 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
		
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
 - scapy学习笔记(3)发送包,SYN及TCP traceroute 扫描
		
转载请注明:@小五义:http://www.cnblogs/xiaowuyi 在安装完scapy(前两篇笔记有介绍)后,linux环境下,执行sudo scapy运行scapy. 一.简单的发送包 1 ...
 - netty权威指南学习笔记三——TCP粘包/拆包之粘包现象
		
TCP是个流协议,流没有一定界限.TCP底层不了解业务,他会根据TCP缓冲区的实际情况进行包划分,在业务上,一个业务完整的包,可能会被TCP底层拆分为多个包进行发送,也可能多个小包组合成一个大的数据包 ...
 - Android自动化学习笔记:获取APK包名的几种方法
		
---------------------------------------------------------------------------------------------------- ...
 - 【jqGrid for ASP.NET MVC Documentation】.学习笔记.3.本地化语言包
		
1 引用本地化语言包 在 js/i18n 文件夹中,提供了大量预定义的语言包.它包括为所有字符串定义的,包括消息,标题,分页信息,搜索/添加/删除 的对话框 文本等. 在jQuery库文件后,在jqG ...
 
随机推荐
- php根据命令行参数生成配置文件
			
像npm, composer等工具,在开始使用的使用,都需要初始化项目,生成一个项目的配置文件.这种功能的原理是怎么实现的呢? 比如: D:\>npm init --yes Wrote to D ...
 - HDU4289(KB11-I 最小割)
			
Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
 - div阴影
			
.box-shadow{ //Firefox4.0- -moz-box-shadow:投影方式 X轴偏移量 Y轴偏移量阴影模糊半径 阴影扩展半径 阴影颜色; //Safariand Google ch ...
 - BZOJ2956: 模积和(数论分块)
			
题意 题目链接 Sol 啊啊这题好恶心啊,推的时候一堆细节qwq \(a \% i = a - \frac{a}{i} * i\) 把所有的都展开,直接分块.关键是那个\(i \not= j\)的地方 ...
 - 解除mysql只有本机可以访问的限制
			
1.终端:sudo vim /etc/mysql/my.cnf 2.找到bind-address,注释掉(前面加#) 这里出现问题,发现my.cnf打开根本没有bind-address,但是多了两句话 ...
 - 关于Web中列表页面的加载问题
			
2017年5月23日,天气晴朗.尽管昨晚睡的不踏实,好在今天心情还不是很糟糕,近来事情颇多,尤其是对于TA的改变,至少目前还是没有习惯,但时间将会解决一切,这点深有体会.此时此刻,又想起了苏东坡的那首 ...
 - hibernate动态表名映射
			
引自:http://blog.csdn.net/xvshu/article/details/39187779 最近的一个项目有一个需求,有N个考核单位,要对每个考核单位生成一张考核情况表,这样做的目的 ...
 - php递归获取无限分类菜单
			
从数据库获取所有菜单信息,需要根据id,pid字段获取主菜单及其子菜单,以及子菜单下的子菜单,可以通过函数递归来实现. <?php class Menu { public $menu = arr ...
 - KCF的弊端
			
一.前情提要 如果你对目标跟踪和KCF是什么东西还不了解的话欢迎你看前一篇博文KCF入门详解:https://www.cnblogs.com/jins-note/p/10215511.html ...
 - 使用CSS 3创建不规则图形
			
前言 CSS 创建复杂图形的技术即将会被广泛支持,并且应用到实际项目中.本篇文章的目的是为大家开启它的冰山一角.我希望这篇文章能让你对不规则图形有一个初步的了解. 现在,我们已经可以使用CSS 3 常 ...