|
111端口开着,端口漏洞等于把SunRPC的端口漏洞家门钥匙插在锁孔上没拔。这玩意儿全称叫远程过程调用(Remote Procedure Call),端口漏洞上世纪80年代Sun公司捣鼓出来的端口漏洞东西,设计初衷是端口漏洞让不同机器上的程序能像调用本地函数一样互相通信。想法挺好,端口漏洞问题是端口漏洞它默认不设防。 我头一回接触111端口是端口漏洞几年前帮朋友看一台老旧的CentOS服务器。nmap扫了一遍,端口漏洞111/tcp open rpcbind,端口漏洞底下还挂着一串rpc服务:portmapper、端口漏洞status、端口漏洞nlockmgr、端口漏洞mountd……密密麻麻。端口漏洞朋友问我严重吗,端口漏洞我说得看上面跑了什么。他这台机器跑着NFS,那基本就是把文件系统的大门敞开了。 它到底怎么工作的 111端口上跑的叫rpcbind(老版本叫portmapper)。你可以把它理解成一个电话总机。客户端想调用某个RPC服务,但它不知道那个服务监听在哪个端口,于是先打111这个总机号码问:”我要找NFS,它在哪个分机?“总机查一下注册表,告诉它:”在2049。“然后客户端再去连2049。 问题出在总机本身。早期版本的rpcbind没有任何认证机制,任何人来问都给回答。更糟的是,有些RPC服务自身也有漏洞,比如著名的CVE-1999-0170——攻击者可以通过111端口间接调用其他RPC服务,实现远程溢出。1999年的事了,但直到今天,互联网上暴露111端口的机器仍然一大把。 真实场景里的麻烦 Shodan上搜一下port:111,结果数量常年维持在百万级别。大量是云服务商那边的虚拟机,管理员装完系统默认开了rpcbind,防火墙规则没管。有些人觉得内网无所谓,但内网横向移动恰恰是攻击链里最关键的一环。你DMZ里一台机器被拿下了,攻击者扫到内网某台机器的111端口,通过它摸清整个RPC服务拓扑,再找有漏洞的服务下手。 2010年有个案例我印象很深。某高校的NFS服务器通过111端口暴露了rpcbind,攻击者先查询注册的RPC服务,发现mountd在跑,然后利用mountd的访问控制缺陷挂载了服务器的/export目录,直接读到了/etc/shadow。整个过程没用到任何高级exploit,全是系统自带的工具。 怎么处理 最直接的办法:不用NFS就别装rpcbind。很多Linux发行版在安装NFS相关包时会自动把rpcbind拉进来,你甚至不知道它在跑。检查一下systemctl status rpcbind,如果active但你没在用NFS,直接停掉禁用。 确实需要NFS的话,防火墙层面限制111端口的访问来源。只允许信任的IP段访问,别开0.0.0.0/0。另外NFSv4已经不再强依赖rpcbind了,能用v4就别用v3。如果非要用v3,把/etc/hosts.allow和/etc/hosts.deny配好,虽然这玩意儿的安全强度也就那样,但总比裸奔强。 还有个容易忽略的点:rpcbind自身的历史漏洞不少。CVE-2017-8779能导致内存泄露,CVE-2015-7236存在use-after-free。补丁打了吗?版本是多少?rpcbind -h看一眼,如果还是0.2.x的老版本,赶紧升级。 一个常见的误区 不少人觉得111端口只跑UDP,扫TCP扫不到就以为没事。实际上rpcbind同时监听TCP和UDP的111端口。UDP的111更容易被反射放大攻击利用,因为请求包小、响应包大,伪造源IP就能拿来打DDoS。Cloudflare的报告中提到过利用rpcbind做反射放大的案例,放大倍数虽然不如DNS和NTP那么夸张,但胜在存量大。 说到底,111端口本身不是漏洞,它是个攻击面。就像你家门口的信箱,本身没问题,但如果信箱里塞着备用钥匙的藏匿位置说明,那就另说了。rpcbind干的就是这个事——它告诉来问的人,你这台机器上还有什么服务、在哪个端口。信息泄露本身就是一种漏洞。 下次扫到111端口开着,别只记一个open就完事。跑一下rpcinfo -p target_ip,看看上面到底注册了什么。那个列表比端口本身更能说明问题。 |