背景
用etter作dns欺骗的时候,发现查询局域网IP,手机占用的IP有时候扫描不出来,无法展示到列表中,抓了包看到etter启动扫描局域网是遍历网段所有IP,广播arp请求,可是电脑端的都会正常应答,手机端的确没有。后来测试了下,不用etter扫描,直接ping的话,是有arp应答的(手机端)。用etter扫描测试,手机(小m6)锁屏,可能出现没有arp应答。
毕竟我知道局域网内某个人是用了手机的,但是不知道具体IP是很尴尬的(只能确定已经显示的IP列表肯定没有这个手机IP,但不知道这个用手机的小伙伴IP是多少),我总不能对整个网段的主机作arp缓存中毒攻击(只想针对这个IP),所以写了个脚本,把当前局域网(只针对B类和C类局域网)主机所在网段的所有IP给ping出来。就当替代使用etter扫描主机列表了。
脚本代码
用的bash shell,我加的有注释,就直接粘代码了。
#! /bin/bash
#获得主机所有接口ip
ips=(`hostname -I`)
#输入某些ip
#ips=($1)
#创建记录ip文件
ip_record_file=.ip_record_file
touch $ip_record_file
#分隔符设置,字符串分隔,这里不能用这个了,换个方式
#OLD_IFS=$IFS
#IFS=.
ping_ip()
{
#ping 1 次ip,如果成功,便认为IP存在
ping $ip -W 1 -c 1 &>/dev/null
[ $? -eq 0 ] && echo $ip >> $ip_record_file
}
resolve_ip()
{
#不尝试获取网关,解析IP前三个字段,1-254主机全部测试
ip_head=`echo $1 | sed 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\.\).*/\1/g'`;
for i in `seq 1 254`
do
ip="$ip_head$i"
[[ $ip = $1 ]] && continue;
ping_ip $ip &
done
wait
}
for my_ip in $ips
do
#只处理B类和C类的局域网IP范围
#如是B类,172.16.0.0 - 172.31.255.255
[[ $my_ip =~ ^172* ]] && my_ip_sperators=(${my_ip//./ }) && two_num=${my_ip_sperators[1]};
if [[ $two_num > 15 && $two_num < 32 ]];then
resolve_ip $my_ip &
fi
#如果是C类,192.168.0.0 - 192.168.255.255
[[ $my_ip =~ ^192\.168* ]] && resolve_ip $my_ip &
done
wait
cat $ip_record_file | sort -u
rm $ip_record_file