我从踩坑到搞定的一次真实记录
说实话,写这篇文章之前我犹豫了好久——因为“提权”这俩字一出来,很多兄弟第一反应就是“这玩意儿能随便聊吗?”别急,我今天聊的不是教你去干坏事,而是站在一个运维/安全从业者的角度,讲讲我在真实项目里怎么用实战漏洞修复提权脚本把一台被提权成功的目标机器给“救”回来的,对,你没看错,是修复,不是攻击。

事情是这么开始的:一台服务器“莫名其妙”多了个root
上个月帮一个朋友的公司做应急响应,他们一台对外提供服务的Linux机器,监控告警突然炸了——CPU飙高、有个陌生进程一直在跑,我远程连上去一看,好家伙,/tmp目录下躺着一个一看就不对劲的ELF文件,ps aux里有个名字伪装成kworker的进程,但它的父进程是1,路径却在/tmp,这种典型的“脏东西”,十有八九是被人拿低权限Webshell进来之后,用内核漏洞或者SUID配置失误提权到root了。
当时我第一反应不是删文件——删了没用,攻击者留了定时任务和SSH公钥,我需要的是先搞清楚它是怎么提上去的,然后用实战漏洞修复提权脚本的思路去反向排查和加固,注意啊,这里的“提权脚本”不是攻击脚本,而是我写的一套自动化检测+修复的脚本合集,专门用来干这种脏活累活的。
别急着敲命令,先把“提权路径”摸清楚
很多新手一上来就rm -rf,结果呢?攻击者第二天又进来了,因为你根本没堵住那个洞,我当时做的第一件事是跑了一遍自己攒的检测脚本,大概逻辑是这样的:
- 查SUID/SGID异常文件:
find / -perm -4000 -type f 2>/dev/null,果然发现/usr/bin/find被加了SUID位——这玩意儿配合-exec参数直接就能find . -exec /bin/sh -p \;提权,经典得不能再经典了。 - 查内核版本:
uname -r出来是10.0-xxx,对应CVE-2019-13272(ptrace提权)和Dirty Pipe的前置条件都沾点边,攻击者大概率是用公开EXP打的。 - 查定时任务和启动项:
crontab -l、/etc/cron.*、systemctl list-unit-files全扫一遍,果然在/var/spool/cron/root里发现了一条每分钟拉起一次的反连脚本。 - 查SSH授权文件:
~/.ssh/authorized_keys里被塞了一把陌生公钥,注释还是attacker@kali,笑死,连伪装都懒得做。
你看,这几个点就是实战漏洞修复提权脚本要覆盖的核心检测项,我自己写的那个脚本其实不复杂,bash + 一点点python,但胜在“实战”——每一条检测规则都是我自己踩坑踩出来的,不是网上抄的那种泛泛而谈的清单。
修复才是重头戏:脚本怎么“提权”帮我把权限收回来
这里得解释一下标题里的“提权”到底啥意思,不是说脚本帮你提权去干坏事,而是说脚本在修复阶段需要以root权限运行,去收回那些被滥用的提权路径,我当时的操作顺序是这样的:
- 先用脚本自动备份现场:
tar打包/etc、/root、/tmp下的可疑文件,留证据,这一步千万别省,后面溯源全靠它。 - 去掉SUID位:
chmod u-s /usr/bin/find,同时脚本里维护了一份“正常SUID白名单”(比如passwd、sudo、su这些不能动),其余一律降权。 - 清理持久化:删恶意cron、删SSH公钥、停掉可疑systemd服务,脚本里我用
grep -v过滤出干净内容再写回去,避免手滑删错。 - 补内核漏洞:这一步脚本没法全自动,但我加了提示——检测到内核版本低于安全基线就输出“请尽快打补丁或升级内核”,并给出对应的CVE编号和官方公告链接,负责任地说,内核升级这种事还是得人工确认,脚本乱升容易把业务搞挂。
- 最后跑一遍复检:脚本自动重跑检测逻辑,确认SUID异常项清零、cron干净、没有陌生监听端口,看到“ALL CHECKS PASSED”那行绿字的时候,我长舒一口气。
踩过的坑,也给兄弟们提个醒
说点掏心窝子的话,我第一次写这个脚本的时候,犯了个蠢事——检测逻辑里用find / -perm -4000没加2>/dev/null,结果满屏的“Permission denied”,脚本跑了半小时还没跑完,差点把服务器IO打满,还有一次,脚本自动删cron的时候没做正则转义,把人家运维自己加的正常备份任务给删了,被客户骂了一顿……所以啊,实战漏洞修复提权脚本这东西,核心不在“脚本”俩字,在“实战”——你得真在生产环境跑过、真被坑过,才知道哪里该加--dry-run、哪里该留备份。
另外提醒一句:提权修复不是一锤子买卖,攻击者能进来一次,说明你Web层大概率也有洞,我后来帮朋友把Nginx日志翻了一遍,果然在access.log里找到了POST /upload.php的可疑请求,所以修复提权只是止血,堵住入口才是根治,这个思路我在脚本注释里也写了,希望用的人能看明白。
写在最后
好了,这篇就唠到这儿,如果你也在做安全运维或者应急响应,真心建议自己动手攒一套实战漏洞修复提权脚本,哪怕只有几十行bash,也比临时手忙脚乱强一百倍,记住啊,脚本是死的,思路是活的——先摸清提权路径,再动手修复,最后一定要复检,别嫌麻烦,安全这事儿,麻烦一次总比出事一次强,对吧?
有啥问题评论区聊,我看到就回,下次有空再写一篇讲讲我怎么用同一个脚本思路去排查挖矿病毒的,感兴趣的兄弟点个关注呗~