构建你自己的工具

译者:草帽小子_DJ

来源:Python Scapy(2.3.1)文档学习(五):构建自己的工具

原文:Build your own tools

协议:CC BY-NC-SA 2.5

你可以使用Scapy构建你自己的自动化工具。你也可以扩展Scapy而不必编辑它的源文件。如果你构建了一些有趣的工具,请捐献给我们的邮件列表。

在你的工具中使用Scapy

你可以很容易的在你的工具中使用Scapy,只需要导入你需要的便可以使用。

第一个例子是传入一个IP或者一个主机名作为参数,发送一个ICMP响应请求,然后显示返回包完整的构造。

  1. #! /usr/bin/env python
  2. import sys
  3. from scapy.all import sr1,IP,ICMP
  4. p=sr1(IP(dst=sys.argv[1])/ICMP())
  5. if p:
  6. p.show()

找个有一个更加灵活的例子,就是生成一个ARP的ping包,并用LaTeX格式报告它所发现的东西。

  1. #! /usr/bin/env python
  2. # arping2tex : arpings a network and outputs a LaTeX table as a result
  3. import sys
  4. if len(sys.argv) != 2:
  5. print "Usage: arping2tex <net>\n eg: arping2tex 192.168.1.0/24"
  6. sys.exit(1)
  7. from scapy.all import srp,Ether,ARP,conf
  8. conf.verb=0
  9. ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=sys.argv[1]),
  10. timeout=2)
  11. print r"\begin{tabular}{|l|l|}"
  12. print r"\hline"
  13. print r"MAC & IP\\"
  14. print r"\hline"
  15. for snd,rcv in ans:
  16. print rcv.sprintf(r"%Ether.src% & %ARP.psrc%\\")
  17. print r"\hline"
  18. print r"\end{tabular}"

这有另外一个工具,它将时刻监控机器上的所有的网卡并打印所有的ARP请求。即使是混杂模式下的无线网卡上的801.11数据帧。注意,sniffer()函数的参数store=0是为了避免将所有的数据包存储在内存。

  1. #! /usr/bin/env python
  2. from scapy.all import *
  3. def arp_monitor_callback(pkt):
  4. if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
  5. return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
  6. sniff(prn=arp_monitor_callback, filter="arp", store=0)

这里有一个生活中真实的例子,你可以参考WiFitap(http://sid.rstack.org/static/articles/w/i/f/Wifitap_EN_9613.html).

扩展Scapy

如果你想添加一些新的协议,新的函数,或者任何东西,你可以直接编辑Scapy的源代码。但是这是非常不方便的。即使这些修改将会整合到Scapy中去。可以更加方便的编写他们在单独的文件中。

一旦你这么做了,你可以启动Scapy并导入自己的文件,但是这还是不是很方便,另外一个能做到这一点的方法是让你文件执行并且调用Scapy的interact()函数。

  1. #! /usr/bin/env python
  2. # Set log level to benefit from Scapy warnings
  3. import logging
  4. logging.getLogger("scapy").setLevel(1)
  5. from scapy.all import *
  6. class Test(Packet):
  7. name = "Test packet"
  8. fields_desc = [ ShortField("test1", 1),
  9. ShortField("test2", 2) ]
  10. def make_test(x,y):
  11. return Ether()/IP()/Test(test1=x,test2=y)
  12. if __name__ == "__main__":
  13. interact(mydict=globals(), mybanner="Test add-on v3.14")

如果你运行上面的代码,便会得到下面的结果:

  1. # ./test_interact.py
  2. Welcome to Scapy (0.9.17.109beta)
  3. Test add-on v3.14
  4. >>> make_test(42,666)
  5. <Ether type=0x800 |<IP |<Test test1=42 test2=666 |>>>