最近在看安全测试相关的教程,这边记录一些二层(网络层、传输层)发现工具:
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())
???执行和前面也是一样的,只是传参时传入的是个文件名。
五、总结
?二层发现一般是已经进入了内网,获取了一台机器的控制权,然后对于其他?机器的发现。至于为什么要了解这么多工具,是因为机器不是你的,你不能控制具体机器中安装了什么工具,所以要根据控制机器的环境,来选择使用的工具?。?