二层发现的用途:
二层发现用于我们已经控制了目标的一台主机,想要探测目标主机子网下的其它主机。
二层发现,数据链路层,使用ARP协议
使用场景:已经取得一台主机,进入内网,对内网进行渗透
优点:扫描速度快,可靠
缺点:不可路由,只能扫同网段
二层发现在扫描中也是很常见的!
先讲一点拓展知识,下面先让大家简单认识一下什么是网络七层协议?以及网络七层协议、网络四层协议、网络五层协议的区别?
一、arping
先介绍下ARPING命令:
arping命令是用于发送ARP请求到一个相邻主机的工具
arping使用arp数据包,通过PING命令检查设备上的硬件地址。能够测试一个IP地址是否是在网络上已经被使用,并能够获取更多设备信息。功能类似于ping
直接使用,-c 参数:只发一个数据包
root@kali:~# arping 192.168.1.1 -c 1
由于这个IP不存在,只发出去数据包,但是没有应答。
shell 脚本
也可以写一个简单的脚本:
作用:对局域网内所有设备扫描
#!/bin/bash
if [ "$#" -ne 1 ];then
echo "Usage - ./arping.sh [interface]"
echo "Excample - ./arping.sh eth0"
echo "Example will perform an ARP scan of the local subnet to which eth0 is assigned"
exit
fi
interface=$1
prefix=$(ifconfig $interface | grep "broadcast" | cut -d " " -f 10 | cut -d '.' -f 1-3)
for addr in $(seq 1 255);do
arping -c 1 $prefix.$addr -I $interface | grep "reply from" | cut -d" " -f 4
done
写好后命名:arping.sh ,(如果无法运行,chmod给执行权限即可)
第一次运行出错,因为需要参数:
root@kali:~# ./arping.sh eth0
可见,这里发现了一个192.168.87.2
二、nmap
nmap在二层发现中的使用:
nmap只需要一行即可实现arping的一个脚本:并且速度更快
#!/bin/bash
if [ "$#" -ne 1 ];then
echo "Usage - ./arping.sh [interface]"
echo "Excample - ./arping.sh eth0"
echo "Example will perform an ARP scan of the local subnet to which eth0 is assigned"
exit
fi
interface=$1
prefix=$(ifconfig $interface | grep "broadcast" | cut -d " " -f 10 | cut -d '.' -f 1-3)
for addr in $(seq 1 255);do
arping -c 1 $prefix.$addr -I $interface | grep "reply from" | cut -d" " -f 4
done
nmap
root@kali:~# nmap -sn 192.168.1.0/24
nmap扫描一个指定文件中保存的IP:
root@kali:~# nmap -iL addr -sn
其实nmap这里的扫描和arping不一样,可以抓包发现,nmap还发送DNS数据包,解析主机名。
三、netdiscover
Netdiscover命令用于二层发现:
1、主动发现:
扫描本地所有网段
root@kali:~# netdiscover -i eth0 -r 192.168.1.0/24
可以把需要扫描的IP放在一个文件中扫描:
root@kali:~# netdiscover -l addr
2、被动发现:
原理是将网卡设置成混杂模式,等待数据包,收集信息;
root@kali:~# netdiscover -p
现在就是在等待状态,只要有数据包,就会出现显示在这里。
四、scapy
直接输入scapy,发现丢失文件或者有错误
这时候,输入这行即可:
耗时不多,发现下载完成之后就可以正常开启scapy了!
root@kali:~# scapy
scapy简单使用方式:就像调用函数的方式:
示例:
这里我要定制一个ARP数据包,输入ARP后查看相关信息:
这里九行的意思分别是:硬件类型,协议类型,硬件地址长度,协议长度,操作(这里的who-has表示ARP的查询包),后边的是四个地址
参数的意思分别是:0x1:以太网,0x800:IP协议,长度分别是6,4,整体来看:
这样来理解这个包:谁是psrc(发送源)?谁的mac地址是hwsrc(发送源)?我要查的是pdst这个地址;hwdst这个mac地址!
通常我们这样来给变量赋值:
仔细看下,这里发送出去了一个包,并且回应了一个包,说明192.168.87.1这个ip地址存在。
不错,这个包确实发送出去了!
我们可以使用脚本:arp1.py
#!/usr/bin/python
import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import*
if len( sys.argv ) !=2:
print "Usage - ./arp_discpy [interface]"
print "Example - ./arp_disc.py eth0"
print "Example will perform an ARP scan of thr local subnet to which eth0 is assigned"
sys.exit()
interface = str(sys.argv[1])
ip=subprocess.check_output("ifconfig "+interface+" | grep 'inet ' | cut -d 't' -f 2 |cut -d ' ' -f 1",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)
然后:
chmod u+x arp1.py
./arp1.py
我第一次运行时候出错,因为是从win10系统复制过来的脚本;
这里会报错:/usr/bin/python^M: 解释器错误: 没有那个文件或目录
解决方式:
vi arp1.py
:set fileformat=unix
:wq
再次
./arp1.py
即可
这里发现两个收到回报的ip;
可以增强下这个脚本:指定文件扫描
arp2.py
#!/usr/bin/python
import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import*
if len( sys.argv ) !=2:
print "Usage - ./arp_discpy [interface]"
print "Example - ./arp_disc.py eth0"
print "Example will perform an ARP scan of thr local subnet to which eth0 is assigned"
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()
还需要在当前目录下创建一个文本记录数据:我这里象征性写几个,实际情况不是如此
adds
192.168.87.1
192.168.87.2
192.168.87.3
192.168.87.4
192.168.87.5
192.168.87.6
192.168.87.7
好了,现在运行这个脚本试试: