专栏首页一名白帽的成长史【Python】利用Scapy进行四层主机探测

【Python】利用Scapy进行四层主机探测

Hello,各位小伙伴晚上好~

最后让我们一起来看看如何利用TCP/UDP进行四层主机探测吧~

Part.1

TCP主机探测

TCP探测

利用TCP协议,在未进行TCP三次握手的情况下,直接向目标主机发送ACK报文。

如果对端回复RST重置连接,则认为对端上线。

优点:可以跨网段进行扫描。

缺点:ACK报文可能被防火墙拦截。

TCP协议

在开始之前,我们先来看看什么是TCP协议。

TCP是一种面向连接的、可靠的传输层通信协议。

TCP在通信之前必须先与目标主机指定的服务端口建立连接,进行TCP三层握手,流程如下:

等到连接建立完成之后,再进行数据传输,如下:

以HTTP为例,访问网页61.151.166.139,同时使用wireshark抓包。

可以看到主机先向目标网站80端口(HTTP服务)发起TCP三层握手:

等到连接建立成功后,再发起数据交互:

当收到对端的数据包后,还会通过ACK报文进行确认:

如果发送数据后,一定时间内没有收到对端的确认包,就会进行重传。

这就是TCP的确认、重传机制,可以保证对端一定能收到数据,因此TCP是一种可靠的传输协议。

但也因为发送的每个数据包都要确认,TCP传输的速率低于UDP,但可靠性一定高于UDP。

Part.2

TCP探测脚本

需求说明

通过python编写一个四层主机探测脚本,发送TCP ACK 报文进行探测。

脚本需要从外部传入参数:

  • 通过-f参数,可以读取本地文件中的IP地址进行扫描。
  • 通过-i参数,输入一个IP地址,探测该IP所在网段的存活主机。

今天的脚本依然是使用scapy模块,忘记的小伙伴先去补补课哦:

【Python】使用scapy模块编写ARP欺骗脚本

模块引入

首先引入我们需要的模块,如下:

具体调用模块的什么功能,我们在后面用到的时候说明。

sweep()函数

首先我们来定义一个sweep()函数,来向指定IP地址发送SYN ACK报文。

//接收的参数ip表示我们需要探测的主机地址。

使用scapy定义一个SYN ACK报文:

  • IP报头目的地址设置为接收的ip参数
  • IP报头源地址不设置,默认为Kali的地址
  • TCP报头连接端口为22,此处可为任意端口,即使端口未开启也会回复
  • TCP报头flags设置为A,表示ACK包
  • 此处根据三层发包,不需要设置二层帧头,使用默认二层参数

这里针对flags字段进行说明:

A表示ACK,F表示FIN,S表示SYN,R表示RST, 默认值是SYN。也可以用数值表示:F为1,S为2,R为4,A为16。

使用sr1进行三层发包,仅接收1个应答报文,超时时间为1s,且不显示详细信息。将收包结果赋值给result,通过if判断flags字段是否为4(RST),进而判断目标主机是否存活。

如果响应包flags字段为RST,就判断主机存活,打印“IP online”。

time.sleep(0.2)用于进行短暂停顿,避免多线程导致输出乱序。

最后再添加try/except异常处理功能,说明如下:

  • 程序运行过程中难免出现错误,当Python检测到错误时,解释器就无法继续执行下去,于是抛出相应的信息,这些统称为异常信息。
  • 使用try/except语句:
  • 程序执行时,如果try子句中没有异常发生,那么except子句在try语句执行之后被忽略;
  • 如果try子句中有异常发生,那么该部分的其他语句将被忽略,直接跳到except部分,执行其后面的子句。

主函数main()

接下来我们来定义主函数main(),如下:

(1)首先通过optparse模块,通过选项向脚本传递所需的参数:

  • 添加-f 选项,让脚本扫描指定文件内的IP地址。
  • 添加-i 选项,让脚本扫描指定的IP地址所在的整个网段。

相关代码如下:

说明如下:

  • 第一行为帮助信息,%prog表示当前脚本文件的名字。
  • 第二行将类实例化成对象,配置usage=usage,使用-h就会显示help信息。
  • 第三行,利用add_option()方法添加选项。 -f和--file分别表示长短选项名,长选项可以省略。 type指定了参数类型,默认为string,dest指定将参数赋值给哪个变量,help为帮助信息。
  • 第四行同理,利用add_option()方法添加选项-i和--ip。
  • 第五行,利用parse_args()方法来获取定义的选项和参数,可以视作一种固定用法。 parseargs()方法返回两个值,其中options对象保存了所传递进来的参数值。
  • 第六、七行,通过options.filename和options.address的方式调用参数值。

(2)判断用户是否传参

判断filename和address参数是否同时为空:

如果同时为空则打印报错信息,报错后通过sys.exit()函数直接退出程序。

(3)通过 -f 文件名传参

代码如下:

  • 首先通过if判断filename变量是否为空。
  • 如果不为空则通过os.path.exists()判断文件是否真实存在
  • 文件不存在则报错,并通过sys.exit()直接退出程序。
  • 若文件存在,则通过open函数,以只读方法打开该文件。
  • 通过for-in语句读取每一行的IP地址,并通过多线程传入sweep()函数进行判断。

(4)通过 -i IP地址传参

代码如下:

  • 首先通过if判断address变量是否为空。
  • 如果不为空则先读取IP地址的前缀。
  • 通过for-in语句,在前缀后面拼接上数字1-254,组成IP地址。
  • 最后将IP地址通过多线程传入sweep()函数完成判断。

Part.3

TCP探测脚本测试

脚本测试

接下来我们对脚本进行测试。

(1)查看帮助信息

输入 -h 查看帮助信息:

(2)不传入任何参数

当不传参时,脚本提示报错并退出:

(3)通过 -i 传入IP地址

成功探测到存活主机:

(4)通过 -f 传入文件

创建ip.txt文件如下:

通过 -f 传入ip.txt,成功探测存活主机:

(5)完整代码

Part.4

UDP主机探测

基本原理

除了使用TCP以外,我们还可以通过UDP进行主机探测。

与TCP不同,UDP是向目标主机一个没有开放的端口发送数据,目标主机会返回一个目的端口不可达的ICMP报文,以此来判断主机是否在线。

注意:如果主机不在线,或者目标端口开放,UDP探测是不会收到响应包的。

目标主机响应的ICMP报文如下:

因此,我们通过判断应答报文proto字段是否为1,进而判断主机是否上线。

代码实现

sweep()函数代码修改如下:

监测一个未开放的非知名端口,例如56789。

通过判断应答报文的proto字段是否为1,来确认主机是否上线。

代码其他部分与前面的TCP一致,这里就不再进行赘述。简单测试如下,成功探测上线主机:

Part.5

结语

好啦,截至今日,主机的二层、三层、四层探测就全部讲解完毕了。大家都明白了吗?

Peace!

本文分享自微信公众号 - 一名白帽的成长史(monster-liuzhi),作者:Monster刘智

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【CSRF】通过DVWA教你学会CSRF攻击

    是指利用受害者未失效的身份认证信息(cookie、session等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下,以受害人的身份向(身...

    一名白帽的成长史
  • 【文件包含】文件包含漏洞知识总结v1.0

    和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。

    一名白帽的成长史
  • 【漏洞复现】Weblogic漏洞搭建与复现:CVE-2017-10271

    WebLogic WLS组件中存在CVE-2017-10271远程代码执行漏洞,可以构造请求对运行WebLogic中间件的主机进行攻击,近期发现此漏洞的利用方式...

    一名白帽的成长史
  • 《我协助破案的那些年》:网络安全工作者的女朋友深陷刷单风波!

    现在不干网络安全工作了,在家养老看茶铺的我,偶尔还会有些老友来到我的茶铺里面坐一坐,喝喝茶,摆一摆龙门阵。他们总是三五成群的点上一壶龙井或是碧螺春,摆上一盘瓜子...

    用户1631416
  • 专栏 | 字节跳动李航:智能与计算

    1950 年,图灵发表论文《计算机器与智能》 (Computing machinery and intelligence),提出著名的 图灵测试。这段时间里,图...

    机器之心
  • IntelliJ IDEA 控制台输出中文乱码问题的解决方法

    首先,找到 IntelliJ IDEA 的安装目录,进入bin目录下,定位到idea.vmoptions文件,如下图所示: ? 双击打开idea.vmoptio...

    CG国斌
  • 「仓储网络智能库存管理问题」最好的答案 | GOC大赛

    本篇特约全球运筹优化挑战赛-仓储物流智能库存管理赛题冠军 TP_AI队伍分享赛题解析。来自清华大学经管学院的闵旭和来自北京大学人工智能创新中心的马思源因为比赛走...

    京东技术
  • 腾讯云支持 Terraform 开发实践

    这篇文章从系统架构开始,到核心库讲解,到实践开发,再到单元测试,比较完整的描述了支持Terraform的开发全过程。

    Techeek
  • css3 RGBA 红色R+绿色G+蓝色B+Alpha通道

    语法:   R:红色值。正整数 | 百分数   G:绿色值。正整数 | 百分数   B:蓝色值。正整数| 百分数   A:透明度。取值0~1之间...

    用户1197315
  • LINUX DNS解析的3种修改方法

    py3study

扫码关注云+社区

领取腾讯云代金券