上周三凌晨两点,软件我在客户内网的渗透一台跳板机上敲下最后一条命令,屏幕上弹出一行回显:
uid=0(root) gid=0(root)。测试这意味着从外网边界到核心数据库,报告整条攻击链路已经打通。软件这份报告要说的渗透,就是测试这条链路是怎么一步步搭起来的。入口:一个被遗忘的报告测试接口
目标是一家做供应链管理的公司,对外只开放了443和几个高位端口。软件扫了一遍,渗透Web应用用的测试是某国产OA系统,版本不算新,报告但补丁打到了去年的软件。常规漏洞试了一圈,渗透没戏。测试
转折出现在一个叫
/api/v1/export的接口上。这个接口在登录页面里没有任何入口,我是从JS文件里翻出来的。它接受一个filePath参数,直接把服务器上的文件内容返回给客户端。没有鉴权,没有路径校验。直接读
/etc/passwd,成功。那一刻我就知道,边界已经没了。横向:从文件读取到命令执行
能读文件,下一步就是找能写文件或者能触发执行的点。翻了半天,在OA的日志目录里发现一个定时任务脚本,每五分钟跑一次,内容是从一个临时目录读取
.sh文件并执行。临时目录的权限是777。问题来了:我只能读,不能写。但那个
filePath参数底层调的是Java的FileInputStream,没做任何过滤。我试了file://协议,没反应。又试了路径穿越,读到了/proc/self/environ,里面有一串数据库连接字符串,明文密码。用这个密码登上了数据库。数据库是MySQL,版本5.7,
secure_file_priv为空。这意味着我可以往任意路径写文件。写了一个反弹shell的脚本到那个临时目录,等了不到四分钟,跳板机上收到了一个www-data权限的shell。提权:内核漏洞与配置疏忽
www-data权限太低,连/etc/shadow都读不了。先看了内核版本:4.4.0-116-generic。这个版本对应的是CVE-2017-16995,一个eBPF模块的提权漏洞。编译exp,执行,直接拿到root。其实还有一条更简单的路。在
/home目录下有个运维账号,家目录里放着一把SSH私钥,权限是644。私钥没设密码,直接就能登。这个账号在sudoers里,可以无密码执行所有命令。两条路都通,我选了漏洞利用那条,因为更隐蔽。内网漫游:域控与数据
拿到root之后,在跳板机上翻了翻,发现它连着内网三段:
10.0.1.0/24、10.0.2.0/24和172.16.0.0/16。域控在172.16.0.10,Windows Server 2012 R2。用mimikatz抓了本机内存里的哈希,没抓到域管。但在
/root/.bash_history里翻到一条命令:smbclient -U admin%P@ssw0rd123 //172.16.0.10/backup。密码直接写在历史记录里。用这个账号登域控的共享,里面有一个ntds.dit的备份文件。导出来,用secretsdump跑了一遍,域内所有用户的哈希全出来了。数据那边更直接。核心数据库里有一张
customer_contract表,存着所有客户的合同扫描件和金额。我导了前100条做证明,没继续往下拉。客户后来自己统计,这张表总共47万条记录。收尾与修复建议
整个测试从外网到域控,用了不到六个小时。最耗时的部分不是漏洞利用,是信息收集和路径确认。那个
/api/v1/export接口是整条链路的起点,如果它做了鉴权和路径白名单,后面所有事情都不会发生。修复建议就三条,按优先级排:第一,那个接口立刻下线或者加鉴权;第二,数据库连接字符串不能明文写在环境变量里,用密钥管理服务;第三,运维账号的私钥加密码,
sudoers权限收紧。别的都是锦上添花,这三条不做,下次换个人来,照样能进来。报告写到这,天已经亮了。客户的技术负责人看完邮件,回了一句:“那个接口是去年做数据迁移时临时加的,后来忘了删。” 这种事我见得太多了。攻击链上最脆弱的一环,往往不是技术,是人的记忆。
顶: 5268踩: 12






评论专区