Scapy基础学习之一

关于Scapy

Scapy的是一个强大的交互式数据包处理程序(使用python编写)。它能够伪造或者解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等等。它可以很容易地处理一些典型操作,比如端口扫描,tracerouting,探测,单元测试,攻击或网络发现(可替代hping,NMAP,arpspoof,ARP-SK,arping,tcpdump,tethereal,P0F等)。最重要的他还有很多更优秀的特性——发送无效数据帧、注入修改的802.11数据帧、在WEP上解码加密通道(VOIP)、ARP缓存攻击(VLAN)等,这也是其他工具无法处理完成的。

安装Scapy

这里我没有使用安装包进行安装,而是直接使用 命令 apt-get install python-scapy,根据提示安装相应的数据包,这里我使用的ubuntu 14.04,使用的安装包如下:

tcpreplay  graphviz    imagemagick   python-gnuplot    python-pyx    ebtables   python-visual sox xpdf gv hexer librsvg2-binp

>>> conf.verb=2

ython-pcapy

安装完毕后测试结果如下:

[email protected]:~/wmw/scapy/test$ sudo scapy
Welcome to Scapy (2.2.0)
>>> IP()
<IP  |>
>>> target="www.baidu.com"
>>> ip=IP(dst=target)
>>> ip
<IP  dst=Net('www.baidu.com') |>
>>> [p for p in ip]
[<IP  dst=180.97.33.107 |>]
>>>

Scapy的使用特性

1、conf 变量保存了配置信息

>>> conf
ASN1_default_codec = <ASN1Codec BER[1]>
AS_resolver = <scapy.as_resolvers.AS_resolver_multi instance at 0xb5fd4c0c>
BTsocket   = <BluetoothL2CAPSocket: read/write packets on a connected L2CAP ...
L2listen   = <L2ListenSocket: read packets at layer 2 using Linux PF_PACKET ...
L2socket   = <L2Socket: read/write packets at layer 2 using Linux PF_PACKET ...
L3socket   = <L3PacketSocket: read/write packets at layer 3 using Linux PF_P...
auto_fragment = 1
checkIPID  = 0
checkIPaddr = 1
checkIPsrc = 1
check_TCPerror_seqack = 0
color_theme = <RastaTheme>
commands   = arpcachepoison : Poison target's cache with (your MAC,victim's ...
debug_dissector = 0
debug_match = 0
default_l2 = <class 'scapy.packet.Raw'>
emph       = <Emphasize []>
ethertypes = </etc/ethertypes/ ATMMPOA RAW_FR DNA_DL ATMFATE ATALK BPQ X25 P...
except_filter = ''
extensions_paths = '.'
histfile   = '/home/walfred/.scapy_history'
iface      = 'eth0'
iface6     = 'eth0'
interactive = True
interactive_shell = ''
ipv6_enabled = True
l2types    = 0x1 <- Dot3 (802.3) 0x1 <-> Ether (Ethernet) 0xc -> IP (IP) 0x1...
l3types    = 0x3 -> IP (IP) 0x800 <-> IP (IP) 0x806 <-> ARP (ARP) 0x86dd <->...
layers     = Packet : None NoPayload : None Raw : Raw Padding : Padding ASN1...
load_layers = ['l2', 'inet', 'dhcp', 'dns', 'dot11', 'gprs', 'hsrp', 'inet6'...
logLevel   = 20
manufdb    = </usr/wireshark/wireshark/manuf/ >
mib        = <MIB/ >
neighbor   = Ether -> Dot1Q Ether -> IP Dot3 -> LLC Dot3 -> SNAP Dot3 -> IP ...
netcache   = arp_cache: 0 valid items. Timeout=120s in6_neighbor: 0 valid it...
noenum     = <Resolve []>
padding    = 1
prog       = display = 'display' dot = 'dot' hexedit = 'hexer' pdfreader = '...
promisc    = 1
prompt     = '>>> '
protocols  = </etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip rohc ipv6_o...
raw_layer  = <class 'scapy.packet.Raw'>
raw_summary = False
readfunc   = None
resolve    = <Resolve []>
route      = Network Netmask Gateway Iface Output IP 127.0.0.0 255.0.0.0 0.0...
route6     = Destination Next Hop iface src candidates 2400:dd01:3000:10::/6...
services_tcp = </etcrvices-tcp/ kpop zabbix_trapper noclog svn cmip_man b...
services_udp = </etcrvices-udp/ zabbix_trapper noclog cmip_man z3950 root...
session    = ''
sniff_promisc = 1
stats_classic_protocols = [<class 'scapy.layers.inet.TCP'>, <class 'scapy.la...
stats_dot11_protocols = [<class 'scapy.layers.inet.TCP'>, <class 'scapy.laye...
stealth    = 'not implemented'
temp_files = []
teredoPrefix = '2001::'
teredoServerPort = 3544
use_dnet   = False
use_pcap   = False
verb       = 1
version    = '2.2.0'
warning_threshold = 5
wepkey     = ''
>>>

更改这些配置信息也比较方便:比如修改verb属性

>>> conf.verb=2

2、数据操作

>>> IP()
<IP  |>
>>> test_ip=IP(dst="192.168.115.188")<span style="font-family: Arial, Helvetica, sans-serif;">          </span>
>>> test_ip.dst
'192.168.115.188'
>>> test_ip.ttl
64
>>> test_ip.ttl=32    修改ttl值
>>> test_ip
<IP  ttl=32 dst=192.168.115.188 |>
>>> del(test_ip.ttl)  删除tt值
>>> test_ip
<IP  dst=192.168.115.188 |>
>>> test_ip.ttl       恢复了默认的ttl值
64


<div> >>> test_tcp=TCP()
>>> test_tcp.flags
2
>>> test_tcp.flags="SA"
>>> test_tcp.flags
18
>>> test_tcp
<TCP  flags=SA |>
>>> test_tcp.flags=23
>>> test_tcp
<TCP  flags=FSRA |>
>>> i=IP(flags="DF+MF")
>>> i.flags
3
>>> i.flags=6
>>> i
<IP  flags=DF+evil |>
>>>  </div>
<div> >>> test_ip.src
'192.168.115.198'
>>> test_ip.dst
'192.168.115.188'
>>> del(test_ip.dst)                         注意删除后的变化
>>> test_ip.dst
'127.0.0.1'
>>> test_ip.src
'127.0.0.1'
>>> test_ip.dst="192.168.115.188"             重新设定目标地址
>>> test_ip.src
'192.168.115.198'
>>>  </div>
<span style="font-size:18px;">注:以下的“/”符号表示两个链路层的组合。这样</span><span style="font-size:18px;">下层可以层重载上一层的默认值或多个字段值。</span>
<span style="font-size:18px;"></span><div><span style="color:#ff0000;"> >>> IP()</span>
<IP  |></div><div>
<span style="color:#ff0000;">>>> IP()/TCP()</span>
<IP  frag=0 proto=tcp |<TCP  |>></div><div>
</div><div><span style="font-family: monospace;font-size:18px; white-space: pre; background-color: rgb(240, 240, 240);">>>> IP(proto=55)/TCP()</span><br style="font-family: monospace;font-size:18px; white-space: pre; background-color: rgb(240, 240, 240);" /><span style="font-family: monospace;font-size:18px; white-space: pre; background-color: rgb(240, 240, 240);"><IP  frag=0 proto=55 |<TCP  |>> </span>
</div><div>
<span style="color:#ff0000;">>>> Ether()/IP()/TCP()</span>
<Ether  type=IPv4 |<IP  frag=0 proto=tcp |<TCP  |>>></div><div>
<span style="color:#ff0000;">>>> IP()/TCP()/"GET /HTTP/1.0\r\n\r\n"     数据部分可以直接使用字符串</span>
<IP  frag=0 proto=tcp |<TCP  |<Raw  load='GET /HTTP/1.0\r\n\r\n' |>>>  </div><div>
<span style="color:#ff0000;">>>> Ether()/IP()/UDP()</span>
<Ether  type=IPv4 |<IP  frag=0 proto=udp |<UDP  |>>></div><div>
<span style="color:#ff0000;">>>> Ether()/IP()/IP()/UDP()</span>
<Ether  type=IPv4 |<IP  frag=0 proto=ipencap |<IP  frag=0 proto=udp |<UDP  |>>>>

</div><div>
</div><div><div><span style="color:#3333ff;"> >>> str(IP())</span>
'E\x00\x00\x14\x00\x01\x00\[email protected]\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
>>> IP(_)
<IP  version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=64 proto=hopopt chksum=0x7ce7 src=127.0.0.1 dst=127.0.0.1 |>
<span style="color:#3333ff;">>>> a=Ether()/IP(dst="<img src="file:///C:\Users\WLWAQ\AppData\Local\Temp\%[email protected]$ACOF(TYDYECOKVDYB.png" alt="" />www.baidu.com")/TCP()/"GET /index.html HTTP/1.0 \n\n"</span>
<span style="color:#3333ff;">>>> hexdump(a)</span>
0000   00 03 0F 19 6A 49 08 00  27 FE D8 12 08 00 45 00   ....jI..'.....E.
0010   00 43 00 01 00 00 40 06  70 78 C0 A8 73 C6 B4 61   [email protected]
0020   21 6C 00 14 00 50 00 00  00 00 00 00 00 00 50 02   !l...P........P.
0030   20 00 B3 75 00 00 47 45  54 20 2F 69 6E 64 65 78    ..u..GET /index
0040   2E 68 74 6D 6C 20 48 54  54 50 2F 31 2E 30 20 0A   .html HTTP/1.0 .
0050   0A                                                 .
<span style="color:#3333ff;">>>> b=str(a)
>>> b</span>
"\x00\x03\x0f\x19jI\x08\x00'\xfe\xd8\x12\x08\x00E\x00\x00C\x00\x01\x00\[email protected]\x06px\xc0\xa8s\xc6\xb4a!l\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb3u\x00\x00GET /index.html HTTP/1.0 \n\n"
<span style="color:#3333ff;">>>> c=Ether(b)
>>> c</span>
<Ether  dst=00:03:0f:19:6a:49 src=08:00:27:fe:d8:12 type=IPv4 |<IP  version=4L ihl=5L tos=0x0 len=67 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x7078 src=192.168.115.198 dst=180.97.33.108 options=[] |<TCP  sport=ftp_data dport=http seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0xb375 urgptr=0 options=[] |<Raw  load='GET /index.html HTTP/1.0 \n\n' |>>>>
</div>
</div><div><div><span style="color:#3333ff;"> >>> c.hide_defaults()</span>  如果觉得过于冗长,可以使用这个函数隐藏
<span style="color:#3333ff;">>>> c</span>
<Ether  dst=00:03:0f:19:6a:49 src=08:00:27:fe:d8:12 type=IPv4 |<IP  ihl=5L len=67 frag=0 proto=tcp chksum=0x7078 src=192.168.115.198 dst=180.97.33.108 |<TCP  dataofs=5L chksum=0xb375 options=[] |<Raw  load='GET /index.html HTTP/1.0 \n\n' |>>>>
</div>
</div><div><div> >>> a=rdpcap("/mnt<img src="file:///C:\Users\WLWAQ\AppData\Local\Temp\UG9`@AH2%L{}S0N6}3E~FO2.gif" sysface="78" alt="" />/share/test1.cap")  我使用的wireshark,保存成pcap的格式
>>> a
<test1.cap: TCP:13 UDP:53 ICMP:4 Other:3>
>>> a[9].pdfdump(layer_shift=1)</div></div><div><div>>>> a[9].psdump("/mnt<img src="file:///C:\Users\WLWAQ\AppData\Local\Temp\UG9`@AH2%L{}S0N6}3E~FO2.gif" sysface="78" alt="" />/share/test1.eps",layer_shift=1) </div>
</div><div><img src="http://img.blog.csdn.net/20141013154705963?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ193YWxmcmVk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
</div><div>如何产生多个数据包</div><div><div> >>> a=IP(dst="<img src="file:///C:\Users\WLWAQ\AppData\Local\Temp\[5UQ[BL(6~BS2JV6W}N6[%S.png" alt="" />www.baidu.com/30")
>>> a
<IP  dst=Net('<img src="file:///C:\Users\WLWAQ\AppData\Local\Temp\[5UQ[BL(6~BS2JV6W}N6[%S.png" alt="" />www.baidu.com/30') |>
>>> [p for p in a]
[<IP  dst=180.97.33.104 |>, <IP  dst=180.97.33.105 |>, <IP  dst=180.97.33.106 |>, <IP  dst=180.97.33.107 |>]
>>> b=IP(ttl=[1,2,(5,9)])
>>> b
<IP  ttl=[1, 2, (5, 9)] |>
>>> [p for p in b]
[<IP  ttl=1 |>, <IP  ttl=2 |>, <IP  ttl=5 |>, <IP  ttl=6 |>, <IP  ttl=7 |>, <IP  ttl=8 |>, <IP  ttl=9 |>]
>>> c=TCP(dport=[80,443])
>>> [p for p in a/c]    产生多个数据包
[<IP  frag=0 proto=tcp dst=180.97.33.104 |<TCP  dport=http |>>,</div><div> <IP  frag=0 proto=tcp dst=180.97.33.104 |<TCP  dport=https |>>, </div><div> <IP  frag=0 proto=tcp dst=180.97.33.105 |<TCP  dport=http |>>,</div><div> <IP  frag=0 proto=tcp dst=180.97.33.105 |<TCP  dport=https |>>,</div><div> <IP  frag=0 proto=tcp dst=180.97.33.106 |<TCP  dport=http |>>,</div><div> <IP  frag=0 proto=tcp dst=180.97.33.106 |<TCP  dport=https |>>,</div><div> <IP  frag=0 proto=tcp dst=180.97.33.107 |<TCP  dport=http |>>,</div><div> <IP  frag=0 proto=tcp dst=180.97.33.107 |<TCP  dport=https |>>]
>>>  </div>
</div>

3、发送数据包

学习send/sendp/sr/sr1/srp  发送数据包函数使用

>>> send(IP(dst="192.168.115.188")/ICMP())  send函数工作在第三层
.
Sent 1 packets.
>>> sendp(Ether()/IP(dst="192.168.115.188",ttl=(1,4)),iface="eth0")
....
Sent 4 packets.
>>> sendp("hello ,i am walfred ",iface="eth0",loop=1,inter=0.2)  sendp函数工作在第二层,你可以选择网卡和协议
..................................................................................................................................................................................................................................................................................................................................^C
Sent 322 packets.
fuzz函数的作用:可以更改一些默认的不可以被计算的值(比如校验和checksums),更改的值是随机的,但是类型是符合字段的值的。比如下面的例子,结果如下图对比:
<div><div> >>> send(IP(dst="<img src="file:///C:\Users\WLWAQ\AppData\Local\Temp\%[email protected]$ACOF(TYDYECOKVDYB.png" alt="" />www.baidu.com")/UDP()/NTP(version=4),loop=2)  未使用fuzz()</div></div>

>>> send(IP(dst="www.baidu.com")/fuzz(UDP()/NTP(version=4)),loop=2)
使用fuzz()

SR()函数用来来发送数据包和接收响应。该函数返回有回应的数据包和没有回应的数据包;该函数也算得上是scapy的核心了,他会返回两个列表数据,一个是answer list 另一个是unanswered list

>>> sr(IP(dst="192.168.115.1")/TCP(dport=[21,22,23]))
Begin emission:
Finished to send 3 packets.
***
Received 3 packets, got 3 answers, remaining 0 packets
(<<span style="color:#ff0000;">Results</span>: TCP:3 UDP:0 ICMP:0 Other:0>, <<span style="color:#ff0000;">Unanswered</span>: TCP:0 UDP:0 ICMP:0 Other:0>)

<div><div>>>> ans,unans=_    这也是scapy的核心了,</div></div><div>>>> ans.show()
0000 IP / TCP 192.168.115.198:ftp_data > 192.168.115.1:ftp S ==> IP / TCP 192.168.115.1:ftp > 192.168.115.198:ftp_data RA / Padding
0001 IP / TCP 192.168.115.198:ftp_data > 192.168.115.1:ssh S ==> IP / TCP 192.168.115.1:ssh > 192.168.115.198:ftp_data RA / Padding
0002 IP / TCP 192.168.115.198:ftp_data > 192.168.115.1:telnet S ==> IP / TCP 192.168.115.1:telnet > 192.168.115.198:ftp_data SA / Padding </div>>>>sr(IP(dst="192.168.115.1")/TCP(dport=[21,22,23]),inter=0.5,retry=-2,timeout=1)  网络环境不好时,也可以追加inter retry timeout等附加信息,

函数sr1()是sr()一个变种,只返回应答发送的分组(或分组集)。这两个函数发送的数据包必须是第3层数据包(IP,ARP等)。而函数SRP()位于第2层(以太网,802.3,等)。

>>> p=sr1(IP(dst="192.168.115.188")/ICMP()/"test")
Begin emission:
.....Finished to send 1 packets.
.*
Received 7 packets, got 1 answers, remaining 0 packets
>>> p
<IP  version=4L ihl=5L tos=0x0 len=32 id=26000 flags= frag=0L ttl=128 proto=icmp chksum=0x6c79 src=192.168.115.188 dst=192.168.115.198 options=[] |<ICMP  type=echo-reply code=0 chksum=0x1826 id=0x0 seq=0x0 |<Raw  load='test' |<Padding  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>>
>>> p.show()
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 32
  id= 26000
  flags=
  frag= 0L
  ttl= 128
  proto= icmp
  chksum= 0x6c79
  src= 192.168.115.188
  dst= 192.168.115.198
  \options###[ ICMP ]###
     type= echo-reply
     code= 0
     chksum= 0x1826
     id= 0x0
     seq= 0x0
###[ Raw ]###
        load= 'test'
###[ Padding ]###
           load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

时间: 2024-10-05 12:42:50

Scapy基础学习之一的相关文章

蓝鸥零基础学习HTML5—html+css基础

蓝鸥零基础学习HTML5-html+css基础 一.课程目标 1.了解前端开发职位:2.掌握常用标签以及语义及用法:3.掌握常用css的特性,掌握基础布局技巧:4.掌握整站规划概念. 二.适用人群 零基础积极学习html5者 三.课程简介 本课程主要讲解了 html+css的基础知识,包括html模板.标签.css基础样式.布局.表格表单.整站等等,是进行前端开发的基础.Html+css是前端开发的基础,大部分前端开发工程都需要从html+css布局开始,html+css的基础非常重要,是前端开

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Linux新手入门书籍推荐 鸟哥的linux私房菜-基础学习篇

这本书写的不错.赞~\(≧▽≦)/~ 2017-02-24 下午,我开始在Linux下写第一个.c程序,在终端打印hello world.gcc 源代码文件之后,输出可执行文件,但是 当我输入文件名执行它的时候,却提示我 无法找到命令.于是我找百度,查资料,花了半个小时,终于找到解决方法了, 输入"./filename"即可.... 2017-02-25 我看<基础学习篇>这本书,在P158页下面的例题讲解中找到了昨天下午异常的解析.我就很是感慨,心想:要是早看这本书,半个

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

零基础学习 Hadoop 如何下手

想学习hadoop,可是苦于自己没有任何的基础,不知道该如何下手,也不知道自己能不能学会.其实零基础学习hadoop,没有想象的那么困难.曾经我也是一位小白,刚接触到云计算,想过培训,但是培训机构的选择也让我很纠结,就自己开始去摸索学习,现在我把自己的学习思路整理一下,希望对大家有帮助. 首先整体说一下学习过程给大家借鉴: 一.了解hadoop: 这里不具体阐述概念,有兴趣的同学可以自己上网去查.我们知道hadoop,有单机安装,伪分布安装和分布安装.同时hadoop的环境是Linux,所以我们

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

javascript基础学习(十五)

javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的secure 一.cookie介绍 cookie实际上就是一些信息,这些信息以文件的形式存储在客户端计算机上.在javascript中,cookie主要用来保存状态,或用于识别身份. 二.创建与获取cookie 创建cookie的语法代码如下所示:document.cookie="name=value&q

javascript基础学习(八)

javascript之日期对象 学习要点: 日期对象 将日期对象转换为字符串 将日期对象中的日期和时间转换为字符串 日期对象中的日期 日期对象中的时间 设置日期对象中的日期 设置日期对象中的时间 与毫秒相关的方法 一.日期对象 在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间. 日期对象的创建: new Date(); 二.将日期对象转换为字符串 将日期对象转换为字符串可以使用以下4种方法: date.toString();//将日期对象转换为字符串时,采