去年秋天,支持我在一个园区里做渗透测试。扫描客户觉得自己的物联网设网络固若金汤——防火墙、EDR、漏洞零信任,支持该上的扫描都上了。结果我用一台树莓派,物联网设在访客WiFi上跑了二十分钟,漏洞就摸到了他们的支持门禁控制器。那东西的扫描固件版本是2016年的,Telnet端口还开着,物联网设默认密码没改。漏洞从门禁到内网核心交换机,支持中间只隔了一层VLAN。扫描客户的物联网设安全负责人当场脸色就变了。
这种事不是孤例。物联网设备正在成为企业网络里最薄弱的环节,而大多数安全团队根本没有把扫描器对准它们。
传统漏洞扫描器是为服务器和终端设计的。它们假设目标有操作系统、有代理、能响应认证请求。但物联网设备不按这套逻辑出牌。一台IP摄像头可能只开放两个端口,跑着裁剪过的Linux,Web界面是定制的,连HTTP响应头都不规范。Nmap扫出来的结果往往只有“unknown service”几个字。你拿Nessus去扫,它连设备是什么都认不出来,更别提匹配CVE了。
我试过用Masscan扫一个/16的网段,开放端口里排前几的是1883、8883、5683、502。这些是MQTT、CoAP和Modbus的端口。普通IT安全工程师看到这些数字可能没什么感觉,但搞工控的人知道,502端口敞着意味着有人可以直接跟PLC对话。问题是,很多企业的资产管理系统里压根没登记这些设备。它们可能是某个部门自己买的,插上网线就用,IT部门毫不知情。
扫描物联网设备需要换一套思路。被动监听比主动扫描更靠谱。把SPAN端口配好,抓几天流量,你会发现一堆从未在资产表里出现过的MAC地址。它们可能在跟云平台通信,用的协议是私有加密的,但流量特征很明显——心跳包间隔固定、payload长度规律、TLS指纹跟常见浏览器完全不同。这些线索足够你定位设备,然后再针对性地做主动探测。
主动探测也得改参数。物联网设备CPU弱、内存小,并发连接一多就崩。我用Zmap的时候会把速率压到很低,发包间隔拉长。有些老设备收到畸形包直接重启,产线上要是停一分钟,损失按万美元算。所以扫描窗口得跟运维确认好,最好在维护时段做。
漏洞验证更麻烦。你不能像扫Windows那样直接丢一个exploit过去。很多物联网设备没有shell,拿到命令执行也回显不了。得靠带外通道,比如DNS查询或者HTTP回调。我习惯用Interactsh,配合自定义的payload,看设备会不会主动连出来。有一次扫一个智能电表,它不响应任何TCP连接,但发特定UDP包之后,它会向一个固定IP发心跳。那个IP是厂商的云平台,我伪造响应之后,电表就把固件版本和配置信息吐出来了。
还有个坑是固件提取。很多设备把固件藏在Flash里,通过Web界面能下载到加密的bin文件。你得找到解密密钥,通常在bootloader或者某个so库里硬编码着。用Binwalk跑一遍,再拿Ghidra反编译,能看到不少有意思的东西——比如某个品牌的楼宇控制器,所有设备共用同一个SSH密钥,而且私钥就明文写在固件里。这意味着拿到任何一台设备,就能登录同一型号的所有设备。
扫描只是第一步。真正的问题是,你扫出来之后怎么办。物联网设备打补丁极其困难。厂商可能已经停止支持了,或者补丁需要现场手动刷机。有些设备甚至没有升级机制。我见过一个医疗影像设备,跑着Windows XP Embedded,厂商的解决方案是“把网线拔了”。
所以扫描策略得跟风险管理挂钩。先扫出所有物联网设备,按协议和暴露面分类。能隔离的隔离,能加访问控制的加访问控制。实在动不了的,至少得监控它的流量。别指望修好所有漏洞,那不现实。但至少你得知道它们在哪、在干什么、跟谁通信。
回到那个园区项目。最后我们没有换门禁控制器,而是在交换机上给它单独划了一个VLAN,ACL只允许它跟管理服务器通信。扫描报告里写得很清楚:这个设备有17个已知漏洞,其中3个可远程利用。但客户决定接受风险,因为更换整套门禁系统的成本是六位数。这就是现实——扫描让你看清风险,但怎么处理,是另一回事。