实战渗透测试报告
目标系统上线第三天,实战渗透我们拿到了域控权限。测试整个过程没有用到0day,报告全靠一个被遗忘的实战渗透测试账号和运维人员图省事留下的配置文件。这篇文章不聊理论,测试只还原一次真实的报告渗透过程。
信息收集:从一张员工卡开始
客户给的实战渗透授权范围只有一个IP段,没给域名。测试我们先用Nmap扫了一遍存活主机,报告发现80和443端口开得不多,实战渗透倒是测试3389和445端口遍地都是。这年头还大面积开RDP,报告要么是实战渗透内网管理松散,要么是测试业务系统老旧。
真正打开局面的报告是一张照片。客户行政人员在朋友圈发过一张工位照,背景里贴着资产标签,上面印着内部系统域名和资产编号。我们用这个域名反查到了真实IP,又通过证书透明度日志找到了几个子域名。其中一个子域名解析到一台Jenkins服务器,版本号是2.138——这个版本存在未授权访问漏洞。
撕开口子:Jenkins的脚本命令行
访问那台Jenkins,果然没登录就直接进了控制台。脚本命令行功能没关,直接执行系统命令。先看了下当前用户,是jenkins,权限不高。但服务器上挂着Git仓库的SSH密钥,读出来一看,能访问内网代码托管平台。
这里有个细节:密钥没设密码短语。运维图方便,生成密钥时直接回车跳过。我们拿这个密钥克隆了几个仓库,其中一个仓库的配置文件里硬编码了数据库连接串,账号是root,密码是弱口令——公司名加年份。
横向移动:从数据库到域控
数据库是MySQL,连上去发现是生产库。但这不是重点,重点是这个数据库所在的内网段和域控在同一个VLAN。我们通过数据库的LOAD_FILE和INTO OUTFILE功能,往Web目录写了个JSP webshell。这台机器同时跑着Tomcat,权限是SYSTEM。
拿到SYSTEM权限后,用Mimikatz抓内存里的明文密码。抓到一个运维账号,密码是Admin@123。用这个账号登录域内其他机器,发现它对所有服务器都有本地管理员权限。运维为了省事,把同一个本地管理员密码推到了所有机器上。
接下来就简单了。用这个账号登录域控,DCSync导出域内所有用户哈希。krbtgt的哈希也在里面。整个域算是彻底沦陷。
几个让我印象深刻的点
第一,Jenkins未授权访问是老生常谈,但每年都能碰到。很多团队装完Jenkins就不管了,插件不更新,权限不配,脚本命令行默认开着。第二,SSH密钥不设密码短语,等于把钥匙插在门上。第三,本地管理员密码统一,这是内网渗透的加速器。第四,数据库和域控放同一个网段,这等于把金库和保安室打通。
客户后来问我们怎么防。我说先把Jenkins的脚本命令行关了,SSH密钥加密码短语,本地管理员密码用LAPS管理,数据库单独划VLAN。这四条做到,这次渗透至少要多花三天。
最后说一句
渗透测试报告不是炫技,是把真实风险摆到桌面上。这次能打进去,不是我们技术多强,是运维的方便习惯给了机会。安全这件事,往往不是败在复杂的攻击上,而是输在“图省事”三个字。