Kali Linux 渗透测试:主动信息收集工具 二层发现(6)

二层发现的用途:

二层发现用于我们已经控制了目标的一台主机,想要探测目标主机子网下的其它主机。

 

二层发现,数据链路层,使用ARP协议

使用场景:已经取得一台主机,进入内网,对内网进行渗透

优点:扫描速度快,可靠

缺点:不可路由,只能扫同网段

 

二层发现在扫描中也是很常见的!

 

先讲一点拓展知识,下面先让大家简单认识一下什么是网络七层协议?以及网络七层协议、网络四层协议、网络五层协议的区别?网络七层协议

 

网络七层协议、网络四层协议、网络五层协议之间的区别

 

一、arping

先介绍下ARPING命令:

arping命令是用于发送ARP请求到一个相邻主机的工具

arping使用arp数据包,通过PING命令检查设备上的硬件地址。能够测试一个IP地址是否是在网络上已经被使用,并能够获取更多设备信息。功能类似于ping

 

直接使用,-c 参数:只发一个数据包

root@kali:~# arping 192.168.1.1 -c 1

arping

 

由于这个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

arping shell脚本

可见,这里发现了一个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 二层扫描

 

nmap扫描一个指定文件中保存的IP:

root@kali:~# nmap -iL addr -sn

nmap指定文件二层发现

 

其实nmap这里的扫描和arping不一样,可以抓包发现,nmap还发送DNS数据包,解析主机名。

 

三、netdiscover

Netdiscover命令用于二层发现:

 

1、主动发现:

扫描本地所有网段

root@kali:~# netdiscover -i eth0 -r 192.168.1.0/24

Netdiscover

Netdiscover扫描本地所有网段

 

可以把需要扫描的IP放在一个文件中扫描:

root@kali:~# netdiscover -l addr

 

2、被动发现:

原理是将网卡设置成混杂模式,等待数据包,收集信息;

root@kali:~# netdiscover -p

Netdiscover被动发现

 

现在就是在等待状态,只要有数据包,就会出现显示在这里。

 

四、scapy

直接输入scapy,发现丢失文件或者有错误

这时候,输入这行即可:

scapy

 

耗时不多,发现下载完成之后就可以正常开启scapy了!

root@kali:~# scapy

 

scapy简单使用方式:就像调用函数的方式:

示例:

这里我要定制一个ARP数据包,输入ARP后查看相关信息:

scapy arp数据包

 

这里九行的意思分别是:硬件类型,协议类型,硬件地址长度,协议长度,操作(这里的who-has表示ARP的查询包),后边的是四个地址

参数的意思分别是:0x1:以太网,0x800:IP协议,长度分别是6,4,整体来看:

这样来理解这个包:谁是psrc(发送源)?谁的mac地址是hwsrc(发送源)?我要查的是pdst这个地址;hwdst这个mac地址!

 

通常我们这样来给变量赋值:

scapy 变量赋值

 

我们只需要一个简单的命令就可以将这个包发出去:scapy

 

仔细看下,这里发送出去了一个包,并且回应了一个包,说明192.168.87.1这个ip地址存在。

 

我们可以抓包看看:scapy 抓包

 

不错,这个包确实发送出去了!

 

还可以简单设置下,看看回应包的内容:scapy 回应

 

我们可以使用脚本: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;

arp python

 

可以增强下这个脚本:指定文件扫描

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

 

好了,现在运行这个脚本试试:

arp 指定文件扫描 python

头像
  • ¥ 299.0元
  • 市场价:599.0元
  • ¥ 49.9元
  • 市场价:99.9元
  • ¥ 798.0元
  • 市场价:1298.0元
  • ¥ 99.0元
  • 市场价:129.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: