1. 项目概述与核心价值如果你在日常的渗透测试、红队演练或者安全评估工作中经常需要面对大量的Tomcat中间件资产那么手动一个个去测试弱口令、验证CVE漏洞效率低不说还容易遗漏。TomcatScanPro这个工具就是为解决这个痛点而生的。它不是一个简单的端口扫描器而是一个集成了多种Tomcat常见攻击路径的自动化利用框架。简单来说它把针对Tomcat的“发现-验证-利用”这一套流程给自动化、批量化了。我最初接触它是在一次针对某大型企业内网的安全评估中。当时资产列表里有上百个Tomcat服务手动测试根本不可能。TomcatScanPro帮我节省了至少80%的时间让我能集中精力去分析那些真正存在风险的脆弱点。它的核心价值在于将安全研究人员从重复、繁琐的“体力活”中解放出来把精力聚焦在更高阶的漏洞分析和利用链构建上。它支持批量URL导入、并发检测、动态线程池这些设计都直指实战中的效率瓶颈。这个工具主要面向有一定基础的网络安全从业者比如渗透测试工程师、红队成员、安全运维人员以及进行授权安全评估的研究人员。它不是一个“点一下就能黑掉服务器”的玩具而是一个需要你理解Tomcat架构、HTTP协议、以及相关漏洞原理才能用得好、用得稳的专业工具。接下来我会结合自己的实战经验带你从环境搭建到高级利用一步步拆解这个工具并分享那些在官方文档里不会写的“踩坑”心得和效率技巧。2. 工具核心功能深度解析TomcatScanPro的功能设计非常聚焦就是围绕Tomcat最常见的几类安全风险展开的。理解每一项功能背后的原理和实现方式能帮助你在实战中更好地判断结果、调整策略。2.1 CVE-2017-12615 漏洞的自动化利用这个漏洞老手们通常叫它“Tomcat PUT方法任意文件上传”。它的根源在于Tomcat在配置了readonlyfalse默认是true时对HTTP PUT方法处理不当攻击者可以利用一些特殊的技巧绕过限制上传一个JSP木马文件。工具实现了三种经典的绕过方式这可不是随便选的每一种都对应着不同版本或配置下Tomcat的解析特性PUT /shell.jsp/利用末尾斜杠。某些版本的Tomcat在处理PUT请求时如果路径以/结尾会将其当作目录创建请求但文件内容却被写入了。随后访问/shell.jsp/注意有斜杠时Tomcat可能将其作为文件执行。PUT /shell.jsp%20利用空格URL编码%20。这是利用Windows环境下文件系统对末尾空格的处理特性。Tomcat在解析URL时可能去除%20但保存文件时保留了空格导致请求shell.jsp无空格和实际文件shell.jsp有空格不匹配从而绕过了一些安全检查。PUT /shell.jsp::$DATA利用NTFS文件流。这是Windows NTFS文件系统特有的特性::$DATA是默认数据流。Tomcat在解析时可能忽略了这部分直接将文件保存为shell.jsp从而实现了上传。实操心得在实际测试中这三种方式成功率因目标环境操作系统、Tomcat版本、配置差异很大。我个人的经验是先快速用三种方式都试一遍如果都失败了不要轻易放弃。可以手动尝试其他变种比如shell.jsp.末尾加点、shell.jsp\x00.jpg利用空字节截断但受限于HTTP协议版本。工具记录每种方式的成功与否这个设计很好能帮你快速判断目标的脆弱点具体在哪里。工具在上传成功后会主动去访问这个JSP路径如果返回的HTTP状态码是200并且响应内容符合预期比如包含特定的测试字符串则判定为“利用成功”。这一步的“检测”逻辑至关重要避免了上传了一个无法访问或执行的文件而误判为成功。2.2 CNVD-2020-10487 (AJP文件包含) 漏洞利用这个漏洞的知名度可能不如CVE-2017-12615但危害性极大因为它可以导致敏感信息泄露甚至结合其他条件实现远程代码执行。它出在Tomcat的AJP协议处理上。AJPApache JServ Protocol是Tomcat与前端HTTP服务器如Apache通信的二进制协议默认监听8009端口。漏洞允许攻击者通过构造恶意的AJP请求让Tomcat将Web应用目录之外的任意文件如WEB-INF/web.xml、/etc/passwd包含进来并返回其内容。TomcatScanPro默认配置是读取WEB-INF/web.xml因为这个文件几乎存在于所有Web应用中且包含配置信息是验证漏洞存在的“标志性”文件。它的工作流程是工具模拟一个AJP客户端向目标的8009端口发送精心构造的请求包。包中指定了要包含的文件路径。如果目标存在漏洞且文件可读Tomcat会通过AJP响应将文件内容返回。注意事项这个功能的成功与否高度依赖于目标Tomcat开启了AJP连接器默认配置中可能被注释掉且AJP服务端口默认8009能被你访问到。在内网环境中很常见但在云服务器或严格防火墙策略下8009端口可能不对外开放。工具日志里如果AJP检测全部失败第一步就应该用nmap或masscan确认一下目标的8009端口状态。2.3 弱口令检测与自动化攻击链这是工具中最“传统”但也最实用的部分。它不仅仅是一个爆破工具更构建了一条完整的攻击链弱口令爆破 - 后台登录 - 自动部署WebShell。爆破阶段工具读取你提供的user.txt和passwd.txt对每个URL尝试组合登录。它模拟浏览器向Tomcat Manager的/manager/html路径发送认证请求。这里的关键是工具需要能够智能识别目标URL。你输入的urls.txt可以是http://ip:8080/工具会自己尝试拼接/manager/html路径也可以是完整的Manager地址http://ip:8080/manager/html。这个细节处理得很到位。登录后动作一旦爆破成功工具不会停在那里。它会立即尝试两个后续操作这两个操作构成了“一键Getshell”的能力上传WAR包部署这是最经典、最稳定的Tomcat后台Getshell方式。工具会在内存中生成一个简单的WAR包包含一个JSP WebShell然后通过Manager的/manager/html/upload接口上传并部署。部署成功后访问特定的URL路径就能执行命令。直接上传JSP Webshell作为备用方案工具也会尝试通过PUT方法如果环境允许直接上传一个JSP文件到web目录。这通常需要目标Tomcat配置了适当的写权限。这个“爆破-利用”链的自动化将多个手动步骤压缩成一个动作在批量攻击场景下效率提升是指数级的。2.4 并发扫描与资源管理机制面对成百上千个目标单线程扫描是不可接受的。TomcatScanPro采用了动态线程池来控制并发数。这不仅仅是“开多个线程”那么简单。好的并发控制要兼顾效率和稳定性。避免拖垮本地网络或CPU过高的并发数会导致本地网络连接数爆满也可能触发目标系统的防御机制如IP限速、封禁。避免误判过快的请求可能导致网络超时或响应异常被错误地判断为“失败”或“不存在漏洞”。动态调整工具理论上可以根据任务完成情况和系统负载微调线程数量以达到最优的扫描速度。这在长时间、大批量的扫描任务中非常有用。在config.yaml中通常会有相关的线程池配置参数如max_workers。我的经验是在内网环境中延迟低、带宽足可以设置得稍高一些如50-100而对互联网目标进行扫描时建议保守一点如10-20并且适当增加超时时间以保证扫描结果的准确性。3. 环境准备与实战配置详解工欲善其事必先利其器。直接运行python TomcatScanPro.py可能遇到各种依赖问题正确的环境搭建是第一步。3.1 Python环境与依赖安装工具基于Python 3开发首先确保你的Python版本在3.6以上。我强烈建议使用虚拟环境venv来管理依赖避免污染系统环境也方便不同项目之间的隔离。# 创建并进入虚拟环境 python -m venv tomcatscan_env # Windows 激活 tomcatscan_env\Scripts\activate # Linux/Mac 激活 source tomcatscan_env/bin/activate # 安装依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplerequirements.txt文件通常包含以下核心库requests用于发送HTTP/HTTPS请求是网络通信的基础。colorama用于在控制台输出彩色文字提升结果的可读性。urllib3通常requests会依赖它处理URL解析和连接池。可能还有pycryptodome或Crypto如果工具涉及AJP协议通信AJP协议数据包需要一定的封装格式。踩坑记录如果安装pycryptodome失败特别是在Windows上可能是缺少C编译环境。一个简单的解决办法是访问 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个非官方库下载对应你Python版本和系统位数的pycryptodome预编译whl文件然后用pip install 文件名.whl进行安装。这是解决Windows下Python包编译问题的一个经典技巧。3.2 关键配置文件 config.yaml 解读config.yaml是工具的大脑所有的行为策略都在这里定义。我们逐项分析# 目标文件路径 url_file: urls.txt user_file: user.txt pass_file: passwd.txt output_file: success.txt这是最基础的路径配置。确保这几个txt文件放在与脚本相同的目录或者填写正确的绝对路径。# 漏洞检测配置 cve_2017_12615: enabled: true test_file: test.jsp test_string: TomcatScanPro_Testtest_file: 上传测试用的JSP文件名。可以自定义但后缀必须是.jsp。test_string: 写入test.jsp文件的内容。工具在上传后会访问这个文件并检查响应中是否包含这个字符串以此判断文件是否上传并执行成功。这里有个技巧你可以把这个字符串设得独特一些避免和目标网站本身的某些内容混淆导致误判。cnvd_2020_10487: enabled: true ajp_port: 8009 target_file: WEB-INF/web.xml success_keyword: web-appajp_port: AJP服务端口默认8009。如果目标修改了端口这里一定要改。target_file: 要尝试读取的文件路径。默认WEB-INF/web.xml是最佳选择。你也可以尝试/etc/passwd(Linux)或C:\windows\win.ini(Windows)来验证跨目录读取但成功率取决于Tomcat进程的权限。success_keyword: 判断文件是否读取成功的关键字。web.xml里肯定有web-app标签所以用web-app很准。如果换其他文件关键字也要相应修改。# 弱口令与后台利用配置 weak_password: enabled: true manager_path: /manager/html war_shell_content: | % 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(); } } %manager_path: Tomcat管理后台的路径一般不用动。war_shell_content: 这是核心中的核心。它定义了打包进WAR包里的JSP WebShell代码。默认的这段代码是一个简单的命令执行Shell通过?cmdwhoami来执行命令。但在实战中这段代码需要根据情况调整免杀考虑默认的代码特征太明显容易被WAF或主机安全软件拦截。可以对其进行混淆、编码或使用更隐蔽的写法。功能增强可以增加文件管理、数据库连接、内网探测等功能将其变成一个功能全面的“大马”。注意事项修改这里的内容后工具会在运行时动态生成包含此代码的WAR包。确保你的代码语法正确否则会导致WAR包部署失败。# 扫描性能配置 threads: 50 timeout: 10threads: 并发线程数。如前所述根据网络环境和目标数量调整。timeout: 请求超时时间秒。对于网络状况不佳的目标可以适当调大比如15-20秒。3.3 字典文件准备的艺术工具的强大一半依赖于你的字典。urls.txt,user.txt,passwd.txt这三个文件的质量直接决定扫描的覆盖面和成功率。urls.txt不仅仅是IP:PORT。基础格式http://192.168.1.1:8080或https://example.com:8443。进阶技巧你可以放入具体的应用路径如http://target.com/app/。工具在检测弱口令时会尝试拼接manager/html但对于某些部署在子目录下的Tomcat可能需要完整的Manager URL。你可以先用工具扫描一波根路径对于发现存在Tomcat但后台爆破失败的再手动将完整的Manager URL加入列表进行二次扫描。来源可以从资产测绘平台如FOFA、Shodan导出语法可以是appApache-Tomcat。也可以结合子域名枚举、端口扫描的结果进行整理。user.txt 和 passwd.txt弱口令字典。常用用户名admin,tomcat,manager,root,administrator, 以及目标系统可能使用的其他常见用户名。常用密码tomcat,admin,123456,password,manager,空密码以及用户名123、Tomcat2023等组合。定制化字典这是提升成功率的关键。收集目标单位在其他系统上常用的密码规则如公司缩写年份生成专属字典。工具本身不提供密码生成功能需要借助其他工具如crunch、CUPP或自己写Python脚本。字典顺序把最有可能成功的组合放在前面可以尽快获得有效凭证节省时间。4. 实战操作流程与结果分析配置妥当后就可以开始实战了。运行命令很简单python TomcatScanPro.py。但我们要看的不是简单的开始和结束而是运行过程中的细节和结果的深度分析。4.1 运行过程监控与日志解读运行后控制台会滚动输出扫描状态。你会看到类似这样的信息[*] 开始扫描总目标数: 50 线程数: 20 [] Testing: http://192.168.1.100:8080 [-] CVE-2017-12615 (PUT jsp/) 失败: 403 [-] CVE-2017-12615 (PUT jsp%20) 失败: 403 [-] CVE-2017-12615 (PUT jsp::$DATA) 失败: 403 [!] AJP端口8009关闭跳过CNVD-2020-10487检测。 [ ] 弱口令检测中: admin/tomcat ... 成功 [] 成功上传WAR包: http://192.168.1.100:8080/shell_abc/ [] 信息已保存至 success.txt[]通常表示成功或开始一个阶段。[-]表示某项检测失败。[!]表示提示信息如跳过某项检测。[*]表示一般信息。重点观察CVE-2017-12615三种方式都返回403这非常常见。403表示禁止访问说明目标Tomcat的readonly参数很可能就是true安全配置或者有其他的权限控制。这基本意味着这个漏洞利用路径不通。AJP端口关闭这是快速判断目标是否启用AJP服务的方式。如果大量目标都显示这个可能说明AJP协议在公网或该环境下不常用。弱口令成功这是最有价值的信息。注意看它尝试的口令对成功后会立刻跟进上传WAR包。WAR包上传成功会给出WebShell的访问路径如/shell_abc/。这个路径通常是随机的以防冲突。4.2 输出文件 success.txt 分析所有成功的利用结果都会汇总到success.txt。这个文件的结构清晰是后续渗透行动的“作战地图”。 URL: http://192.168.1.100:8080 弱口令爆破成功: 用户名: admin 密码: tomcat WAR包WebShell地址: http://192.168.1.100:8080/shell_abc/cmd.jsp (密码/参数: cmd) URL: http://192.168.1.101:8443 (HTTPS) CVE-2017-12615 漏洞利用成功 (方式: PUT /test.jsp/) WebShell地址: http://192.168.1.101:8443/test.jsp (测试字符串: TomcatScanPro_Test) URL: http://10.0.0.5:8000 CNVD-2020-10487 漏洞利用成功: 读取文件: WEB-INF/web.xml 文件片段: ?xml version1.0?web-app xmlns... 对于每一个成功的目标文件都清晰地记录了漏洞类型是弱口令、CVE-2017-12615还是CNVD-2020-10487。利用详情具体的利用方式、上传的路径、读取的文件内容片段。访问信息最关键的WebShell地址。对于WAR包部署的路径可能比较复杂但工具已经给出了直接访问的JSP路径通常是/部署名/cmd.jsp或/部署名/shell.jsp。4.3 获取Shell后的标准操作流程 (Post-Exploitation)成功获取WebShell只是第一步接下来需要规范化操作避免留下过多痕迹和丢失权限。权限确认访问工具给出的WebShell地址传入cmdwhoamiLinux或cmdwhoamiWindows查看当前Tomcat进程的运行权限。通常是低权限用户如tomcat、www-data。信息收集cmdifconfig / ipconfig / hostname查看网络配置和主机名。cmdsysteminfo(Windows) 或cmduname -a(Linux)查看系统详细信息。cmdnetstat -ano(Windows) 或cmdnetstat -tulnp(Linux)查看网络连接和端口发现内网其他资产。权限提升尝试利用系统本地漏洞提权。上传如LinPEAS、WinPEAS等本地信息收集脚本或者使用JuicyPotato、DirtyCow等提权EXP。这一步高度依赖于操作系统版本和配置。持久化在WebShell基础上建立更稳定、隐蔽的后门。写入一句话木马在网站目录其他位置写入更隐蔽的JSP后门。添加计划任务Windows下schtasksLinux下crontab。创建系统服务权限足够时可以注册一个新的服务。SSH密钥写入如果服务器有SSH服务且允许密钥登录可以写入公钥。横向移动利用当前主机作为跳板扫描和攻击内网其他机器。可以使用frp、nps等工具建立隧道将内网端口代理出来。重要安全提醒以上所有操作必须在获得明确书面授权的环境中进行。未经授权对他人系统进行渗透测试是违法行为。工具本身是双刃剑安全研究人员应用其来提升自身技能和帮助企业发现风险而非进行非法活动。5. 高级技巧与疑难问题排查掌握了基础用法后一些高级技巧和问题排查能力能让你在复杂环境中游刃有余。5.1 绕过WAF与入侵检测系统的策略在实战中目标系统很可能部署了WAF或IDS直接使用默认的Payload和流量特征很容易被拦截。流量特征修改User-Agent工具发出的请求通常有固定的User-Agent如python-requests/2.x.x。你可以在工具的源码中通常是发送请求的函数里如requests.get/post调用处修改headers将其伪装成普通浏览器例如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...。请求延时在config.yaml中增加随机延时功能。虽然工具本身可能没有直接提供但你可以修改源码在每次发送请求前用time.sleep(random.uniform(1, 3))加入随机1-3秒的等待模拟人工操作避免触发频率告警。Payload混淆与变形CVE-2017-12615除了工具自带的三种方式可以尝试其他绕过技巧如双扩展名test.jsp.jpg结合解析漏洞、大小写变换、特殊Unicode字符等需要手动修改工具的上传逻辑进行测试。WebShell代码config.yaml中的war_shell_content是重中之重。务必进行混淆。例如将Java代码用Base64编码在JSP中动态解码执行或者将关键函数名、变量名进行替换使用反射等高级特性来调用Runtime执行命令。网上有很多JSP一句话木马的变种可以借鉴。HTTPS与证书处理如果目标使用HTTPS且证书不可信自签名证书requests库可能会抛出SSL错误。可以在发送请求时添加参数verifyFalse来忽略证书验证。但请注意这会降低通信安全性仅在测试环境使用。同样这需要修改工具源码中对应的请求函数。5.2 工具运行常见错误与解决方案错误现象可能原因解决方案ModuleNotFoundError: No module named Crypto依赖库pycryptodome未正确安装或存在冲突。1. 确认虚拟环境已激活。2. 尝试pip uninstall pycryptodome crypto然后pip install pycryptodome。3. 如前所述使用预编译的whl文件安装。扫描过程中大量Connection refused或Timeout1. 目标IP/端口不存活。2. 本地网络或防火墙问题。3. 并发线程数过高导致本地端口耗尽。1. 先用ping或telnet检查目标连通性。2. 降低config.yaml中的threads数量如降到10。3. 增加timeout时间如到30秒。弱口令检测显示成功但后续WAR包上传失败1. 目标Tomcat Manager应用可能被移除或路径不同。2. 登录成功但权限不足非manager-gui角色。3. 网络波动导致上传请求失败。1. 手动访问http://target/manager/html确认管理页面存在。2. 检查Tomcat的tomcat-users.xml文件确认用户是否具有manager-script和manager-gui角色。3. 查看工具运行日志确认失败的具体HTTP状态码如403, 404, 500。AJP漏洞检测全部显示“端口关闭”1. 目标Tomcat未启用AJP连接器。2. AJP端口被防火墙屏蔽。3. 目标AJP端口不是默认的8009。1. 用nmap -p 8009 target_ip确认端口状态。2. 检查Tomcat的server.xml确认Connector port8009 protocolAJP/1.3 ... 未被注释。3. 如果端口改变修改config.yaml中的ajp_port。运行脚本后无任何输出直接退出1.urls.txt等输入文件路径错误或为空。2. Python脚本存在语法错误。3. 缺少必要的命令行参数如果工具设计如此。1. 检查文件路径和内容确保格式正确每行一个URL。2. 在命令行直接运行python -c print(test)确认Python环境正常。3. 尝试在命令行简单运行python TomcatScanPro.py -h查看帮助。5.3 集成到自动化工作流TomcatScanPro可以成为你更大自动化扫描体系中的一个组件。资产输入自动化你可以写一个脚本定期从FOFA、Shodan等平台通过API拉取最新的Tomcat资产自动格式化成urls.txt然后调用TomcatScanPro进行扫描。结果解析与告警扫描结束后写一个脚本解析success.txt将成功利用的目标信息URL、漏洞类型、WebShell地址自动发送到你的安全告警平台如钉钉、飞书、Slack或者SIEM系统实现实时告警。与漏洞管理平台联动将扫描结果包括成功的和失败的进行结构化导入到像OpenVAS、Nexpose或自建的漏洞管理系统中形成资产漏洞生命周期管理。作为扫描框架的插件如果你在使用像xray、goby这样的综合扫描器虽然它们可能已有Tomcat漏洞检测模块但TomcatScanPro的利用链更自动化。你可以将其封装成一个独立的模块在扫描器发现Tomcat服务后自动调用进行深度利用验证。5.4 防御视角如何发现和阻断此类攻击作为一名蓝队或安全运维了解攻击手法才能更好地防御。强化Tomcat配置删除或禁用Manager应用生产环境除非必要否则移除webapps/manager目录。严格配置tomcat-users.xml使用强密码遵循最小权限原则只赋予必要的角色。设置readonlytrue在conf/web.xml中确保DefaultServlet的readonly参数为true关闭PUT方法。禁用AJP连接器如果不需要通过AJP与前端Web服务器如Apache、Nginx集成直接在server.xml中注释掉AJP的Connector配置。及时更新版本升级到已修复相关CVE漏洞的Tomcat版本。网络层防护防火墙限制只允许必要的IP访问Tomcat的管理端口8080, 8443和AJP端口8009。部署WAF配置规则拦截包含PUT、jsp、::$DATA等特征的恶意请求拦截JSP WebShell的常见代码片段。主机层监控文件监控监控webapps目录下是否有新的WAR包或JSP文件被创建。进程监控监控Tomcat进程是否执行了异常命令如cmd.exe、/bin/bash。日志分析定期分析Tomcat的localhost_access_log.*.txt和catalina.out日志寻找爆破大量401状态码、异常PUT请求、访问陌生JSP路径等行为。工具的本质是效率的放大器。TomcatScanPro将攻击者的常见操作流程化、自动化同样防御方也可以借鉴这种思路将自己的安全监控和响应流程自动化才能在这场攻防对抗中占据主动。