>>> a = rdpcap("/spare/captures/isakmp.cap") >>> a <isakmp.cap: UDP:721 TCP:0 ICMP:0 Other:0> # 或者 >>> a = sniff(offline="isakmp.cap")
1
>>> wrpcap("temp.cap", pkts)
使用 Scapy 进行嗅探
使用 Scapy 进行嗅探操作,最核心的函数即是 sniff。它有一些常用的入参,如下表所示:
参数
说明
count
需要捕获的包的个数,0 代表无限
store
是否需要存储捕获到的包
filter
指定嗅探规则过滤,遵循 BPF (伯克利封包过滤器)
timeout
指定超时时间
iface
指定嗅探的网络接口或网络接口列表,默认为 None,即在所有网络接口上嗅探
prn
传入一个可调用对象,将会应用到每个捕获到的数据包上,如果有返回值,那么它不会显示
offline
从 pcap 文件读取包数据而不是通过嗅探的方式获得
1 2 3 4 5 6 7 8
# 嗅探实例 >>> sniff(filter="tcp and port 80 and target www.acfun.cn", count=3) <Sniffed: TCP:3 UDP:0 ICMP:0 Other:0> >>> a = _ >>> a.nsummary() 0000 Ether / IP / TCP 10.0.3.173:62061 > 202.105.176.96:https A / Raw 0001 Ether / IP / TCP 202.105.176.96:https > 10.0.3.173:62061 A 0002 Ether / IP / TCP 10.0.3.173:57087 > 59.110.88.58:https PA / Raw
Scapy 使用实例
获取本机 IP 信息
一般网上给出的都是 socket 的方式,先获取计算机名,再根据计算机名获取 host 地址(即 IP 地址),现在使用 Scapy 可以直接构造 IP 数据包并获取其 src 的方式得到:
1 2
>>> a = IP(dst="www.baidu.com") >>> a.src
至于在 Windows 上需要知道自己具体的网卡信息以填入 iface 中,因此可以使用 show_interfaces() 函数获得。更多的内置函数可以通过 lsc() 函数查看。
IPID_count : Identify IP id values classes in a list of packets arpcachepoison : Poison target's cache with (your MAC,victim's IP) couple arping : Send ARP who-has requests to determine which hosts are up bind_layers : Bind 2 layers on some specific fields' values bridge_and_sniff : Forward traffic between interfaces if1 and if2, sniff and return chexdump : Build a per byte hexadecimal representation computeNIGroupAddr : Compute the NI group Address. Can take a FQDN as input parameter corrupt_bits : Flip a given percentage or number of bits from a string corrupt_bytes : Corrupt a given percentage or number of bytes from a string defrag : defrag(plist) -> ([not fragmented], [defragmented], defragment : defrag(plist) -> plist defragmented as much as possible dhcp_request : -- dyndns_add : Send a DNS add message to a nameserver for "name" to have a new "rdata" dyndns_del : Send a DNS delete message to a nameserver for "name" etherleak : Exploit Etherleak flaw fletcher16_checkbytes: Calculates the Fletcher-16 checkbytes returned as 2 byte binary-string. fletcher16_checksum : Calculates Fletcher-16 checksum of the given buffer. fragleak : -- fragleak2 : -- fragment : Fragment a big IP datagram fuzz : Transform a layer into a fuzzy layer by replacing some default values by random objects getmacbyip : Return MAC address corresponding to a given IP address getmacbyip6 : Returns the MAC address corresponding to an IPv6 address hexdiff : Show differences between 2 binary strings hexdump : Build a tcpdump like hexadecimal view hexedit : -- hexstr : -- import_hexcap : -- is_promisc : Try to guess if target is in Promisc mode. The target is provided by its ip. linehexdump : Build an equivalent view of hexdump() on a single line ls : List available layers, or infos on a given layer class or name neighsol : Sends an ICMPv6 Neighbor Solicitation message to get the MAC address of the neighbor with specified IPv6 address addr ...
ARP 主机发现
使用 ARP Ping 是在本地以太网内发现主机的最快的方法:
1 2 3 4
>>> ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="10.0.3.0/24"), timeout=2)
Ping of Death 俗称 “死拼”,其攻击原理是攻击者 A 向受害者 B 发送一些尺寸超大的 ICMP (Ping 命令使用的是 ICMP 报文)报文对其进行攻击(对于有些路由器或系统,在接收到一个这样的报文后,由于处理不当,会造成系统崩溃、死机或重启)。由于 IP 报文的最大长度是 216-1=65535 个字节,那么去除 IP 首部的 20 个字节和 ICMP 首部的 8 个字节,实际数据部分长度最大为:65535-20-8=65507 个字节。所谓的尺寸超大的 ICMP 报文就是指数据部分长度超过 65507 个字节的 ICMP 报文。而且由于 IP 报文会分片,单片报文一般不超过显示,实际上会到达目的机器后才会重组导致报文过大。
ARP Cache 投毒
ARP 协议的工作方式
ARP 协议负责通过 IP 地址找到 MAC 地址,在以太网中所使用的地址是 MAC 地址。它的工作方式如下: 一台机器 A 想知道拥有 10.0.2.105 这个 IP 地址的主机并进行通信,因此机器 A 向所在网段的所有机器发送过一个广播包,询问谁的 IP 是 “10.0.2.105”。正常情况下其他机器会忽略这个消息,只有 10.0.2.105 IP 的主机会响应,返回自己的 MAC 地址。然后机器 A 把对应的 IP 地址和 MAC 地址缓存到 ARP 缓存表,下次直接查询这个表而不发送 ARP 请求(Windows 下 ARP 缓存表可以用 arp -a 查看)。
如何实现
ARP 缓存投毒,又称作 ARP 欺骗,是非常常用的一种攻击手段,一般用在中间人攻击里面,将攻击方伪装成网关(即网关的 IP 地址对应攻击方的 MAC 地址)。使用 Scapy 可以简洁地实现 ARP Cache 投毒。