玖叶教程网

前端编程开发入门

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

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

1.arping

2.nmap

3.netdiscover

4.scapy

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

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

一、arping

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

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

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

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

不同的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的介绍:

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

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

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

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

三、netdiscover

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

实际使用:

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

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

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

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

也会进入统计界面:

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

四、scapy

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

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

apt-get -install python3-gnuplot

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

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

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

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

? ?从对象调用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())

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

五、总结

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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言