三层发现:发送ICMP/IP数据包探测
第一种方式:
就是很简单的Ping命令:
不过linux的ping命令和windows的ping命令不一样,它会默认不停止地发数据包
我们可以通过-c参数来设置
第二种方式:
traceroute命令:
这里会显示所有路由跳过的IP,***说明被防火墙阻挡了(通常防火墙默认阻挡ICMP数据包)。
实现原理是基于TTL值的改变
我们发现基本无法获得有用的信息,所以这种方式不推荐
Linux的ping命令还有参数-R可以设置:可以实现路由追踪
接下来我们可以写一个脚本来做三层发现:
#!/bin/bash if [ "$#" -ne 1 ];then echo "Usage - ./ping [interface]" echo "Excample - ./ping 192.168.1.0" exit fi prefix=$(echo $1 | cut -d '.' -f 1-3) for addr in $(seq 1 254);do ping -c 1 $prefix.$addr | grep "bytes from" | cut -d " " -f 4 | cut -d ":" -f 1 & done
如果是从windows系统复制过来的脚本
注意:
vi ping
:set fileformat=unix
赋予执行权限:
chmod u+x ping
执行脚本即可:
效果不错,找到了我局域网中存活的ip
接下来利用强大的Scapy工具:
这种方式通常没有任何效果,原因:
防火墙阻挡ICMP数据包,这里基本不会有所发现
脚本:
pinger1.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 - ./pingger.py [/24 network address]" print "Example - ./pinger.py 172.16.36.0" print "Example will perform an ICMP scan of the 192.168.1.0/24 range" sys.exit() address = str(sys.argv[1]) prefix = address.split(".")[0] + '.' + address.split(".")[1] + '.' + address.split(".")[2] + '.' for addr in range(1,254): answer=sr1(IP(dst=prefix+str(addr))/ICMP(),timeout=0.1,verbose=0) if answer ==None: pass; else: print prefix+str(addr)
扫描已存在文件中的ip:
pinger2.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 - ./pingger.py [/24 network address]" print "Example - ./pinger.py 172.16.36.0" print "Example will perform an ICMP scan of the 192.168.1.0/24 range" sys.exit() filename = str(sys.argv[1]) file=open(filename,"r") for addr in file: answer=sr1(IP(dst=addr.strip())/ICMP(),timeout=0.1,verbose=0) if answer ==None: pass; else: print addr.strip()
第三种方式:Nmap(推荐,这个工具很强大)
nmap中-sn参数可以探测目标ip是否活着:
第四种方式:fping命令(ping命令的加强版)
可以对地址段Ping
后边输出的是一堆unreachable的报告,原因是防火墙阻挡ICMP数据包:
第五种方式:hping命令
hping命令很强大,这里只用其中一部分功能:
我分别给存在的ip和不存在的ip发送:结果不同
当然,也可以写成hping脚本