一些计算机安全领域中的二层发现工具

最近在看安全测试相关的教程,这边记录一些二层(网络层、传输层)发现工具:

1.arping

2.nmap

3.netdiscover

4.scapy

可以简单理解成这些工具可以用来发现网络上具体活着的主机ip。

二层发现只能扫描同一网段,不能进行路由。

一、arping

先来看arping,通过arping -h查看一下具体使用:

一些计算机安全领域中的二层发现工具

arping -h

arping具体的语法:arping [目标地址] [选择参数]

一般使用arping进行二层发现,只要发送一次就够了,所以在使用的时候都会加参数-c 1。

如果目标地址在网络中不存在,就收不到目标机器返回的数据,列如这样:

一些计算机安全领域中的二层发现工具

arping目标机器无响应

不同的Linux版本中arping的参数都会有点区别,所以在使用的时候最好都去看一下-h的说明。

然后分享一个arping检查附近有哪些主机是活着的shell脚本:

#!/bin/bash
if ["$#" -ne 1]:then
   echo 'Usage ./arping_script.sh [interface]'
   echo 'Example ./arping_script.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 't' -f 2 | cut -d ' ' -f 2 | cut -d '.' -f 1-3}
for addr in ${seq 1 254}:do
    arping -c 1 $prefix.$addr | grep 'bytes from' | cut -d '' -f 5 | cut -d '(' -f 2 | cut -d ')' -f 1
done

脚本必须要带一个参数,脚本第2行就是检查参数,这个参数是用来区分使用哪个网卡,如果没传参数,会进行一些提示。

第8行就是接收这个参数,第9行就是获取本机ip地址的前三位。

第10行就是遍历1到254,第11行将遍历的数字和第9行获取的前三位组合成一个ip,使用arping去请求目标地址,如果能接收到目标地址返回的数据包,就将这个ip输出。

如果不需要实时显示地址的话,也可以将排查出来的ip地址输入到一个文本里,将第11行末尾改动一下:

arping -c 1 $prefix.$addr | grep 'bytes from' | cut -d '' -f 5 | cut -d '(' -f 2 | cut -d ')' -f 1 >>addr.txt

脚本传到Linux服务器后,需要chmod修改一下脚本的权限,让它可执行,然后使用命令./arping_script.sh进行执行。

当已经获取了一些目标机器的ip,需要检查这些目标机器是否还活着时,可以使用下面的脚本:

#!/bin/bash
if ['$#' -ne 1]:then
   echo 'Usage ./arping_script2.sh [filename]'
   echo 'Example ./arping.sh eth0'
   echo 'Example will perform an ARP scan of the local subnet to which eth0 is assigned'
   exit
fi
file=$1
for addr in ${cat $file}:do
   arping -c 1 $addr | grep 'bytes from' | cut -d '' -f 5 | cut -d '(' -f 2 | cut -d ')' -f 1
done

需要注意的点,ip的文本里需要是一个ip一行,列如:

192.168.1.1
192.168.1.3
192.168.1.6

二、nmap

然后介绍一下nmap,这个工具的功能十分强劲,这里主要是分享一下和二层发现相关的功能。

先还是通过-h看一下nmap的介绍:

一些计算机安全领域中的二层发现工具

nmap -h

我们主要用于二层发现,只需要关注-sn这个参数就可以,功能是只扫描ip,不扫描端口。

nmap相对于arping有一个好处,是nmap支持地址段的写法,列如:

一些计算机安全领域中的二层发现工具

nmap地址段写法

其中36.152.44.1-22就代表了22个IP地址。扫描结果中Host is up就代表这个ip代表的机器处于工作状态。

一些计算机安全领域中的二层发现工具

nmap扫描结果

nmap当然也支持通过文本文件来传入需要扫描的ip地址:

一些计算机安全领域中的二层发现工具

nmap通过文本传入ip地址

三、netdiscover

接下来再介绍第三个工具——netdiscover,它拥有主动和被动发现两种方式。还是先看它的说明:

一些计算机安全领域中的二层发现工具

netdiscover -h

实际使用:

一些计算机安全领域中的二层发现工具

netdiscover扫描网段

执行后会进入一个执行统计界面:

一些计算机安全领域中的二层发现工具

netdiscover扫描结果

不过我在使用的时候扫描结果和使用nmap得到的扫描结果不太一样,不清楚是不是我姿势不对,先不管了,后来实际使用的时候再看看吧。

netdiscover也可以通过文件传入ip地址,通过参数-l,像这样:

一些计算机安全领域中的二层发现工具

netdiscover通过文档传入ip

前面都是主动扫描,可以通过-p参数,实现被动扫描:

一些计算机安全领域中的二层发现工具

netdiscover -p

也会进入统计界面:

一些计算机安全领域中的二层发现工具

被动扫描的统计界面

从划线的位置可以看到扫描处于passive状态。

四、scapy

最后再介绍一下scapy,它可以作为python库进行调用,也可以作为单独的工具进行使用,功能也比较丰富,可以抓包、分析、创建、修改、注入网络流量。

安装比较简单,可以直接通过命令​完成:

apt-get -install python3-gnuplot

安装成功后,通过scapy命令,进入​控制台:

一些计算机安全领域中的二层发现工具

scapy的控制台

这里是用来做二层发现,主要是使用scapy里面的ARP()类,可以通过display()函数,查看ARP()具体的内容​:

一些计算机安全领域中的二层发现工具

ARP().display()

​ ​通过查看具体内容,可以看到ARP()类实则就是定制了一个数据包​。

​​需要扫描哪个ip的时候,就实例化一个ARP(),然后将对象的pdst复制目标ip,​像这样:

一些计算机安全领域中的二层发现工具

赋值pdst

​ ​从对象调用display()方法后显示的pdst的值,已经是新值了​。

然后scapy里发送数据包的方法是sr1(),将前面定义的arp对象作为参数传入。如果直接调用,没有参数接收返回值,就会将结果直接在控制台进行打印​。为了便于观察,可以用个参数接收返回值,然后对这个参数调用display()函数,显示的结果会进行分层。

​前面说过scapy可以作为python的库进行调用,所以如果使用者对于python还算熟悉的话,可以直接写个python脚本,用于二层发现,​例如这样:

#!/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_disc.py [interface]')
  print('Example - ./arp_disc.py eth0')
  print('Example will perform an ARP scan of the local subnet to which eth0 is assigned')
  sys.exit()

interface = str(sys.argv[1])
ip = subprocess.check_output("ifconfig " + interface + "| grep 'inet addr' | cut -d ':' -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 is None:
    pass
  else:
    print(prefix+str(addr))

​ ​这里提一下,在执行sr1的时候,如果没有目标ip对应的机器,默认是会一直发数据包,等到目标机器出现并​返回数据包才结束。所以在写脚本调用sr1方法的时候,需要传一个timeout参数,表明超过设定时间没有返回数据包,就结束这次sr1​执行。

​ ​脚本写好后,传到Linux系统,然后修改权限,就可以执行了,执行可以直接用python命令​:

python arp_disc.py eth0

也可以直接作为shell脚本​执行:

./arp_disc.py eth0

​​然后再看一个通过ip文档进行扫描的脚本:

import logging
import subprocess
logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
from scapy.all import *

if len(sys.argv) != 2:
  print('Usage - ./arp_disc.py [filename]')
  print('Example - ./arp_disc.py addr.txt')
  print('Example will perform an ARP scan of the IP addresses listed in addr.txt')
  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 is None:
		pass
  else:
    print(addr.strip())

​​​执行和前面也是一样的,只是传参时传入的是个文件名。

五、总结

​二层发现一般是已经进入了内网,获取了一台机器的控制权,然后对于其他​机器的发现。至于为什么要了解这么多工具,是由于机器不是你的,你不能控制具体机器中安装了什么工具,所以要根据控制机器的环境,来选择使用的工具​。​

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
妖精在跳舞呀的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容