关于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. C# #pragma warning disable/restore

    #pragma warning 可以启用或禁用特定警告. 语法 #pragma warning disable warning-list #pragma warning restore warning ...

  2. java得到当前时间

    SimpleDateFormat timeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date ...

  3. SpringMVC的工作流程-005

    1.用户发送请求至前端控制器DispatcherServlet           2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.          3. ...

  4. Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符

    在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义.样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的差值误差,这样就避免了使用高阶多项式 ...

  5. 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...

  6. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  7. 【刷题】SPOJ 1812 LCS2 - Longest Common Substring II

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  8. 蒟蒻Orion还要学的东西!

    这个ID多元化真是个麻烦的事情...... 一会KamijouIndex一会dedicatus545一会Orion的,乱死了啊啊啊啊 数据结构 圆方树 ETT 仙人掌 可持久化树套树 数学 洲阁筛 m ...

  9. React中的高阶组件,无状态组件,PureComponent

    1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...

  10. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...