0x00:简介

scapy 是一个很强大的库文件,是 python 为了操作网络流量而写的一个库。它可以抓包分析包以及创建修改等很多强大的功能,这篇记录 scapy 怎么去做二层发现,这个工具在后面几层也会用到。

0x01:scapy 使用

scapy 可以直接在 kali 命令行输入 scapy 进行启动,如下图:

信息搜集 - 二层发现 Scapy

启动后就进入到了 scapy 中,随后就可以按照 scapy 的语法输入相关的命令去执行相关的请求,例如输入 ARP() 则代表调用 arp 函数,在 scapy 中,函数名称一律大写,当输入 ARP() 时会发现没有输出,这时需要接一个 display() 来进行显示才会输出内容。命令是:ARP().display(),arp 是函数名称,display 是这个函数下的方法,图如下:

信息搜集 - 二层发现 Scapy

arp 函数里的内容其实就是一个 arp 包头,里面的字段就是包头包含的一些变量和值,其含义如下:

信息搜集 - 二层发现 Scapy

其实这就是一个 arp 包头,这里通过 wireshark 抓一个 arp 协议类型的包进行对比,如下图:

信息搜集 - 二层发现 Scapy

通过上面可以知道,arp 函数已经包含了 arp 协议包头结构,那么 arp 函数使用的时候,只需要设置 arp 函数中的相应字段的值,然后把它发出去即可。

通常情况下,首先需要把要使用的函数赋给一个变量,这样后续操作会方便很多,例如:arp=ARP(),这样就把 ARP 函数赋给了 arp 变量,然后给 arp 变量中的 pdst 字段指定一个值(pdst 是要查的目标 ip,也就是要扫描的机器 ip),例如:arp.pdst="172.168.1.104", 最后可以 arp.display() 来查看一下设置都是否正确,过程如下:

信息搜集 - 二层发现 Scapy

设置好要发送的目标 ip 后,就可以发包了,发包是 sr1 函数,参数是传一个 arp 包,也就是刚才设置的,例如:sr1(arp),图如下:

信息搜集 - 二层发现 Scapy

结果可以看到完成发送了一个包,返回了一个包,含有一个回答,丢失了 0 个包。然后就是返回包的一些信息,包含了目标的 mac 和 ip,因为要满足以太网最小包的大小,而包的内容一共大小不满足的时候,就会使用 padding 来补全,使用的是十六进制的 0 来补全的。

默认输出的包是没有格式的,都在一行上,如果想方便查看,可以把结果赋给一个变量,然后直接变量 display 即可。

0x02:python 脚本和 scapy

python 脚本可以把 scapy 当作模块使用,然后实现批量扫描,例如以下 python 脚本:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!=2:
    print "参数错误,正确示例例如:./scapy-arp-1.py eth0"
    sys.exit()

interface=str(sys.argv[1])

ip=subprocess.check_output("ifconfig "+interface+" | grep 'inet ' | cut -d 't' -f 2 | cut -d '.' -f 1-3",shell=True).strip()
prefix=ip.split('.')[0]+'.'+ip.split('.')[1]+'.'+ip.split('.')[2]+'.'

for addr in range(0,254):
    answer=sr1(ARP(pdst=prefix+str(addr)),timeout=0.1,verbose=0)
    if answer == None:
        pass
     else:
        print prefix+str(addr)

脚本首先导入了相应的库,然后判断使用脚本时的参数,是否跟了一个网卡,随后获取自己 ip 的前三段,然后循环第四段从 1 到 254,最后用 scapy 的 ARP 函数进行循环执行。

脚本是单线程的,所以速度可能会慢,有一点是 sr1 里面设置 timeout 超时时间,因为 scapy 默认如果去给一个不存在的目标发请求的话,他会不断的请求,并且不退出,直到目标上线。所以设置 timeout,超过一定时间就执行下一步。

运行示例如下:

信息搜集 - 二层发现 Scapy

通过 wireshark 抓包如下:

信息搜集 - 二层发现 Scapy

可以看到协议是 ARP 的,每个 ip 的发送数量默认是两个,所以是两遍,scapy 为了准备不误报,会确认一下目标是否真的存在。

当已经有要扫描的 ip 表时,可以存到文件中,然后 scapy 去读取文件的内容进行扫描发现,示例脚本如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv)!=2:
    print "参数错误,使用示例:./scapy-arp-2.py filename"
    sys.exit()

filename=str(sys.argv[1])
file=open(filename,'r')

for addr in file:
    answer=sr1(ARP(pdst=addr.strip()),timeout=0.1,verbose=0)
    if answer == None:
        pass
    else:
        print addr.strip()

运行脚本时后跟要扫描的文件名即可。

0x03:总结

scapy 很强大,这篇博客只记录了二层发现时的一些用法,后续其它层发现也会涉及到 scapy,二层发现记录了 arping、nmap、netdiscover 和 scapy,主要使用的 arp 协议。

更多关于代码审计、WEB渗透、网络安全的运维的知识,请关注微信公众号:发哥微课堂。

信息搜集 - 二层发现 Scapy

相关文章:

  • 2021-05-28
  • 2021-05-19
  • 2021-09-22
  • 2021-04-02
  • 2021-08-03
  • 2022-12-23
  • 2021-09-20
猜你喜欢
  • 2021-05-05
  • 2021-08-27
  • 2021-06-20
  • 2021-08-09
  • 2021-06-17
  • 2021-11-04
  • 2022-12-23
相关资源
相似解决方案