• scapy
    • scapy安装
    • 简单使用

    scapy

    scapy是一个强大的python网络数据包处理库,它可以生成或解码网络协议数据包,可以用来端口扫描、探测、网络测试等。

    scapy安装

    1. pip install scapy

    简单使用

    scapy提供了一个简单的交互式界面,直接运行scapy命令即可进入。当然,也可以在python交互式命令行中导入scapy包进入

    1. from scapy.all import *

    查看所有支持的协议和预制工具:

    1. ls()
    2. lsc()

    构造IP数据包

    1. pkt=IP(dst="8.8.8.8")
    2. pkt.show()
    3. print pkt.dst # 8.8.8.8
    4. str(pkt) # hex string
    5. hexdump(pkt) # hex dump

    输出HEX格式的数据包

    1. import binascii
    2. from scapy.all import *
    3. a=Ether(dst="02:ac:10:ff:00:22",src="02:ac:10:ff:00:11")/IP(dst="172.16.255.22",src="172.16.255.11", ttl=10)/ICMP()
    4. print binascii.hexlify(str(a))

    TCP/IP协议的四层模型都可以分别构造,并通过/连接

    1. Ether()/IP()/TCP()
    2. IP()/TCP()
    3. IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
    4. Ether()/IP()/IP()/UDP()
    5. Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"

    从PCAP文件读入数据

    1. a = rdpcap("test.cap")

    发送数据包

    1. # 三层发送,不接收
    2. send(IP(dst="8.8.8.8")/ICMP())
    3. # 二层发送,不接收
    4. sendp(Ether()/IP(dst="8.8.8.8",ttl=10)/ICMP())
    5. # 三层发送并接收
    6. # 二层可以用srp, srp1和srploop
    7. result, unanswered = sr(IP(dst="8.8.8.8")/ICMP())
    8. # 发送并只接收第一个包
    9. sr1(IP(dst="8.8.8.8")/ICMP())
    10. # 发送多个数据包
    11. result=srloop(IP(dst="8.8.8.8")/ICMP(), inter=1, count=2)

    嗅探数据包

    1. sniff(filter="icmp", count=3, timeout=5, prn=lambda x:x.summary())
    2. a=sniff(filter="tcp and ( port 25 or port 110 )",
    3. prn=lambda x: x.sprintf("%IP.src%:%TCP.sport% -> %IP.dst%:%TCP.dport% %2s,TCP.flags% : %TCP.payload%"))

    SYN扫描

    1. sr1(IP(dst="172.217.24.14")/TCP(dport=80,flags="S"))
    2. ans,unans = sr(IP(dst=["192.168.1.1","yahoo.com","slashdot.org"])/TCP(dport=[22,80,443],flags="S"))

    TCP traceroute

    1. ans,unans=sr(IP(dst="www.baidu.com",ttl=(2,25),id=RandShort())/TCP(flags=0x2),timeout=50)
    2. for snd,rcv in ans:
    3. print snd.ttl,rcv.src,isinstance(rcv.payload,TCP)

    ARP Ping

    1. ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2)
    2. ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") )

    ICMP Ping

    1. ans,unans=sr(IP(dst="192.168.1.1-254")/ICMP())
    2. ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") )

    TCP Ping

    1. ans,unans=sr( IP(dst="192.168.1.*")/TCP(dport=80,flags="S") )
    2. ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") )