上周三凌晨两点,扫描我盯着屏幕上跳动的漏洞进度条,Kalinmap刚扫完一个C段,扫描结果里蹦出七台机器开着8080端口。漏洞其中一台返回的扫描HTTP头里带着"Jetty/9.4.31",这个版本有已知的漏洞请求走私漏洞。讲真,扫描那一刻我比中彩票还兴奋——这种老版本Jetty现在不多了,漏洞大部分运维早该升级了。扫描
Kalinmap这工具,漏洞圈外人可能没听过。扫描它其实是漏洞nmap的Python封装,但加了不少自动化逻辑。扫描作者是漏洞个叫"k4l1"的巴西人,GitHub上最后更新停在2022年11月。扫描我翻过它的源码,扫描模块调的是python-nmap库,漏洞检测部分直接硬编码了CVE编号和对应的payload。说白了,就是把手工渗透的套路脚本化了。
但问题恰恰出在这儿。上周那次扫描,它把一台Windows Server 2012的445端口标成了"MS17-010高危"。我手动用nmap的smb-vuln脚本复测,结果是不存在。为什么误报?看Kalinmap的检测逻辑:它只发了SMB协商包,看返回的Dialect版本号就下结论。可实际上,系统打了补丁但没改版本号的情况太常见了。这种粗糙的判断,在真实环境里能把人坑死。
更离谱的是它的Web漏洞扫描模块。我拿DVWA靶场做测试,Kalinmap扫出"SQL注入"的URL,手动一测全是误报。它用的检测payload是' OR '1'='1,现在稍微正常点的WAF都能拦。而且它不区分注入类型,不管报错注入还是布尔盲注,全用同一个payload怼。这就好比用一把钥匙开所有的锁,开不了就说是锁坏了。
不过话说回来,Kalinmap也不是一无是处。它的端口扫描速度确实快,多线程调度写得不错。我拿它扫一个/24的网段,全端口扫描加服务识别,三分钟出结果。同样的任务用nmap -sV -p-,得跑将近二十分钟。快在哪?它默认只扫Top 1000端口,而且服务识别用的是socket直接读banner,不走nmap的指纹库。快是快了,代价就是准确率往下掉。
我认识一个做安服的朋友,他们团队去年把Kalinmap加进了内部工具链。结果第一次实战就翻车——扫一个客户的内网,Kalinmap报了一堆"Redis未授权访问",客户运维差点连夜爬起来改配置。后来发现是Kalinmap把Redis的PING响应当成了未授权标志,可实际上那台Redis明明设了密码,只是没开protected-mode。这种低级错误,在交付报告里写出来是要被投诉的。
那这工具到底能不能用?我的看法是:当个快速侦察的辅助可以,但别信它的漏洞判断。我现在的习惯是,Kalinmap扫完端口,手动用nmap的NSE脚本复测一遍漏洞。Web部分直接跳过,用Burp Suite的主动扫描或者xray。工具这东西,用对了是帮手,用错了就是挖坑。尤其是安全工具,误报比漏报更可怕——漏报顶多没发现,误报会让你在错误的方向上浪费一整天。
凌晨三点,我把那台Jetty的漏洞验证脚本跑通了。Kalinmap报的漏洞,十个里能中一个就算不错。但就为了这一个,我还是会继续用它扫端口。毕竟,在信息收集阶段,速度有时候比精度更重要。只是别把它的扫描结果直接贴进报告——那是对客户的不负责,也是对自己的不负责。