0x00:简介
hping3 之前在三层发现有记录,格式是 hping3 1.1.1.1 --icmp -c 1,利用的主要是三层协议 icmp。而在四层中,格式类似,区别在于指定的协议不同。
0x01:hping3 udp
hping3 四层发现主要使用的协议是 udp 和 tcp,使用方法和三层的 icmp 类似,先来看下 udp 的用法,格式是 hping3 1.1.1.1 --udp -c 1,运行示例如下:
上面是单个 ip 的检测,如果需要检测 ip 段时,可以借助 shell 脚本来实现,示例代码如下:
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "使用错误,示例:./hping3-udp.sh 1.1.1.1"
exit
fi
prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr --udp -c 1 >> hping3-udp-list.txt;
done
grep Unreachable hping3-udp-list.txt | cut -d " " -f 5 | cut -d "=" -f 2 >> hping3-upd-output.txt
rm hping3-udp-list.txt
脚本还是之前的老思路,给一个 ip 参数,去 ip 的前三段然后 1-254 循环第四段,给 hpin3 去检测,筛选结果。
脚本执行情况如下:
脚本在循环 ip 时,把结果定向输出到了一个文本文件中,因为 hping3 的执行输出内容比较多,不利于查看,随后利用 grep 筛选关键字 Unreachable,然后就是利用 cut 筛选出 ip,把最终的结果也放到了文本文件中,这样直接查看这个文件就可以看到 hping3 检测到在线的主机。
grep 那块为什么要筛选关键字 Unreachable,首先 Unreachable 翻译过来是端口不可达的意思,用 udp 进行发现的时候,如果目标不在线会直接返回 loss 100% packet 的情况,也就是百分百的丢包率,且没有关于端口的情况,如果目标在线,则会返回信息告诉自己端口不能访问。所以这里主要的原理是根据返回的端口信息来判断目标是否在线。
下面是目标在线和目标不在线输出信息的对比,如下图:
104 是在线的,返回的信息是 icmp port unreachable from ip,意思 ip 的 icmp 端口不可达,而 105 是不在线的,则没有此信息。
脚本运行完毕后,会在当前目录下生成一个结果 txt 文件,结果如下:
因为我这里扫的是内网的 ip 段,所以 wireshark 抓到的协议是 arp 的,如果是外网的 ip 段,则协议就是 udp,如下图:
0x02:hping3 tcp
hping3 在四层使用 tcp 去进行主机发现时,格式和之前的 icmp、udp 一样,只不过这里没有 --tcp 参数,因为 hping3 默认就是使用的 tcp,如果没有指定其他包类型,则就以 tcp 去检测,所以其格式为:hping3 1.1.1.1 -c 1,运行示例如下:
检测 ip 段的话也需要结合一下 shell 脚本,其示例代码如下:
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "使用错误,示例:./hping3-udp.sh 1.1.1.1"
exit
fi
prefix=$(echo $1 | cut -d '.' -f 1-3)
for addr in $(seq 1 254); do
hping3 $prefix.$addr -c 1 >> hping3-tcp-list.txt;
done
grep ^len hping3-tcp-list.txt | cut -d " " -f 2 | cut -d "=" -f 2 >> hping3-tcp-output.txt
rm hping3-tcp-list.txt
tcp 的脚本和 udp 的很像,区别在于一个是 hping3 的命令是直接跟的 ip,再一个是筛选的时候检测关键字,这里是以 len 开头的进行筛选。为什么筛选以 len 开头的内容?hping3 在使用 tcp 检测时,如果目标在线,返回的信息中带有 flags 标志,值为 RA,即代表 RST 包,RST 回应包则代表目标在线,开头是 len 长度,也可以检测 flags 关键字。下面是在线和不在线的返回信息对比,如下图:
脚本运行示例如下:
使用 wireshark 抓包应该是 tcp 协议,但我这里是内网,所以是 arp 的,wireshark 抓包如下:
结果最后也会放到一个 txt 文件中,如下图:
用 hping3 去发现主机的时候会有这种情况,如果目标开了防火墙,这个时候使用 udp 和 tcp 是检测不出来的,结果会告诉你 loss 100% packer 也就是包全丢了,而使用 --icmp 参数用 icmp 去检测,则会探测到。所以不被发现的原因可能在于目标有防火墙,也有可能是设备的原因,很多设备路由默认是不接受一些突然的包的。
所以在四层发现使用 udp 和 tcp 时,目标准确率不是很高,只能作为参考,建议是结合其他层发现的结果做整合。
0x03:总结
hping3 使用 icmp 参数利用 icmp 协议可在三层用来做发现,使用 udp 参数利用 udp 协议可来四层做发现,默认不带协议参数,则用 tcp 在四层做发现。其四层发现的结果准确率不高,建议对其他层的结果一起做整合。
公众号推荐:aFa攻防实验室
分享关于信息搜集、Web安全、内网安全、代码审计、红蓝对抗、Java、Python等方面的东西。