信息搜集-二层发现 Scapy

信息搜集-二层发现 Scapy

点击右上角【关注】发哥微课堂头条号,get更多相关技能~


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 协议。


分享到:


相關文章: