信息搜集与漏洞扫描
写在最前面:本次实践的主要内容包括 主机存活探测、端口扫描、scapy编程、漏洞扫描等,每种内容涉及一种或几种技术。
记录只是形式,学会才是目的!
下面是大纲:
主机探测
ping与TTL
实践过程
实践要求:主机A开启命令行,对B进行ping探测,根据B的回复,可以确定主机A和B的连通情况,还可以根据回复数据包的TTL值对操作系统进行猜测。
下面是具体的实施过程:
如上图所示,在未开启防火墙的情况下主机A对主机B进行ping扫描,得到返回信息。
回复数据包的TTL值: 64
,B运行的操作系统可能为: LINUX
。
知识补充
- Kali Linux 防火墙指令
指令 | 功能 |
---|---|
Apt-get install ufw | 安装防火墙 |
Systemctl status ufw | 查看防火墙状态 |
Ufw disable | 关闭防火墙 |
Ufw enable | 开启防火墙 |
Ufw status | 查看防火墙开启情况 |
Ufw version | 查看防火墙版本 |
Ufw default deny | 拒绝所有服务 |
Ufw default allow | 允许所有服务 |
- TTL与系统类型判断
TTL(Time To Live,生存时间)
是IP协议包中的一个值,当我们使用Ping命令进行网络连通测试或者是测试网速的时候,本地计算机会向目的主机发送数据包,但是有的数据包会因为一些特殊的原因不能正常传送到目的主机,如果没有设置TTL值的话,数据包会一直在网络上面传送,浪费网络资源。数据包在传送的时候至少会经过一个以上的路由器,当数据包经过一个路由器的时候,TTL就会自动减1,如果减到0了还是没有传送到目的主机,那么这个数据包就会自动丢失,这时路由器会发送一个ICMP报文给最初的发送者。
不同的操作系统的默认TTL值是不同的, 所以我们可以通过TTL值来判断主机的操作系统,但是当用户修改了TTL值的时候,就会误导我们的判断,所以这种判断方式也不一定准确。
注:通过TTL判断操作系统类型是十分不准确的,需要使用更加可靠和精准的方法,比如使用指纹识别技术或者其他的技术手段。这些方法可以通过分析网络协议、使用的服务、传输的数据包结构等来确定操作系统类型。
- 设置防火墙以避免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连接:
代码如下:
运行效果:
注意事项:
- 要理清三次握手是seq与ack值的变化,ack的值是seq+1,也是期望收到的下一个包的seq值。seq随机生成初始值,而后在之后的发送中递增1
- 进行三次握手要保证目标机器开启了Apache服务,win下通过phpstudy开启,kali可以通过指令开启:
service apache2 start
- 如果用于测试的主机为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 |