首页 > 代码库 > Scapy基础学习之一

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

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

walfred@walfred-VirtualBox:~/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 = http://www.mamicode.com/1>更改这些配置信息也比较方便:比如修改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.flags2>>> test_tcp.flags="SA">>> test_tcp.flags18>>> test_tcp<TCP  flags=SA |>>>> test_tcp.flags=23>>> test_tcp<TCP  flags=FSRA |>>>> i=IP(flags="DF+MF")>>> i.flags3>>> 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\x00@\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=http://www.mamicode.com/127.0.0.1 dst=127.0.0.1 |>>

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=http://www.mamicode.com/"file:///C:/Users/WLWAQ/AppData/Local/Temp/%W@GJ$ACOF(TYDYECOKVDYB.png" alt="" />www.baidu.com")/UDP()/NTP(version=4),loop=2)  未使用fuzz()
 >>> 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 / Padding0001 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 / Padding0002 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=http://www.mamicode.com/192.168.115.188 dst=192.168.115.198 options=[] |>>>>






Scapy基础学习之一