关于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

  1. >>> conf.verb=2

ython-pcapy

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

  1. walfred@walfred-VirtualBox:~/wmw/scapy/test$ sudo scapy
  2. Welcome to Scapy (2.2.0)
  3. >>> IP()
  4. <IP  |>
  5. >>> target="www.baidu.com"
  6. >>> ip=IP(dst=target)
  7. >>> ip
  8. <IP  dst=Net('www.baidu.com') |>
  9. >>> [p for p in ip]
  10. [<IP  dst=180.97.33.107 |>]
  11. >>>

Scapy的使用特性

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

  1. >>> conf
  2. ASN1_default_codec = <ASN1Codec BER[1]>
  3. AS_resolver = <scapy.as_resolvers.AS_resolver_multi instance at 0xb5fd4c0c>
  4. BTsocket   = <BluetoothL2CAPSocket: read/write packets on a connected L2CAP ...
  5. L2listen   = <L2ListenSocket: read packets at layer 2 using Linux PF_PACKET ...
  6. L2socket   = <L2Socket: read/write packets at layer 2 using Linux PF_PACKET ...
  7. L3socket   = <L3PacketSocket: read/write packets at layer 3 using Linux PF_P...
  8. auto_fragment = 1
  9. checkIPID  = 0
  10. checkIPaddr = 1
  11. checkIPsrc = 1
  12. check_TCPerror_seqack = 0
  13. color_theme = <RastaTheme>
  14. commands   = arpcachepoison : Poison target's cache with (your MAC,victim's ...
  15. debug_dissector = 0
  16. debug_match = 0
  17. default_l2 = <class 'scapy.packet.Raw'>
  18. emph       = <Emphasize []>
  19. ethertypes = </etc/ethertypes/ ATMMPOA RAW_FR DNA_DL ATMFATE ATALK BPQ X25 P...
  20. except_filter = ''
  21. extensions_paths = '.'
  22. histfile   = '/home/walfred/.scapy_history'
  23. iface      = 'eth0'
  24. iface6     = 'eth0'
  25. interactive = True
  26. interactive_shell = ''
  27. ipv6_enabled = True
  28. l2types    = 0x1 <- Dot3 (802.3) 0x1 <-> Ether (Ethernet) 0xc -> IP (IP) 0x1...
  29. l3types    = 0x3 -> IP (IP) 0x800 <-> IP (IP) 0x806 <-> ARP (ARP) 0x86dd <->...
  30. layers     = Packet : None NoPayload : None Raw : Raw Padding : Padding ASN1...
  31. load_layers = ['l2', 'inet', 'dhcp', 'dns', 'dot11', 'gprs', 'hsrp', 'inet6'...
  32. logLevel   = 20
  33. manufdb    = </usr/wireshark/wireshark/manuf/ >
  34. mib        = <MIB/ >
  35. neighbor   = Ether -> Dot1Q Ether -> IP Dot3 -> LLC Dot3 -> SNAP Dot3 -> IP ...
  36. netcache   = arp_cache: 0 valid items. Timeout=120s in6_neighbor: 0 valid it...
  37. noenum     = <Resolve []>
  38. padding    = 1
  39. prog       = display = 'display' dot = 'dot' hexedit = 'hexer' pdfreader = '...
  40. promisc    = 1
  41. prompt     = '>>> '
  42. protocols  = </etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip rohc ipv6_o...
  43. raw_layer  = <class 'scapy.packet.Raw'>
  44. raw_summary = False
  45. readfunc   = None
  46. resolve    = <Resolve []>
  47. route      = Network Netmask Gateway Iface Output IP 127.0.0.0 255.0.0.0 0.0...
  48. route6     = Destination Next Hop iface src candidates 2400:dd01:3000:10::/6...
  49. services_tcp = </etcrvices-tcp/ kpop zabbix_trapper noclog svn cmip_man b...
  50. services_udp = </etcrvices-udp/ zabbix_trapper noclog cmip_man z3950 root...
  51. session    = ''
  52. sniff_promisc = 1
  53. stats_classic_protocols = [<class 'scapy.layers.inet.TCP'>, <class 'scapy.la...
  54. stats_dot11_protocols = [<class 'scapy.layers.inet.TCP'>, <class 'scapy.laye...
  55. stealth    = 'not implemented'
  56. temp_files = []
  57. teredoPrefix = '2001::'
  58. teredoServerPort = 3544
  59. use_dnet   = False
  60. use_pcap   = False
  61. verb       = 1
  62. version    = '2.2.0'
  63. warning_threshold = 5
  64. wepkey     = ''
  65. >>>

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

  1. >>> conf.verb=2

2、数据操作

  1. >>> IP()
  2. <IP  |>
  3. >>> test_ip=IP(dst="192.168.115.188")<span style="font-family: Arial, Helvetica, sans-serif;">          </span>
  1. >>> test_ip.dst
  2. '192.168.115.188'
  3. >>> test_ip.ttl
  4. 64
  1. >>> test_ip.ttl=32    修改ttl值
  2. >>> test_ip
  3. <IP  ttl=32 dst=192.168.115.188 |>
  4. >>> del(test_ip.ttl)  删除tt值
  5. >>> test_ip
  6. <IP  dst=192.168.115.188 |>
  7. >>> test_ip.ttl       恢复了默认的ttl值
  8. 64
  1. >>> test_tcp=TCP()
  2. >>> test_tcp.flags
  3. 2
  4. >>> test_tcp.flags="SA"
  5. >>> test_tcp.flags
  6. 18
  7. >>> test_tcp
  8. <TCP  flags=SA |>
  9. >>> test_tcp.flags=23
  10. >>> test_tcp
  11. <TCP  flags=FSRA |>
  12. >>> i=IP(flags="DF+MF")
  13. >>> i.flags
  14. 3
  15. >>> i.flags=6
  16. >>> i
  17. <IP  flags=DF+evil |>
  18. >>>
  1. >>> test_ip.src
  2. '192.168.115.198'
  3. >>> test_ip.dst
  4. '192.168.115.188'
  5. >>> del(test_ip.dst)                         注意删除后的变化
  6. >>> test_ip.dst
  7. '127.0.0.1'
  8. >>> test_ip.src
  9. '127.0.0.1'
  10. >>> test_ip.dst="192.168.115.188"             重新设定目标地址
  11. >>> test_ip.src
  12. '192.168.115.198'
  13. >>>  </div>

注:以下的“/”符号表示两个链路层的组合。这样</span><span style="font-size:18px;">下层可以层重载上一层的默认值或多个字段值。

  1. >>> IP()
  2. <IP  |>
  3. >>>> IP()/TCP()
  4. <IP  frag=0 proto=tcp |<TCP  |>>
  5. >>>> IP(proto=55)/TCP()
  6. <IP  frag=0 proto=55 |<TCP  >>
  7. >>>> Ether()/IP()/TCP()
  8. <Ether  type=IPv4 |<IP  frag=0 proto=tcp |<TCP  |>>>
  9. >>>> IP()/TCP()/"GET /HTTP/1.0\r\n\r\n"     数据部分可以直接使用字符串
  10. <IP  frag=0 proto=tcp |<TCP  |<Raw  load='GET /HTTP/1.0\r\n\r\n' |>>>
  11. >>>> Ether()/IP()/UDP()
  12. <Ether  type=IPv4 |<IP  frag=0 proto=udp |<UDP  |>>>
  13. >>>> Ether()/IP()/IP()/UDP()
  14. <Ether  type=IPv4 |<IP  frag=0 proto=ipencap |<IP  frag=0 proto=udp |<UDP  |>>>>
  15. >>> str(IP())
  16. 'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
  17. >>> IP(_)
  18. <IP  version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=64 proto=hopopt
  19. chksum=0x7ce7 src=127.0.0.1 dst=127.0.0.1 |>
  20. >>> a=Ether()/IP(dst="www.baidu.com")/TCP()/"GET /index.html HTTP/1.0 \n\n"
  21. >>> hexdump(a)
  22. 0000   00 03 0F 19 6A 49 08 00  27 FE D8 12 08 00 45 00   ....jI..'.....E.
  23. 0010   00 43 00 01 00 00 40 06  70 78 C0 A8 73 C6 B4 61   .C....@.px..s..a
  24. 0020   21 6C 00 14 00 50 00 00  00 00 00 00 00 00 50 02   !l...P........P.
  25. 0030   20 00 B3 75 00 00 47 45  54 20 2F 69 6E 64 65 78    ..u..GET /index
  26. 0040   2E 68 74 6D 6C 20 48 54  54 50 2F 31 2E 30 20 0A   .html HTTP/1.0 .
  27. 0050   0A                                                 .
  28. >>> b=str(a)
  29. >>> b
  30. "\x00\x03\x0f\x19jI\x08\x00'\xfe\xd8\x12\x08\x00E\x00\x00C\x00\x01\x00\x00@\x06px
  31. \xc0\xa8s\xc6\xb4a!l\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb3u
  32. \x00\x00GET /index.html HTTP/1.0 \n\n"
  33. >>> c=Ether(b)
  34. >>> c
  35. <Ether  dst=00:03:0f:19:6a:49 src=08:00:27:fe:d8:12 type=IPv4 |<IP  version=4L
  36. ihl=5L tos=0x0 len=67 id=1 flags= frag=0L ttl=64 proto=tcp chksum=0x7078
  37. src=192.168.115.198 dst=180.97.33.108 options=[] |<TCP  sport=ftp_data dport=http
  38. seq=0 ack=0 dataofs=5L reserved=0L flags=S window=8192 chksum=0xb375 urgptr=0
  39. options=[] |<Raw  load='GET /index.html HTTP/1.0 \n\n' |>>>>
  40. >>> c.hide_defaults()  如果觉得过于冗长,可以使用这个函数隐藏
  41. >>> c
  42. <Ether  dst=00:03:0f:19:6a:49 src=08:00:27:fe:d8:12 type=IPv4 |<IP  ihl=5L len=67
  43. frag=0 proto=tcp chksum=0x7078 src=192.168.115.198 dst=180.97.33.108 |<TCP
  44. dataofs=5L chksum=0xb375 options=[] |<Raw  load='GET /index.html HTTP/1.0 \n\n' |
  45. >>>>
  46. >>> a=rdpcap("/mnt/share/test1.cap")  我使用的wireshark,保存成pcap的格式
  47. >>> a
  48. <test1.cap: TCP:13 UDP:53 ICMP:4 Other:3>
  49. >>> a[9].pdfdump(layer_shift=1)
  50. >>> a[9].psdump("/mnt/share/test1.eps",layer_shift=1)

  1. 如何产生多个数据包
  2. >>> a=IP(dst="www.baidu.com/30")
  3. >>> a
  4. <IP  dst=Net('www.baidu.com/30') |>
  5. >>> [p for p in a]
  6. [<IP  dst=180.97.33.104 |>, <IP  dst=180.97.33.105 |>, <IP  dst=180.97.33.106 |>,
  7. <IP  dst=180.97.33.107 |>]
  8. >>> b=IP(ttl=[1,2,(5,9)])
  9. >>> b
  10. <IP  ttl=[1, 2, (5, 9)] |>
  11. >>> [p for p in b]
  12. [<IP  ttl=1 |>, <IP  ttl=2 |>, <IP  ttl=5 |>, <IP  ttl=6 |>, <IP  ttl=7 |>, <IP
  13. ttl=8 |>, <IP  ttl=9 |>]
  14. >>> c=TCP(dport=[80,443])
  15. >>> [p for p in a/c]    产生多个数据包
  16. [<IP  frag=0 proto=tcp dst=180.97.33.104 |<TCP  dport=http |>>, <IP  frag=0
  17. proto=tcp dst=180.97.33.104 |<TCP  dport=https |>>,  <IP  frag=0 proto=tcp
  18. dst=180.97.33.105 |<TCP  dport=http |>>, <IP  frag=0 proto=tcp dst=180.97.33.105 |
  19. <TCP  dport=https |>>, <IP  frag=0 proto=tcp dst=180.97.33.106 |<TCP  dport=http |
  20. >>, <IP  frag=0 proto=tcp dst=180.97.33.106 |<TCP  dport=https |>>, <IP  frag=0
  21. proto=tcp dst=180.97.33.107 |<TCP  dport=http |>>, <IP  frag=0 proto=tcp
  22. dst=180.97.33.107 |<TCP  dport=https |>>]
  23. >>>

3、发送数据包

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

  1. >>> send(IP(dst="192.168.115.188")/ICMP())  send函数工作在第三层
  2. .
  3. Sent 1 packets.
  4. >>> sendp(Ether()/IP(dst="192.168.115.188",ttl=(1,4)),iface="eth0")
  5. ....
  6. Sent 4 packets.
  7. >>> sendp("hello ,i am walfred ",iface="eth0",loop=1,inter=0.2)  sendp函数工作在第二层,你可以选择网卡和协议
  8. ..................................................................................................................................................................................................................................................................................................................................^C
  9. Sent 322 packets.

fuzz函数的作用:可以更改一些默认的不可以被计算的值(比如校验和checksums),更改的值是随机的,但是类型是符合字段的值的。比如下面的例子,结果如下图对比:

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

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

SR()函数用来来发送数据包和接收响应。该函数返回有回应的数据包和没有回应的数据包;该函数也算得上是scapy的核心了,他会返回两个列表数据,一个是answer list 另一个是unanswered list
  1. >>> sr(IP(dst="192.168.115.1")/TCP(dport=[21,22,23]))
  2. Begin emission:
  3. Finished to send 3 packets.
  4. ***
  5. Received 3 packets, got 3 answers, remaining 0 packets
  6. Results: TCP:3 UDP:0 ICMP:0 Other:0>, Unanswered: TCP:0 UDP:0 ICMP:0 Other:0
  1. >>> ans,unans=_    这也是scapy的核心了
  2. >>> ans.show()
  3. 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
  4. 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
  5. 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
  6. >>>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,等)。

  1. >>> p=sr1(IP(dst="192.168.115.188")/ICMP()/"test")
  2. Begin emission:
  3. .....Finished to send 1 packets.
  4. .*
  5. Received 7 packets, got 1 answers, remaining 0 packets
  6. >>> p
  7. <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' |>>>>
  8. >>> p.show()
  9. ###[ IP ]###
  10. version= 4L
  11. ihl= 5L
  12. tos= 0x0
  13. len= 32
  14. id= 26000
  15. flags=
  16. frag= 0L
  17. ttl= 128
  18. proto= icmp
  19. chksum= 0x6c79
  20. src= 192.168.115.188
  21. dst= 192.168.115.198
  22. \options\
  23. ###[ ICMP ]###
  24. type= echo-reply
  25. code= 0
  26. chksum= 0x1826
  27. id= 0x0
  28. seq= 0x0
  29. ###[ Raw ]###
  30. load= 'test'
  31. ###[ Padding ]###
  32. load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

【转】关于Scapy的更多相关文章

  1. python脚本执行Scapy出现IPv6警告WARNING解决办法

    安装完scapy,写了脚本执行后执行: WARNING: No route found for IPv6 destination :: (no default route?) 原因是用 from sc ...

  2. Windows下使用scapy+python2.7实现对pcap文件的读写操作

    scapy在linux环境中对pcap文件进行操作非常方便,但在windows下,特别是在python2.7环境下却会碰到各种各样的依赖包无法使用的问题,最明显的可能就属dnet和pcap的pytho ...

  3. 使用它tshark分析pcap的例子以及scapy下载地址

    转一篇cisco工作人员使用tshark分析pcap的文章,以及scapy的下载地址 http://blogs.cisco.com/security/finding-a-needle-in-a-pca ...

  4. 安装scapy遇到的问题

    1. Mac平台 在mac上安装scapy可以说是困难重重,一来因为scapy实在有些小众和老旧,再加上安装说明文档都是python2.5 也没有详细说明一些安装问题. 折腾了大概三个小时之后终于解决 ...

  5. scapy 安装及简单测试

    关于scapy Scapy的是一个强大的交互式数据包处理程序(使用python编写).它能够伪造或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比如 ...

  6. Python模块(scapy)

    scapy scapy相当于linux的tcpdump的功能

  7. 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy

    四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结 ...

  8. 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy

    主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证   特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备)   2 ...

  9. 小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

    三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议 ...

  10. scapy流量嗅探简单使用

    官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html 参考链接:http://blog.csdn.net/Jeanphorn/ar ...

随机推荐

  1. shell基础练习题讲解

    1037774765 克隆 1.创建一个用户redhat,其ID号为1001,基本组为like(组ID为2002),附近租为linux. groupadd -g 2002 likegroupadd l ...

  2. 【bzoj3524】[Poi2014]Couriers 主席树

    题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...

  3. Flask的第一个应用

    Flask 是一个 Python 实现的 Web 开发微框架,微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展. 与Django功能上比较: Django:中间件,路由系统,视图(CBV ...

  4. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  5. 我的ACM参赛故事

    从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...

  6. bzoj1706: [Usaco2007 Nov]relays 奶牛接力跑 (Floyd+新姿势)

    题目大意:有t(t<=100)条无向边连接两点,求s到e刚好经过n(n<=10^7)条路径的最小距离. 第一反应分层图,但是一看n就懵逼了,不会写.看了题解之后才知道可以这么玩... 首先 ...

  7. 【单调队列】【P2627】 修剪草坪

    传送门 Wa这次竟然不是Uva的题 Description 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希 ...

  8. BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...

  9. OopenCV复习及函数深入理解(轮廓查询及绘图)

    核心函数:(后面标明号的,下面有解析) int cvFindContours(Iplimage* img,//这是输入函数,必须是8bit,单通道的图像---1 CvMemStorage* stora ...

  10. Qt ------- QByteArray操作注意

    使用QByteArray方法把数据存入QByteArray需要是char型数据,如果需要存入无符号8位数据,如下: QByteArray data; data[0] = 0xFF; 即使通过data[ ...