SNMP… Strings Attached!
SNMP概述
简单网络管理协议(SNMP)是一种广泛使用的协议,用于管理和监控网络设备,如路由器、交换机和服务器。它允许网络管理员管理和监控网络设备的性能,并在出现问题时进行故障排除。
SNMP基于“管理器-代理”模型,其中中央网络管理系统(NMS)充当管理器,并与每个网络设备上的SNMP代理通信。NMS向代理发送请求以获取设备信息,代理则响应请求的数据。这使得NMS能够从网络上的所有设备收集和分析数据。
SNMP依赖于安全字符串(或“社区字符串”)来授予对设备管理平面的部分访问权限。我们经常看到两个常见的社区字符串——‘public’主要提供只读访问,‘private’通常提供读写访问。
SNMP版本
- SNMPv1:这是最旧的版本,认证基于社区字符串,传输时未加密,因此所有信息也以明文传输。它易于设置,但仅受明文社区字符串保护。
- SNMPv2c:版本2c与版本1几乎相同,但增加了对64位计数器的支持。这是目前最常用的版本,但像版本1一样,也以明文发送流量,并使用明文社区字符串进行认证。即使您使用非默认社区字符串,获得中间人位置也会通过简单的数据包分析披露社区字符串。
- SNMPv3:版本3是SNMP的最新版本,增加了加密和认证,可以一起或分开使用。它比版本1或2c更复杂,但是一个更安全的选择。
信息收集
Nmap有一些有用的NSE脚本专门用于SNMP。例如,使用‘snmp-sysdescr’ NSE脚本,我们可以检索服务器类型和操作系统。
使用‘snmp-interfaces’ NSE脚本,我们可以收集有关设备的一些网络信息,如IP地址、任何其他网络接口,甚至流量统计信息。
这些信息对网络管理员有用,但对攻击者也有用,因为他们可以开始构建系统配置文件并尝试制定攻击。
攻击演示
通过简单的Nmap UDP扫描,我们可以看到SNMP确实在系统上运行,并使用默认UDP端口161。
使用Metasploit的‘scanner/snmp/snmp_login’模块,我们可以看到系统是否使用默认社区字符串。系统实际上使用了‘public’(只读)和‘private’(读写)社区字符串。
由于我们使用‘private’字符串具有读写访问权限,我们现在能够通过向‘nsExtendObjects’表添加额外行来在系统上添加或执行额外命令。
‘nsExtendObjects’是Net-SNMP代理的NET-SNMP-EXTEND-MIB扩展的一部分,允许您查询任意shell脚本。
使用以下命令,我们可以将命令注入SNMP配置,以创建反向shell回连到攻击者系统。
|
|
接下来,我们在攻击者系统上启动Netcat监听器。
使用snmpwalk触发受害者的命令执行,并启动到攻击者系统上Netcat监听器的连接。
我们可以安全地忽略超时消息,因为我们可以在Netcat监听器中看到来自受害者系统的新连接。更糟糕的是,我们不仅拥有到受害者系统的远程shell,还可以看到我们拥有系统的root访问权限。
攻击扩展
这种攻击可以扩展到网络基础设施设备,如路由器、交换机和其他设备。想象一下攻击者修改访问控制列表、更改VLAN配置或简单地禁用网络基础设施设备上的端口的含义。读写访问可用于绕过安全控制、在网络上横向移动或导致拒绝服务事件。
安全最佳实践
- 禁用SNMP:如果您没有明确使用SNMP,则应尽可能禁用它。
- 修改默认字符串:如果您有意使用它,请确保更改默认社区字符串,并使用‘public’和‘private’以外的内容。使用独特且难以猜测的内容将使攻击者更难访问您网络上的SNMP。
- 端口阻塞:您可以在防火墙或访问控制列表(ACL)处阻止对端口161和162的访问。这将允许您的授权系统仍然访问您的SNMP启用设备,同时防止攻击者访问SNMP。
- 使用SNMPv3:考虑使用SNMPv3与AuthNoPriv模式加密认证凭据,并配置它使用MD5和SHA以增加安全性。
结论
SNMP是网络管理员的有价值工具,但也可以被攻击者滥用。通过采取必要的安全措施和监控网络,组织可以保护自己免受SNMP滥用,并确保其网络的完整性和可用性。