2023年秋天,服务我帮一个客户做内部安全评估。器渗他们的服务运维图省事,把一台测试服务器的器渗SSH密码设成了`admin@123`,端口也没改,服务22。器渗我扫了一眼暴露面,服务心里就有数了——这台机器大概率要出事。器渗
服务器渗透这件事,服务外行听起来像电影里的器渗黑客敲几下键盘就拿下五角大楼。实际上,服务绝大多数入侵靠的器渗不是什么零日漏洞,而是服务人的懒惰。弱口令、器渗没打补丁的服务旧版本、配置错误的权限,这三样东西能覆盖八成以上的案例。
拿到一个目标IP,第一步永远不是直接攻击,而是摸清它跑了什么。我用`nmap`扫端口,看到22、80、3306开着。80端口跑的是Apache 2.4.49——这个版本有个著名的路径穿越漏洞CVE-2021-41773。当时我嘴角就翘了一下。
有人喜欢一上来就丢sqlmap或者Metasploit,觉得工具越猛越好。我的习惯是先手工确认,再上工具。因为自动化扫描器噪音大,容易触发WAF或者IDS告警。手工摸一遍,心里有底,后续动作也精准。
那个Apache漏洞利用起来不复杂,一个curl请求就能读取`/etc/passwd`。我确认了漏洞存在,接着尝试读取`/etc/shadow`——失败了,权限不够。但`/etc/passwd`里有个用户叫`deploy`,家目录是`/home/deploy`。
顺手试了一下SSH,用`deploy`配`deploy123`。进去了。
你没看错。漏洞只是敲门砖,真正让我拿到shell的是那个弱密码。很多渗透测试报告里会把这个过程写得花里胡哨,其实核心就这么朴素。我见过太多服务器,防火墙配得严严实实,结果root密码是`P@ssw0rd`。
进去之后是普通用户,能干的事有限。提权的路子很多,我习惯先跑一遍`sudo -l`,看看当前用户有没有什么免密sudo权限。这台机器上,`deploy`可以免密执行`/usr/bin/find`。
这就够了。`sudo find / -exec /bin/bash \;`,直接拿到root shell。整个过程不到五分钟。
提权这个环节最能体现一个渗透测试者的功底。内核漏洞提权(比如Dirty Pipe)当然好用,但依赖具体内核版本,而且容易把机器搞崩。配置类提权——sudo误配、SUID滥用、计划任务劫持——更稳定,也更常见。我个人的偏好是先从配置入手,内核漏洞留作备选。
拿到root之后,理论上有两种做法:一是立刻报告客户,二是继续模拟真实攻击者的行为,看看能走多远。那次客户授权的是完整渗透测试,所以我继续往下走。
我加了一个SSH公钥到`/root/.ssh/authorized_keys`,这样即使密码改了我也能回来。然后清掉了`/var/log/auth.log`里我登录的记录。`history`也清了。这些动作在真实攻击中很常见,防守方如果只看密码登录日志,根本发现不了。
说句实在话,大部分中小企业的服务器日志留存周期不超过30天,有的甚至根本没开审计。攻击者进来待几个月,你都不知道。
我后来把报告交给客户,他们最关心的问题是:怎么防?我的回答可能让他们失望——没有银弹。补丁要打,密码策略要严,权限要最小化,日志要集中收集。每一条都是老生常谈,但每一条都有大量服务器做不到。
那台Apache服务器如果及时升级到2.4.51,我连门都进不去。`deploy`用户的密码如果稍微复杂一点,我也拿不到shell。sudo配置如果只允许特定命令带参数执行,提权也没那么容易。
安全这件事,攻防不对称。防守方要堵住所有洞,攻击方只需要找到一个。但反过来想,把最基础的几件事做好,就能过滤掉绝大部分自动化扫描和低水平攻击者。剩下的那些盯着你打的,才需要更高级的防护手段。
渗透测试的意义不在于炫技,而在于用攻击者的视角帮防守方看清自己的盲区。我每次拿到一台服务器的root,心里想的不是“我多厉害”,而是“这台机器的主人今晚可能要加班了”。