首页 > 代码库 > 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=22、数据操作>>> 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基础学习之一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。