|
一台服务器被攻破,本地管理员登录上去,提权敲下 id 命令,漏洞看到的本地却是 uid=0(root)。攻击者早就不满足于拿到一个普通用户的提权shell了,他们要的漏洞是整个系统的控制权。而这一切,本地往往从一个看似不起眼的提权本地提权漏洞开始。 本地提权漏洞,漏洞说白了就是本地让一个低权限用户获得高权限(通常是root或SYSTEM)的手段。它不像远程漏洞那样需要打穿网络边界,提权而是漏洞发生在系统内部——攻击者已经通过钓鱼、Web漏洞或其他方式拿到了一部分权限,本地接下来要做的提权,就是漏洞“越狱”。 我见过最典型的例子是脏牛(Dirty COW),2016年爆出来的Linux内核竞态条件漏洞。它允许任何本地用户修改只读文件,包括 /etc/passwd。攻击者只需要写一小段C代码,编译运行,几秒钟后就能把自己变成root。那时候我拿一台老旧的CentOS 6测试机试了一下,全程不超过30秒,屏幕上刷出一行 root@localhost 的提示符时,我后背发凉——这玩意儿的利用门槛太低了。 这类漏洞的根源,多半是内核或特权程序对输入校验不够严格,或者对资源访问的权限判断存在逻辑瑕疵。比如某个系统服务以root身份运行,但它处理用户传入的参数时没有做沙箱隔离,用户就能通过精心构造的数据让它执行任意命令。又或者像sudo那样,配置不当导致某个命令可以被低权限用户以root身份执行,而那个命令本身又有漏洞。 有些提权漏洞甚至不需要写代码。Windows上有个经典的案例:如果某个目录的权限设置错误,让普通用户可以写入,而系统服务又恰好从这个目录加载DLL,那么攻击者只需放一个恶意DLL进去,等服务重启,代码就以SYSTEM权限跑了。这种“DLL劫持”在老旧软件里太常见了。 提权漏洞的可怕之处在于,它把一次普通的入侵变成了一场灾难。攻击者拿到root后,可以关闭安全软件、篡改日志、安装后门、横向移动——所有的防御措施都成了摆设。而且,很多提权漏洞的利用代码是公开的,一个脚本小子照着GitHub的PoC敲几行命令就能得手。 我印象很深的一次实战,是帮朋友排查一台被入侵的Ubuntu服务器。入侵者最初只是利用了网站后台的一个文件上传漏洞,拿到了www-data权限——这个用户连home目录都进不去。但系统内核版本是4.4.0-31,正好存在CVE-2016-5195(脏牛)。攻击者用现成的exp,一分钟不到就提权成功,然后改了SSH配置,加了后门账户,删了日志。等我们发现时,他已经在里面待了两周了。 防御本地提权漏洞,没有一劳永逸的解法。及时打补丁是最基本的,但很多生产系统为了稳定性不敢随便升级内核。那就得靠最小权限原则了——别给普通用户多余的权限,关掉不必要的SUID程序,用容器或seccomp限制进程能做的事。还有,监控系统里奇怪的 whoami 或者 uname -a 命令执行,这往往是攻击者在探测内核版本。 本地提权漏洞不会消失。只要有特权边界存在,就会有人想翻过去。而我们要做的,就是尽量让那道墙高一点,再高一点——至少别让翻墙的人连梯子都不用带。 |