我与小组中的一位博士生聊天,他告诉我 Windows 有 2,500 个开放的 UDP 端口。
因此,如果在 2500 个开放的 UDP 端口中使用了某个临时端口,那么攻击者就很难知道使用了哪个端口,因为它们都是开放的。
我以前从未听说过,所以我检查了自己的环境并发现了这一点:
C:\Users\Administrator>netstat -ab
Active Connections
TCP [fe80::fc9b:3f4b:206e:b05%9]:49689 WIN-Test:epmap TIME_WAIT
TCP [fe80::fc9b:3f4b:206e:b05%9]:49690 WIN-Test:49667 ESTABLISHED
[lsass.exe]
TCP [fe80::fc9b:3f4b:206e:b05%9]:49691 WIN-Test:ldap ESTABLISHED
[dns.exe]
TCP [fe80::fc9b:3f4b:206e:b05%9]:49695 WIN-Test:epmap ESTABLISHED
[lsass.exe]
TCP [fe80::fc9b:3f4b:206e:b05%9]:49696 WIN-Test:49667 ESTABLISHED
[lsass.exe]
UDP 0.0.0.0:123 *:*
W32Time
[svchost.exe]
UDP 0.0.0.0:389 *:*
[lsass.exe]
UDP 0.0.0.0:500 *:*
IKEEXT
[svchost.exe]
UDP 0.0.0.0:4500 *:*
IKEEXT
[svchost.exe]
UDP 0.0.0.0:5353 *:*
Dnscache
[svchost.exe]
UDP 0.0.0.0:5355 *:*
Dnscache
[svchost.exe]
UDP 0.0.0.0:50271 *:*
[dns.exe]
UDP 0.0.0.0:50272 *:*
[dns.exe]
UDP 0.0.0.0:50273 *:*
[dns.exe]
UDP 0.0.0.0:50274 *:*
[dns.exe]
UDP 0.0.0.0:50275 *:*
[dns.exe]
UDP 0.0.0.0:50276 *:*
[dns.exe]
UDP 0.0.0.0:50277 *:*
[dns.exe]
UDP 0.0.0.0:50278 *:*
[dns.exe]
UDP 0.0.0.0:50279 *:*
[dns.exe]
UDP 0.0.0.0:50280 *:*
[dns.exe]
UDP 0.0.0.0:50281 *:*
[dns.exe]
UDP 0.0.0.0:50282 *:*
[dns.exe]
UDP 0.0.0.0:50283 *:*
[dns.exe]
UDP 0.0.0.0:50284 *:*
[dns.exe]
UDP 0.0.0.0:50285 *:*
[dns.exe]
UDP 0.0.0.0:50286 *:*
[dns.exe]
UDP 0.0.0.0:50287 *:*
[dns.exe]
UDP 0.0.0.0:50288 *:*
[dns.exe]
UDP 0.0.0.0:50289 *:*
[dns.exe]
UDP 0.0.0.0:50290 *:*
[dns.exe]
UDP 0.0.0.0:50291 *:*
[dns.exe]
UDP 0.0.0.0:50292 *:*
[dns.exe]
UDP 0.0.0.0:50293 *:*
[dns.exe]
UDP 0.0.0.0:50294 *:*
[dns.exe]
UDP 0.0.0.0:50295 *:*
[dns.exe]
UDP 0.0.0.0:50296 *:*
[dns.exe]
UDP 0.0.0.0:50297 *:*
[dns.exe]
UDP 0.0.0.0:50298 *:*
[dns.exe]
UDP 0.0.0.0:50299 *:*
[dns.exe]
UDP 0.0.0.0:50300 *:*
[dns.exe]
UDP 0.0.0.0:50301 *:*
[dns.exe]
UDP 0.0.0.0:50302 *:*
[dns.exe]
UDP 0.0.0.0:50303 *:*
[dns.exe]
UDP 0.0.0.0:50304 *:*
[dns.exe]
UDP 0.0.0.0:50305 *:*
[dns.exe]
UDP 0.0.0.0:50306 *:*
[dns.exe]
UDP 0.0.0.0:50307 *:*
[dns.exe]
UDP 0.0.0.0:50308 *:*
[dns.exe]
UDP 0.0.0.0:50309 *:*
[dns.exe]
UDP 0.0.0.0:50310 *:*
[dns.exe]
UDP 0.0.0.0:50311 *:*
[dns.exe]
这只是我的终端显示的一部分。总金额约为2k。
从规范0.0.0.0
意味着端口正在侦听所有接口。第一个*
in*:*
表示连接可以来自任何 IP 地址,第二个*
in*:*
表示连接可以来自远程计算机上的任何端口。因此,它是一个等待连接的套接字。但是,它没有,LISTENING
但我想在这种情况下它是开放的。
现在,我有以下问题:
- 通常不同的接口有不同的端口,这意味着如果 NIC A 和 NIC B 都打开了端口 C,那么 A 的 C 和 B 是不同的东西。但是从输出中,我们可以看到 windows 还提供了所有 NIC 共享的端口。这些端口是否永久可用于所有 NIC?或者,如果某些套接字用于某些服务,则此端口专门用于该 NIC。
- 开放的 2500 个 udp 端口,如果服务器发送一个 UDP 数据包,系统会不会只使用其中一个作为临时端口?
我稍后会自己做一些检查,但我也想听听一些与之相关的观点。
终端中显示的这些端口似乎未打开
[dns.exe]
UDP 0.0.0.0:53161 *:*
[dns.exe]
UDP 0.0.0.0:53162 *:*
[dns.exe]
UDP 0.0.0.0:53163 *:*
[dns.exe]
我向 53162 发送了一个 udp 数据包,Windows 发回了一个 UDP 数据包,并且 ICMP 端口无法访问
根据丹尼尔的评论,该端口似乎是因为dns.exe
. 所以我向 Windows 发送了一个 DNS 查询,但 ICMP 端口也无法访问。但是,A 记录是在 ICMP 之前发送的。
目前还不清楚学生所说的“开放”是什么意思,或者他们有什么来源证明这一说法。
最常见的是,“端口已打开”意味着程序绑定了一个套接字,并且正在等待在该端口上接收数据包(将显示在 netstat 中)——因此它不能作为临时端口使用,即使它通常会在范围内。
但正如您从 netstat 输出中看到的那样,具有“开放”端口的套接字远少于 2500 个(其中只有 6 个真正在侦听请求,其他是发出请求并等待 DNS 的临时套接字每个响应),因此这不太可能是您的学生的意思。
那么,学生可能一直在谈论临时端口(不会在 netstat 中显示)——但是,2500 也不是正确的临时端口数;端口范围恰好记录在此处和此处:
没有要显示的协议状态,因为 UDP 没有任何协议状态(与具有实际状态机的 TCP 不同)。
尽管 UDP 套接字可以绑定到远程地址:端口,但这是本地操作,不会改变协议的行为方式;它始终处于相同的状态。
但是,如果这些是具有状态的 TCP 套接字,其中大约 5-6 个将是“LISTENING”,而其余的(所有 dns.exe 套接字)很可能是“ESTABLISHED”,因为它们是出站查询的结果。
TCP/UDP 端口不与接口相关联,而是与本地 IP 地址相关联。根据网络路由,发往 B 地址的数据包实际上可能通过接口 A 到达,但仍会匹配绑定到 B 地址的套接字。另一方面,一个接口可能有多个 IP 地址——如果一个套接字绑定到地址 B1,它不会接受发送到地址 B2 的数据包,即使它是到“相同”端口。
因此,如果 netstat 显示一个套接字绑定到
10.0.0.5:22
,那么它的字面意思是它与本地地址 10.0.0.5 相关联,无论它配置在什么接口上。0.0.0.0随时匹配所有IPv4 本地地址,包括将来可能添加的地址。
netstat 不会向您显示“可用”临时端口池 - 恰恰相反,它仅显示与特定套接字关联的端口。例如,本地端口 50311 被列出,因为它当前正在由该特定套接字使用(因此从临时端口池中删除)。
因此,dns.exe 通过该套接字发送的数据包将使用 50311 作为本地端口,但通过任何其他套接字发送的端口将需要使用不同的本地端口。