写在最前面:本次实践的主要内容包括 主机存活探测、端口扫描、scapy编程、漏洞扫描等,每种内容涉及一种或几种技术。
记录只是形式,学会才是目的

下面是大纲:

主机探测

ping与TTL

实践过程

实践要求:主机A开启命令行,对B进行ping探测,根据B的回复,可以确定主机A和B的连通情况,还可以根据回复数据包的TTL值对操作系统进行猜测。

下面是具体的实施过程

如上图所示,在未开启防火墙的情况下主机A对主机B进行ping扫描,得到返回信息。

回复数据包的TTL值: 64 ,B运行的操作系统可能为: LINUX

知识补充

  1. Kali Linux 防火墙指令
指令 功能
Apt-get install ufw 安装防火墙
Systemctl status ufw 查看防火墙状态
Ufw disable 关闭防火墙
Ufw enable 开启防火墙
Ufw status 查看防火墙开启情况
Ufw version 查看防火墙版本
Ufw default deny 拒绝所有服务
Ufw default allow 允许所有服务
  1. TTL与系统类型判断

TTL(Time To Live,生存时间)是IP协议包中的一个值,当我们使用Ping命令进行网络连通测试或者是测试网速的时候,本地计算机会向目的主机发送数据包,但是有的数据包会因为一些特殊的原因不能正常传送到目的主机,如果没有设置TTL值的话,数据包会一直在网络上面传送,浪费网络资源。数据包在传送的时候至少会经过一个以上的路由器,当数据包经过一个路由器的时候,TTL就会自动减1,如果减到0了还是没有传送到目的主机,那么这个数据包就会自动丢失,这时路由器会发送一个ICMP报文给最初的发送者。
不同的操作系统的默认TTL值是不同的, 所以我们可以通过TTL值来判断主机的操作系统,但是当用户修改了TTL值的时候,就会误导我们的判断,所以这种判断方式也不一定准确。

:通过TTL判断操作系统类型是十分不准确的,需要使用更加可靠和精准的方法,比如使用指纹识别技术或者其他的技术手段。这些方法可以通过分析网络协议、使用的服务、传输的数据包结构等来确定操作系统类型。

  1. 设置防火墙以避免Ping扫描

可以使用Kali Linux自带的防火墙工具ufw来防御ping扫描。ufw是一种简单的防火墙工具,它允许在Linux上轻松配置防火墙规则。ufw默认情况下已经安装在Kali Linux中,您可以使用以下命令启用它:sudo ufw enable。然后,您可以使用以下命令来阻止ping扫描:sudo ufw deny icmp。这将禁止所有ICMP流量,包括ping扫描。

arping使用

实践过程

arping是一个在LAN中使用ARP地址解析协议发现目标主机的工具。arping工具测试特定IP地址在网络中是否在线。该命令只能在本地局域网内运行,无法跨越路由器和网关,常用的选项为arping -c。Wireshark抓包分析该工具的工作原理。

如图所示,通过wirshark抓包,可以得到arping指令下的网络数据包情况。通过分析具体的协议字段可以看出:这个工具通过广播的方式发送ARP请求报文。当探测主机(192.168.72.129)接收到ARP请求包后会向报文中的目的地址发送ARP响应报文
综上所述:arping命令是一个用于测试和管理局域网的工具,它可以通过向本网段下所有主机发起arp请求,然后看收到响应的消息的mac地址是否是我们需要的mac地址,如果是,那么这个ip就是该网卡绑定的ip了。同时如何收到响应包也就说明该主机存活。

分析并回答:在同一子网中判断目标主机存活性,ping和arping谁更具优势?
当需要在同一子网中确定主机是否存活时,使用arping命令有以下优势:

  • 更快的响应时间:在同一子网中,目标主机的MAC地址可以从ARP缓存中获取,而无需使用IP地址进行寻址。因此,arping命令可以直接向目标主机发送ARP请求,并根据目标主机是否响应来判断其是否存活。相比之下,ping命令需要发送ICMP数据包并等待回复,这可能会花费更多的时间,并且目标主机可能会过滤掉ICMP数据包。
  • 不会被目标主机屏蔽:一些主机可能会过滤掉ICMP数据包,从而使ping命令无法检测到其存活状态。相比之下,arping命令发送的是ARP请求,不会被目标主机屏蔽。
  • 更精确的诊断:在一些网络环境下,目标主机的ICMP回复可能会被路由器或防火墙拦截,从而导致ping命令误判目标主机的状态。而arping命令只与目标主机进行通信,因此能够提供更精确的诊断结果。
  • 可以检测到MAC地址变更:如果目标主机的MAC地址发生变化,arping命令可以检测到这一变化,并更新本地ARP缓存中的MAC地址。而ping命令无法检测到MAC地址的变更,因为它只依赖IP地址进行通信。

综上所述,当需要在同一子网中快速确定主机是否存活时,arping命令是一种更可靠、更精确、更快速的工具。

arping指令扩展

参数释义:

-A:
与-U参数类似,但是使用的是ARP REPLY包而非ARP REQUEST包。
-b:
发送以太网广播帧,arping在开始时使用广播地址,在收到回复后使用unicast单播地址。
-c:
发送指定的count个ARP REQUEST包后停止。如果指定了-w参数,则会等待相同数量的ARP REPLY包,直到超时为止。
-D:
重复地址探测模式,即,Duplicate address detection mode (DAD),用来检测有没有IP地址冲突,如果没有IP冲突则返回0。
-f:
收到第一个响应包后退出。
-h:
显示帮助页。
-I:
用来发送ARP REQUEST包的网络设备的名称。
-q:
quite模式,不显示输出。
-U:
无理由的(强制的)ARP模式去更新别的主机上的ARP CACHE列表中的本机的信息,不需要响应。
-V:
显示arping的版本号。
-w:
指定一个超时时间,单位为秒,arping在到达指定时间后退出,无论期间发送或接收了多少包。在这种情况下,arping在发送完指定的count(-c)个包后并不会停止,而是等待到超时或发送的count个包都进行了回应后才会退出。
-s:设置发送ARP包的IP资源地址,如果为空,则按如下方式处理:
1、DAD模式(-D)设置为0.0.0.0;
2、Unsolicited模式(-U)设置为目标地址;
3、其它方式,从路由表计算。

操作实例:

  • 用于检验目标主机是否存活:arping 192.168.72.129 -c 1
  • 查看某个IP是否被不同的MAC占用: arping -d 192.168.72.159

端口扫描

这里进行端口扫描使用的工具是nmap,这是一个功能强大的扫描工具。

实践过程

对活动主机进行端口扫描

主机A使用Nmap工具对主机B进行TCP端口同步扫描(范围1-150):
Nmap命令:nmap -sS -p 1-150 192.168.72.129

  • 补充1:-sS 表示TCP SYN扫描
  • 补充2:TCP端口同步扫描就是TCP SYN扫描。它是一种半开放扫描,通过向目标服务器的端口发送一个请求连接的SYN包,如果目标端口开放,则服务器会向扫描器返回一个SYN/ACK包,否则会返回一个RST包。

对主机B进行UDP端口扫描(范围是110-140):

Nmap命令: nmap -sU -p 110-140 192.168.72.129

  • 补充:-sU表示扫描UDP端口,-p:指定端口范围

对活动主机操作系统进行探测

主机A对主机B进行TCP/IP指纹特征扫描:
Nmap命令:nmap -O 192.168.72.129

对活动主机运行服务进行探测

Nmap命令:nmap -sV 192.168.72.129

主机A使用Nmap命令对主机B进行IP协议探测

Nmap命令:nmap -sO 192.168.72.129

nmap指令扩展

参数(区分大小写) 说明
-sT TCP connect()扫描,这种方式会在目标主机的日志中记录大批连接请求和错误信息。
-sS 半开扫描,很少有系统能把它记入系统日志。不过,需要Root权限。
-sF -sN 秘密FIN数据包扫描、Xmas Tree、Null扫描模式
-sP ping扫描,Nmap在扫描端口时,默认都会使用ping扫描,只有主机存活,Nmap才会继续扫描。
-sU UDP扫描,但UDP扫描是不可靠的
-sA 这项高级的扫描方法通常用来穿过防火墙的规则集
-sV 探测端口服务版本
-Pn 扫描之前不需要用ping命令,有些防火墙禁止ping命令。可以使用此选项进行扫描
-v 显示扫描过程,推荐使用
-h 帮助选项,是最清楚的帮助文档
-p 指定端口,如“1-65535、1433、135、22、80”等
-O 启用远程操作系统检测,存在误报
-A 全面系统检测、启用脚本检测、扫描等
-oN/-oX/-oG 将报告写入文件,分别是正常、XML、grepable 三种格式
-T4 针对TCP端口禁止动态扫描延迟超过10ms
-iL 读取主机列表,例如,“-iL C:\ip.txt”

Nmap使用时的注意事项

  • nmap扫描会产生大量的网络流量,可能会影响网络性能。
  • nmap扫描可能会被防火墙或入侵检测系统检测到,因此需要谨慎使用。
  • nmap扫描可能会被误认为是攻击行为,因此需要获得授权后再使用。
  • nmap扫描可能会泄露网络拓扑结构和主机信息,因此需要谨慎使用

scapy编程

Scapy是Python中构造网络数据包的模块,它可以完成绝大多数工具所能完成的功能,例如:扫描,网络发现,跟踪路由,探测,攻击等。

实践过程

send、sendp、sr、sr1 发送数据包函数使用。可以通过python导入此库也可以在命令行直接输入指令。

send函数工作在第三层,只发送数据包:

sendp函数工作在第二层,只发送数据包:

sr()函数用来发送数据包和接收响应:

构造数据包来实现TCP SYN端口扫描

模拟三次握手实现TCP连接:

官方文档有这个实例

代码如下

运行效果

注意事项

  1. 要理清三次握手是seq与ack值的变化,ack的值是seq+1,也是期望收到的下一个包的seq值。seq随机生成初始值,而后在之后的发送中递增1
  2. 进行三次握手要保证目标机器开启了Apache服务,win下通过phpstudy开启,kali可以通过指令开启:service apache2 start
  3. 如果用于测试的主机为LINUX,需要关闭RST:iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP

scapy扩展

一定要看官方文档https://www.osgeo.cn/scapy/introduction.html

这里主要就上述使用到的知识进行扩展:

数据包构造

 Scapy数据包的创建与网络中的分层方法一致。
 数据包的基本构建块是一层,而整个数据包则是通过将各个层堆叠在一起而构建的。
 scapy通过在TCP / IP的不同层上为每个协议定义数据包头,然后按顺序堆叠这些层,来构造数据包。

可以通过show显示详细的包头:

send函数

scapy.sendrecv.send(x, iface=None,**kargs)
功能:在第三层发送数据包
参数:
x – 数据包
inter – 两个数据包之间的时间(以秒为单位)(默认值为0)
loop – send packet indefinitely (default 0)
count – 要发送的数据包数(默认无=1)
verbose – 详细模式(默认无=conf.详细)
realtime – 在发送下一个包之前,请检查是否已发送了一个包
return_packets – 返回发送的数据包
socket – 要使用的套接字(默认为conf.L3socket(kargs))
iface – 发送数据包的接口
monitor – (不在linux上)以监视模式发送
返回值:无
源代码链接:https://www.osgeo.cn/scapy/api/scapy.sendrecv.html#scapy.sendrecv.send

sendp函数

scapy.sendrecv.sendp(x, iface=None, iface_hint=None, socket=None, **kargs)
功能:在第二层发送数据包
参数:
x – 数据包
inter – 两个数据包之间的时间(以秒为单位)(默认值为0)
loop – send packet indefinitely (default 0)
count – 要发送的数据包数(默认无=1)
verbose – 详细模式(默认无=conf.详细)
realtime – 在发送下一个包之前,请检查是否已发送了一个包
return_packets – 返回发送的数据包
socket – 要使用的套接字(默认为conf.L3socket(kargs))
iface – 发送数据包的接口
monitor – (不在linux上)以监视模式发送
返回值:无
源代码:https://github.com/secdev/scapy/blob/master/scapy/sendrecv.py#L443-L474

sr函数

scapy.sendrecv.sr(x, promisc=None, filter=None, iface=None, nofilter=0, *args, **kargs)
功能:在第三层发送和接收数据包
参数:
pks – 发送/接收数据包的SuperSocket实例
pkt – 要发送的数据包
rcv_pks – 如果设置,则将使用而不是pks来接收数据包。数据包仍将通过pks发送
nofilter – 输入1以避免使用BPF过滤器
retry – 如果为正数,则重发未应答数据包的次数(如果为负数),当没有更多的数据包被应答时重试多少次
timeout – 最后一个数据包发送后要等待多长时间
verbose – 设置详细级别
multi – 是否接受同一刺激的多个答案
prebuild – 在开始发送数据包之前,先预构建这些包。当发电机作为数据包传递时自动启用
sr()返回两个列表,第一个列表包含响应的,第二个列表包含未响应的
源代码:https://github.com/secdev/scapy/blob/master/scapy/sendrecv.py#L606-L623

sr1函数

scapy.sendrecv.sr1(x, promisc=None, filter=None, iface=None, nofilter=0, *args, **kargs)
功能:在第三层发送和接收数据包,只返回一个答案
参数:
pks – 发送/接收数据包的SuperSocket实例
pkt – 要发送的数据包
rcv_pks – 如果设置,则将使用而不是pks来接收数据包。数据包仍将通过pks发送
nofilter – 输入1以避免使用BPF过滤器
retry – 如果为正数,则重发未应答数据包的次数(如果为负数),当没有更多的数据包被应答时重试多少次
timeout – 最后一个数据包发送后要等待多长时间
verbose – 设置详细级别
multi – 是否接受同一刺激的多个答案
prebuild – 在开始发送数据包之前,先预构建这些包。当发电机作为数据包传递时自动启用
sr()返回一个列表,列表包含响应的
源代码:https://github.com/secdev/scapy/blob/master/scapy/sendrecv.py#L606-L623