Hello,各位小伙伴周一好~
今天依然是喜闻乐见的python模块...
今天就来看看scapy怎么实现三层探测吧~
Here we go~
Part.1
三层探测原理
ICMP报文
三层扫描我们需要用到ICMP的两类报文:
echo request、echo reply。
其实就是我们使用的ping命令,请求机向目标主机发送echo request报文,如果收到了echo reply应答就认为对方在线。
优点:相比ARP,可进行跨网段扫描
缺点:可能被防火墙过滤,结果可能不准确
Fping命令
既然说到ICMP,那再额外补充一下,除了ping以外,还有个fping命令。
在linux中,使用ping命令访问目标主机,会不停的发送echo request报文:
即使目标主机不可以访问,也会不断发送echo request请求:
这里其实还有一个命令fping,使用fping访问主机,如果主机应答了,就马上停止发包:
如果主机不应答,也只会发送4次请求包就自动停止:
fping -g 还可以扫描一整个网段:
把错误信息去掉:
Part.2
脚本编写
需求说明
通过python编写一个三层主机探测脚本,使用ping命令进行扫描。
脚本需要从外部传入参数:
今天的脚本依然是使用scapy模块,忘记的小伙伴先去补补课哦:
模块引入
首先引入我们需要的模块,如下:
具体调用模块的什么功能,我们在后面用到的时候说明。
3、sweep()函数
首先我们来定义一个sweep()函数,来向指定IP地址发送echo request请求。
接收的参数ip表示我们需要探测的主机地址。
使用scapy定义一个icmp echo request报文:
使用sr1进行三层发包,仅接收1个应答报文,超时时间为1s,且不显示详细信息。
将收包结果赋值给result,通过if判断result是否有值,进而判断是否收到了响应。
如果收到响应,就判断主机存活,打印“IP online”
time.sleep(0.1)用于进行短暂停顿,避免多线程导致输出乱序。
最后再添加try/except异常处理功能,说明如下:
主函数main()
接下来我们来定义主函数main(),如下:
(1)首先通过optparse模块,通过选项向脚本传递所需的参数:
该部分代码如下:
说明如下:
(2)判断用户是否传参
判断filename和address参数是否同时为空:
如果同时为空则打印报错信息,报错后通过sys.exit()函数直接退出程序。
(3)通过 -f 文件名传参
代码如下:
(4)通过 -i IP地址传参
代码如下:
Part.3
脚本测试
脚本测试
接下来我们对脚本进行测试。
(1)查看帮助信息
输入 -h 查看帮助信息:
(2)不传入任何参数
当不传参时,脚本提示报错并退出:
(3)通过 -i 传入IP地址
成功探测到存活主机:
(4)通过 -f 传入文件
创建ip.txt文件如下:
通过 -f 传入ip.txt,成功探测存活主机:
Part.4
结语
好啦,到此我们的代码就全部完成了。
涉及了大量python基础知识,没看明白的小伙伴,可以针对不明白的函数在百度查询获取解答哦。
当然也可以在公众号给我留言,我看到会直接回复的,最后附上完整代码:
Peace!