ntp mode 6 检测漏洞 原理扫描
凌晨三点,测漏某银行的洞原NOC大屏突然跳出十几条告警,全部指向同一台核心交换机。理扫值班工程师老张ssh上去一看,测漏syslog里全是洞原ntpd: receive(123)的报错,源头IP来自一个从未见过的理扫地址段。他第一反应是测漏DDoS,但流量曲线平得像心电图。洞原直到他跑了一句ntpdc -c monlist 192.168.1.1,理扫才意识到问题出在NTP的测漏mode 6查询上——那台交换机被人用ntp mode 6漏洞扫了个底朝天,系统时间被悄悄篡改了8分钟。洞原
NTP mode 6,理扫官方叫法是测漏"control message",本来是洞原给管理员用的调试后门。它允许客户端查询服务器的理扫状态、配置、甚至直接修改运行参数。问题在于,很多老版本ntpd默认开启了mode 6且不校验来源IP,这就等于把服务器的管理接口裸奔在公网上。原理扫描器干的事很简单:发一个mode 6的readvar请求,如果对方回了version、processor、system这些变量,就说明漏洞存在。整个过程一个UDP包搞定,快过你打个喷嚏。
我见过最离谱的一次,是某云厂商的物理机巡检脚本,居然用mode 6去批量获取所有节点的时钟偏移量。运维图省事,没走内部监控通道,直接对着生产IP段扫。结果安全团队在旁边跑着漏洞扫描器,两边的UDP包在机房里撞了个满怀。误报倒是小事,关键是那批机器里有几台老掉牙的CentOS 6,内核版本停留在2.6.32——mode 6的漏洞在CVE-2013-5211里写得明明白白,允许远程未授权修改ntpd配置。你说巧不巧,那周正好有内部红队演练。
原理扫描和漏洞利用之间,隔着一层窗户纸。扫描器只验证"是否存在",不关心"能否被打穿"。比如你发一个setvar请求,如果服务器返回error 503,说明它开了认证,那漏洞就不存在;但要是返回ok,恭喜,你可以在线改它的tinker panic 0,直接把时钟步进限制去掉。更狠的是readlist,能直接dump出NTP密钥文件里的MD5哈希——很多老设备用默认密钥pass,拿到哈希后彩虹表一撞就出明文。
有人觉得这漏洞没意思,不就是对个时间嘛。但你想想,Kerberos的票据有效期基于时间戳,TLS证书的校验也依赖时钟。把目标服务器的时间往后拨五年,它的SSL证书全部失效,业务直接瘫痪;往前拨一小时,日志时间线错乱,取证直接作废。2017年那次美国东海岸的NTP反射放大攻击,就是利用mode 6的monlist命令,把7字节的请求放大到700字节的响应,峰值流量冲到400Gbps。原理扫描是前置侦察,攻击者先用它摸清哪些主机开着mode 6,再挑带宽大的下手。
修复手段其实不复杂。要么在ntpd.conf里加restrict default nomodify nopeer noquery,要么干脆升级到4.2.8p10以上版本——这个版本默认禁用了mode 6的远程查询。但现实是,很多工控系统和嵌入式设备用的是裁剪版ntp,厂商早就不维护了。我去年帮一个电厂做排查,发现他们的GPS时钟同步器还在跑着2009年的ntpd,mode 6敞开着,连个防火墙规则都没配。问厂家,厂家说"我们只保证硬件能用,软件安全请自行联系第三方"。你拿它没辙。
最后说个细节。原理扫描器判断漏洞时,会看响应包里的org字段——如果它回显了你发送的原始时间戳,说明服务端处理了你的请求。但有些伪装过的设备会故意丢弃mode 6包,只回应标准的mode 3客户端请求。这时候你得换个思路,发一个mode 6 version 2的请求,老版本ntpd对version 2的处理逻辑和version 3不一样,有些会直接透传内部状态。说白了,漏洞检测是个猫鼠游戏,你永远不知道对面那台设备里跑的是原版代码还是打了补丁的魔改版。但mode 6这个口子,能堵上的早堵上了,堵不上的,多半还在某个机房的角落里默默对时。