软件渗透测试报告

 人参与 | 时间:2026-10-17 07:31:31

上周三凌晨两点,软件我在客户内网的渗透一台跳板机上敲下最后一条命令,屏幕上弹出一行回显: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