Linux网络端口扫描工具实例
1. Linux网络端口
在计算机网络中,端口是一种用于标识不同应用程序或服务的数字或名称,它是通过数字标识的。它们允许计算机在网络上发送和接收数据。每个计算机都有数万个端口,取值范围为0到65535,分为两个范围: 系统端口和动态端口。系统端口,也叫知名端口,范围是从0到1023,用于常见的网络服务,如HTTP(端口80) 、HTTPS(端口443)、FTP(端口21)、SSH(端口22)。动态端口,又分注册端口和私有端口,1024到49151的端口号是注册端口,用于用户自定义的服务;49152到65535的端口号是动态或私有端口,用于临时分配给客户端应用程序。
随着互联网的快速发展,网络安全问题日益凸显。在网络安全领域中,端口是一个重要的概念,经常被黑客利用来进行攻击。端口经常成为黑客攻击的目标之一,原因如下:
-
服务暴露:许多计算机和服务器上的端口是向外界开放的,以便与其他计算机通信。如果这些服务存在漏洞或配置不当,黑客可以利用它们进行入侵。因此,保护开放端口的安全性至关重要
-
恶意服务:黑客可能在计算机上运行恶意服务,通过特定的端口进行攻击。这些服务可能会监听特定的端口,等待潜在的受害者连接,然后利用漏洞或恶意代码进行攻击。
-
端口扫描:黑客使用端口扫描工具来扫描目标计算机上开放的端口。通过发现开放的端口,黑客可以确定目标计算机上可能存在的弱点和漏洞,并尝试进行入侵
3UK Penetration Test通常会检测当前网络端口是否存在不必要的监听和使用。对于知名端口严格控制使用,对于不必要的应用进行端口过滤和应用裁剪或去使能;对于动态端口需保持最小使用原则,能不用则不用,如必须使用需输出相关说明,进一步评估其是否存在安全隐患。
下文主要讲解如何使用端口扫描工具去扫描当前端口使用情况,以及如何去关闭相关监听。
2. 端口扫描
端口扫描是一种常见的网络安全技术,用于检测目标主机上开放的端口。攻击者可以使用端口扫描来获取目标系统的网络服务信息,从而发现潜在的安全弱点。
常见的端口扫描技术包括:
- TCP 扫描:TCP 扫描是最常见的端口扫描方法之一。通过发送 TCP SYN 或者 TCP CONNECT 请求来探测目标主机上的开放端口。如果收到目标主机的响应,表示相应的端口是开放的。
- UDP 扫描:UDP 扫描用于探测目标主机上的 UDP 端口是否开放。UDP 是无连接的协议,而且没有像 TCP 那样的三次握手过程,因此 UDP 端口扫描相对更复杂。通过发送特定的 UDP 数据包来测试目标主机上的 UDP 端口是否开放。
- SYN 扫描(半开放扫描):SYN 扫描利用了 TCP 握手过程中的半开放连接状态。通过发送 TCP SYN 请求,但不完成三次握手过程,而是在收到目标主机的 SYN/ACK 响应后发送 RST 来关闭连接。这种扫描方式可以较快地扫描大量的目标主机端口。
- NULL 扫描:NULL 扫描利用了 TCP 协议中的一个特性,发送空的 TCP 数据包,不设置任何标志位,观察目标主机是否响应。如果目标主机响应了 RST 数据包,则表示相应的端口是关闭的。
- FIN 扫描:FIN 扫描利用了 TCP 协议中的 FIN 标志位,发送带有 FIN 标志位的 TCP 数据包,观察目标主机的响应。如果目标主机返回了 RST 数据包,则表示相应的端口是关闭的。
- Xmas 扫描:Xmas 扫描是一种特殊的扫描方法,利用 TCP 数据包中的 URG、PSH、FIN 标志位来发送特定的数据包,观察目标主机的响应情况。
- IDLE 扫描:IDLE 扫描利用目标主机上的空闲状态,借助于一个中间主机来探测目标主机上的端口情况。这种扫描方法对目标主机进行了伪装,难以被追踪。
端口扫描工具比较常见的有Nmap、Masscan、ZMap等。需要注意的是,进行端口扫描时需要遵守法律法规和道德准则,只能用于合法的安全测试和授权的测试环境中,不得进行未经授权的黑客攻击行为。
2.1 Netstat
netstat(网络统计)是一个用于显示网络连接、路由表和网络接口信息的命令行工具。netstat命令可以用于确认端口使用情况,可以查看当前计算机上的活动连接和监听端口,以及它们所对应的进程或程序。
常见的netstat命令选项有:
-a:显示所有连接和监听端口。
-t:显示TCP协议相关的连接信息。
-u:显示UDP协议相关的连接信息。
-n:以数字形式显示IP地址和端口号。
-p:显示与连接相关的进程信息。
-r:显示路由表信息。
-s:显示网络统计摘要信息。
-l 仅显示出于Listen(监听)状态的
2.1.1 基于SDX12平台的使用实例
~ # netstat -atunlp
netstat -atunlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.1.1:443 0.0.0.0:* LISTEN 1689/lighttpd
tcp 0 0 0.0.0.0:40096 0.0.0.0:* LISTEN 473/oem_at_client
tcp 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN 2674/adbd
tcp 0 0 192.168.1.1:80 0.0.0.0:* LISTEN 1689/lighttpd
tcp 0 0 192.168.1.1:53 0.0.0.0:* LISTEN 3142/dnsmasq
tcp 0 0 192.168.1.1:443 192.168.1.54:2449 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2447 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2444 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2448 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2446 TIME_WAIT -
tcp 0 0 :::80 :::* LISTEN 1689/lighttpd
tcp 0 0 fe80::58d8:e5ff:fe27:3e94:53 :::* LISTEN 3142/dnsmasq
tcp 0 0 fe80::6666:53 :::* LISTEN 3142/dnsmasq
udp 0 0 0.0.0.0:5555 0.0.0.0:* 473/oem_at_client
udp 0 0 192.168.1.1:53 0.0.0.0:* 3142/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 3142/dnsmasq
udp 0 0 fe80::58d8:e5ff:fe27:3e94:53 :::* 3142/dnsmasq
udp 0 0 fe80::6666:53 :::* 3142/dnsmasq
可以看出,共有以下几类应用正在使用端口:
- lighttpd:轻量级的、高性能的开源Web服务器软件。使用的是http和https两种协议,因此端口监听也使用了443(HTTPS)和80(HTTP)两个
tcp 0 0 192.168.1.1:443 0.0.0.0:* LISTEN 1689/lighttpd
tcp 0 0 192.168.1.1:80 0.0.0.0:* LISTEN 1689/lighttpd
tcp 0 0 192.168.1.1:443 192.168.1.54:2449 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2447 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2444 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2448 TIME_WAIT -
tcp 0 0 192.168.1.1:443 192.168.1.54:2446 TIME_WAIT -
tcp 0 0 :::80 :::* LISTEN 1689/lighttpd
- adbd:是指Android Debug Bridge(ADB)的守护进程(daemon),是Android设备和计算机之间通信的后台服务。5037端口是adb客户端和adb守护进程之间的通信端口,用于管理adb客户端与设备之间的连接。而5555端口是用于TCP/IP网络连接的端口,可用于通过adb网络连接到设备进行调试操作。
tcp 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN 2674/adbd
- dnsmasq:是一个轻量级的DNS服务器和DHCP服务器软件,它可以在本地网络中提供网址解析和局域网IP地址分配功能。Dnsmasq作为网络解析时使用UDP协议监听53端口(或其他指定的DNS端口),在某些情况下,dnsmasq服务器需要处理大型DNS响应或支持DNS重定向等高级功能,这时候就可能需要使用TCP协议的53端口;作为DHCP服务器使用时使用67端口(或其他指定的DHCP端口)来监听客户端请求并提供动态主机配置
tcp 0 0 192.168.1.1:53 0.0.0.0:* LISTEN 3142/dnsmasq
tcp 0 0 fe80::58d8:e5ff:fe27:3e94:53 :::* LISTEN 3142/dnsmasq
tcp 0 0 fe80::58d8:e5ff:fe27:3e94:53 :::* LISTEN 3142/dnsmasq
tcp 0 0 fe80::6666:53 :::* LISTEN 3142/dnsmasq
udp 0 0 192.168.1.1:53 0.0.0.0:* 3142/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 3142/dnsmasq
udp 0 0 fe80::58d8:e5ff:fe27:3e94:53 :::* 3142/dnsmasq
udp 0 0 fe80::6666:53 :::* 3142/dnsmasq
4、 oem_at_client:是oem厂商自己的应用,主要用于接收AT等指令,并将该指令通过socket传输到对应的AT处理服务器。属于用户自定义的服务。因此使用了端口40096。
tcp 0 0 0.0.0.0:40096 0.0.0.0:* LISTEN 473/oem_at_client
udp 0 0 0.0.0.0:5555 0.0.0.0:* 473/oem_at_client
2.1.2 基于SDX12平台的端口限制
上面四类应用, 3UK Penetration Test扫描结果如下,需要我们对各应用各端口进行限制和说明:
'Several network daemons (dnsmasq, oem_at_client) are bound on all interfaces rather than just being exposed on local interfaces. This meant services meant to be access may be accessed by an attacker from WAN. Publicly available services on the internet facilitate the discovery of devices with network services accessible from public IP addresses.
This is especially catastrophic for oem_at_client which provides an unauthenticated AT interface on the WAN interface over TCP 40096 port. This allows an attacker to disable the modem or reconfigure it to connect it to its own APN.
REC-14: Bind daemons on required interface only (especially oem_at_client which must bind on the loopback interface for TCP and UDP and not on LAN or WAN or better, remove oem_at_client from the firmware if it is not used).
上述问题,处理方案如下:
- lighttpd和dnsmasq为必须应用,应用必须保留,端口使用合理;
- adbd为调试使用,因此我们可修改为有adb端口时再启用,这样可极大减少端口被攻击的风险。
- oem_at_client为oem厂商必须应用,用于AT的接收和处理,虽然应用可以保留,但是地址和端口监听存在范围过大问题,没有依照最小原则。
针对第三个问题,我们排查相关代码发现其绑定的地址是INADDR_ANY(即0.0.0.0):
static int oem_tcp_at_client_open_listener (int port, int* p_fd)
{
…
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
/* Bind socket to address */
if ((ret = bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)
…
}
oem_udp_at_server_open_listener同oem_tcp_at_client_open_listener
但实际上该应用只运行在模组内部,并不需要监听全地址端口,因此我们按照最小原则,修改INADDR_ANY(即0.0.0.0)为INADDR_LOOPBACK(127.0.0.1),这样就可以保证地址和端口在可控范围内使用:
static int oem_tcp_at_client_open_listener(int port, int* p_fd)
{
…
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
server_addr.sin_port = htons(port);
/* Bind socket to address */
if ((ret = bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)
…
}
修改后再去扫描端口就可以发现该应用的监听地址和端口符合要求:
tcp 0 0 127.0.0.1:40096 0.0.0.0:* LISTEN 473/oem_at_client
udp 0 0 127.0.0.1:5555 0.0.0.0:* 473/oem_at_client
2.2 Nmap
2.2.1 Namp简介
Nmap(Network Mapper)是一款强大的主机发现和端口扫描的工具,可用于发现计算机网络上的主机和开放的端口;也被广泛用于网络安全评估、系统管理和渗透测试等领域。它可以帮助管理员评估其网络的安全性,检测漏洞,并收集目标计算机的一些信息。Nmap使用C语言编写,支持多种操作系统。
基本功能:
-
主机发现:Nmap可用于发现计算机网络上的活动主机。它可以扫描指定IP范围或整个子网,以确定哪些主机是在线的。
-
端口扫描:Nmap可以扫描目标主机上开放的端口。它使用TCP和UDP探测方法来确定目标主机上哪些端口处于开放状态,并且可以检测常见的服务(如HTTP、FTP、SSH等)所使用的端口。
-
服务和操作系统版本识别:Nmap能够识别目标主机上正在运行的服务和操作系统的版本信息。通过分析目标主机对特定请求的响应,Nmap可以推断出目标主机上安装的软件版本,帮助管理员评估其系统的安全性。
-
漏洞扫描:Nmap可以使用一些脚本和插件来进行漏洞扫描。这些脚本可以检测目标主机上的已知漏洞,并提供关于可能存在的安全风险的报告。
-
OS发现:Nmap可以根据目标主机的响应和其他标志来推断出目标操作系统的类型。这对于了解网络上的潜在目标和系统配置非常有用。
-
命令行灵活性:Nmap提供了广泛的命令行选项和参数,允许用户自定义扫描方式、端口范围、报告格式等。用户可以根据具体需求灵活地配置和使用Nmap。
2.2.2 基本用法
- 扫描单个主机:使用命令"nmap [目标主机IP地址]"来扫描单个主机。例如,"nmap 192.168.1.1"将扫描IP地址为192.168.1.1的主机。
- 扫描多个主机:使用命令"nmap [目标主机IP地址1,目标主机IP地址2,…]"来扫描多个主机。例如,"nmap 192.168.1.1 192.168.1.2"将扫描IP地址为192.168.1.1和192.168.1.2的两个主机。
- 扫描整个子网:使用命令"nmap [目标子网]/[掩码位数]"来扫描整个子网。例如,"nmap 192.168.1.0/24"将扫描192.168.1.0到192.168.1.255之间的所有IP地址。
- 扫描指定端口:使用命令"nmap -p 端口号 [目标主机IP地址]"来扫描指定端口。例如,"nmap -p 22 192.168.1.1"将只扫描SSH服务所使用的22号端口。
- 扫描常见端口:使用命令"nmap -F [目标主机IP地址]"来扫描常用的端口。例如,"nmap -F 192.168.1.1"将会扫描100个最常用的TCP端口。
- 扫描操作系统和服务版本信息:使用命令"nmap -O [目标主机IP地址]"来扫描目标主机的操作系统信息,并使用命令"nmap -sV [目标主机IP地址]"来扫描目标主机正在运行的服务版本信息。
2.2.3 基于SDX12平台的使用实例
SDX12模组通过usb连接到windows PC上,枚举rndis网口,我们通过win下的Zenmap工具对于rndis网口进行端口的扫描。Zenmap工具可从官网nmap.org下载。
执行的命令是nmap -p 1-65535 -T4 -v 192.168.1.1,含义是快速扫描192.168.1.1主机的1-65535端口,并实时输出详细信息,下图是软件的运行过程截图:
最终的扫描结果可以在端口/主机查看:
可以看到已经扫描到443/tcp、53/tcp、80/tcp等端口是open状态,这结果端口恰好对应着HTTPS、domain(dnsmasq)、http等服务,也和我们在3.1.1章节扫描结果一致。
Discovered open port 443/tcp on 192.168.1.1
Discovered open port 53/tcp on 192.168.1.1
Discovered open port 80/tcp on 192.168.1.1
上面的结果是在3.1.2的修改基础之后的,因此仅扫描到上述三个服务。而adbd和oem_at_client两个应用绑定的地址是127.0.0.1,并不是0.0.0.0或192.168.1.1,因此外部的扫描工具是无法通过网关192.168.1.1扫描到这两个应用的,也符合我们的预期。