一场与系统底层的“暗战”博弈
嘿,各位安全圈的老铁们,今儿咱们不聊那些花里胡哨的Web漏洞,咱们把目光放低一点,再低一点——低到操作系统的最深处,也就是那个让无数渗透测试人员又爱又恨的内核提权。

讲真,每次拿到一个Shell,心里那叫一个美滋滋,但一看权限,哦豁,是个低权限的Web服务账号,这个时候,要是没点内核提权的底子,那感觉就像是被关在玻璃房里看宝藏,急得抓耳挠腮却又无可奈何,今天我就把自己这些年折腾内核提权的方法论,像竹筒倒豆子一样,全给大伙儿抖搂出来,咱们一起过过招!
第一招:信息收集——知己知彼,百战不殆(这步没做好,后面全白搭)
兄弟们,千万别一上来就想着拿工具砸,那是莽夫干的事儿,咱得先摸清楚目标系统的底细,这就好比你去拜访一个陌生人,总得先知道人家姓甚名谁、家里几口人吧?
uname -a 这条命令赶紧敲起来!瞅瞅内核版本号,是老掉牙的2.6.x还是新潮的5.x?cat /etc/os-release 看看是Ubuntu、CentOS还是Debian。为啥要这么仔细? 因为内核提权漏洞那都是“一个萝卜一个坑”,针对特定的版本才有用,你要是拿个针对Linux 4.4的exp去打5.15的系统,那纯属浪费感情,运气好不崩,运气差直接死机,当场表演一个“系统崩溃”给管理员看,那可就尴尬到脚趾抠地了!
再啰嗦一句,补丁情况也得心里有数。apt list --installed 或者 rpm -qa 快速扫一眼,看看关键组件有没有打补丁,这就像看对方房子的防盗门,如果锁芯都是最新的,那咱就得想想别的辙了。
第二招:经典漏洞利用——老酒装新瓶,味儿还挺正
说真的,虽然新漏洞层出不穷,但实战中我发现,真正拿下权限的,往往还是那些“年迈”的经典漏洞,为啥?因为很多服务器的管理员,安全意识真的感人,补丁常年不更新,简直是在给咱们安全从业者送“暖心大礼包”!
比如那个震古烁今的 Dirty Cow(脏牛漏洞,CVE-2016-5195) ,这老哥简直是提权界的“常青树”,它利用的是Linux内核copy-on-write机制的竞争条件,实现本地提权,只要内核版本在Linux 2.6.22到4.8之间,那基本就是一打一个准儿,我记得第一次用这个漏洞的时候,那心情跟坐过山车似的,编译完exp一运行,看到 root@victim:~# 那个提示符蹦出来,我差点没从椅子上跳起来,那成就感,别提了!
还有 Dirty Pipe(脏管道,CVE-2022-0847) ,这可是个年轻力壮的小伙子,影响范围从Linux 5.8一直到5.16.11,它利用了管道缓冲区初始化时的数据残留漏洞,可以直接覆盖只读文件内容,用这招,咱甚至不用碰root密码,直接把 /etc/passwd 里root的密码位给抹了,然后秒切root,哎呀妈呀,那感觉真是“透心凉,心飞扬”,简直不要太丝滑!
第三招:内核漏洞的“猎手”逻辑——别瞎蒙,要找对钥匙孔
各位,我在这儿必须得掏心窝子说句话:内核提权不是请客吃饭,更不是靠运气瞎蒙,你得像个猎人一样,懂得看“脚印”。
除了上述两个经典,像 CVE-2017-16995(Ubuntu的overlayfs漏洞)、CVE-2021-3493(Ubuntu的overlayfs再次沦陷),这些都是针对特定文件系统模块的,咱们在实战中,第一原则就是“版本匹配”,你得拿着手里的内核版本号,去对照漏洞库,看看有没有能用的exp,这也是为啥我一直强调信息收集要细,因为这一步直接决定了你后续的武器选型。
别忘了看看系统的架构!是x86_64还是ARM?如果是ARM的路由器或者物联网设备,那很多针对x86的exp就跑不动,这时候你得学会“因地制宜”,甚至是自己动手改exp的偏移量,虽然不是每次都能成功,但这种“自己动手,丰衣足食”的快感,确实挺让人上瘾的。
第四招:现代防护机制的“绕绕绕”——狗头铡下的舞蹈
现在的内核,那是今非昔比,什么SMEP(内核页表隔离)、SMAP(禁执行与禁止访问)、KASLR(内核地址空间布局随机化)都整上了,这就像给系统穿上了一层厚厚的铠甲。这时候你还拿着老思路硬怼? 那肯定碰一鼻子灰。
咋办?咱得学“绕”。KASLR 可以通过泄露内核地址来绕过,一种常用的技巧是/proc/kallsyms文件如果没有开启kptr_restrict限制,就能直接看到内核符号地址,这简直是“送分题”!如果开启了,那就得利用信息泄露漏洞,比如带外数据读取(out-of-bounds read)来泄露地址。
对于SMEP/SMAP,有时候咱们得利用JOP(跳转导向编程)或者ROP(返回导向编程)链,去调用内核里现成的gadget,说实话,这活儿真的很烧脑,写一次payload,头发都得掉好几根,但当你成功在开了全防护的系统上弹出root shell,那种“与天斗其乐无穷”的爽快感,真的无法用语言形容!
常怀敬畏之心,方能行稳致远
好了,写了这么多,感觉像是把自己的“武功秘籍”都翻了一遍,内核提权是个庞大的技术栈,远不是我这几百个字能完全覆盖的,它需要咱们有扎实的C语言功底、对Linux内核源码有一定的理解,还得有足够的耐心去跟那些莫名其妙报错的编译过程死磕。
我最后必须得泼一盆冷水:咱们做安全测试,一定要在法律允许的范围内进行! 学这些技术是为了更好地防御,去加固客户的系统,而不是为了搞破坏,如果你是利用这些技术去攻击别人的服务器,那兄弟,牢饭可是不好吃的呀!
好啦,今天就跟大家唠到这儿,我得去喝口水润润嗓子了,改天咱们再聊聊提权之后,怎么把“痕迹”擦得干干净净?拜了个拜!